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  }