wmj-test/src/app_model.go

168 lines
3.2 KiB
Go

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"
}