From 799345a6f9a9f13b86eb6c05896c87fc03c43c1d Mon Sep 17 00:00:00 2001 From: Tomas Kral Date: Fri, 23 Sep 2016 14:47:04 +0200 Subject: [PATCH] Prepare up/down for other providers --- cli/app/app.go | 86 ++++++++--------------- pkg/loader/loader.go | 26 ++++++- pkg/transformer/kubernetes/kubernetes.go | 88 +++++++++++++++++------- pkg/transformer/openshift/openshift.go | 10 +++ pkg/transformer/transformer.go | 5 ++ 5 files changed, 133 insertions(+), 82 deletions(-) diff --git a/cli/app/app.go b/cli/app/app.go index d927ca51..e89dac04 100644 --- a/cli/app/app.go +++ b/cli/app/app.go @@ -25,16 +25,12 @@ import ( // install kubernetes api _ "k8s.io/kubernetes/pkg/api/install" _ "k8s.io/kubernetes/pkg/apis/extensions/install" - client "k8s.io/kubernetes/pkg/client/unversioned" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" // install OpenShift apis _ "github.com/openshift/origin/pkg/deploy/api/install" "github.com/skippbox/kompose/pkg/kobject" "github.com/skippbox/kompose/pkg/loader" - "github.com/skippbox/kompose/pkg/loader/bundle" - "github.com/skippbox/kompose/pkg/loader/compose" "github.com/skippbox/kompose/pkg/transformer" "github.com/skippbox/kompose/pkg/transformer/kubernetes" "github.com/skippbox/kompose/pkg/transformer/openshift" @@ -151,14 +147,9 @@ func Convert(c *cli.Context) { validateFlags(opt, singleOutput, dabFile, inputFile) // loader parses input from file into komposeObject. - var l loader.Loader - switch inputFormat { - case "bundle": - l = new(bundle.Bundle) - case "compose": - l = new(compose.Compose) - default: - logrus.Fatalf("Input file format is not supported") + l, err := loader.GetLoader(inputFormat) + if err != nil { + logrus.Fatal(err) } komposeObject = l.LoadFile(file) @@ -179,20 +170,6 @@ func Convert(c *cli.Context) { // Up brings up deployment, svc. func Up(c *cli.Context) { - fmt.Println("We are going to create Kubernetes deployments and services for your Dockerized application. \n" + - "If you need different kind of resources, use the 'kompose convert' and 'kubectl create -f' commands instead. \n") - - factory := cmdutil.NewFactory(nil) - clientConfig, err := factory.ClientConfig() - if err != nil { - logrus.Fatalf("Failed to access the Kubernetes cluster. Make sure you have a Kubernetes cluster running: %v", err) - } - namespace, _, err := factory.DefaultNamespace() - if err != nil { - logrus.Fatalf("Failed to get Namespace") - } - client := client.NewOrDie(clientConfig) - inputFile := c.GlobalString("file") dabFile := c.GlobalString("bundle") @@ -214,35 +191,25 @@ func Up(c *cli.Context) { validateFlags(opt, false, dabFile, inputFile) // loader parses input from file into komposeObject. - var l loader.Loader - switch inputFormat { - case "bundle": - l = new(bundle.Bundle) - case "compose": - l = new(compose.Compose) - default: - logrus.Fatalf("Input file format is not supported") + l, err := loader.GetLoader(inputFormat) + if err != nil { + logrus.Fatal(err) } + komposeObject = l.LoadFile(file) + //get transfomer t := new(kubernetes.Kubernetes) - //Convert komposeObject to K8S controllers - objects := t.Transform(komposeObject, opt) - - //Submit objects to K8s endpoint - kubernetes.CreateObjects(client, namespace, objects) + //Submit objects provider + errDeploy := t.Deploy(komposeObject, opt) + if errDeploy != nil { + logrus.Fatalf("Error while deploying application: %s", err) + } } // Down deletes all deployment, svc. func Down(c *cli.Context) { - factory := cmdutil.NewFactory(nil) - clientConfig, err := factory.ClientConfig() - if err != nil { - logrus.Fatalf("Failed to access the Kubernetes cluster. Make sure you have a Kubernetes running: %v", err) - } - client := client.NewOrDie(clientConfig) - inputFile := c.GlobalString("file") dabFile := c.GlobalString("bundle") @@ -256,25 +223,30 @@ func Down(c *cli.Context) { file = dabFile } - opt := kobject.ConvertOptions{} + opt := kobject.ConvertOptions{ + Replicas: 1, + CreateD: true, + } validateFlags(opt, false, dabFile, inputFile) // loader parses input from file into komposeObject. - var l loader.Loader - switch inputFormat { - case "bundle": - l = new(bundle.Bundle) - case "compose": - l = new(compose.Compose) - default: - logrus.Fatalf("Input file format is not supported") + l, err := loader.GetLoader(inputFormat) + if err != nil { + logrus.Fatal(err) } + komposeObject = l.LoadFile(file) - for k := range komposeObject.ServiceConfigs { - kubernetes.DeleteObjects(client, k) + // get transformer + t := new(kubernetes.Kubernetes) + + //Remove deployed application + errUndeploy := t.Undeploy(komposeObject, opt) + if errUndeploy != nil { + logrus.Fatalf("Error while deleting application: %s", err) } + } func askForConfirmation() bool { diff --git a/pkg/loader/loader.go b/pkg/loader/loader.go index d4f07e19..9b77d482 100644 --- a/pkg/loader/loader.go +++ b/pkg/loader/loader.go @@ -16,8 +16,32 @@ limitations under the License. package loader -import "github.com/skippbox/kompose/pkg/kobject" +import ( + "errors" + "fmt" + + "github.com/skippbox/kompose/pkg/kobject" + "github.com/skippbox/kompose/pkg/loader/bundle" + "github.com/skippbox/kompose/pkg/loader/compose" +) type Loader interface { LoadFile(file string) kobject.KomposeObject } + +// GetLoader returns loader for given format +func GetLoader(format string) (Loader, error) { + var l Loader + + switch format { + case "bundle": + l = new(bundle.Bundle) + case "compose": + l = new(compose.Compose) + default: + return nil, errors.New(fmt.Sprintf("Input file format %s is not supported", format)) + } + + return l, nil + +} diff --git a/pkg/transformer/kubernetes/kubernetes.go b/pkg/transformer/kubernetes/kubernetes.go index 5f4c7129..05f6441b 100644 --- a/pkg/transformer/kubernetes/kubernetes.go +++ b/pkg/transformer/kubernetes/kubernetes.go @@ -25,10 +25,15 @@ import ( "github.com/skippbox/kompose/pkg/kobject" "github.com/skippbox/kompose/pkg/transformer" + // install kubernetes api "k8s.io/kubernetes/pkg/api" + _ "k8s.io/kubernetes/pkg/api/install" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/apis/extensions" + _ "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" "k8s.io/kubernetes/pkg/util/intstr" //"k8s.io/kubernetes/pkg/controller/daemon" @@ -281,50 +286,85 @@ func UpdateController(obj runtime.Object, updateTemplate func(*api.PodTemplateSp } // Submit deployment and svc to k8s endpoint -func CreateObjects(client *client.Client, namespace string, objects []runtime.Object) { +func (k *Kubernetes) Deploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error { + //Convert komposeObject + objects := k.Transform(komposeObject, opt) + + fmt.Println("We are going to create Kubernetes deployments and services for your Dockerized application. \n" + + "If you need different kind of resources, use the 'kompose convert' and 'kubectl create -f' commands instead. \n") + + factory := cmdutil.NewFactory(nil) + clientConfig, err := factory.ClientConfig() + if err != nil { + return err + } + namespace, _, err := factory.DefaultNamespace() + if err != nil { + return err + } + client := client.NewOrDie(clientConfig) + for _, v := range objects { switch t := v.(type) { case *extensions.Deployment: _, err := client.Deployments(namespace).Create(t) if err != nil { - logrus.Fatalf("Error: '%v' while creating deployment: %s", err, t.Name) + return err } logrus.Infof("Successfully created deployment: %s", t.Name) case *api.Service: _, err := client.Services(namespace).Create(t) if err != nil { - logrus.Fatalf("Error: '%v' while creating service: %s", err, t.Name) + return err } logrus.Infof("Successfully created service: %s", t.Name) } } fmt.Println("\nYour application has been deployed to Kubernetes. You can run 'kubectl get deployment,svc,pods' for details.") + + return nil } -func DeleteObjects(client *client.Client, name string) { - //delete svc - rpService, err := kubectl.ReaperFor(api.Kind("Service"), client) - if err != nil { - logrus.Warningf("Can't get reaper for service due to '%v'", err) - } - //FIXME: timeout = 300s, gracePeriod is nil - err = rpService.Stop(api.NamespaceDefault, name, 300*time.Second, nil) - if err != nil { - logrus.Warningf("Can't delete service: %s due to '%v'", name, err) - } else { - logrus.Infof("Successfully deleted service: %s", name) - } +func (k *Kubernetes) Undeploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error { - //delete deployment - rpDeployment, err := kubectl.ReaperFor(extensions.Kind("Deployment"), client) + factory := cmdutil.NewFactory(nil) + clientConfig, err := factory.ClientConfig() if err != nil { - logrus.Warningf("Can't get reaper for deployment due to '%v'", err) + return err } - //FIXME: timeout = 300s, gracePeriod is nil - err = rpDeployment.Stop(api.NamespaceDefault, name, 300*time.Second, nil) + namespace, _, err := factory.DefaultNamespace() if err != nil { - logrus.Warningf("Can't delete deployment: %s due to '%v'", name, err) - } else { - logrus.Infof("Successfully deleted deployment: %s", name) + return err } + client := client.NewOrDie(clientConfig) + + // delete objects from kubernetes + for name := range komposeObject.ServiceConfigs { + //delete svc + rpService, err := kubectl.ReaperFor(api.Kind("Service"), client) + if err != nil { + return err + } + //FIXME: timeout = 300s, gracePeriod is nil + err = rpService.Stop(namespace, name, 300*time.Second, nil) + if err != nil { + return err + } else { + logrus.Infof("Successfully deleted service: %s", name) + } + + //delete deployment + rpDeployment, err := kubectl.ReaperFor(extensions.Kind("Deployment"), client) + if err != nil { + return err + } + //FIXME: timeout = 300s, gracePeriod is nil + err = rpDeployment.Stop(namespace, name, 300*time.Second, nil) + if err != nil { + return err + } else { + logrus.Infof("Successfully deleted deployment: %s", name) + } + } + return nil } diff --git a/pkg/transformer/openshift/openshift.go b/pkg/transformer/openshift/openshift.go index e927d459..5a9547ab 100644 --- a/pkg/transformer/openshift/openshift.go +++ b/pkg/transformer/openshift/openshift.go @@ -17,6 +17,8 @@ limitations under the License. package openshift import ( + "errors" + deployapi "github.com/openshift/origin/pkg/deploy/api" "github.com/skippbox/kompose/pkg/kobject" "github.com/skippbox/kompose/pkg/transformer/kubernetes" @@ -89,3 +91,11 @@ func (k *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C kubernetes.SortServicesFirst(&allobjects) return allobjects } + +func (k *OpenShift) Deploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error { + return errors.New("Not Implemented") +} + +func (k *OpenShift) Undeploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error { + return errors.New("Not Implemented") +} diff --git a/pkg/transformer/transformer.go b/pkg/transformer/transformer.go index bf332c56..26c50838 100644 --- a/pkg/transformer/transformer.go +++ b/pkg/transformer/transformer.go @@ -22,5 +22,10 @@ import ( ) type Transformer interface { + // Transform converts KomposeObject to transformer specific objects. Transform(kobject.KomposeObject, kobject.ConvertOptions) []runtime.Object + // Deploy deploys KomposeObject to provider + Deploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error + // Undeploy deletes/undeploys KomposeObject from provider + Undeploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error }