diff --git a/cmd/convert.go b/cmd/convert.go index bbe9b5b9..bad54c21 100644 --- a/cmd/convert.go +++ b/cmd/convert.go @@ -82,6 +82,7 @@ var convertCmd = &cobra.Command{ IsDeploymentFlag: cmd.Flags().Lookup("deployment").Changed, IsDaemonSetFlag: cmd.Flags().Lookup("daemon-set").Changed, IsReplicationControllerFlag: cmd.Flags().Lookup("replication-controller").Changed, + IsReplicaSetFlag: cmd.Flags().Lookup("replicas").Changed, IsDeploymentConfigFlag: cmd.Flags().Lookup("deployment-config").Changed, } diff --git a/pkg/kobject/kobject.go b/pkg/kobject/kobject.go index 88b8355c..1c66efa0 100644 --- a/pkg/kobject/kobject.go +++ b/pkg/kobject/kobject.go @@ -53,6 +53,7 @@ type ConvertOptions struct { IsDeploymentFlag bool IsDaemonSetFlag bool IsReplicationControllerFlag bool + IsReplicaSetFlag bool IsDeploymentConfigFlag bool IsNamespaceFlag bool } @@ -92,6 +93,7 @@ type ServiceConfig struct { MemLimit yaml.MemStringorInt `compose:"mem_limit" bundle:""` TmpFs []string `compose:"tmpfs" bundle:""` Dockerfile string `compose:"dockerfile" bundle:""` + Replicas int `compose:"replicas" bundle:""` } // EnvVar holds the environment variable struct of a container diff --git a/pkg/loader/compose/v3.go b/pkg/loader/compose/v3.go index be68bafa..1aafcc49 100644 --- a/pkg/loader/compose/v3.go +++ b/pkg/loader/compose/v3.go @@ -192,6 +192,11 @@ func dockerComposeToKomposeMapping(composeObject *types.Config) (kobject.Kompose serviceConfig.Command = composeServiceConfig.Entrypoint serviceConfig.Args = composeServiceConfig.Command + //Handling replicas + if composeServiceConfig.Deploy.Replicas != nil { + serviceConfig.Replicas = int(*composeServiceConfig.Deploy.Replicas) + } + // This is a bit messy since we use yaml.MemStringorInt // TODO: Refactor yaml.MemStringorInt in kobject.go to int64 // Since Deploy.Resources.Limits does not initialize, we must check type Resources before continuing diff --git a/pkg/transformer/kubernetes/kubernetes.go b/pkg/transformer/kubernetes/kubernetes.go index 5619f551..acad54da 100644 --- a/pkg/transformer/kubernetes/kubernetes.go +++ b/pkg/transformer/kubernetes/kubernetes.go @@ -489,15 +489,21 @@ func (k *Kubernetes) ConfigEnvs(name string, service kobject.ServiceConfig) []ap // CreateKubernetesObjects generates a Kubernetes artifact for each input type service func (k *Kubernetes) CreateKubernetesObjects(name string, service kobject.ServiceConfig, opt kobject.ConvertOptions) []runtime.Object { var objects []runtime.Object + var replica int + if opt.IsReplicaSetFlag || service.Replicas == 0 { + replica = opt.Replicas + } else { + replica = service.Replicas + } if opt.CreateD { - objects = append(objects, k.InitD(name, service, opt.Replicas)) + objects = append(objects, k.InitD(name, service, replica)) } if opt.CreateDS { objects = append(objects, k.InitDS(name, service)) } if opt.CreateRC { - objects = append(objects, k.InitRC(name, service, opt.Replicas)) + objects = append(objects, k.InitRC(name, service, replica)) } return objects diff --git a/pkg/transformer/kubernetes/kubernetes_test.go b/pkg/transformer/kubernetes/kubernetes_test.go index 6292bc80..9947b150 100644 --- a/pkg/transformer/kubernetes/kubernetes_test.go +++ b/pkg/transformer/kubernetes/kubernetes_test.go @@ -53,6 +53,7 @@ func newServiceConfig() kobject.ServiceConfig { Stdin: true, Tty: true, TmpFs: []string{"/tmp"}, + Replicas: 2, } } @@ -270,11 +271,14 @@ func TestKomposeConvert(t *testing.T) { expectedNumObjs int }{ // objects generated are deployment, service and pvc - "Convert to Deployments (D)": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, Replicas: replicas}, 3}, - "Convert to DaemonSets (DS)": {newKomposeObject(), kobject.ConvertOptions{CreateDS: true}, 3}, - "Convert to ReplicationController (RC)": {newKomposeObject(), kobject.ConvertOptions{CreateRC: true, Replicas: replicas}, 3}, + "Convert to Deployments (D)": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, Replicas: replicas, IsReplicaSetFlag: true}, 3}, + "Convert to Deployments (D) with v3 replicas": {newKomposeObject(), kobject.ConvertOptions{CreateD: true}, 3}, + "Convert to DaemonSets (DS)": {newKomposeObject(), kobject.ConvertOptions{CreateDS: true}, 3}, + "Convert to ReplicationController(RC)": {newKomposeObject(), kobject.ConvertOptions{CreateRC: true, Replicas: replicas, IsReplicaSetFlag: true}, 3}, + "Convert to ReplicationController(RC) with v3 replicas ": {newKomposeObject(), kobject.ConvertOptions{CreateRC: true}, 3}, // objects generated are deployment, daemonset, ReplicationController, service and pvc - "Convert to D, DS, and RC": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, CreateDS: true, CreateRC: true, Replicas: replicas}, 5}, + "Convert to D, DS, and RC": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, CreateDS: true, CreateRC: true, Replicas: replicas, IsReplicaSetFlag: true}, 5}, + "Convert to D, DS, and RC with v3 replicas": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, CreateDS: true, CreateRC: true}, 5}, // TODO: add more tests } @@ -313,9 +317,18 @@ func TestKomposeConvert(t *testing.T) { if err := checkMeta(config, d.ObjectMeta, name, true); err != nil { t.Errorf("%v", err) } - if (int)(d.Spec.Replicas) != replicas { - t.Errorf("Expected %d replicas, got %d", replicas, d.Spec.Replicas) + if test.opt.IsReplicaSetFlag { + if (int)(d.Spec.Replicas) != replicas { + t.Errorf("Expected %d replicas, got %d", replicas, d.Spec.Replicas) + } + } else { + + if (int)(d.Spec.Replicas) != newServiceConfig().Replicas { + t.Errorf("Expected %d replicas, got %d", newServiceConfig().Replicas, d.Spec.Replicas) + + } } + if d.Spec.Selector != nil && len(d.Spec.Selector.MatchLabels) > 0 { t.Errorf("Expect selector be unset, got: %#v", d.Spec.Selector) } @@ -344,9 +357,18 @@ func TestKomposeConvert(t *testing.T) { if err := checkMeta(config, rc.ObjectMeta, name, true); err != nil { t.Errorf("%v", err) } - if (int)(rc.Spec.Replicas) != replicas { - t.Errorf("Expected %d replicas, got %d", replicas, rc.Spec.Replicas) + if test.opt.IsReplicaSetFlag { + if (int)(rc.Spec.Replicas) != replicas { + t.Errorf("Expected %d replicas, got %d", replicas, rc.Spec.Replicas) + } + } else { + + if (int)(rc.Spec.Replicas) != newServiceConfig().Replicas { + t.Errorf("Expected %d replicas, got %d", newServiceConfig().Replicas, rc.Spec.Replicas) + + } } + if len(rc.Spec.Selector) > 0 { t.Errorf("Expect selector be unset, got: %#v", rc.Spec.Selector) } diff --git a/pkg/transformer/openshift/openshift.go b/pkg/transformer/openshift/openshift.go index 624fcead..fb730e97 100644 --- a/pkg/transformer/openshift/openshift.go +++ b/pkg/transformer/openshift/openshift.go @@ -346,7 +346,13 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C for _, name := range sortedKeys { service := komposeObject.ServiceConfigs[name] var objects []runtime.Object - + //replicas + var replica int + if opt.IsReplicaSetFlag || service.Replicas == 0 { + replica = opt.Replicas + } else { + replica = service.Replicas + } // Must build the images before conversion (got to add service.Image in case 'image' key isn't provided // Check to see if there is an InputFile (required!) before we build the container // Check that there's actually a Build key @@ -394,7 +400,7 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C objects = o.CreateKubernetesObjects(name, service, opt) if opt.CreateDeploymentConfig { - objects = append(objects, o.initDeploymentConfig(name, service, opt.Replicas)) // OpenShift DeploymentConfigs + objects = append(objects, o.initDeploymentConfig(name, service, replica)) // OpenShift DeploymentConfigs // create ImageStream after deployment (creating IS will trigger new deployment) objects = append(objects, o.initImageStream(name, service, opt)) } diff --git a/script/test/fixtures/v3/output-k8s-full-example.json b/script/test/fixtures/v3/output-k8s-full-example.json index 2acbdd92..db29626e 100644 --- a/script/test/fixtures/v3/output-k8s-full-example.json +++ b/script/test/fixtures/v3/output-k8s-full-example.json @@ -160,7 +160,7 @@ } }, "spec": { - "replicas": 1, + "replicas": 6, "template": { "metadata": { "creationTimestamp": null, diff --git a/script/test/fixtures/v3/output-os-full-example.json b/script/test/fixtures/v3/output-os-full-example.json index 845a07fa..e0367924 100644 --- a/script/test/fixtures/v3/output-os-full-example.json +++ b/script/test/fixtures/v3/output-os-full-example.json @@ -182,7 +182,7 @@ } } ], - "replicas": 1, + "replicas": 6, "test": false, "selector": { "io.kompose.service": "foo"