Skip to content
This repository was archived by the owner on Jun 24, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 41 additions & 5 deletions pkg/reconciler/knativeserving/knativeserving_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ import (
"knative.dev/serving-operator/version"
)

const (
finalizerName = "delete-knative-serving-manifest"
)

var (
// Platform-specific behavior to affect the installation
platform common.Platforms
Expand Down Expand Up @@ -69,17 +73,16 @@ func (r *Reconciler) Reconcile(ctx context.Context, key string) error {
// Get the KnativeServing resource with this namespace/name.
original, err := r.knativeServingLister.KnativeServings(namespace).Get(name)
if apierrs.IsNotFound(err) {
// The resource was deleted
r.servings.Delete(key)
if r.servings.Len() == 0 {
r.config.DeleteAll(&metav1.DeleteOptions{})
}
return nil

} else if err != nil {
r.Logger.Error(err, "Error getting KnativeServing")
return err
}
if original.GetDeletionTimestamp() != nil {
r.servings.Delete(key)
return r.delete(original)
}
// Keep track of the number of KnativeServings in the cluster
r.servings.Insert(key)

Expand Down Expand Up @@ -112,6 +115,7 @@ func (r *Reconciler) reconcile(ctx context.Context, ks *servingv1alpha1.KnativeS
reqLogger.Infow("Reconciling KnativeServing", "status", ks.Status)

stages := []func(*mf.Manifest, *servingv1alpha1.KnativeServing) error{
r.ensureFinalizer,
r.initStatus,
r.install,
r.checkDeployments,
Expand Down Expand Up @@ -210,6 +214,38 @@ func (r *Reconciler) checkDeployments(manifest *mf.Manifest, instance *servingv1
return nil
}

// ensureFinalizer attaches a "delete manifest" finalizer to the instance
func (r *Reconciler) ensureFinalizer(manifest *mf.Manifest, instance *servingv1alpha1.KnativeServing) error {
for _, finalizer := range instance.GetFinalizers() {
if finalizer == finalizerName {
return nil
}
}
instance.SetFinalizers(append(instance.GetFinalizers(), finalizerName))
instance, err := r.KnativeServingClientSet.OperatorV1alpha1().KnativeServings(instance.Namespace).Update(instance)
return err
}

// delete all the resources in the release manifest
func (r *Reconciler) delete(instance *servingv1alpha1.KnativeServing) error {
if len(instance.GetFinalizers()) == 0 || instance.GetFinalizers()[0] != finalizerName {
return nil
}
if r.servings.Len() == 0 {
if err := r.config.DeleteAll(&metav1.DeleteOptions{}); err != nil {
return err
}
}
// The deletionTimestamp might've changed. Fetch the resource again.
refetched, err := r.knativeServingLister.KnativeServings(instance.Namespace).Get(instance.Name)
if err != nil {
return err
}
refetched.SetFinalizers(refetched.GetFinalizers()[1:])
_, err = r.KnativeServingClientSet.OperatorV1alpha1().KnativeServings(refetched.Namespace).Update(refetched)
return err
}

// Delete obsolete resources from previous versions
func (r *Reconciler) deleteObsoleteResources(manifest *mf.Manifest, instance *servingv1alpha1.KnativeServing) error {
// istio-system resources from 0.3
Expand Down
24 changes: 13 additions & 11 deletions test/e2e/knativeservingdeployment_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,16 @@ func knativeServingDelete(t *testing.T, clients *test.Clients, names test.Resour
if err := clients.KnativeServing().Delete(names.KnativeServing, &metav1.DeleteOptions{}); err != nil {
t.Fatalf("KnativeServing %q failed to delete: %v", names.KnativeServing, err)
}
err := wait.PollImmediate(resources.Interval, resources.Timeout, func() (bool, error) {
_, err := clients.KnativeServing().Get(names.KnativeServing, metav1.GetOptions{})
if apierrs.IsNotFound(err) {
return true, nil
}
return false, err
})
if err != nil {
t.Fatal("Timed out waiting on KnativeServing to delete", err)
}
_, b, _, _ := runtime.Caller(0)
m, err := mf.NewManifest(filepath.Join((filepath.Dir(b)+"/.."), "config/"), false, clients.Config)
if err != nil {
Expand All @@ -229,18 +239,10 @@ func knativeServingDelete(t *testing.T, clients *test.Clients, names test.Resour
// been modified, since the namespace can be injected.
continue
}
waitErr := wait.PollImmediate(resources.Interval, resources.Timeout, func() (bool, error) {
gvrs, _ := meta.UnsafeGuessKindToResource(u.GroupVersionKind())
if _, err := clients.Dynamic.Resource(gvrs).Get(u.GetName(), metav1.GetOptions{}); apierrs.IsNotFound(err) {
return true, nil
}
return false, err
})

if waitErr != nil {
t.Fatalf("The %s %s failed to be deleted: %v", u.GetKind(), u.GetName(), waitErr)
gvrs, _ := meta.UnsafeGuessKindToResource(u.GroupVersionKind())
if _, err := clients.Dynamic.Resource(gvrs).Get(u.GetName(), metav1.GetOptions{}); !apierrs.IsNotFound(err) {
t.Fatalf("The %s %s failed to be deleted", u.GetKind(), u.GetName())
}
t.Logf("The %s %s has been deleted.", u.GetKind(), u.GetName())
}
}

Expand Down