Fixed issue with order of deleted resources 86/124686/1 0.9.1
authorLukasz Rajewski <lukasz.rajewski@orange.com>
Tue, 5 Oct 2021 12:36:01 +0000 (14:36 +0200)
committerLukasz Rajewski <lukasz.rajewski@orange.com>
Tue, 5 Oct 2021 12:55:01 +0000 (14:55 +0200)
For delete operation order of resources is reverse to
the order used for creation

Issue-ID: MULTICLOUD-1398
Signed-off-by: Lukasz Rajewski <lukasz.rajewski@orange.com>
Change-Id: I3f34c6000222e82c34f59042e99d2c37a343dfa5

src/k8splugin/internal/app/client.go
src/k8splugin/internal/app/config_backend.go
src/k8splugin/internal/app/instance.go
src/k8splugin/internal/helm/helm.go
src/k8splugin/internal/helm/helm_test.go

index 06c4c46..f70dc0a 100644 (file)
@@ -550,18 +550,17 @@ func (k *KubernetesClient) DeleteKind(resource helm.KubernetesResource, namespac
                return pkgerrors.Wrap(err, "Error loading plugin")
        }
 
-       name, err := pluginImpl.Get(resource, namespace, k)
+       err = pluginImpl.Delete(resource, namespace, k)
 
-       if (err == nil && name == resource.Name) || (err != nil && strings.Contains(err.Error(), "not found") == false) {
-               err = pluginImpl.Delete(resource, namespace, k)
-               if err != nil {
+       if err != nil {
+               if strings.Contains(err.Error(), "not found") == false {
                        return pkgerrors.Wrap(err, "Error deleting "+resource.Name)
+               } else {
+                       log.Warn("Resource already does not exist", log.Fields{
+                               "gvk":      resource.GVK,
+                               "resource": resource.Name,
+                       })
                }
-       } else {
-               log.Warn("Resource does not exist, Skipping delete", log.Fields{
-                       "gvk":      resource.GVK,
-                       "resource": resource.Name,
-               })
        }
 
        return nil
index be11e8c..1f22922 100644 (file)
@@ -551,7 +551,7 @@ func scheduleResources(c chan configResourceList) {
                                        //Move onto the next cloud region
                                        continue
                                }
-                               err = k8sClient.deleteResources(data.resources, inst.Namespace)
+                               err = k8sClient.deleteResources(helm.GetReverseK8sResources(data.resources), inst.Namespace)
                                if err != nil {
                                        log.Printf("Error Deleting resources: %s", err.Error())
                                        continue
index 63fe042..c4cce5e 100644 (file)
@@ -322,7 +322,7 @@ func (v *InstanceClient) Create(i InstanceRequest) (InstanceResponse, error) {
        if err != nil {
                if len(createdResources) > 0 {
                        log.Printf("[Instance] Reverting created resources on Error: %s", err.Error())
-                       k8sClient.deleteResources(createdResources, profile.Namespace)
+                       k8sClient.deleteResources(helm.GetReverseK8sResources(createdResources), profile.Namespace)
                }
                log.Printf("  Instance: %s, Main rss are failed, skip post-install and remove instance in DB", id)
                //main rss creation failed -> remove instance in DB
@@ -764,7 +764,7 @@ func (v *InstanceClient) Delete(id string) error {
                return pkgerrors.Wrap(err, "Cleanup Config Resources")
        }
 
-       err = k8sClient.deleteResources(inst.Resources, inst.Namespace)
+       err = k8sClient.deleteResources(helm.GetReverseK8sResources(inst.Resources), inst.Namespace)
        if err != nil {
                return pkgerrors.Wrap(err, "Deleting Instance Resources")
        }
@@ -872,7 +872,7 @@ func (v *InstanceClient) RecoverCreateOrDelete(id string) error {
                                return
                        }
 
-                       err = k8sClient.deleteResources(instance.Resources, instance.Namespace)
+                       err = k8sClient.deleteResources(helm.GetReverseK8sResources(instance.Resources), instance.Namespace)
                        if err != nil {
                                log.Printf("  Error running deleting instance resources, error: %s", err)
                                return
index 6064b2c..b27c8ae 100644 (file)
@@ -249,3 +249,13 @@ func getGroupVersionKind(data string) (schema.GroupVersionKind, error) {
 
        return *gvk, nil
 }
+
+//GetReverseK8sResources reverse list of resources for delete purpose
+func GetReverseK8sResources(resources []KubernetesResource) []KubernetesResource {
+       reversed := []KubernetesResource{}
+
+       for i := len(resources) - 1; i >= 0; i-- {
+               reversed = append(reversed, resources[i])
+       }
+       return reversed
+}
index b805b59..951ff92 100644 (file)
@@ -26,6 +26,7 @@ import (
        "testing"
 
        "gopkg.in/yaml.v2"
+       "k8s.io/apimachinery/pkg/runtime/schema"
 )
 
 func TestProcessValues(t *testing.T) {
@@ -265,3 +266,45 @@ func TestGenerateKubernetesArtifacts(t *testing.T) {
                })
        }
 }
+
+func TestReverseResources(t *testing.T) {
+
+       t.Run("Successfully reverse resources", func(t *testing.T) {
+               data := []KubernetesResource{
+                       {
+                               GVK: schema.GroupVersionKind{
+                                       Group:   "apps",
+                                       Version: "v1",
+                                       Kind:    "Deployment"},
+                               Name: "deployment-1",
+                       },
+                       {
+                               GVK: schema.GroupVersionKind{
+                                       Group:   "apps",
+                                       Version: "v1",
+                                       Kind:    "Deployment"},
+                               Name: "deployment-2",
+                       },
+                       {
+                               GVK: schema.GroupVersionKind{
+                                       Group:   "",
+                                       Version: "v1",
+                                       Kind:    "Service"},
+                               Name: "service-1",
+                       },
+                       {
+                               GVK: schema.GroupVersionKind{
+                                       Group:   "",
+                                       Version: "v1",
+                                       Kind:    "Service"},
+                               Name: "service-2",
+                       },
+               }
+
+               reversed := GetReverseK8sResources(data)
+
+               if reversed[0] != data[len(data)-1] {
+                       t.Fatalf("Unexpected k8s resource at position 0 %s", reversed[0])
+               }
+       })
+}