Merge pull request #126 from kadel/fix-openshift-output

Fix conversion to OpenShift (invalid DeploymentConfig)
This commit is contained in:
Tomas Kral 2016-09-05 10:49:36 +02:00 committed by GitHub
commit 7e91770dfe
4 changed files with 55 additions and 45 deletions

View File

@ -27,7 +27,6 @@ import (
_ "k8s.io/kubernetes/pkg/apis/extensions/install" _ "k8s.io/kubernetes/pkg/apis/extensions/install"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/runtime"
// install kubernetes api // install kubernetes api
_ "github.com/openshift/origin/pkg/deploy/api/install" _ "github.com/openshift/origin/pkg/deploy/api/install"
@ -207,7 +206,6 @@ func Up(c *cli.Context) {
//Convert komposeObject to K8S controllers //Convert komposeObject to K8S controllers
objects := t.Transform(komposeObject, opt) objects := t.Transform(komposeObject, opt)
sortServicesFirst(&objects)
//Submit objects to K8s endpoint //Submit objects to K8s endpoint
kubernetes.CreateObjects(client, objects) 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 { func askForConfirmation() bool {
var response string var response string
_, err := fmt.Scanln(&response) _, err := fmt.Scanln(&response)

View File

@ -127,24 +127,25 @@ func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error {
f := transformer.CreateOutFile(opt.OutFile) f := transformer.CreateOutFile(opt.OutFile)
defer f.Close() defer f.Close()
var err error
var files []string var files []string
// if asked to print to stdout or to put in single file // if asked to print to stdout or to put in single file
// we will create a list // we will create a list
if opt.ToStdout || f != nil { if opt.ToStdout || f != nil {
list := &api.List{} list := &api.List{}
list.Items = objects // 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 each object in the list
list.Items, err = convertToVersion(list.Items)
if err != nil {
return err
} }
// version list itself // version list itself
listVersion := unversioned.GroupVersion{Group: "", Version: "v1"} listVersion := unversioned.GroupVersion{Group: "", Version: "v1"}
convertedList, err := api.Scheme.ConvertToVersion(list, listVersion) convertedList, err := convertToVersion(list, listVersion)
if err != nil { if err != nil {
return err return err
} }
@ -157,10 +158,16 @@ func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error {
var file string var file string
// create a separate file for each provider // create a separate file for each provider
for _, v := range objects { for _, v := range objects {
data, err := marshal(v, opt.GenerateYaml) versionedObject, err := convertToVersion(v, unversioned.GroupVersion{})
if err != nil { if err != nil {
return err return err
} }
data, err := marshal(versionedObject, opt.GenerateYaml)
if err != nil {
return err
}
switch t := v.(type) { switch t := v.(type) {
case *api.ReplicationController: case *api.ReplicationController:
file = transformer.Print(t.Name, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateYaml, f) file = transformer.Print(t.Name, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateYaml, f)
@ -196,22 +203,23 @@ func marshal(obj runtime.Object, yamlFormat bool) (data []byte, err error) {
return return
} }
// Convert all objects in objs to versioned objects // Convert object to versioned object
func convertToVersion(objs []runtime.Object) ([]runtime.Object, error) { // if groupVersion is empty (unversioned.GroupVersion{}), use version from original object (obj)
ret := []runtime.Object{} 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() objectVersion := obj.GetObjectKind().GroupVersionKind()
version := unversioned.GroupVersion{Group: objectVersion.Group, Version: objectVersion.Version} version = unversioned.GroupVersion{Group: objectVersion.Group, Version: objectVersion.Version}
convertedObject, err := api.Scheme.ConvertToVersion(obj, version) } else {
if err != nil { version = groupVersion
return nil, err
}
ret = append(ret, convertedObject)
} }
convertedObject, err := api.Scheme.ConvertToVersion(obj, version)
return ret, nil if err != nil {
return nil, err
}
return convertedObject, nil
} }
func PortsExist(name string, service kobject.ServiceConfig) bool { func PortsExist(name string, service kobject.ServiceConfig) bool {
@ -297,3 +305,21 @@ func UpdateKubernetesObjects(name string, service kobject.ServiceConfig, objects
UpdateController(obj, fillTemplate, fillObjectMeta) 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
}

View File

@ -234,7 +234,8 @@ func CreateKubernetesObjects(name string, service kobject.ServiceConfig, opt kob
return objects 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 { func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) []runtime.Object {
// this will hold all the converted data // this will hold all the converted data
var allobjects []runtime.Object var allobjects []runtime.Object
@ -252,7 +253,8 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.
allobjects = append(allobjects, objects...) allobjects = append(allobjects, objects...)
} }
// sort all object so Services are first
SortServicesFirst(&allobjects)
return allobjects return allobjects
} }

View File

@ -62,7 +62,8 @@ func initDeploymentConfig(name string, service kobject.ServiceConfig, replicas i
return dc 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 { func (k *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) []runtime.Object {
// this will hold all the converted data // this will hold all the converted data
var allobjects []runtime.Object var allobjects []runtime.Object
@ -84,6 +85,7 @@ func (k *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C
allobjects = append(allobjects, objects...) allobjects = append(allobjects, objects...)
} }
// sort all object so Services are first
kubernetes.SortServicesFirst(&allobjects)
return allobjects return allobjects
} }