From faf835f8aff312f40e919f4590a7fb21b77ecf71 Mon Sep 17 00:00:00 2001 From: njhale Date: Fri, 18 Jan 2019 15:08:56 -0500 Subject: [PATCH] fix(installplans): add ability to apply Services --- pkg/controller/operators/catalog/operator.go | 36 +++++++++++++++++++ .../registry/resolver/resolver_test.go | 21 +++++++++++ pkg/lib/ownerutil/util.go | 6 ++++ 3 files changed, 63 insertions(+) diff --git a/pkg/controller/operators/catalog/operator.go b/pkg/controller/operators/catalog/operator.go index f523921add8..bb9a23a2d7d 100644 --- a/pkg/controller/operators/catalog/operator.go +++ b/pkg/controller/operators/catalog/operator.go @@ -43,6 +43,7 @@ const ( clusterRoleKind = "ClusterRole" clusterRoleBindingKind = "ClusterRoleBinding" serviceAccountKind = "ServiceAccount" + serviceKind = "Service" roleKind = "Role" roleBindingKind = "RoleBinding" ) @@ -1031,6 +1032,41 @@ func (o *Operator) ExecutePlan(plan *v1alpha1.InstallPlan) error { // If no error occurred, mark the step as Created. plan.Status.Plan[i].Status = v1alpha1.StepStatusCreated } + + case serviceKind: + // Marshal the manifest into a Service instance + var s corev1.Service + err := json.Unmarshal([]byte(step.Resource.Manifest), &s) + if err != nil { + return errorwrap.Wrapf(err, "error parsing step manifest: %s", step.Resource.Name) + } + + // Update UIDs on all CSV OwnerReferences + updated, err := o.getUpdatedOwnerReferences(s.OwnerReferences, plan.Namespace) + if err != nil { + return errorwrap.Wrapf(err, "error generating ownerrefs for service: %s", s.GetName()) + } + s.SetOwnerReferences(updated) + s.SetNamespace(namespace) + + // Attempt to create the Service + _, err = o.OpClient.KubernetesInterface().CoreV1().Services(plan.Namespace).Create(&s) + if k8serrors.IsAlreadyExists(err) { + // If it already exists we need to patch the existing SA with the new OwnerReferences + s.SetNamespace(plan.Namespace) + _, err = o.OpClient.UpdateService(&s) + if err != nil { + return errorwrap.Wrapf(err, "error updating service: %s", s.GetName()) + } + + // Mark as present + plan.Status.Plan[i].Status = v1alpha1.StepStatusPresent + } else if err != nil { + return errorwrap.Wrapf(err, "error creating service: %s", s.GetName()) + } else { + // If no error occurred, mark the step as Created + plan.Status.Plan[i].Status = v1alpha1.StepStatusCreated + } default: return v1alpha1.ErrInvalidInstallPlan diff --git a/pkg/controller/registry/resolver/resolver_test.go b/pkg/controller/registry/resolver/resolver_test.go index a522a3ea25c..24791f9f434 100644 --- a/pkg/controller/registry/resolver/resolver_test.go +++ b/pkg/controller/registry/resolver/resolver_test.go @@ -9,6 +9,7 @@ import ( "github.com/stretchr/testify/require" rbacv1 "k8s.io/api/rbac/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" "k8s.io/client-go/tools/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1" @@ -113,6 +114,26 @@ func TestNamespaceResolver(t *testing.T) { }, }, }, + { + name: "SingleNewSubscription/ResolveOne/AdditionalBundleObjects/Service", + clusterState: []runtime.Object{ + newSub(namespace, "a", "alpha", catalog), + }, + bundlesInCatalog: []*opregistry.Bundle{ + withBundleObject(bundle("b.v1", "b", "beta", "", Provides1, nil, nil, nil), u(&corev1.Service{TypeMeta: metav1.TypeMeta{Kind: "Service", APIVersion: ""}, ObjectMeta: metav1.ObjectMeta{Name: "test-service"}})), + bundle("a.v1", "a", "alpha", "", nil, Requires1, nil, nil), + }, + out: out{ + steps: [][]*v1alpha1.Step{ + bundleSteps(bundle("a.v1", "a", "alpha", "", nil, Requires1, nil, nil), namespace, catalog), + bundleSteps(withBundleObject(bundle("b.v1", "b", "beta", "", Provides1, nil, nil, nil), u(&corev1.Service{TypeMeta: metav1.TypeMeta{Kind: "Service", APIVersion: ""}, ObjectMeta: metav1.ObjectMeta{Name: "test-service"}})), namespace, catalog), + subSteps(namespace, "b.v1", "b", "beta", catalog), + }, + subs: []*v1alpha1.Subscription{ + updatedSub(namespace, "a.v1", "a", "alpha", catalog), + }, + }, + }, { name: "SingleNewSubscription/DependencyMissing", clusterState: []runtime.Object{ diff --git a/pkg/lib/ownerutil/util.go b/pkg/lib/ownerutil/util.go index 50c305bf159..84c481fa263 100644 --- a/pkg/lib/ownerutil/util.go +++ b/pkg/lib/ownerutil/util.go @@ -201,6 +201,12 @@ func InferGroupVersionKind(obj runtime.Object) error { } switch obj.(type) { + case *corev1.Service: + objectKind.SetGroupVersionKind(schema.GroupVersionKind{ + Group: "", + Version: "v1", + Kind: "Service", + }) case *corev1.ServiceAccount: objectKind.SetGroupVersionKind(schema.GroupVersionKind{ Group: "",