From 6ad54a36e2392b1c46dc853af53e017013c69d28 Mon Sep 17 00:00:00 2001 From: Abhishek Date: Mon, 14 Nov 2016 15:11:54 +0530 Subject: [PATCH] added support for OpenShift down --- pkg/transformer/kubernetes/kubernetes.go | 34 ++++---- pkg/transformer/openshift/openshift.go | 98 +++++++++++++++++++----- 2 files changed, 97 insertions(+), 35 deletions(-) diff --git a/pkg/transformer/kubernetes/kubernetes.go b/pkg/transformer/kubernetes/kubernetes.go index 91effe17..25f06b60 100644 --- a/pkg/transformer/kubernetes/kubernetes.go +++ b/pkg/transformer/kubernetes/kubernetes.go @@ -373,6 +373,24 @@ func (k *Kubernetes) UpdateController(obj runtime.Object, updateTemplate func(*a } } +// Creates the k8s Client, returns k8s client and namespace +func (o *Kubernetes) GetKubernetesClient() (*client.Client, string, error) { + // initialize Kubernetes client + factory := cmdutil.NewFactory(nil) + clientConfig, err := factory.ClientConfig() + if err != nil { + return nil, "", err + } + client := client.NewOrDie(clientConfig) + + // get namespace from config + namespace, _, err := factory.DefaultNamespace() + if err != nil { + return nil, "", err + } + return client, namespace, nil +} + // Submit deployment and svc to k8s endpoint func (k *Kubernetes) Deploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error { //Convert komposeObject @@ -385,16 +403,10 @@ func (k *Kubernetes) Deploy(komposeObject kobject.KomposeObject, opt kobject.Con fmt.Println("We are going to create Kubernetes Deployments, Services" + pvcStr + "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() + client, namespace, err := k.GetKubernetesClient() 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) { @@ -433,16 +445,10 @@ func (k *Kubernetes) Undeploy(komposeObject kobject.KomposeObject, opt kobject.C //Convert komposeObject objects := k.Transform(komposeObject, opt) - factory := cmdutil.NewFactory(nil) - clientConfig, err := factory.ClientConfig() + client, namespace, err := k.GetKubernetesClient() 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) { diff --git a/pkg/transformer/openshift/openshift.go b/pkg/transformer/openshift/openshift.go index 2b3e6a80..b38c3024 100644 --- a/pkg/transformer/openshift/openshift.go +++ b/pkg/transformer/openshift/openshift.go @@ -17,7 +17,6 @@ limitations under the License. package openshift import ( - "errors" "fmt" "strings" @@ -31,14 +30,14 @@ import ( "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" "k8s.io/kubernetes/pkg/runtime" - kclient "k8s.io/kubernetes/pkg/client/unversioned" - kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - oclient "github.com/openshift/origin/pkg/client" ocliconfig "github.com/openshift/origin/pkg/cmd/cli/config" deployapi "github.com/openshift/origin/pkg/deploy/api" + deploymentconfigreaper "github.com/openshift/origin/pkg/deploy/cmd" imageapi "github.com/openshift/origin/pkg/image/api" + "k8s.io/kubernetes/pkg/kubectl" + "time" ) type OpenShift struct { @@ -48,6 +47,10 @@ type OpenShift struct { kubernetes.Kubernetes } +// timeout is how long we'll wait for the termination of OpenShift resource to be successful +// used when undeploying resources from OpenShift +const TIMEOUT = 300 + // getImageTag get tag name from image name // if no tag is specified return 'latest' func getImageTag(image string) string { @@ -171,6 +174,19 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C return allobjects } +// Create OpenShift client, returns OpenShift client +func (o *OpenShift) getOpenShiftClient() (*oclient.Client, error) { + // initialize OpenShift Client + loadingRules := ocliconfig.NewOpenShiftClientConfigLoadingRules() + overrides := &clientcmd.ConfigOverrides{} + oclientConfig, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, overrides).ClientConfig() + if err != nil { + return nil, err + } + oclient := oclient.NewOrDie(oclientConfig) + return oclient, nil +} + func (o *OpenShift) Deploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error { //Convert komposeObject objects := o.Transform(komposeObject, opt) @@ -181,25 +197,11 @@ func (o *OpenShift) Deploy(komposeObject kobject.KomposeObject, opt kobject.Conv fmt.Println("We are going to create OpenShift DeploymentConfigs, Services" + pvcStr + "for your Dockerized application. \n" + "If you need different kind of resources, use the 'kompose convert' and 'oc create -f' commands instead. \n") - // initialize OpenShift Client - loadingRules := ocliconfig.NewOpenShiftClientConfigLoadingRules() - overrides := &clientcmd.ConfigOverrides{} - oclientConfig, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, overrides).ClientConfig() + oclient, err := o.getOpenShiftClient() if err != nil { return err } - oclient := oclient.NewOrDie(oclientConfig) - - // initialize Kubernetes client - kfactory := kcmdutil.NewFactory(nil) - kclientConfig, err := kfactory.ClientConfig() - if err != nil { - return err - } - kclient := kclient.NewOrDie(kclientConfig) - - // get namespace from config - namespace, _, err := kfactory.DefaultNamespace() + kclient, namespace, err := o.GetKubernetesClient() if err != nil { return err } @@ -244,5 +246,59 @@ func (o *OpenShift) Deploy(komposeObject kobject.KomposeObject, opt kobject.Conv } func (o *OpenShift) Undeploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error { - return errors.New("Not Implemented") + //Convert komposeObject + objects := o.Transform(komposeObject, opt) + + oclient, err := o.getOpenShiftClient() + if err != nil { + return err + } + kclient, namespace, err := o.GetKubernetesClient() + if err != nil { + return err + } + + for _, v := range objects { + switch t := v.(type) { + case *imageapi.ImageStream: + //delete imageStream + err = oclient.ImageStreams(namespace).Delete(t.Name) + if err != nil { + return err + } else { + logrus.Infof("Successfully deleted ImageStream: %s", t.Name) + } + case *deployapi.DeploymentConfig: + // delete deploymentConfig + dcreaper := deploymentconfigreaper.NewDeploymentConfigReaper(oclient, kclient) + err := dcreaper.Stop(namespace, t.Name, TIMEOUT*time.Second, nil) + if err != nil { + return err + } else { + logrus.Infof("Successfully deleted DeploymentConfig: %s", t.Name) + } + case *api.Service: + //delete svc + rpService, err := kubectl.ReaperFor(api.Kind("Service"), kclient) + if err != nil { + return err + } + //FIXME: gracePeriod is nil + err = rpService.Stop(namespace, t.Name, TIMEOUT*time.Second, nil) + if err != nil { + return err + } else { + logrus.Infof("Successfully deleted service: %s", t.Name) + } + case *api.PersistentVolumeClaim: + // delete pvc + err = kclient.PersistentVolumeClaims(namespace).Delete(t.Name) + if err != nil { + return err + } else { + logrus.Infof("Successfully deleted PersistentVolumeClaim: %s", t.Name) + } + } + } + return nil }