From 85e6b3b16fc1089c2525e644fc3a7f902b164027 Mon Sep 17 00:00:00 2001 From: ACoolName Date: Sun, 12 May 2024 22:19:10 +0300 Subject: [PATCH] added more server capabilities --- .vscode/launch.json | 15 ++++++++++++++ go.work.sum | 28 +++++++++++++++----------- servers/servers.go | 49 +++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 78 insertions(+), 14 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..0f8103e --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Package", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/go.work.sum b/go.work.sum index 94d8d18..d434a0a 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,12 +1,16 @@ -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/servers/servers.go b/servers/servers.go index e3f688f..353e7a4 100644 --- a/servers/servers.go +++ b/servers/servers.go @@ -11,6 +11,7 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/image" "github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/volume" @@ -107,6 +108,46 @@ func transformContainerPortsToModel(ports []types.Port) []models.Port { return modelPorts } +func convertLabelsToMap(v any) (map[string]string, error) { + data, err := json.Marshal(v) + if err != nil { + return nil, err + } + x := map[string]string{} + json.Unmarshal(data, &x) + return x, nil +} + +func (con Connection) CreateServer(ctx *gin.Context) { + claims, exists := ctx.Get("claims") + if !exists { + ctx.AbortWithStatus(500) + } + imageId := ctx.Param("image_id") + imageList, err := con.apiClient.ImageList(context.Background(), image.ListOptions{All: true, Filters: filters.NewArgs(filters.Arg("reference", imageId))}) + if err != nil { + ctx.AbortWithError(400, err) + } + if len(imageList) == 0 { + ctx.AbortWithStatusJSON(404, "imageNotFound") + return + } + imageSummary := imageList[0] + labels, err := convertLabelsToMap(VolumeLabels{OwnerId: claims.(*auth.AuthClaims).Username, ImageId: imageSummary.RepoTags[0], Type: "GAME"}) + if err != nil { + ctx.AbortWithError(400, err) + } + volumeResponse, err := con.apiClient.VolumeCreate(context.Background(), volume.CreateOptions{ + Labels: labels, + }) + if err != nil { + ctx.AbortWithError(500, err) + } + + ctx.JSON(200, volumeResponse.Name) + +} + func (con Connection) StartServer(ctx *gin.Context) { serverId := ctx.Param("server_id") claims, exists := ctx.Get("claims") @@ -162,7 +203,7 @@ func (con Connection) StartServer(ctx *gin.Context) { Labels: jsonLabels, }, &container.HostConfig{ - AutoRemove: false, + AutoRemove: true, Mounts: []mount.Mount{{Source: serverInfo.Id, Target: image.Config.WorkingDir, Type: "volume"}}, }, &network.NetworkingConfig{}, @@ -172,6 +213,9 @@ func (con Connection) StartServer(ctx *gin.Context) { if err != nil { ctx.AbortWithError(500, err) } + if err := con.apiClient.ContainerStart(ctx, response.ID, container.StartOptions{}); err != nil { + ctx.AbortWithError(500, err) + } ctx.JSON(200, response.ID) } @@ -210,6 +254,7 @@ func LoadGroup(group *gin.RouterGroup, mongo_client *mongo.Client) { defer apiClient.Close() connection := Connection{connection: mongo_client, apiClient: apiClient} - group.Use(auth.AuthorizedTo(models.Create)).POST("/:server_id/start", connection.StartServer) + group.Use(auth.AuthorizedTo(models.Start)).POST("/:server_id/start", connection.StartServer) + group.Use(auth.AuthorizedTo(models.Create)).POST("/", connection.CreateServer) group.GET("/", connection.GetServers) }