github.com/docker/compose-on-kubernetes@v0.5.0/internal/registry/composefile.go (about) 1 package registry 2 3 import ( 4 "context" 5 6 "github.com/docker/compose-on-kubernetes/api/compose/latest" 7 iv "github.com/docker/compose-on-kubernetes/internal/internalversion" 8 log "github.com/sirupsen/logrus" 9 apiequality "k8s.io/apimachinery/pkg/api/equality" 10 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 11 "k8s.io/apimachinery/pkg/runtime" 12 genericapirequest "k8s.io/apiserver/pkg/endpoints/request" 13 "k8s.io/apiserver/pkg/registry/rest" 14 ) 15 16 type stackComposeFileRest struct { 17 storage stackRESTStore 18 } 19 20 var _ rest.Storage = &stackComposeFileRest{} 21 var _ rest.Getter = &stackComposeFileRest{} 22 var _ rest.CreaterUpdater = &stackComposeFileRest{} 23 24 // NewStackComposeFileRest returns a rest storage for composefile subresource 25 func NewStackComposeFileRest(storev1beta1 stackRESTStore) rest.Storage { 26 return &stackComposeFileRest{storage: storev1beta1} 27 } 28 29 func (r *stackComposeFileRest) New() runtime.Object { 30 return &latest.ComposeFile{} 31 } 32 33 func (r *stackComposeFileRest) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { 34 stack, err := r.storage.GetStack(ctx, name, options) 35 if err != nil { 36 return nil, err 37 } 38 var res latest.ComposeFile 39 res.ComposeFile = stack.Spec.ComposeFile 40 return &res, nil 41 } 42 43 func (r *stackComposeFileRest) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) { 44 compose := obj.(*latest.ComposeFile) 45 n, _ := genericapirequest.NamespaceFrom(ctx) 46 log.Infof("Compose create from compose file %s/%s", n, compose.Name) 47 var stack iv.Stack 48 stack.Name = compose.Name 49 stack.Namespace = n 50 stack.Spec.ComposeFile = compose.ComposeFile 51 stack.Generation = 1 52 return r.storage.CreateStack(ctx, &stack, createValidation, options) 53 } 54 55 func (r *stackComposeFileRest) Update(ctx context.Context, name string, objInfo rest.UpdatedObjectInfo, 56 createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc, forceAllowCreate bool, options *metav1.UpdateOptions) (runtime.Object, bool, error) { 57 n, _ := genericapirequest.NamespaceFrom(ctx) 58 log.Infof("Compose update from compose file %s/%s", n, name) 59 return r.storage.UpdateStack(ctx, name, func(ctx context.Context, newObj *iv.Stack, oldObj *iv.Stack) (transformedNewObj *iv.Stack, err error) { 60 composefile := latest.ComposeFile{ 61 ComposeFile: oldObj.Spec.ComposeFile, 62 } 63 newCompose, err := objInfo.UpdatedObject(ctx, &composefile) 64 if err != nil { 65 return nil, err 66 } 67 newObj.Spec.ComposeFile = newCompose.(*latest.ComposeFile).ComposeFile 68 newObj.Spec.Stack = nil 69 if !apiequality.Semantic.DeepEqual(oldObj.Spec, newObj.Spec) { 70 newObj.Generation = oldObj.Generation + 1 71 } 72 return newObj, nil 73 }, createValidation, updateValidation, forceAllowCreate, options) 74 }