mirror of
https://github.com/cuigh/swirl
synced 2024-12-28 23:02:02 +00:00
128 lines
2.5 KiB
Go
128 lines
2.5 KiB
Go
package biz
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/cuigh/auxo/net/web"
|
|
"github.com/cuigh/swirl/biz/docker"
|
|
"github.com/cuigh/swirl/dao"
|
|
"github.com/cuigh/swirl/model"
|
|
)
|
|
|
|
// Stack return a stack biz instance.
|
|
var Stack = &stackBiz{}
|
|
|
|
type stackBiz struct {
|
|
}
|
|
|
|
func (b *stackBiz) List(args *model.StackListArgs) (stacks []*model.Stack, err error) {
|
|
var (
|
|
upStacks, internalStacks []*model.Stack
|
|
upMap = make(map[string]*model.Stack)
|
|
)
|
|
|
|
// load real stacks
|
|
upStacks, err = docker.StackList()
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, stack := range upStacks {
|
|
upMap[stack.Name] = stack
|
|
}
|
|
|
|
// load stack definitions
|
|
do(func(d dao.Interface) {
|
|
internalStacks, err = d.StackList()
|
|
})
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
// merge stacks and definitions
|
|
for _, stack := range internalStacks {
|
|
stack.Internal = true
|
|
if s, ok := upMap[stack.Name]; ok {
|
|
stack.Services = s.Services
|
|
delete(upMap, stack.Name)
|
|
}
|
|
if !b.filter(stack, args) {
|
|
stacks = append(stacks, stack)
|
|
}
|
|
}
|
|
for _, stack := range upMap {
|
|
if !b.filter(stack, args) {
|
|
stacks = append(stacks, stack)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func (b *stackBiz) filter(stack *model.Stack, args *model.StackListArgs) bool {
|
|
if args.Name != "" {
|
|
if !strings.Contains(strings.ToLower(stack.Name), strings.ToLower(args.Name)) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
switch args.Filter {
|
|
case "up":
|
|
if len(stack.Services) == 0 {
|
|
return true
|
|
}
|
|
case "internal":
|
|
if !stack.Internal {
|
|
return true
|
|
}
|
|
case "external":
|
|
if stack.Internal {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func (b *stackBiz) Create(stack *model.Stack, user web.User) (err error) {
|
|
do(func(d dao.Interface) {
|
|
err = d.StackCreate(stack)
|
|
if err == nil {
|
|
Event.CreateStack(model.EventActionCreate, stack.Name, user)
|
|
}
|
|
})
|
|
return
|
|
}
|
|
|
|
func (b *stackBiz) Get(name string) (stack *model.Stack, err error) {
|
|
do(func(d dao.Interface) {
|
|
stack, err = d.StackGet(name)
|
|
})
|
|
return
|
|
}
|
|
|
|
func (b *stackBiz) Update(stack *model.Stack, user web.User) (err error) {
|
|
do(func(d dao.Interface) {
|
|
err = d.StackUpdate(stack)
|
|
if err == nil {
|
|
Event.CreateStack(model.EventActionUpdate, stack.Name, user)
|
|
}
|
|
})
|
|
return
|
|
}
|
|
|
|
func (b *stackBiz) Delete(name string, user web.User) (err error) {
|
|
do(func(d dao.Interface) {
|
|
err = d.StackDelete(name)
|
|
if err == nil {
|
|
Event.CreateStack(model.EventActionDelete, name, user)
|
|
}
|
|
})
|
|
return
|
|
}
|
|
|
|
// Migrate migrates old archives to stack collection.
|
|
func (b *stackBiz) Migrate() {
|
|
do(func(d dao.Interface) {
|
|
d.StackMigrate()
|
|
})
|
|
}
|