From 41e075e85d726ef7631296daedffe4ae5908130f Mon Sep 17 00:00:00 2001 From: Vincent Hou Date: Mon, 20 Jan 2020 12:13:31 -0500 Subject: [PATCH] Remove all the deployments in the older version We can know if there is an older version of operator CR, by checking Status.Version. If it is not empty and not equal to the current version, we can delete the old resources with the label "serving.knative.dev/release=". --- .../knativeserving_controller.go | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/pkg/reconciler/knativeserving/knativeserving_controller.go b/pkg/reconciler/knativeserving/knativeserving_controller.go index 23e3ac59..0df8e914 100644 --- a/pkg/reconciler/knativeserving/knativeserving_controller.go +++ b/pkg/reconciler/knativeserving/knativeserving_controller.go @@ -45,6 +45,7 @@ const ( creationChange = "creation" editChange = "edit" deletionChange = "deletion" + selectorKey = "serving.knative.dev/release" ) var ( @@ -59,6 +60,7 @@ type Reconciler struct { knativeServingLister listers.KnativeServingLister config mf.Manifest servings map[string]int64 + oldVersion string } // Check that our Reconciler implements controller.Reconciler @@ -106,6 +108,9 @@ func (r *Reconciler) Reconcile(ctx context.Context, key string) error { } r.servings[key] = newGen + // Save the version of the original CR + r.oldVersion = original.Status.Version + // Don't modify the informers copy. knativeServing := original.DeepCopy() @@ -295,5 +300,26 @@ func (r *Reconciler) deleteObsoleteResources(manifest *mf.Manifest, instance *se if err := manifest.Delete(resource, &metav1.DeleteOptions{}); err != nil { return err } + + // If there used to be a CR at an older version, we need to remove the old resources with + // the label serving.knative.dev/release="" + if r.oldVersion != "" && r.oldVersion != version.Version { + selector := fmt.Sprintf("%s=%s", selectorKey, r.oldVersion) + listOptions := metav1.ListOptions{ LabelSelector: selector } + + // Remove all the deployments at the old version + deploymentList, err := r.KubeClientSet.AppsV1().Deployments(instance.GetNamespace()).List(listOptions) + if err == nil { + for _, dep := range deploymentList.Items { + if e := r.KubeClientSet.AppsV1().Deployments(instance.GetNamespace()).Delete(dep.Name, + &metav1.DeleteOptions{}); e != nil { + return e + } + } + } else if !apierrs.IsNotFound(err) { + return err + } + } + return nil }