first step on fork app
This commit is contained in:
parent
8ec0e3eb05
commit
9e748a50df
1
go.mod
1
go.mod
|
|
@ -45,6 +45,7 @@ require (
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
|
github.com/otiai10/copy v1.9.0 // indirect
|
||||||
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
|
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
|
||||||
github.com/spf13/pflag v1.0.5 // indirect
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
github.com/ugorji/go/codec v1.2.9 // indirect
|
github.com/ugorji/go/codec v1.2.9 // indirect
|
||||||
|
|
|
||||||
6
go.sum
6
go.sum
|
|
@ -193,6 +193,12 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m
|
||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
github.com/onsi/ginkgo/v2 v2.4.0 h1:+Ig9nvqgS5OBSACXNk15PLdp0U9XPYROt9CFzVdFGIs=
|
github.com/onsi/ginkgo/v2 v2.4.0 h1:+Ig9nvqgS5OBSACXNk15PLdp0U9XPYROt9CFzVdFGIs=
|
||||||
github.com/onsi/gomega v1.23.0 h1:/oxKu9c2HVap+F3PfKort2Hw5DEU+HGlW8n+tguWsys=
|
github.com/onsi/gomega v1.23.0 h1:/oxKu9c2HVap+F3PfKort2Hw5DEU+HGlW8n+tguWsys=
|
||||||
|
github.com/otiai10/copy v1.9.0 h1:7KFNiCgZ91Ru4qW4CWPf/7jqtxLagGRmIxWldPP9VY4=
|
||||||
|
github.com/otiai10/copy v1.9.0/go.mod h1:hsfX19wcn0UWIHUQ3/4fHuehhk2UyArQ9dVFAn3FczI=
|
||||||
|
github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
|
||||||
|
github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
|
||||||
|
github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
|
||||||
|
github.com/otiai10/mint v1.4.0/go.mod h1:gifjb2MYOoULtKLqUAEILUG/9KONW6f7YsJ6vQLTlFI=
|
||||||
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
|
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
|
||||||
github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
|
github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
|
||||||
github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
|
github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,13 @@ package controller
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
cp "github.com/otiai10/copy"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/thoas/go-funk"
|
"github.com/thoas/go-funk"
|
||||||
|
k8s_manager "k8s-manager/src"
|
||||||
"k8s-manager/src/model"
|
"k8s-manager/src/model"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -49,22 +52,22 @@ func statusString(a *AppViewModel) string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func AppPage(c *gin.Context) {
|
//func AppPage(c *gin.Context) {
|
||||||
c.File("template/app_view.html")
|
// c.File("template/app_view.html")
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
func AppMiddleware(c *gin.Context) {
|
//func AppMiddleware(c *gin.Context) {
|
||||||
app := &model.AppModel{}
|
// app := &model.AppModel{}
|
||||||
err := c.ShouldBindJSON(&app)
|
// err := c.ShouldBindJSON(&app)
|
||||||
if err == nil {
|
// if err == nil {
|
||||||
username := c.MustGet("username")
|
// username := c.MustGet("username")
|
||||||
if app.UserName != username {
|
// if app.UserName != username {
|
||||||
c.JSON(http.StatusUnauthorized, gin.H{"msg": "user error."})
|
// c.JSON(http.StatusUnauthorized, gin.H{"msg": "user error."})
|
||||||
c.Abort()
|
// c.Abort()
|
||||||
}
|
// }
|
||||||
c.Set("app", app)
|
// c.Set("app", app)
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
func CreateUpdateDeleteApp(c *gin.Context) {
|
func CreateUpdateDeleteApp(c *gin.Context) {
|
||||||
app := &model.AppModel{}
|
app := &model.AppModel{}
|
||||||
|
|
@ -114,3 +117,39 @@ func GetUsername(c *gin.Context) {
|
||||||
username := c.MustGet("username").(string)
|
username := c.MustGet("username").(string)
|
||||||
c.JSON(http.StatusOK, gin.H{"username": username})
|
c.JSON(http.StatusOK, gin.H{"username": username})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ForkApp(c *gin.Context) {
|
||||||
|
newApp := &model.AppModel{}
|
||||||
|
err := c.BindJSON(newApp)
|
||||||
|
if err != nil {
|
||||||
|
log.WithError(err).Error("ForkApp BindJson")
|
||||||
|
k8s_manager.GinError(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
originApp := &model.AppModel{Id: newApp.OriginId}
|
||||||
|
err = originApp.Fill()
|
||||||
|
if err != nil {
|
||||||
|
log.WithError(err).Error("ForkApp Fill")
|
||||||
|
k8s_manager.GinError(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = os.RemoveAll(newApp.NFSPath())
|
||||||
|
if err != nil {
|
||||||
|
log.WithError(err).Error("ForkApp RemoveAll")
|
||||||
|
k8s_manager.GinError(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = cp.Copy(originApp.NFSPath(), newApp.NFSPath())
|
||||||
|
if err != nil {
|
||||||
|
log.WithError(err).Error("ForkApp Copy")
|
||||||
|
k8s_manager.GinError(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = newApp.Create()
|
||||||
|
if err != nil {
|
||||||
|
log.WithError(err).Error("ForkApp Create")
|
||||||
|
k8s_manager.GinError(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
k8s_manager.GinOk(c, "ok")
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"k8s-manager/src"
|
"k8s-manager/src"
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
"unicode"
|
"unicode"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -20,6 +21,10 @@ type AppModel struct {
|
||||||
SvcRemovePrefix bool
|
SvcRemovePrefix bool
|
||||||
Ports string
|
Ports string
|
||||||
PersistentPath string
|
PersistentPath string
|
||||||
|
OriginId int
|
||||||
|
CreateTime time.Time
|
||||||
|
UpdateTime time.Time
|
||||||
|
IsPublished bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*AppModel) TableName() string {
|
func (*AppModel) TableName() string {
|
||||||
|
|
@ -51,6 +56,7 @@ func (a *AppModel) fillDefaults() {
|
||||||
|
|
||||||
func (a *AppModel) Update() error {
|
func (a *AppModel) Update() error {
|
||||||
a.fillDefaults()
|
a.fillDefaults()
|
||||||
|
a.UpdateTime = time.Now()
|
||||||
db := k8s_manager.DB()
|
db := k8s_manager.DB()
|
||||||
db.Save(a)
|
db.Save(a)
|
||||||
return nil
|
return nil
|
||||||
|
|
@ -58,6 +64,8 @@ func (a *AppModel) Update() error {
|
||||||
|
|
||||||
func (a *AppModel) Create() error {
|
func (a *AppModel) Create() error {
|
||||||
a.fillDefaults()
|
a.fillDefaults()
|
||||||
|
a.CreateTime = time.Now()
|
||||||
|
a.UpdateTime = time.Now()
|
||||||
db := k8s_manager.DB()
|
db := k8s_manager.DB()
|
||||||
db.Create(a)
|
db.Create(a)
|
||||||
return nil
|
return nil
|
||||||
|
|
@ -70,7 +78,11 @@ func (a *AppModel) Delete() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AppModel) NamePrefix() string {
|
func (a *AppModel) NamePrefix() string {
|
||||||
prefix := fmt.Sprintf("%s-%s", a.UserName, a.AppName)
|
t := "app"
|
||||||
|
if a.OriginId > 0 {
|
||||||
|
t = "fork"
|
||||||
|
}
|
||||||
|
prefix := fmt.Sprintf("%s-%s-%s-%d", t, a.UserName, a.AppName, a.Id)
|
||||||
ans := strings.Builder{}
|
ans := strings.Builder{}
|
||||||
for _, c := range prefix {
|
for _, c := range prefix {
|
||||||
if (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '-' {
|
if (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '-' {
|
||||||
|
|
|
||||||
17
src/utils.go
17
src/utils.go
|
|
@ -1,5 +1,22 @@
|
||||||
package k8s_manager
|
package k8s_manager
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
func UnnamedPointer[T any](v T) *T {
|
func UnnamedPointer[T any](v T) *T {
|
||||||
return &v
|
return &v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GinError(c *gin.Context, code int, msg string) {
|
||||||
|
c.JSON(code, gin.H{"ok": false, "msg": msg})
|
||||||
|
}
|
||||||
|
|
||||||
|
func GinOk(c *gin.Context, msg string) {
|
||||||
|
c.JSON(http.StatusOK, gin.H{"ok": true, "msg": msg})
|
||||||
|
}
|
||||||
|
|
||||||
|
func GinOkData(c *gin.Context, data interface{}) {
|
||||||
|
c.JSON(http.StatusOK, gin.H{"ok": true, "data": data})
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue