swirl/biz/stack.go
2018-05-26 14:57:32 +08:00

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()
})
}