From 0bcec2aa23dd1cb3a873414de4b01391567c93b9 Mon Sep 17 00:00:00 2001 From: Janet Kuo Date: Tue, 12 Jul 2016 19:53:20 -0700 Subject: [PATCH 1/7] Make deployment the default controller, create -rc for rc, and enable copying all types of controller to chart templates --- cli/app/app.go | 9 ++++++--- cli/app/k8sutils.go | 41 ++++++++++++++++++++++++++++++----------- cli/command/command.go | 8 ++++++-- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/cli/app/app.go b/cli/app/app.go index 2a6d2999..8c3ed404 100644 --- a/cli/app/app.go +++ b/cli/app/app.go @@ -563,6 +563,7 @@ func ProjectKuberConvert(p *project.Project, c *cli.Context) { createDS := c.BoolT("daemonset") createRS := c.BoolT("replicaset") createChart := c.BoolT("chart") + createRC := c.BoolT("replicationcontroller") singleOutput := len(outFile) != 0 || toStdout // Validate the flags @@ -583,6 +584,9 @@ func ProjectKuberConvert(p *project.Project, c *cli.Context) { if createRS { count++ } + if createRC { + count++ + } if count > 1 { logrus.Fatalf("Error: only one type of Kubernetes controller can be generated when --out or --stdout is specified") } @@ -811,8 +815,7 @@ func ProjectKuberConvert(p *project.Project, c *cli.Context) { } } - // We can create RC when we either don't print to --out or --stdout, or we don't create any other controllers - if !singleOutput || (!createD && !createDS && !createRS) { + if createRC { for k, v := range mReplicationControllers { print(k, "rc", v, toStdout, generateYaml, f) } @@ -823,7 +826,7 @@ func ProjectKuberConvert(p *project.Project, c *cli.Context) { } if createChart { - err := generateHelm(composeFile, svcnames, generateYaml) + err := generateHelm(composeFile, svcnames, generateYaml, createD, createDS, createRS, createRC) if err != nil { logrus.Fatalf("Failed to create Chart data: %s\n", err) } diff --git a/cli/app/k8sutils.go b/cli/app/k8sutils.go index 3d77bcc7..610b451b 100644 --- a/cli/app/k8sutils.go +++ b/cli/app/k8sutils.go @@ -32,7 +32,7 @@ import ( /** * Generate Helm Chart configuration */ -func generateHelm(filename string, svcnames []string, generateYaml bool) error { +func generateHelm(filename string, svcnames []string, generateYaml, createD, createDS, createRS, createRC bool) error { type ChartDetails struct { Name string } @@ -89,26 +89,35 @@ home: } /* Copy all related json/yaml files into the newly created manifests directory */ - // TODO: support copying controller files other than rc? // TODO: support copying the file specified by --out? for _, svcname := range svcnames { extension := ".json" if generateYaml { extension = ".yaml" } - infile, err := ioutil.ReadFile(svcname + "-rc" + extension) - if err != nil { - logrus.Infof("Error reading %s: %s\n", svcname+"-rc"+extension, err) - return err + if createD { + if err = cpToChart(manifestDir, svcname, "deployment", extension); err != nil { + return err + } } - - err = ioutil.WriteFile(manifestDir+string(os.PathSeparator)+svcname+"-rc"+extension, infile, 0644) - if err != nil { - return err + if createDS { + if err = cpToChart(manifestDir, svcname, "daemonset", extension); err != nil { + return err + } + } + if createRC { + if err = cpToChart(manifestDir, svcname, "replicationcontroller", extension); err != nil { + return err + } + } + if createRS { + if err = cpToChart(manifestDir, svcname, "replicaset", extension); err != nil { + return err + } } /* The svc file is optional */ - infile, err = ioutil.ReadFile(svcname + "-svc" + extension) + infile, err := ioutil.ReadFile(svcname + "-svc" + extension) if err != nil { continue } @@ -121,3 +130,13 @@ home: fmt.Fprintf(os.Stdout, "chart created in %q\n", "."+string(os.PathSeparator)+dirName+string(os.PathSeparator)) return nil } + +func cpToChart(manifestDir, svcname, trailing, extension string) error { + infile, err := ioutil.ReadFile(svcname + "-" + trailing + extension) + if err != nil { + logrus.Infof("Error reading %s: %s\n", svcname+"-"+trailing+extension, err) + return err + } + + return ioutil.WriteFile(manifestDir+string(os.PathSeparator)+svcname+"-"+trailing+extension, infile, 0644) +} diff --git a/cli/command/command.go b/cli/command/command.go index 72665b3e..2625b0bc 100644 --- a/cli/command/command.go +++ b/cli/command/command.go @@ -41,14 +41,18 @@ func ConvertCommand(factory app.ProjectFactory) cli.Command { EnvVar: "OUTPUT_FILE", }, // TODO: validate the flags and make sure only one type is specified - cli.BoolFlag{ + cli.BoolTFlag{ Name: "deployment,d", - Usage: "Generate a deployment resource file", + Usage: "Generate a deployment resource file (default on)", }, cli.BoolFlag{ Name: "daemonset,ds", Usage: "Generate a daemonset resource file", }, + cli.BoolFlag{ + Name: "replicationcontroller,rc", + Usage: "Generate a replicationcontroller file", + }, cli.BoolFlag{ Name: "replicaset,rs", Usage: "Generate a replicaset resource file", From b3466679125d335b9e2810fdae9cc01c60609783 Mon Sep 17 00:00:00 2001 From: Tomas Kral Date: Wed, 13 Jul 2016 18:57:52 +0200 Subject: [PATCH 2/7] Generate only controllers set by flag --- cli/app/app.go | 5 +++++ cli/command/command.go | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/cli/app/app.go b/cli/app/app.go index 8c3ed404..5ffcde45 100644 --- a/cli/app/app.go +++ b/cli/app/app.go @@ -566,6 +566,11 @@ func ProjectKuberConvert(p *project.Project, c *cli.Context) { createRC := c.BoolT("replicationcontroller") singleOutput := len(outFile) != 0 || toStdout + // Create Deployment by default if no controller has be set + if !createD && !createDS && !createRS && !createRC { + createD = true + } + // Validate the flags if len(outFile) != 0 && toStdout { logrus.Fatalf("Error: --out and --stdout can't be set at the same time") diff --git a/cli/command/command.go b/cli/command/command.go index 2625b0bc..dad7d89e 100644 --- a/cli/command/command.go +++ b/cli/command/command.go @@ -40,8 +40,7 @@ func ConvertCommand(factory app.ProjectFactory) cli.Command { Usage: "Specify file name in order to save objects into", EnvVar: "OUTPUT_FILE", }, - // TODO: validate the flags and make sure only one type is specified - cli.BoolTFlag{ + cli.BoolFlag{ Name: "deployment,d", Usage: "Generate a deployment resource file (default on)", }, From a2ae1c3990737dddeed6e7e8d83f94d752f22086 Mon Sep 17 00:00:00 2001 From: ngtuna Date: Thu, 14 Jul 2016 02:10:00 +0700 Subject: [PATCH 3/7] adding replicas to --rc, it's going to be kompose convert --rc . Close #15 --- cli/app/app.go | 16 ++++++++-------- cli/app/k8sutils.go | 4 ++-- cli/command/command.go | 5 +++-- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/cli/app/app.go b/cli/app/app.go index 5ffcde45..0b7650b1 100644 --- a/cli/app/app.go +++ b/cli/app/app.go @@ -259,7 +259,7 @@ func createOutFile(out string) *os.File { } // Init RC object -func initRC(name string, service *project.ServiceConfig) *api.ReplicationController { +func initRC(name string, service *project.ServiceConfig, replicas int) *api.ReplicationController { rc := &api.ReplicationController{ TypeMeta: unversioned.TypeMeta{ Kind: "ReplicationController", @@ -270,7 +270,7 @@ func initRC(name string, service *project.ServiceConfig) *api.ReplicationControl //Labels: map[string]string{"service": name}, }, Spec: api.ReplicationControllerSpec{ - Replicas: 1, + Replicas: int32(replicas), Selector: map[string]string{"service": name}, Template: &api.PodTemplateSpec{ ObjectMeta: api.ObjectMeta{ @@ -563,11 +563,11 @@ func ProjectKuberConvert(p *project.Project, c *cli.Context) { createDS := c.BoolT("daemonset") createRS := c.BoolT("replicaset") createChart := c.BoolT("chart") - createRC := c.BoolT("replicationcontroller") + replicas := c.Int("replicationcontroller") singleOutput := len(outFile) != 0 || toStdout // Create Deployment by default if no controller has be set - if !createD && !createDS && !createRS && !createRC { + if !createD && !createDS && !createRS && replicas == 0 { createD = true } @@ -589,7 +589,7 @@ func ProjectKuberConvert(p *project.Project, c *cli.Context) { if createRS { count++ } - if createRC { + if (replicas != 0) { count++ } if count > 1 { @@ -625,7 +625,7 @@ func ProjectKuberConvert(p *project.Project, c *cli.Context) { checkUnsupportedKey(*service) - rc := initRC(name, service) + rc := initRC(name, service, replicas) sc := initSC(name, service) dc := initDC(name, service) ds := initDS(name, service) @@ -820,7 +820,7 @@ func ProjectKuberConvert(p *project.Project, c *cli.Context) { } } - if createRC { + if (replicas != 0) { for k, v := range mReplicationControllers { print(k, "rc", v, toStdout, generateYaml, f) } @@ -831,7 +831,7 @@ func ProjectKuberConvert(p *project.Project, c *cli.Context) { } if createChart { - err := generateHelm(composeFile, svcnames, generateYaml, createD, createDS, createRS, createRC) + err := generateHelm(composeFile, svcnames, generateYaml, createD, createDS, createRS, replicas) if err != nil { logrus.Fatalf("Failed to create Chart data: %s\n", err) } diff --git a/cli/app/k8sutils.go b/cli/app/k8sutils.go index 610b451b..e656e7b1 100644 --- a/cli/app/k8sutils.go +++ b/cli/app/k8sutils.go @@ -32,7 +32,7 @@ import ( /** * Generate Helm Chart configuration */ -func generateHelm(filename string, svcnames []string, generateYaml, createD, createDS, createRS, createRC bool) error { +func generateHelm(filename string, svcnames []string, generateYaml, createD, createDS, createRS bool, replicas int) error { type ChartDetails struct { Name string } @@ -105,7 +105,7 @@ home: return err } } - if createRC { + if (replicas != 0) { if err = cpToChart(manifestDir, svcname, "replicationcontroller", extension); err != nil { return err } diff --git a/cli/command/command.go b/cli/command/command.go index dad7d89e..ab900dca 100644 --- a/cli/command/command.go +++ b/cli/command/command.go @@ -48,9 +48,10 @@ func ConvertCommand(factory app.ProjectFactory) cli.Command { Name: "daemonset,ds", Usage: "Generate a daemonset resource file", }, - cli.BoolFlag{ + cli.IntFlag{ Name: "replicationcontroller,rc", - Usage: "Generate a replicationcontroller file", + Value: 0, + Usage: "Specify replicas in order to generate a replication controller resource file", }, cli.BoolFlag{ Name: "replicaset,rs", From ba1c66af42e5c0f15dbdee7a5c524180fa60280a Mon Sep 17 00:00:00 2001 From: Tuna Date: Fri, 15 Jul 2016 11:52:34 +0700 Subject: [PATCH 4/7] Add skippbox slack to README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d93a8907..4f9fb38f 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Kubernetes compose (Kompose) -[![Build Status](https://travis-ci.org/skippbox/kompose2.svg?branch=master)](https://travis-ci.org/skippbox/kompose2) +[![Build Status](https://travis-ci.org/skippbox/kompose2.svg?branch=master)](https://travis-ci.org/skippbox/kompose2) [![Join us on Slack](https://s3.eu-central-1.amazonaws.com/ngtuna/slack-cmyk-2.png)](https://skippbox.herokuapp.com) `kompose` is a tool to help users familiar with `docker-compose` move to [Kubernetes](http://kubernetes.io). It takes a Docker Compose file and translates it into Kubernetes objects, it can then submit those objects to a Kubernetes endpoint with the `kompose up` command. From eb8e5be7b4b81a6c7b3512ccd4c938e8fa425443 Mon Sep 17 00:00:00 2001 From: ngtuna Date: Fri, 15 Jul 2016 16:20:40 +0700 Subject: [PATCH 5/7] changed kompose2 to kompose --- Godeps/Godeps.json | 2 +- README.md | 8 ++++---- cli/command/command.go | 2 +- cli/docker/app/factory.go | 2 +- cli/main/main.go | 8 ++++---- script/.validate | 2 +- script/make.sh | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index b19c3c71..159ae25f 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -1,5 +1,5 @@ { - "ImportPath": "github.com/skippbox/kompose2", + "ImportPath": "github.com/skippbox/kompose", "GoVersion": "go1.6", "GodepVersion": "v74", "Packages": [ diff --git a/README.md b/README.md index 4f9fb38f..d34c0cf9 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Kubernetes compose (Kompose) -[![Build Status](https://travis-ci.org/skippbox/kompose2.svg?branch=master)](https://travis-ci.org/skippbox/kompose2) [![Join us on Slack](https://s3.eu-central-1.amazonaws.com/ngtuna/slack-cmyk-2.png)](https://skippbox.herokuapp.com) +[![Build Status](https://travis-ci.org/skippbox/kompose.svg?branch=master)](https://travis-ci.org/skippbox/kompose) [![Join us on Slack](https://s3.eu-central-1.amazonaws.com/ngtuna/slack-cmyk-2.png)](https://skippbox.herokuapp.com) `kompose` is a tool to help users familiar with `docker-compose` move to [Kubernetes](http://kubernetes.io). It takes a Docker Compose file and translates it into Kubernetes objects, it can then submit those objects to a Kubernetes endpoint with the `kompose up` command. @@ -8,7 +8,7 @@ ## Download -Grab the latest [release](https://github.com/skippbox/kompose2/releases) +Grab the latest [release](https://github.com/skippbox/kompose/releases) ## Usage @@ -166,7 +166,7 @@ Currently `kompose` does not support the following Docker Compose options. For example: ``` -$ cat nginx.yml +$ cat nginx.yml nginx: image: nginx dockerfile: foobar @@ -205,7 +205,7 @@ $ make binary ## Contributing and Issues `kompose` is a work in progress, we will see how far it takes us. We welcome any pull request to make it even better. -If you find any issues, please [file it](https://github.com/skippbox/kompose2/issues). +If you find any issues, please [file it](https://github.com/skippbox/kompose/issues). ## Community, discussion, contribution, and support diff --git a/cli/command/command.go b/cli/command/command.go index ab900dca..f762271f 100644 --- a/cli/command/command.go +++ b/cli/command/command.go @@ -18,7 +18,7 @@ package command import ( "github.com/docker/libcompose/project" - "github.com/skippbox/kompose2/cli/app" + "github.com/skippbox/kompose/cli/app" "github.com/urfave/cli" ) diff --git a/cli/docker/app/factory.go b/cli/docker/app/factory.go index 5c09802a..90090a8d 100644 --- a/cli/docker/app/factory.go +++ b/cli/docker/app/factory.go @@ -18,7 +18,7 @@ package app import ( "github.com/urfave/cli" - "github.com/skippbox/kompose2/cli/command" + "github.com/skippbox/kompose/cli/command" "github.com/docker/libcompose/cli/logger" "github.com/docker/libcompose/docker" "github.com/docker/libcompose/project" diff --git a/cli/main/main.go b/cli/main/main.go index 4f0083ab..baaa19fe 100644 --- a/cli/main/main.go +++ b/cli/main/main.go @@ -20,10 +20,10 @@ import ( "os" "github.com/urfave/cli" - dockerApp "github.com/skippbox/kompose2/cli/docker/app" - "github.com/skippbox/kompose2/version" - "github.com/skippbox/kompose2/cli/command" - cliApp "github.com/skippbox/kompose2/cli/app" + dockerApp "github.com/skippbox/kompose/cli/docker/app" + "github.com/skippbox/kompose/version" + "github.com/skippbox/kompose/cli/command" + cliApp "github.com/skippbox/kompose/cli/app" ) func main() { diff --git a/script/.validate b/script/.validate index c31942e0..90038e98 100644 --- a/script/.validate +++ b/script/.validate @@ -4,7 +4,7 @@ if [ -z "$VALIDATE_UPSTREAM" ]; then # this is kind of an expensive check, so let's not do this twice if we # are running more than one validate bundlescript - VALIDATE_REPO='https://github.com/skippbox/kompose2.git' + VALIDATE_REPO='https://github.com/skippbox/kompose.git' VALIDATE_BRANCH='master' if [ "$TRAVIS" = 'true' -a "$TRAVIS_PULL_REQUEST" != 'false' ]; then diff --git a/script/make.sh b/script/make.sh index e6f59591..811e7365 100755 --- a/script/make.sh +++ b/script/make.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -e -export KOMPOSE_PKG='github.com/skippbox/kompose2' +export KOMPOSE_PKG='github.com/skippbox/kompose' # List of bundles to create when no argument is passed DEFAULT_BUNDLES=( From e55044b9e9f80d8529b82779fc0287d0ccc5c04d Mon Sep 17 00:00:00 2001 From: Janet Kuo Date: Fri, 15 Jul 2016 17:04:38 -0700 Subject: [PATCH 6/7] Refactor how we update controllers --- cli/app/app.go | 132 +++++++++++++++++++++++-------------------------- 1 file changed, 61 insertions(+), 71 deletions(-) diff --git a/cli/app/app.go b/cli/app/app.go index 0b7650b1..9baf7bd5 100644 --- a/cli/app/app.go +++ b/cli/app/app.go @@ -36,6 +36,7 @@ import ( "k8s.io/kubernetes/pkg/apis/extensions" client "k8s.io/kubernetes/pkg/client/unversioned" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util/intstr" "github.com/fatih/structs" @@ -589,7 +590,7 @@ func ProjectKuberConvert(p *project.Project, c *cli.Context) { if createRS { count++ } - if (replicas != 0) { + if replicas != 0 { count++ } if count > 1 { @@ -637,62 +638,20 @@ func ProjectKuberConvert(p *project.Project, c *cli.Context) { logrus.Fatalf(err) } - rc.Spec.Template.Spec.Containers[0].Env = envs - dc.Spec.Template.Spec.Containers[0].Env = envs - ds.Spec.Template.Spec.Containers[0].Env = envs - rs.Spec.Template.Spec.Containers[0].Env = envs - // Configure the container command. var cmds []string for _, cmd := range service.Command.Slice() { cmds = append(cmds, cmd) } - rc.Spec.Template.Spec.Containers[0].Command = cmds - dc.Spec.Template.Spec.Containers[0].Command = cmds - ds.Spec.Template.Spec.Containers[0].Command = cmds - rs.Spec.Template.Spec.Containers[0].Command = cmds - - // Configure the container working dir. - rc.Spec.Template.Spec.Containers[0].WorkingDir = service.WorkingDir - dc.Spec.Template.Spec.Containers[0].WorkingDir = service.WorkingDir - ds.Spec.Template.Spec.Containers[0].WorkingDir = service.WorkingDir - rs.Spec.Template.Spec.Containers[0].WorkingDir = service.WorkingDir - // Configure the container volumes. volumesMount, volumes := configVolumes(service) - rc.Spec.Template.Spec.Containers[0].VolumeMounts = volumesMount - dc.Spec.Template.Spec.Containers[0].VolumeMounts = volumesMount - ds.Spec.Template.Spec.Containers[0].VolumeMounts = volumesMount - rs.Spec.Template.Spec.Containers[0].VolumeMounts = volumesMount - - rc.Spec.Template.Spec.Volumes = volumes - dc.Spec.Template.Spec.Volumes = volumes - ds.Spec.Template.Spec.Volumes = volumes - rs.Spec.Template.Spec.Volumes = volumes - - // Configure the container privileged mode - if service.Privileged == true { - securitycontexts := &api.SecurityContext{ - Privileged: &service.Privileged, - } - rc.Spec.Template.Spec.Containers[0].SecurityContext = securitycontexts - dc.Spec.Template.Spec.Containers[0].SecurityContext = securitycontexts - ds.Spec.Template.Spec.Containers[0].SecurityContext = securitycontexts - rs.Spec.Template.Spec.Containers[0].SecurityContext = securitycontexts - } - // Configure the container ports. ports, err := configPorts(name, service) if err != "" { logrus.Fatalf(err) } - rc.Spec.Template.Spec.Containers[0].Ports = ports - dc.Spec.Template.Spec.Containers[0].Ports = ports - ds.Spec.Template.Spec.Containers[0].Ports = ports - rs.Spec.Template.Spec.Containers[0].Ports = ports - // Configure the service ports. servicePorts, err := configServicePorts(name, service) if err != "" { @@ -706,38 +665,48 @@ func ProjectKuberConvert(p *project.Project, c *cli.Context) { for key, value := range service.Labels.MapParts() { labels[key] = value } - rc.Spec.Template.ObjectMeta.Labels = labels - dc.Spec.Template.ObjectMeta.Labels = labels - ds.Spec.Template.ObjectMeta.Labels = labels - rs.Spec.Template.ObjectMeta.Labels = labels - rc.ObjectMeta.Labels = labels - dc.ObjectMeta.Labels = labels - ds.ObjectMeta.Labels = labels - rs.ObjectMeta.Labels = labels sc.ObjectMeta.Labels = labels - // Configure the container restart policy. - switch service.Restart { - case "", "always": - rc.Spec.Template.Spec.RestartPolicy = api.RestartPolicyAlways - dc.Spec.Template.Spec.RestartPolicy = api.RestartPolicyAlways - ds.Spec.Template.Spec.RestartPolicy = api.RestartPolicyAlways - rs.Spec.Template.Spec.RestartPolicy = api.RestartPolicyAlways - case "no": - rc.Spec.Template.Spec.RestartPolicy = api.RestartPolicyNever - dc.Spec.Template.Spec.RestartPolicy = api.RestartPolicyNever - ds.Spec.Template.Spec.RestartPolicy = api.RestartPolicyNever - rs.Spec.Template.Spec.RestartPolicy = api.RestartPolicyNever - case "on-failure": - rc.Spec.Template.Spec.RestartPolicy = api.RestartPolicyOnFailure - dc.Spec.Template.Spec.RestartPolicy = api.RestartPolicyOnFailure - ds.Spec.Template.Spec.RestartPolicy = api.RestartPolicyOnFailure - rs.Spec.Template.Spec.RestartPolicy = api.RestartPolicyOnFailure - default: - logrus.Fatalf("Unknown restart policy %s for service %s", service.Restart, name) + // fillTemplate fills the pod template with the value calculated from config + fillTemplate := func(template *api.PodTemplateSpec) { + template.Spec.Containers[0].Env = envs + template.Spec.Containers[0].Command = cmds + template.Spec.Containers[0].WorkingDir = service.WorkingDir + template.Spec.Containers[0].VolumeMounts = volumesMount + template.Spec.Volumes = volumes + // Configure the container privileged mode + if service.Privileged == true { + template.Spec.Containers[0].SecurityContext = &api.SecurityContext{ + Privileged: &service.Privileged, + } + } + template.Spec.Containers[0].Ports = ports + template.ObjectMeta.Labels = labels + // Configure the container restart policy. + switch service.Restart { + case "", "always": + template.Spec.RestartPolicy = api.RestartPolicyAlways + case "no": + template.Spec.RestartPolicy = api.RestartPolicyNever + case "on-failure": + template.Spec.RestartPolicy = api.RestartPolicyOnFailure + default: + logrus.Fatalf("Unknown restart policy %s for service %s", service.Restart, name) + } } + // fillObjectMeta fills the metadata with the value calculated from config + fillObjectMeta := func(meta *api.ObjectMeta) { + meta.Labels = labels + } + + // Update each supported controllers + updateController(rc, fillTemplate, fillObjectMeta) + updateController(rs, fillTemplate, fillObjectMeta) + updateController(dc, fillTemplate, fillObjectMeta) + updateController(ds, fillTemplate, fillObjectMeta) + // convert datarc to json / yaml datarc, err := transformer(rc, "replication controller", generateYaml) if err != "" { @@ -820,7 +789,7 @@ func ProjectKuberConvert(p *project.Project, c *cli.Context) { } } - if (replicas != 0) { + if replicas != 0 { for k, v := range mReplicationControllers { print(k, "rc", v, toStdout, generateYaml, f) } @@ -952,3 +921,24 @@ func ProjectKuberUp(p *project.Project, c *cli.Context) { } } + +// updateController updates the given object with the given pod template update function and ObjectMeta update function +func updateController(obj runtime.Object, updateTemplate func(*api.PodTemplateSpec), updateMeta func(meta *api.ObjectMeta)) { + switch t := obj.(type) { + case *api.ReplicationController: + if t.Spec.Template == nil { + t.Spec.Template = &api.PodTemplateSpec{} + } + updateTemplate(t.Spec.Template) + updateMeta(&t.ObjectMeta) + case *extensions.Deployment: + updateTemplate(&t.Spec.Template) + updateMeta(&t.ObjectMeta) + case *extensions.ReplicaSet: + updateTemplate(&t.Spec.Template) + updateMeta(&t.ObjectMeta) + case *extensions.DaemonSet: + updateTemplate(&t.Spec.Template) + updateMeta(&t.ObjectMeta) + } +} From f09b640e90015dc559af1d6c45d2570940d56b7c Mon Sep 17 00:00:00 2001 From: ngtuna Date: Sun, 17 Jul 2016 02:21:15 +0700 Subject: [PATCH 7/7] support bash completion for commands, not for flags --- README.md | 7 +++++++ cli/main/main.go | 1 + script/bash_autocomplete | 14 ++++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 script/bash_autocomplete diff --git a/README.md b/README.md index d34c0cf9..9f3bc687 100755 --- a/README.md +++ b/README.md @@ -181,6 +181,13 @@ WARNING: Unsupported key ContainerName - ignoring WARNING: Unsupported key Dockerfile - ignoring ``` +## Bash completion +Running this below command in order to benefit from bash completion + +``` +$ PROG=kompose source script/bash_autocomplete +``` + ## Building ### Building with `go` diff --git a/cli/main/main.go b/cli/main/main.go index baaa19fe..d0f309f6 100644 --- a/cli/main/main.go +++ b/cli/main/main.go @@ -35,6 +35,7 @@ func main() { app.Version = version.VERSION + " (" + version.GITCOMMIT + ")" app.Author = "Skippbox Compose Contributors" app.Email = "https://github.com/skippbox/kompose" + app.EnableBashCompletion = true app.Before = cliApp.BeforeApp app.Flags = append(command.CommonFlags()) app.Commands = []cli.Command{ diff --git a/script/bash_autocomplete b/script/bash_autocomplete new file mode 100644 index 00000000..21a232f1 --- /dev/null +++ b/script/bash_autocomplete @@ -0,0 +1,14 @@ +#! /bin/bash + +: ${PROG:=$(basename ${BASH_SOURCE})} + +_cli_bash_autocomplete() { + local cur opts base + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-bash-completion ) + COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) + return 0 + } + + complete -F _cli_bash_autocomplete $PROG