github.com/docker/compose-on-kubernetes@v0.5.0/internal/stackresources/stackstate.go (about) 1 package stackresources 2 3 import ( 4 "fmt" 5 6 appstypes "k8s.io/api/apps/v1" 7 coretypes "k8s.io/api/core/v1" 8 ) 9 10 // ObjKey returns the key of a k8s object 11 func ObjKey(namespace, name string) string { 12 if namespace == "" { 13 return name 14 } 15 return fmt.Sprintf("%s/%s", namespace, name) 16 } 17 18 // StackState holds resources created for a stack 19 type StackState struct { 20 Deployments map[string]appstypes.Deployment 21 Statefulsets map[string]appstypes.StatefulSet 22 Daemonsets map[string]appstypes.DaemonSet 23 Services map[string]coretypes.Service 24 } 25 26 // FlattenResources returns all resources in an untyped slice 27 func (s *StackState) FlattenResources() []interface{} { 28 var result []interface{} 29 for ix := range s.Deployments { 30 v := s.Deployments[ix] 31 result = append(result, &v) 32 } 33 for ix := range s.Statefulsets { 34 v := s.Statefulsets[ix] 35 result = append(result, &v) 36 } 37 for ix := range s.Daemonsets { 38 v := s.Daemonsets[ix] 39 result = append(result, &v) 40 } 41 for ix := range s.Services { 42 v := s.Services[ix] 43 result = append(result, &v) 44 } 45 return result 46 } 47 48 // EmptyStackState is an empty StackState 49 var EmptyStackState = &StackState{ 50 Deployments: make(map[string]appstypes.Deployment), 51 Statefulsets: make(map[string]appstypes.StatefulSet), 52 Daemonsets: make(map[string]appstypes.DaemonSet), 53 Services: make(map[string]coretypes.Service), 54 } 55 56 // NewStackState creates a StackState from a list of existing resources 57 func NewStackState(objects ...interface{}) (*StackState, error) { 58 result := &StackState{ 59 Deployments: make(map[string]appstypes.Deployment), 60 Statefulsets: make(map[string]appstypes.StatefulSet), 61 Daemonsets: make(map[string]appstypes.DaemonSet), 62 Services: make(map[string]coretypes.Service), 63 } 64 for _, o := range objects { 65 switch r := o.(type) { 66 case *appstypes.Deployment: 67 result.Deployments[ObjKey(r.Namespace, r.Name)] = *r 68 case *appstypes.StatefulSet: 69 result.Statefulsets[ObjKey(r.Namespace, r.Name)] = *r 70 case *appstypes.DaemonSet: 71 result.Daemonsets[ObjKey(r.Namespace, r.Name)] = *r 72 case *coretypes.Service: 73 result.Services[ObjKey(r.Namespace, r.Name)] = *r 74 default: 75 return nil, fmt.Errorf("unexpected object type: %T", o) 76 } 77 } 78 return result, nil 79 }