diff --git a/src/controller/app_controller.go b/src/controller/app_controller.go index a4bc488..651d3e7 100644 --- a/src/controller/app_controller.go +++ b/src/controller/app_controller.go @@ -6,8 +6,8 @@ import ( cp "github.com/otiai10/copy" log "github.com/sirupsen/logrus" "github.com/thoas/go-funk" - k8s_manager "k8s-manager/src" "k8s-manager/src/model" + k8s_manager "k8s-manager/src/utils" "net/http" "os" "strings" diff --git a/src/controller/deployment_controller.go b/src/controller/deployment_controller.go index 565738f..90137db 100644 --- a/src/controller/deployment_controller.go +++ b/src/controller/deployment_controller.go @@ -3,9 +3,9 @@ package controller import ( "github.com/gin-gonic/gin" log "github.com/sirupsen/logrus" - k8s_manager "k8s-manager/src" "k8s-manager/src/model" "k8s-manager/src/service" + k8s_manager "k8s-manager/src/utils" "k8s.io/api/apps/v1" "net/http" "strconv" diff --git a/src/controller/image_controller.go b/src/controller/image_controller.go new file mode 100644 index 0000000..efa616b --- /dev/null +++ b/src/controller/image_controller.go @@ -0,0 +1,61 @@ +package controller + +import ( + "github.com/gin-gonic/gin" + "gorm.io/gorm" + "k8s-manager/src/model" + utils "k8s-manager/src/utils" + "net/http" +) + +func AddImage(c *gin.Context) { + image := &model.ImageModel{} + if utils.GinErrorCheck(c, c.BindJSON(image)) { + return + } + username := c.MustGet("username").(string) + image.UserName = username + image.Create() + utils.GinOk(c, "ok") +} + +func DeleteImage(c *gin.Context) { + image := &model.ImageModel{} + if utils.GinErrorCheck(c, c.BindJSON(image)) { + return + } + username := c.MustGet("username").(string) + oldImage := &model.ImageModel{Model: gorm.Model{ID: image.ID}} + oldImage.Fill() + if oldImage.UserName != username { + utils.GinError(c, http.StatusUnauthorized, "username error") + return + } + image.Delete() +} + +func UpdateImage(c *gin.Context) { + image := &model.ImageModel{} + if utils.GinErrorCheck(c, c.BindJSON(image)) { + return + } + username := c.MustGet("username").(string) + oldImage := &model.ImageModel{Model: gorm.Model{ID: image.ID}} + oldImage.Fill() + if oldImage.UserName != username { + utils.GinError(c, http.StatusUnauthorized, "username error") + return + } + image.Save() +} + +func MyImages(c *gin.Context) { + username := c.MustGet("username").(string) + myImages := model.GetMyImages(username) + c.JSON(http.StatusOK, gin.H{"images": myImages}) +} + +func PublicImages(c *gin.Context) { + myImages := model.GetPublicImages() + c.JSON(http.StatusOK, gin.H{"images": myImages}) +} diff --git a/src/model/data_model.go b/src/model/data_model.go new file mode 100644 index 0000000..1a58597 --- /dev/null +++ b/src/model/data_model.go @@ -0,0 +1,23 @@ +package model + +import ( + "gorm.io/gorm" + k8s_manager "k8s-manager/src" +) + +type DataModel struct { + gorm.Model + Type string + Name string + Comment string + AccessInfo string +} + +func (*DataModel) TableName() string { + return "data" +} + +func (d *DataModel) Fill() { + db := k8s_manager.DB() + db.First(d, d.ID) +} diff --git a/src/model/image_model.go b/src/model/image_model.go new file mode 100644 index 0000000..778194c --- /dev/null +++ b/src/model/image_model.go @@ -0,0 +1,55 @@ +package model + +import ( + "gorm.io/gorm" + k8s_manager "k8s-manager/src" +) + +type ImageModel struct { + gorm.Model + Image string + Comment string + Command string + Env string + Port string + UserName string + IsPublished bool +} + +func (*ImageModel) TableName() string { + return "images" +} + +func (i *ImageModel) Fill() { + db := k8s_manager.DB() + db.First(i, i.ID) +} + +func (i *ImageModel) Create() { + db := k8s_manager.DB() + db.Create(i) +} + +func (i *ImageModel) Save() { + db := k8s_manager.DB() + db.Save(i) +} + +func (i *ImageModel) Delete() { + db := k8s_manager.DB() + db.Delete(i) +} + +func GetMyImages(username string) []ImageModel { + db := k8s_manager.DB() + ans := make([]ImageModel, 0) + db.Where(&ImageModel{UserName: username}).Find(&ans) + return ans +} + +func GetPublicImages() []ImageModel { + db := k8s_manager.DB() + ans := make([]ImageModel, 0) + db.Where(&ImageModel{IsPublished: true}).Find(&ans) + return ans +} diff --git a/src/model/project_model.go b/src/model/project_model.go index 71eb139..c06efed 100644 --- a/src/model/project_model.go +++ b/src/model/project_model.go @@ -22,33 +22,6 @@ func (*ProjectModel) TableName() string { return "projects" } -type ImageModel struct { - gorm.Model - Image string - Comment string - Command string - Env string - Port string - UserName string - IsPublished bool -} - -func (*ImageModel) TableName() string { - return "images" -} - -type DataModel struct { - gorm.Model - Type string - Name string - Comment string - AccessInfo string -} - -func (*DataModel) TableName() string { - return "data" -} - type RunningProject struct { Project *ProjectModel StartTime *time.Time diff --git a/src/service/k8s_service.go b/src/service/k8s_service.go index c86d2e8..5792afa 100644 --- a/src/service/k8s_service.go +++ b/src/service/k8s_service.go @@ -7,6 +7,7 @@ import ( "github.com/thoas/go-funk" "k8s-manager/src" "k8s-manager/src/model" + "k8s-manager/src/utils" appv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" netv1 "k8s.io/api/networking/v1" @@ -96,7 +97,7 @@ func (c *K8sClient) UpdateDeployment(app *model.AppModel) { Labels: l, }, Spec: appv1.DeploymentSpec{ - Replicas: k8s_manager.UnnamedPointer(int32(1)), + Replicas: utils.UnnamedPointer(int32(1)), Selector: &metav1.LabelSelector{ MatchLabels: l, }, @@ -122,7 +123,7 @@ func (c *K8sClient) UpdateDeployment(app *model.AppModel) { }, Ports: containerPorts, SecurityContext: &v1.SecurityContext{ - RunAsUser: k8s_manager.UnnamedPointer(int64(0)), + RunAsUser: utils.UnnamedPointer(int64(0)), }, }}, Volumes: []v1.Volume{ @@ -315,7 +316,7 @@ func (c *K8sClient) UpdateIngress(a *model.AppModel) { Annotations: annotations, }, Spec: netv1.IngressSpec{ - IngressClassName: k8s_manager.UnnamedPointer("nginx"), + IngressClassName: utils.UnnamedPointer("nginx"), Rules: []netv1.IngressRule{ { IngressRuleValue: netv1.IngressRuleValue{ @@ -323,7 +324,7 @@ func (c *K8sClient) UpdateIngress(a *model.AppModel) { Paths: []netv1.HTTPIngressPath{ { Path: "/svc/" + a.URLPrefix() + "(/|$)(.*)", - PathType: k8s_manager.UnnamedPointer(netv1.PathTypePrefix), + PathType: utils.UnnamedPointer(netv1.PathTypePrefix), Backend: netv1.IngressBackend{ Service: &netv1.IngressServiceBackend{ Name: a.ServiceName(), diff --git a/src/utils.go b/src/utils/utils.go similarity index 71% rename from src/utils.go rename to src/utils/utils.go index 2bc8f72..c9238ef 100644 --- a/src/utils.go +++ b/src/utils/utils.go @@ -1,4 +1,4 @@ -package k8s_manager +package utils import ( "github.com/gin-gonic/gin" @@ -20,3 +20,11 @@ func GinOk(c *gin.Context, msg string) { func GinOkData(c *gin.Context, data interface{}) { c.JSON(http.StatusOK, gin.H{"ok": true, "data": data}) } + +func GinErrorCheck(c *gin.Context, err error) bool { + if err != nil { + GinError(c, http.StatusBadRequest, err.Error()) + return true + } + return false +}