Skip to content

Commit a4f3a36

Browse files
committed
feat(spawn): prototype hpc-spawn
1 parent 8abaee1 commit a4f3a36

File tree

10 files changed

+183
-10
lines changed

10 files changed

+183
-10
lines changed

Diff for: .vscode/settings.json

+3
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
"ANZKW",
44
"authd",
55
"Cdtm",
6+
"cgroups",
67
"commonclient",
78
"consts",
9+
"containerd",
810
"GSVDWH",
911
"Hasher",
1012
"hpcgame",
@@ -18,6 +20,7 @@
1820
"nsqlookupd",
1921
"Rcvd",
2022
"Shne",
23+
"spawncmd",
2124
"urfave",
2225
"utilitycmd"
2326
]

Diff for: cmd/hpc-spawn/main.go

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package main
2+
3+
import (
4+
"log"
5+
"os"
6+
7+
"github.com/lcpu-club/hpcjudge/spawncmd/consts"
8+
"github.com/urfave/cli/v3"
9+
)
10+
11+
func main() {
12+
if os.Getenv(consts.SpawnEnvVar) != consts.SpawnEnvVarValue {
13+
log.Fatalln("Command", os.Args[0], "should not be called directly from outside.")
14+
}
15+
if os.Getuid() != 0 {
16+
log.Fatalln("Command", os.Args[0], "requires root permission.")
17+
}
18+
app := cli.NewApp()
19+
app.Name = "hpc-spawn"
20+
app.Usage = "for internal usage"
21+
app.Commands = []*cli.Command{
22+
{
23+
Name: "run-judge-script",
24+
Usage: "Executes a judge script",
25+
Flags: []cli.Flag{
26+
&cli.StringFlag{
27+
Name: "data",
28+
Required: true,
29+
},
30+
},
31+
Action: func(ctx *cli.Context) error {
32+
return nil
33+
},
34+
},
35+
}
36+
err := app.Run(os.Args)
37+
if err != nil {
38+
log.Fatalln(err)
39+
}
40+
}

Diff for: discovery/protocol/protocol.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,16 @@ type Service struct {
1414
}
1515

1616
type QueryParameters struct {
17-
ID uuid.UUID `json:"id"`
18-
Address string `json:"address"`
19-
Type string `json:"type"`
20-
Tags []string `json:"tags"`
21-
ExcludeTags []string `json:"exclude-tags"`
17+
ID uuid.UUID `json:"id,omitempty"`
18+
Address string `json:"address,omitempty"`
19+
Type string `json:"type,omitempty"`
20+
Tags []string `json:"tags,omitempty"`
21+
ExcludeTags []string `json:"exclude-tags,omitempty"`
2222
}
2323

2424
type ResponseBase struct {
2525
Success bool `json:"success"`
26-
Error string `json:"error"`
26+
Error string `json:"error,omitempty"`
2727
}
2828

