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  }