mirror of
https://github.com/cuigh/swirl
synced 2024-12-30 15:53:24 +00:00
188 lines
4.6 KiB
Go
188 lines
4.6 KiB
Go
package controller
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"github.com/cuigh/auxo/data/set"
|
|
"github.com/cuigh/auxo/net/web"
|
|
"github.com/cuigh/swirl/biz"
|
|
"github.com/cuigh/swirl/biz/docker"
|
|
"github.com/cuigh/swirl/model"
|
|
)
|
|
|
|
// TemplateController is a controller of service template
|
|
type TemplateController struct {
|
|
List web.HandlerFunc `path:"/" name:"template.list" authorize:"!" desc:"service template list page"`
|
|
New web.HandlerFunc `path:"/new" name:"template.new" authorize:"!" desc:"new service template page"`
|
|
Create web.HandlerFunc `path:"/new" method:"post" name:"template.create" authorize:"!" desc:"create service template"`
|
|
Edit web.HandlerFunc `path:"/:id/edit" name:"template.edit" authorize:"!" desc:"edit service template page"`
|
|
Update web.HandlerFunc `path:"/:id/edit" method:"post" name:"template.update" authorize:"!" desc:"update service template"`
|
|
Delete web.HandlerFunc `path:"/delete" method:"post" name:"template.delete" authorize:"!" desc:"delete service template"`
|
|
}
|
|
|
|
// Template creates an instance of TemplateController
|
|
func Template() (c *TemplateController) {
|
|
return &TemplateController{
|
|
List: templateList,
|
|
New: templateNew,
|
|
Create: templateCreate,
|
|
Edit: templateEdit,
|
|
Update: templateUpdate,
|
|
Delete: templateDelete,
|
|
}
|
|
}
|
|
|
|
func templateList(ctx web.Context) error {
|
|
args := &model.TemplateListArgs{}
|
|
err := ctx.Bind(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
args.PageSize = model.PageSize
|
|
if args.PageIndex == 0 {
|
|
args.PageIndex = 1
|
|
}
|
|
tpls, totalCount, err := biz.Template.List(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
m := newPagerModel(ctx, totalCount, model.PageSize, args.PageIndex).
|
|
Set("Name", args.Name).
|
|
Set("Templates", tpls)
|
|
return ctx.Render("service/template/list", m)
|
|
}
|
|
|
|
func templateNew(ctx web.Context) error {
|
|
service := model.ServiceInfo{}
|
|
networks, err := docker.NetworkList()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
secrets, _, err := docker.SecretList("", 1, 100)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
configs, _, err := docker.ConfigList("", 1, 100)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
registries, err := biz.Registry.List()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
m := newModel(ctx).Set("Action", "New").Set("Service", service).Set("Registries", registries).
|
|
Set("Networks", networks).Set("CheckedNetworks", set.StringSet{}).
|
|
Set("Secrets", secrets).Set("Configs", configs)
|
|
return ctx.Render("service/template/edit", m)
|
|
}
|
|
|
|
func templateCreate(ctx web.Context) error {
|
|
info := &model.ServiceInfo{}
|
|
err := ctx.Bind(info)
|
|
if err == nil {
|
|
var (
|
|
content []byte
|
|
tpl = &model.Template{Name: info.Name}
|
|
)
|
|
|
|
info.Normalize()
|
|
info.Name = ""
|
|
content, err = json.Marshal(info)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
tpl.Content = string(content)
|
|
err = biz.Template.Create(tpl, ctx.User())
|
|
}
|
|
return ajaxResult(ctx, err)
|
|
}
|
|
|
|
// nolint: gocyclo
|
|
func templateEdit(ctx web.Context) error {
|
|
id := ctx.P("id")
|
|
tpl, err := biz.Template.Get(id)
|
|
if err != nil {
|
|
return err
|
|
} else if tpl == nil {
|
|
return web.ErrNotFound
|
|
}
|
|
|
|
service := &model.ServiceInfo{}
|
|
err = json.Unmarshal([]byte(tpl.Content), service)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
service.Normalize()
|
|
|
|
service.Name = tpl.Name
|
|
if service.Registry != "" {
|
|
var registry *model.Registry
|
|
registry, err = biz.Registry.Get(service.Registry)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
service.RegistryURL = registry.URL
|
|
}
|
|
|
|
networks, err := docker.NetworkList()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
secrets, _, err := docker.SecretList("", 1, 100)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
configs, _, err := docker.ConfigList("", 1, 100)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
registries, err := biz.Registry.List()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
names, err := docker.NetworkNames(service.Networks...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
checkedNetworks := set.NewStringSet(names...)
|
|
m := newModel(ctx).Set("Action", "Edit").Set("Service", service).Set("Registries", registries).
|
|
Set("Networks", networks).Set("CheckedNetworks", checkedNetworks).
|
|
Set("Secrets", secrets).Set("Configs", configs)
|
|
return ctx.Render("service/template/edit", m)
|
|
}
|
|
|
|
func templateUpdate(ctx web.Context) error {
|
|
info := &model.ServiceInfo{}
|
|
err := ctx.Bind(info)
|
|
if err == nil {
|
|
var (
|
|
content []byte
|
|
tpl = &model.Template{
|
|
ID: ctx.P("id"),
|
|
Name: info.Name,
|
|
}
|
|
)
|
|
|
|
info.Normalize()
|
|
info.Name = ""
|
|
content, err = json.Marshal(info)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
tpl.Content = string(content)
|
|
err = biz.Template.Update(tpl, ctx.User())
|
|
}
|
|
return ajaxResult(ctx, err)
|
|
}
|
|
|
|
func templateDelete(ctx web.Context) error {
|
|
id := ctx.F("id")
|
|
err := biz.Template.Delete(id, ctx.User())
|
|
return ajaxResult(ctx, err)
|
|
}
|