From b24556e9d5fa89a9d2c5f95dac037c672706afbe Mon Sep 17 00:00:00 2001 From: Tomas Kral Date: Mon, 29 Aug 2016 17:35:03 +0200 Subject: [PATCH 1/2] fixes #124 add missing conversion to versioned object when saving to files --- pkg/transformer/kubernetes/k8sutils.go | 50 ++++++++++++++------------ 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/pkg/transformer/kubernetes/k8sutils.go b/pkg/transformer/kubernetes/k8sutils.go index 745ab311..c9c3458f 100644 --- a/pkg/transformer/kubernetes/k8sutils.go +++ b/pkg/transformer/kubernetes/k8sutils.go @@ -127,24 +127,23 @@ func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error { f := transformer.CreateOutFile(opt.OutFile) defer f.Close() - var err error var files []string // if asked to print to stdout or to put in single file // we will create a list if opt.ToStdout || f != nil { list := &api.List{} - list.Items = objects - - // version each object in the list - list.Items, err = convertToVersion(list.Items) - if err != nil { - return err + // convert objects to versioned and add them to list + for _, object := range objects { + versionedObject, err := convertToVersion(object, unversioned.GroupVersion{}) + if err != nil { + return err + } + list.Items = append(list.Items, versionedObject) } - // version list itself listVersion := unversioned.GroupVersion{Group: "", Version: "v1"} - convertedList, err := api.Scheme.ConvertToVersion(list, listVersion) + convertedList, err := convertToVersion(list, listVersion) if err != nil { return err } @@ -157,10 +156,16 @@ func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error { var file string // create a separate file for each provider for _, v := range objects { - data, err := marshal(v, opt.GenerateYaml) + versionedObject, err := convertToVersion(v, unversioned.GroupVersion{}) if err != nil { return err } + + data, err := marshal(versionedObject, opt.GenerateYaml) + if err != nil { + return err + } + switch t := v.(type) { case *api.ReplicationController: file = transformer.Print(t.Name, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateYaml, f) @@ -196,22 +201,23 @@ func marshal(obj runtime.Object, yamlFormat bool) (data []byte, err error) { return } -// Convert all objects in objs to versioned objects -func convertToVersion(objs []runtime.Object) ([]runtime.Object, error) { - ret := []runtime.Object{} +// Convert object to versioned object +// if groupVersion is empty (unversioned.GroupVersion{}), use version from original object (obj) +func convertToVersion(obj runtime.Object, groupVersion unversioned.GroupVersion) (runtime.Object, error) { - for _, obj := range objs { + var version unversioned.GroupVersion + if groupVersion.IsEmpty() { objectVersion := obj.GetObjectKind().GroupVersionKind() - version := unversioned.GroupVersion{Group: objectVersion.Group, Version: objectVersion.Version} - convertedObject, err := api.Scheme.ConvertToVersion(obj, version) - if err != nil { - return nil, err - } - ret = append(ret, convertedObject) + version = unversioned.GroupVersion{Group: objectVersion.Group, Version: objectVersion.Version} + } else { + version = groupVersion } - - return ret, nil + convertedObject, err := api.Scheme.ConvertToVersion(obj, version) + if err != nil { + return nil, err + } + return convertedObject, nil } func PortsExist(name string, service kobject.ServiceConfig) bool { From e2da0f089ae8f51a964a76d6589e109594bf102c Mon Sep 17 00:00:00 2001 From: Tomas Kral Date: Tue, 30 Aug 2016 14:26:59 +0200 Subject: [PATCH 2/2] Make sure that Services are first in the List Sorts objects in Transform function, this should make sure that Services are first everywhere as long as we keep order in the slice that Transform returns. fixes #130 --- cli/app/app.go | 20 -------------------- pkg/transformer/kubernetes/k8sutils.go | 20 ++++++++++++++++++++ pkg/transformer/kubernetes/kubernetes.go | 6 ++++-- pkg/transformer/openshift/openshift.go | 6 ++++-- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/cli/app/app.go b/cli/app/app.go index a6426f26..e4880b3e 100644 --- a/cli/app/app.go +++ b/cli/app/app.go @@ -27,7 +27,6 @@ import ( _ "k8s.io/kubernetes/pkg/apis/extensions/install" client "k8s.io/kubernetes/pkg/client/unversioned" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/runtime" // install kubernetes api _ "github.com/openshift/origin/pkg/deploy/api/install" @@ -207,7 +206,6 @@ func Up(c *cli.Context) { //Convert komposeObject to K8S controllers objects := t.Transform(komposeObject, opt) - sortServicesFirst(&objects) //Submit objects to K8s endpoint kubernetes.CreateObjects(client, objects) @@ -256,24 +254,6 @@ func Down(c *cli.Context) { } } -// the objects that we get can be in any order this keeps services first -// according to best practice kubernetes services should be created first -// http://kubernetes.io/docs/user-guide/config-best-practices/ -func sortServicesFirst(objs *[]runtime.Object) { - var svc, others, ret []runtime.Object - - for _, obj := range *objs { - if obj.GetObjectKind().GroupVersionKind().Kind == "Service" { - svc = append(svc, obj) - } else { - others = append(others, obj) - } - } - ret = append(ret, svc...) - ret = append(ret, others...) - *objs = ret -} - func askForConfirmation() bool { var response string _, err := fmt.Scanln(&response) diff --git a/pkg/transformer/kubernetes/k8sutils.go b/pkg/transformer/kubernetes/k8sutils.go index c9c3458f..15d28395 100644 --- a/pkg/transformer/kubernetes/k8sutils.go +++ b/pkg/transformer/kubernetes/k8sutils.go @@ -139,7 +139,9 @@ func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error { if err != nil { return err } + list.Items = append(list.Items, versionedObject) + } // version list itself listVersion := unversioned.GroupVersion{Group: "", Version: "v1"} @@ -303,3 +305,21 @@ func UpdateKubernetesObjects(name string, service kobject.ServiceConfig, objects UpdateController(obj, fillTemplate, fillObjectMeta) } } + +// the objects that we get can be in any order this keeps services first +// according to best practice kubernetes services should be created first +// http://kubernetes.io/docs/user-guide/config-best-practices/ +func SortServicesFirst(objs *[]runtime.Object) { + var svc, others, ret []runtime.Object + + for _, obj := range *objs { + if obj.GetObjectKind().GroupVersionKind().Kind == "Service" { + svc = append(svc, obj) + } else { + others = append(others, obj) + } + } + ret = append(ret, svc...) + ret = append(ret, others...) + *objs = ret +} diff --git a/pkg/transformer/kubernetes/kubernetes.go b/pkg/transformer/kubernetes/kubernetes.go index d8e2abda..82d323c0 100644 --- a/pkg/transformer/kubernetes/kubernetes.go +++ b/pkg/transformer/kubernetes/kubernetes.go @@ -234,7 +234,8 @@ func CreateKubernetesObjects(name string, service kobject.ServiceConfig, opt kob return objects } -// Maps komposeObject to k8s objects +// Transform maps komposeObject to k8s objects +// returns object that are already sorted in the way that Services are first func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) []runtime.Object { // this will hold all the converted data var allobjects []runtime.Object @@ -252,7 +253,8 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject. allobjects = append(allobjects, objects...) } - + // sort all object so Services are first + SortServicesFirst(&allobjects) return allobjects } diff --git a/pkg/transformer/openshift/openshift.go b/pkg/transformer/openshift/openshift.go index 789bd164..e927d459 100644 --- a/pkg/transformer/openshift/openshift.go +++ b/pkg/transformer/openshift/openshift.go @@ -62,7 +62,8 @@ func initDeploymentConfig(name string, service kobject.ServiceConfig, replicas i return dc } -// Maps komposeObject to openshift objects +// Transform maps komposeObject to openshift objects +// returns objects that are already sorted in the way that Services are first func (k *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) []runtime.Object { // this will hold all the converted data var allobjects []runtime.Object @@ -84,6 +85,7 @@ func (k *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C allobjects = append(allobjects, objects...) } - + // sort all object so Services are first + kubernetes.SortServicesFirst(&allobjects) return allobjects }