package k8s_manager import ( "fmt" v1 "k8s.io/api/core/v1" "strings" "unicode" ) type AppModel struct { Id int AppName string UserName string Image string Command string Comment string Env string SvcName string Ports string } func (*AppModel) TableName() string { return "app" } func GetApps(username string) []AppModel { db := DB() ans := make([]AppModel, 0) db.Where("user_name = ?", username).Find(&ans) return ans } func (a *AppModel) Fill() error { db := DB() res := db.First(a, a.Id) return res.Error } func (a *AppModel) Update() error { if a.SvcName == "" { a.SvcName = "svc" } a.SvcName = strings.TrimPrefix(a.SvcName, a.NamePrefix()+"-") db := DB() db.Save(a) return nil } func (a *AppModel) Create() error { if a.SvcName == "" { a.SvcName = "svc" } a.SvcName = strings.TrimPrefix(a.SvcName, a.NamePrefix()+"-") db := DB() db.Create(a) return nil } func (a *AppModel) Delete() error { db := DB() db.Delete(a, a.Id) return nil } func (a *AppModel) NamePrefix() string { prefix := fmt.Sprintf("%s-%s", a.UserName, a.AppName) ans := strings.Builder{} for _, c := range prefix { if (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '-' { ans.WriteRune(c) } else { ans.WriteString(fmt.Sprintf("-%d-", c)) } } return ans.String() } func (a *AppModel) PodName() string { return fmt.Sprintf("%s-pod", a.NamePrefix()) } func (a *AppModel) ContainerName() string { return fmt.Sprintf("%s-container", a.NamePrefix()) } func (a *AppModel) ServiceName() string { if len(a.GetPorts()) == 0 { return "" } if strings.TrimSpace(a.SvcName) != "" { return fmt.Sprintf("%s-%s", a.NamePrefix(), a.SvcName) } return a.DefaultServiceName() } func (a *AppModel) DefaultServiceName() string { return fmt.Sprintf("%s-svc", a.NamePrefix()) } func (a *AppModel) DeploymentName() string { return fmt.Sprintf("%s-deployment", a.NamePrefix()) } func (a *AppModel) GetCommandOrBlack() []string { if strings.TrimSpace(a.Command) != "" { return []string{"/bin/sh", "-c", a.Command} } else { return nil } } func (a *AppModel) GetLabel() (string, string) { return "cg-label", fmt.Sprintf("%s-label", a.NamePrefix()) } func (a *AppModel) GetEnv() []v1.EnvVar { if strings.TrimSpace(a.Env) == "" { return nil } sep1 := strings.Split(a.Env, " ") ans := make([]v1.EnvVar, len(sep1)) for i, v := range sep1 { kv := strings.SplitN(v, "=", 2) ans[i].Name = kv[0] if len(kv) == 2 { ans[i].Value = kv[1] } } return ans } func (a *AppModel) GetPorts() []int32 { ans := make([]int32, 0) var cur int32 = 0 for _, c := range a.Ports { if unicode.IsNumber(c) { cur = cur*10 + (c - '0') } else if cur > 0 { ans = append(ans, cur) cur = 0 } } if cur > 0 { ans = append(ans, cur) } return ans } func (a *AppModel) IngressName() string { return fmt.Sprintf("%s-ingress", a.NamePrefix()) } func (a *AppModel) PersistentVolumeName() string { return a.UserName + "-pv" } func (a *AppModel) NFSPath() string { return "/data/" + a.UserName } func (a *AppModel) PersistentVolumeClaimName() string { return a.NamePrefix() + "-pvc" } func (a *AppModel) StorageClassName() string { return a.NamePrefix() + "-storage-class" }