diff --git a/pkg/app/app.go b/pkg/app/app.go index 4b0962fc..f01fd5ee 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -286,7 +286,9 @@ func Down(opt kobject.ConvertOptions) { //Remove deployed application errUndeploy := t.Undeploy(komposeObject, opt) if errUndeploy != nil { - log.Fatalf("Error while deleting application: %s", errUndeploy) + for _, err = range errUndeploy { + log.Fatalf("Error while deleting application: %s", err) + } } } diff --git a/pkg/transformer/kubernetes/kubernetes.go b/pkg/transformer/kubernetes/kubernetes.go index 1c93b72f..1de87b08 100644 --- a/pkg/transformer/kubernetes/kubernetes.go +++ b/pkg/transformer/kubernetes/kubernetes.go @@ -691,17 +691,19 @@ func (k *Kubernetes) Deploy(komposeObject kobject.KomposeObject, opt kobject.Con } // Undeploy deletes deployed objects from Kubernetes cluster -func (k *Kubernetes) Undeploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error { +func (k *Kubernetes) Undeploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) []error { + var errorList []error //Convert komposeObject objects, err := k.Transform(komposeObject, opt) - if err != nil { - return errors.Wrap(err, "k.Transform failed") + errorList = append(errorList, err) + return errorList } client, namespace, err := k.GetKubernetesClient() if err != nil { - return err + errorList = append(errorList, err) + return errorList } for _, v := range objects { @@ -713,20 +715,24 @@ func (k *Kubernetes) Undeploy(komposeObject kobject.KomposeObject, opt kobject.C //delete deployment deployment, err := client.Deployments(namespace).List(options) if err != nil { - return err + errorList = append(errorList, err) + break } for _, l := range deployment.Items { if reflect.DeepEqual(l.Labels, komposeLabel) { rpDeployment, err := kubectl.ReaperFor(extensions.Kind("Deployment"), client) if err != nil { - return err + errorList = append(errorList, err) + break } //FIXME: gracePeriod is nil err = rpDeployment.Stop(namespace, t.Name, TIMEOUT*time.Second, nil) if err != nil { - return err + errorList = append(errorList, err) + break } log.Infof("Successfully deleted Deployment: %s", t.Name) + } } @@ -734,20 +740,24 @@ func (k *Kubernetes) Undeploy(komposeObject kobject.KomposeObject, opt kobject.C //delete svc svc, err := client.Services(namespace).List(options) if err != nil { - return err + errorList = append(errorList, err) + break } for _, l := range svc.Items { if reflect.DeepEqual(l.Labels, komposeLabel) { rpService, err := kubectl.ReaperFor(api.Kind("Service"), client) if err != nil { - return err + errorList = append(errorList, err) + break } //FIXME: gracePeriod is nil err = rpService.Stop(namespace, t.Name, TIMEOUT*time.Second, nil) if err != nil { - return err + errorList = append(errorList, err) + break } log.Infof("Successfully deleted Service: %s", t.Name) + } } @@ -755,13 +765,15 @@ func (k *Kubernetes) Undeploy(komposeObject kobject.KomposeObject, opt kobject.C // delete pvc pvc, err := client.PersistentVolumeClaims(namespace).List(options) if err != nil { - return err + errorList = append(errorList, err) + break } for _, l := range pvc.Items { if reflect.DeepEqual(l.Labels, komposeLabel) { err = client.PersistentVolumeClaims(namespace).Delete(t.Name) if err != nil { - return err + errorList = append(errorList, err) + break } log.Infof("Successfully deleted PersistentVolumeClaim: %s", t.Name) } @@ -777,14 +789,16 @@ func (k *Kubernetes) Undeploy(komposeObject kobject.KomposeObject, opt kobject.C } ingress, err := client.Ingress(namespace).List(options) if err != nil { - return err + errorList = append(errorList, err) + break } for _, l := range ingress.Items { if reflect.DeepEqual(l.Labels, komposeLabel) { err = client.Ingress(namespace).Delete(t.Name, ingDeleteOptions) if err != nil { - return err + errorList = append(errorList, err) + break } log.Infof("Successfully deleted Ingress: %s", t.Name) } @@ -794,23 +808,26 @@ func (k *Kubernetes) Undeploy(komposeObject kobject.KomposeObject, opt kobject.C //delete pod pod, err := client.Pods(namespace).List(options) if err != nil { - return err + errorList = append(errorList, err) } for _, l := range pod.Items { if reflect.DeepEqual(l.Labels, komposeLabel) { rpPod, err := kubectl.ReaperFor(api.Kind("Pod"), client) if err != nil { - return err + errorList = append(errorList, err) + break } //FIXME: gracePeriod is nil err = rpPod.Stop(namespace, t.Name, TIMEOUT*time.Second, nil) if err != nil { - return err + errorList = append(errorList, err) + break } log.Infof("Successfully deleted Pod: %s", t.Name) } } } } - return nil + + return errorList } diff --git a/pkg/transformer/openshift/openshift.go b/pkg/transformer/openshift/openshift.go index 5d14606c..aabca475 100644 --- a/pkg/transformer/openshift/openshift.go +++ b/pkg/transformer/openshift/openshift.go @@ -516,20 +516,24 @@ func (o *OpenShift) Deploy(komposeObject kobject.KomposeObject, opt kobject.Conv } //Undeploy removes deployed artifacts from OpenShift cluster -func (o *OpenShift) Undeploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error { +func (o *OpenShift) Undeploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) []error { + var errorList []error //Convert komposeObject objects, err := o.Transform(komposeObject, opt) if err != nil { - return errors.Wrap(err, "o.Transform failed") + errorList = append(errorList, err) + return errorList } oclient, err := o.getOpenShiftClient() if err != nil { - return err + errorList = append(errorList, err) + return errorList } kclient, namespace, err := o.GetKubernetesClient() if err != nil { - return err + errorList = append(errorList, err) + return errorList } for _, v := range objects { @@ -541,13 +545,15 @@ func (o *OpenShift) Undeploy(komposeObject kobject.KomposeObject, opt kobject.Co //delete imageStream imageStream, err := oclient.ImageStreams(namespace).List(options) if err != nil { - return err + errorList = append(errorList, err) + break } for _, l := range imageStream.Items { if reflect.DeepEqual(l.Labels, komposeLabel) { err = oclient.ImageStreams(namespace).Delete(t.Name) if err != nil { - return err + errorList = append(errorList, err) + break } log.Infof("Successfully deleted ImageStream: %s", t.Name) } @@ -557,13 +563,15 @@ func (o *OpenShift) Undeploy(komposeObject kobject.KomposeObject, opt kobject.Co //options := api.ListOptions{LabelSelector: label} buildConfig, err := oclient.BuildConfigs(namespace).List(options) if err != nil { - return err + errorList = append(errorList, err) + break } for _, l := range buildConfig.Items { if reflect.DeepEqual(l.Labels, komposeLabel) { err := oclient.BuildConfigs(namespace).Delete(t.Name) if err != nil { - return err + errorList = append(errorList, err) + break } log.Infof("Successfully deleted BuildConfig: %s", t.Name) } @@ -573,14 +581,16 @@ func (o *OpenShift) Undeploy(komposeObject kobject.KomposeObject, opt kobject.Co // delete deploymentConfig deploymentConfig, err := oclient.DeploymentConfigs(namespace).List(options) if err != nil { - return err + errorList = append(errorList, err) + break } for _, l := range deploymentConfig.Items { if reflect.DeepEqual(l.Labels, komposeLabel) { dcreaper := deploymentconfigreaper.NewDeploymentConfigReaper(oclient, kclient) err := dcreaper.Stop(namespace, t.Name, TIMEOUT*time.Second, nil) if err != nil { - return err + errorList = append(errorList, err) + break } log.Infof("Successfully deleted DeploymentConfig: %s", t.Name) } @@ -590,18 +600,21 @@ func (o *OpenShift) Undeploy(komposeObject kobject.KomposeObject, opt kobject.Co //delete svc svc, err := kclient.Services(namespace).List(options) if err != nil { - return err + errorList = append(errorList, err) + break } for _, l := range svc.Items { if reflect.DeepEqual(l.Labels, komposeLabel) { rpService, err := kubectl.ReaperFor(api.Kind("Service"), kclient) if err != nil { - return err + errorList = append(errorList, err) + break } //FIXME: gracePeriod is nil err = rpService.Stop(namespace, t.Name, TIMEOUT*time.Second, nil) if err != nil { - return err + errorList = append(errorList, err) + break } log.Infof("Successfully deleted Service: %s", t.Name) } @@ -611,13 +624,15 @@ func (o *OpenShift) Undeploy(komposeObject kobject.KomposeObject, opt kobject.Co // delete pvc pvc, err := kclient.PersistentVolumeClaims(namespace).List(options) if err != nil { - return err + errorList = append(errorList, err) + break } for _, l := range pvc.Items { if reflect.DeepEqual(l.Labels, komposeLabel) { err = kclient.PersistentVolumeClaims(namespace).Delete(t.Name) if err != nil { - return err + errorList = append(errorList, err) + break } log.Infof("Successfully deleted PersistentVolumeClaim: %s", t.Name) } @@ -627,13 +642,15 @@ func (o *OpenShift) Undeploy(komposeObject kobject.KomposeObject, opt kobject.Co // delete route route, err := oclient.Routes(namespace).List(options) if err != nil { - return err + errorList = append(errorList, err) + break } for _, l := range route.Items { if reflect.DeepEqual(l.Labels, komposeLabel) { err = oclient.Routes(namespace).Delete(t.Name) if err != nil { - return err + errorList = append(errorList, err) + break } log.Infof("Successfully deleted Route: %s", t.Name) } @@ -643,23 +660,28 @@ func (o *OpenShift) Undeploy(komposeObject kobject.KomposeObject, opt kobject.Co //delete pods pod, err := kclient.Pods(namespace).List(options) if err != nil { - return err + errorList = append(errorList, err) + break } for _, l := range pod.Items { if reflect.DeepEqual(l.Labels, komposeLabel) { rpPod, err := kubectl.ReaperFor(api.Kind("Pod"), kclient) if err != nil { - return err + errorList = append(errorList, err) + break } + //FIXME: gracePeriod is nil err = rpPod.Stop(namespace, t.Name, TIMEOUT*time.Second, nil) if err != nil { - return err + errorList = append(errorList, err) + break } log.Infof("Successfully deleted Pod: %s", t.Name) + } } } } - return nil + return errorList } diff --git a/pkg/transformer/transformer.go b/pkg/transformer/transformer.go index 9919ee31..62fac9e8 100644 --- a/pkg/transformer/transformer.go +++ b/pkg/transformer/transformer.go @@ -28,5 +28,5 @@ type Transformer interface { // 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 + Undeploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) []error }