From d4fd6f0a680c03d25209adf5ffda4ac1d58ccfff Mon Sep 17 00:00:00 2001 From: Oleg Bulatov Date: Fri, 20 Sep 2019 14:53:15 +0200 Subject: [PATCH] Report Available when registry is explicitly Removed --- pkg/operator/status.go | 16 +++- test/e2e/managementstate_test.go | 133 +++++++++++++++++++++++++++++++ test/e2e/unmanaged_test.go | 83 ------------------- 3 files changed, 147 insertions(+), 85 deletions(-) create mode 100644 test/e2e/managementstate_test.go delete mode 100644 test/e2e/unmanaged_test.go diff --git a/pkg/operator/status.go b/pkg/operator/status.go index 88842ddc14..b86280a12f 100644 --- a/pkg/operator/status.go +++ b/pkg/operator/status.go @@ -87,10 +87,18 @@ func (c *Controller) syncStatus(cr *imageregistryv1.Config, deploy *appsapi.Depl Message: "", Reason: "", } - if deploy == nil { + if cr.Spec.ManagementState == operatorapiv1.Unmanaged { + operatorAvailable.Status = operatorapiv1.ConditionTrue + operatorAvailable.Message = "The registry configuration is set to unmanaged mode" + operatorAvailable.Reason = "Unmanaged" + } else if deploy == nil { if e, ok := applyError.(permanentError); ok { operatorAvailable.Message = applyError.Error() operatorAvailable.Reason = e.Reason + } else if removed { + operatorAvailable.Status = operatorapiv1.ConditionTrue + operatorAvailable.Message = "The registry is removed" + operatorAvailable.Reason = "Removed" } else { operatorAvailable.Message = "The deployment does not exist" operatorAvailable.Reason = "DeploymentNotFound" @@ -159,7 +167,10 @@ func (c *Controller) syncStatus(cr *imageregistryv1.Config, deploy *appsapi.Depl Message: "", Reason: "", } - if e, ok := applyError.(permanentError); ok { + if cr.Spec.ManagementState == operatorapiv1.Unmanaged { + operatorDegraded.Message = "The registry configuration is set to unmanaged mode" + operatorDegraded.Reason = "Unmanaged" + } else if e, ok := applyError.(permanentError); ok { operatorDegraded.Status = operatorapiv1.ConditionTrue operatorDegraded.Message = applyError.Error() operatorDegraded.Reason = e.Reason @@ -175,6 +186,7 @@ func (c *Controller) syncStatus(cr *imageregistryv1.Config, deploy *appsapi.Depl if removed { operatorRemoved.Status = operatorapiv1.ConditionTrue operatorRemoved.Message = "The registry is removed" + operatorRemoved.Reason = "Removed" } updateCondition(cr, imageregistryv1.OperatorStatusTypeRemoved, operatorRemoved) diff --git a/test/e2e/managementstate_test.go b/test/e2e/managementstate_test.go new file mode 100644 index 0000000000..4f6644b848 --- /dev/null +++ b/test/e2e/managementstate_test.go @@ -0,0 +1,133 @@ +package e2e + +import ( + "testing" + "time" + + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" + + "k8s.io/client-go/util/retry" + + operatorapi "github.com/openshift/api/operator/v1" + + imageregistryv1 "github.com/openshift/cluster-image-registry-operator/pkg/apis/imageregistry/v1" + "github.com/openshift/cluster-image-registry-operator/test/framework" +) + +func TestManagementStateUnmanaged(t *testing.T) { + client := framework.MustNewClientset(t, nil) + + defer framework.MustRemoveImageRegistry(t, client) + + framework.MustDeployImageRegistry(t, client, &imageregistryv1.Config{ + ObjectMeta: metav1.ObjectMeta{ + Name: imageregistryv1.ImageRegistryResourceName, + }, + Spec: imageregistryv1.ImageRegistrySpec{ + ManagementState: operatorapi.Managed, + Replicas: 1, + }, + }) + framework.MustEnsureImageRegistryIsAvailable(t, client) + + var cr *imageregistryv1.Config + var err error + err = retry.RetryOnConflict(retry.DefaultBackoff, func() error { + cr, err = client.Configs().Get(imageregistryv1.ImageRegistryResourceName, metav1.GetOptions{}) + if err != nil { + t.Fatal(err) + } + + cr.Spec.ManagementState = operatorapi.Unmanaged + + cr, err = client.Configs().Update(cr) + if err != nil { + return err + } + return nil + }) + if err != nil { + t.Fatal(err) + } + + err = wait.Poll(1*time.Second, framework.AsyncOperationTimeout, func() (stop bool, err error) { + cr, err = client.Configs().Get(imageregistryv1.ImageRegistryResourceName, metav1.GetOptions{}) + if err != nil { + return false, err + } + + conds := framework.GetImageRegistryConditions(cr) + t.Logf("image registry: %s", conds) + return conds.Available.IsTrue() && conds.Available.Reason() == "Unmanaged" && + conds.Progressing.IsFalse() && conds.Progressing.Reason() == "Unmanaged" && + conds.Degraded.IsFalse() && conds.Degraded.Reason() == "Unmanaged", nil + }) + if err != nil { + framework.DumpImageRegistryResource(t, client) + framework.DumpOperatorLogs(t, client) + t.Fatal(err) + } +} + +func TestManagementStateRemoved(t *testing.T) { + client := framework.MustNewClientset(t, nil) + + defer framework.MustRemoveImageRegistry(t, client) + + framework.MustDeployImageRegistry(t, client, &imageregistryv1.Config{ + ObjectMeta: metav1.ObjectMeta{ + Name: imageregistryv1.ImageRegistryResourceName, + }, + Spec: imageregistryv1.ImageRegistrySpec{ + ManagementState: operatorapi.Managed, + Replicas: 1, + }, + }) + framework.MustEnsureImageRegistryIsAvailable(t, client) + + var cr *imageregistryv1.Config + var err error + err = retry.RetryOnConflict(retry.DefaultBackoff, func() error { + cr, err = client.Configs().Get(imageregistryv1.ImageRegistryResourceName, metav1.GetOptions{}) + if err != nil { + t.Fatal(err) + } + + cr.Spec.ManagementState = operatorapi.Removed + + cr, err = client.Configs().Update(cr) + if err != nil { + return err + } + return nil + }) + if err != nil { + t.Fatal(err) + } + + err = wait.Poll(1*time.Second, framework.AsyncOperationTimeout, func() (stop bool, err error) { + cr, err = client.Configs().Get(imageregistryv1.ImageRegistryResourceName, metav1.GetOptions{}) + if err != nil { + return false, err + } + + conds := framework.GetImageRegistryConditions(cr) + t.Logf("image registry: %s", conds) + return conds.Available.IsTrue() && conds.Available.Reason() == "Removed" && + conds.Progressing.IsFalse() && conds.Progressing.Reason() == "Removed" && + conds.Degraded.IsFalse() && + conds.Removed.IsTrue(), nil + }) + if err != nil { + framework.DumpImageRegistryResource(t, client) + framework.DumpOperatorLogs(t, client) + t.Fatal(err) + } + + d, err := client.Deployments(imageregistryv1.ImageRegistryOperatorNamespace).Get(imageregistryv1.ImageRegistryName, metav1.GetOptions{}) + if !errors.IsNotFound(err) { + t.Fatalf("deployment is expected to be removed, got %v %v", d, err) + } +} diff --git a/test/e2e/unmanaged_test.go b/test/e2e/unmanaged_test.go deleted file mode 100644 index 2971d97c6c..0000000000 --- a/test/e2e/unmanaged_test.go +++ /dev/null @@ -1,83 +0,0 @@ -package e2e - -import ( - "testing" - "time" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" - - "k8s.io/client-go/util/retry" - - operatorapi "github.com/openshift/api/operator/v1" - - imageregistryv1 "github.com/openshift/cluster-image-registry-operator/pkg/apis/imageregistry/v1" - "github.com/openshift/cluster-image-registry-operator/test/framework" -) - -func TestUnmanaged(t *testing.T) { - client := framework.MustNewClientset(t, nil) - - defer framework.MustRemoveImageRegistry(t, client) - - framework.MustDeployImageRegistry(t, client, &imageregistryv1.Config{ - TypeMeta: metav1.TypeMeta{ - APIVersion: imageregistryv1.SchemeGroupVersion.String(), - Kind: "Config", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: imageregistryv1.ImageRegistryResourceName, - }, - Spec: imageregistryv1.ImageRegistrySpec{ - ManagementState: operatorapi.Managed, - Storage: imageregistryv1.ImageRegistryConfigStorage{ - EmptyDir: &imageregistryv1.ImageRegistryConfigStorageEmptyDir{}, - }, - Replicas: 1, - }, - }) - framework.MustEnsureImageRegistryIsAvailable(t, client) - - var cr *imageregistryv1.Config - var err error - err = retry.RetryOnConflict(retry.DefaultBackoff, func() error { - cr, err = client.Configs().Get(imageregistryv1.ImageRegistryResourceName, metav1.GetOptions{}) - if err != nil { - t.Fatal(err) - } - - cr.Spec.ManagementState = operatorapi.Unmanaged - - cr, err = client.Configs().Update(cr) - if err != nil { - return err - } - return nil - }) - if err != nil { - t.Fatal(err) - } - - // TODO(dmage): wait for the resource to be observed - - err = client.Deployments(imageregistryv1.ImageRegistryOperatorNamespace).Delete(imageregistryv1.ImageRegistryName, &metav1.DeleteOptions{}) - if err != nil { - t.Fatal(err) - } - - err = wait.Poll(1*time.Second, framework.AsyncOperationTimeout, func() (stop bool, err error) { - cr, err = client.Configs().Get(imageregistryv1.ImageRegistryResourceName, metav1.GetOptions{}) - if err != nil { - return false, err - } - - conds := framework.GetImageRegistryConditions(cr) - t.Logf("image registry: %s", conds) - return conds.Available.IsFalse() && conds.Progressing.IsFalse(), err - }) - if err != nil { - framework.DumpImageRegistryResource(t, client) - framework.DumpOperatorLogs(t, client) - t.Fatal(err) - } -}