2929
func (rb *ResponseBase) IsSuccess() bool {

Diff for: discovery/server/server.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -132,15 +132,15 @@ type PeerRequest struct {
132132
ID uuid.UUID `json:"id"`
133133
Address string `json:"address"`
134134
Operation OperationType `json:"operation"`
135-
Delta *Service `json:"delta"`
135+
Delta *Service `json:"delta,omitempty"`
136136
}
137137

138138
type PeerResponse struct {
139139
ID uuid.UUID `json:"id"`
140140
Success bool `json:"success"`
141-
Error string `json:"error"`
142-
Peers []string `json:"peers"`
143-
Services []*Service `json:"services"`
141+
Error string `json:"error,omitempty"`
142+
Peers []string `json:"peers,omitempty"`
143+
Services []*Service `json:"services,omitempty"`
144144
}
145145

146146
func (s *Server) selectFromServiceSlice(a []*Service) *Service {

Diff for: go.mod

+6
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,15 @@ require (
1313
)
1414

1515
require (
16+
github.com/containerd/cgroups/v3 v3.0.0-20221231153306-e91481ea07e9 // indirect
17+
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
1618
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
19+
github.com/docker/go-units v0.4.0 // indirect
1720
github.com/dustin/go-humanize v1.0.0 // indirect
1821
github.com/gin-gonic/gin v1.8.2 // indirect
1922
github.com/goccy/go-json v0.10.0 // indirect
23+
github.com/godbus/dbus/v5 v5.0.4 // indirect
24+
github.com/gogo/protobuf v1.3.2 // indirect
2025
github.com/golang/protobuf v1.5.0 // indirect
2126
github.com/golang/snappy v0.0.1 // indirect
2227
github.com/google/uuid v1.3.0 // indirect
@@ -29,6 +34,7 @@ require (
2934
github.com/minio/sha256-simd v1.0.0 // indirect
3035
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
3136
github.com/modern-go/reflect2 v1.0.2 // indirect
37+
github.com/opencontainers/runtime-spec v1.0.2 // indirect
3238
github.com/rogpeppe/go-internal v1.8.0 // indirect
3339
github.com/rs/xid v1.4.0 // indirect
3440
github.com/russross/blackfriday/v2 v2.1.0 // indirect

Diff for: go.sum

+41
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
1+
github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA=
2+
github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA=
3+
github.com/containerd/cgroups/v3 v3.0.0-20221231153306-e91481ea07e9 h1:fNZ4clZ+upbgzB1wvtqgovK2H/d8DyYjKHK26C+GIzc=
4+
github.com/containerd/cgroups/v3 v3.0.0-20221231153306-e91481ea07e9/go.mod h1:/vtwk1VXrtoa5AaZLkypuOJgA/6DyPMZHJPGQNtlHnw=
5+
github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
6+
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
17
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
28
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
39
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
410
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
511
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
612
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
13+
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
14+
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
715
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
816
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
917
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
@@ -26,6 +34,10 @@ github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo=
2634
github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
2735
github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA=
2836
github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
37+
github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA=
38+
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
39+
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
40+
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
2941
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
3042
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
3143
github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4=
@@ -43,6 +55,8 @@ github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad
4355
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
4456
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
4557
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
58+
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
59+
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
4660
github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
4761
github.com/klauspost/compress v1.15.13 h1:NFn1Wr8cfnenSJSA46lLq4wHCcBzKTSjnBIexDMMOV0=
4862
github.com/klauspost/compress v1.15.13/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
@@ -77,6 +91,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
7791
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
7892
github.com/nsqio/go-nsq v1.1.0 h1:PQg+xxiUjA7V+TLdXw7nVrJ5Jbl3sN86EhGCQj4+FYE=
7993
github.com/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY=
94+
github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0=
95+
github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
8096
github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
8197
github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
8298
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
@@ -111,23 +127,48 @@ github.com/urfave/cli/v3 v3.0.0-alpha h1:Cbc2CVsHVveE6SvoyOetqQKYNhxKsgp3bTlqH1n
111127
github.com/urfave/cli/v3 v3.0.0-alpha/go.mod h1:o9y/j7PxPajDAEl+kKAdwePXiN/ZA5IDRjCCa8/Wu6s=
112128
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
113129
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
130+
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
131+
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
132+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
133+
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
134+
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
114135
golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8=
115136
golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80=
137+
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
138+
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
139+
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
140+
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
141+
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
142+
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
116143
golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU=
117144
golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
145+
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
146+
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
147+
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
148+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
149+
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
118150
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
151+
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
119152
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
120153
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
121154
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
122155
golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
123156
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
157+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
124158
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
159+
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
125160
golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
126161
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
127162
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
128163
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
164+
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
165+
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
166+
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
167+
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
168+
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
129169
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
130170
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
171+
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
131172
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
132173
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
133174
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

Diff for: spawncmd/consts/consts.go

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package consts
2+
3+
const (
4+
SpawnEnvVar = "HPCGAME_SPAWN"
5+
SpawnEnvVarValue = "e644d75c796f4c2a94a76a99d7056f80"
6+
)

Diff for: spawncmd/models/judgedata.go

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package models
2+
3+
type RunJudgeScriptData struct {
4+
ProblemID string `json:"problem-id"`
5+
SolutionID string `json:"solution-id"`
6+
}

Diff for: spawncmd/models/resource.go

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package models
2+
3+
type ResourceControl struct {
4+
}

Diff for: spawncmd/spawn.go

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package spawncmd
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"os/exec"
7+
"path/filepath"
8+
"sync"
9+
10+
"github.com/containerd/cgroups/v3"
11+
"github.com/containerd/cgroups/v3/cgroup1"
12+
"github.com/lcpu-club/hpcjudge/common"
13+
"github.com/lcpu-club/hpcjudge/spawncmd/models"
14+
"github.com/satori/uuid"
15+
)
16+
17+
type Spawner struct {
18+
cgroupBasePath string
19+
currentID int64
20+
currentIDLock *sync.Mutex
21+
}
22+
23+
var ErrCgroupsV1NotAvailable = fmt.Errorf("cgroups v1 not available")
24+
25+
func NewSpawner(cgroupBasePath string) *Spawner {
26+
return &Spawner{
27+
cgroupBasePath: cgroupBasePath,
28+
}
29+
}
30+
31+
func (s *Spawner) calcCgroupPath(sub string) string {
32+
sb := []byte(sub)
33+
haystack := []byte("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_.")
34+
for i := range sb {
35+
if !bytes.Contains(haystack, []byte{sb[i]}) {
36+
sb[i] = '-'
37+
}
38+
}
39+
return filepath.Join(s.cgroupBasePath, string(sb))
40+
}
41+
42+
func (s *Spawner) Init() error {
43+
if cgroups.Mode() != cgroups.Legacy && cgroups.Mode() != cgroups.Hybrid {
44+
return ErrCgroupsV1NotAvailable
45+
}
46+
return nil
47+
}
48+
49+
func (s *Spawner) ResourceControlToCgroup(path string, res *models.ResourceControl) error {
50+
cg, err := cgroup1.New(cgroup1.StaticPath(path))
51+
if err != nil {
52+
return err
53+
}
54+
return nil
55+
}
56+
57+
func (s *Spawner) SpawnCommand(cmd *exec.Cmd, user string, res *models.ResourceControl, id string) error {
58+
if id == "" {
59+
id = uuid.NewV4().String()
60+
}
61+
cmd, err := common.CommandUseUser(cmd, user)
62+
if err != nil {
63+
return err
64+
}
65+
s.ResourceControlToCgroup(s.calcCgroupPath(id), res)
66+
return nil
67+
}

0 commit comments

Comments
 (0)