Skip to content

Commit 5e1ef28

Browse files
wip: Resurface bundledeployment errors
1 parent 520219c commit 5e1ef28

File tree

4 files changed

+98
-13
lines changed

4 files changed

+98
-13
lines changed

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ build: manifests generate fmt vet ## Build manager binary.
100100
.PHONY: run
101101
run: docker-build kind-cluster kind-load cert-mgr rukpak install deploy wait ## Build the operator-controller then deploy it into a new kind cluster.
102102

103+
.PHONY: run-local
104+
run-local: manifests generate fmt vet
105+
go run ./main.go
106+
103107
.PHONY: wait
104108
wait:
105109
kubectl wait --for=condition=Available --namespace=$(OPERATOR_CONTROLLER_NAMESPACE) deployment/operator-controller-controller-manager --timeout=$(WAIT_TIMEOUT)

controllers/operator_controller.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,18 @@ func (r *OperatorReconciler) reconcile(ctx context.Context, op *operatorsv1alpha
162162
return ctrl.Result{}, err
163163
}
164164

165+
// Re-fetch the bundleDeployment, if successful then update the operator status.
166+
if err := r.verifySuccessfulBundleDeployments(ctx, op.Name); err != nil {
167+
apimeta.SetStatusCondition(&op.Status.Conditions, metav1.Condition{
168+
Type: operatorsv1alpha1.TypeReady,
169+
Status: metav1.ConditionFalse,
170+
Reason: operatorsv1alpha1.ReasonBundleDeploymentFailed,
171+
Message: err.Error(),
172+
ObservedGeneration: op.GetGeneration(),
173+
})
174+
return ctrl.Result{}, err
175+
}
176+
165177
// update operator status
166178
apimeta.SetStatusCondition(&op.Status.Conditions, metav1.Condition{
167179
Type: operatorsv1alpha1.TypeReady,
@@ -277,3 +289,21 @@ func (r *OperatorReconciler) existingBundleDeploymentUnstructured(ctx context.Co
277289
}
278290
return &unstructured.Unstructured{Object: unstrExistingBundleDeploymentObj}, nil
279291
}
292+
293+
func (r *OperatorReconciler) verifySuccessfulBundleDeployments(ctx context.Context, name string) error {
294+
bundleDeploymentExists := &rukpakv1alpha1.BundleDeployment{}
295+
if err := r.Client.Get(ctx, types.NamespacedName{Name: name}, bundleDeploymentExists); err != nil {
296+
return fmt.Errorf("bundleDeployment %q not found %v", name, err)
297+
}
298+
299+
conditions := bundleDeploymentExists.Status.Conditions
300+
ers := []error{}
301+
302+
for _, c := range conditions {
303+
if c.Status == metav1.ConditionFalse {
304+
ers = append(ers, fmt.Errorf("error observed by Rukpak: %v", c.Message))
305+
}
306+
}
307+
fmt.Println(len(ers))
308+
return utilerrors.NewAggregate(ers)
309+
}

internal/resolution/bundle_cache.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,10 @@ var HardcodedEntitySource = input.NewCacheQuerier(map[deppy.Identifier]input.Ent
4848
"olm.gvk": "[{\"group\":\"monitoring.coreos.com\",\"kind\":\"Alertmanager\",\"version\":\"v1\"},{\"group\":\"monitoring.coreos.com\",\"kind\":\"Alertmanager\",\"version\":\"v1\"},{\"group\":\"monitoring.coreos.com\",\"kind\":\"AlertmanagerConfig\",\"version\":\"v1alpha1\"},{\"group\":\"monitoring.coreos.com\",\"kind\":\"AlertmanagerConfig\",\"version\":\"v1alpha1\"},{\"group\":\"monitoring.coreos.com\",\"kind\":\"PodMonitor\",\"version\":\"v1\"},{\"group\":\"monitoring.coreos.com\",\"kind\":\"PodMonitor\",\"version\":\"v1\"},{\"group\":\"monitoring.coreos.com\",\"kind\":\"Probe\",\"version\":\"v1\"},{\"group\":\"monitoring.coreos.com\",\"kind\":\"Probe\",\"version\":\"v1\"},{\"group\":\"monitoring.coreos.com\",\"kind\":\"Prometheus\",\"version\":\"v1\"},{\"group\":\"monitoring.coreos.com\",\"kind\":\"Prometheus\",\"version\":\"v1\"},{\"group\":\"monitoring.coreos.com\",\"kind\":\"PrometheusRule\",\"version\":\"v1\"},{\"group\":\"monitoring.coreos.com\",\"kind\":\"PrometheusRule\",\"version\":\"v1\"},{\"group\":\"monitoring.coreos.com\",\"kind\":\"ServiceMonitor\",\"version\":\"v1\"},{\"group\":\"monitoring.coreos.com\",\"kind\":\"ServiceMonitor\",\"version\":\"v1\"},{\"group\":\"monitoring.coreos.com\",\"kind\":\"ThanosRuler\",\"version\":\"v1\"},{\"group\":\"monitoring.coreos.com\",\"kind\":\"ThanosRuler\",\"version\":\"v1\"}]",
4949
"olm.package": "{\"packageName\":\"prometheus\",\"version\":\"0.47.0\"}",
5050
}),
51+
"operatorhub/lightbend-console-operator/0.0.1": *input.NewEntity("operatorhub/lightbend-console-operator/0.0.1", map[string]string{
52+
"olm.bundle.path": `"quay.io/operatorhubio/lightbend-console-operator@sha256:2cf5f1abf71be29b7d2667ae9ca4102198c93cdef450d09faf1b26900443e285"`,
53+
"olm.channel": "{\"channelName\":\"alpha\",\"priority\":0}",
54+
"olm.gvk": "[{\"group\":\"app.lightbend.com\",\"kind\":\"Console\",\"version\":\"v1alpha1\"}]",
55+
"olm.package": "{\"packageName\":\"lightbend-console-operator\",\"version\":\"0.0.1\"}",
56+
}),
5157
})

test/e2e/install_test.go

Lines changed: 58 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,25 @@ const (
2121
)
2222

2323
var _ = Describe("Operator Install", func() {
24+
var (
25+
ctx context.Context
26+
pkgName string
27+
operatorName string
28+
operator *operatorv1alpha1.Operator
29+
)
2430
It("resolves the specified package with correct bundle path", func() {
25-
var (
26-
ctx context.Context = context.Background()
27-
pkgName string = "prometheus"
28-
operatorName string = fmt.Sprintf("operator-%s", rand.String(8))
29-
operator *operatorv1alpha1.Operator = &operatorv1alpha1.Operator{
30-
ObjectMeta: metav1.ObjectMeta{
31-
Name: operatorName,
32-
},
33-
Spec: operatorv1alpha1.OperatorSpec{
34-
PackageName: pkgName,
35-
},
36-
}
37-
)
3831
ctx = context.Background()
32+
pkgName = "prometheus"
33+
operatorName = fmt.Sprintf("operator-%s", rand.String(8))
34+
operator = &operatorv1alpha1.Operator{
35+
ObjectMeta: metav1.ObjectMeta{
36+
Name: operatorName,
37+
},
38+
Spec: operatorv1alpha1.OperatorSpec{
39+
PackageName: pkgName,
40+
},
41+
}
42+
3943
By("creating the Operator resource")
4044
err := c.Create(ctx, operator)
4145
Expect(err).ToNot(HaveOccurred())
@@ -64,4 +68,45 @@ var _ = Describe("Operator Install", func() {
6468
err = c.Delete(ctx, operator)
6569
Expect(err).ToNot(HaveOccurred())
6670
})
71+
72+
It("errors when Rukpak is not able to install the operator", func() {
73+
ctx = context.Background()
74+
pkgName = "lightbend-console-operator"
75+
operatorName = fmt.Sprintf("operator-%s", rand.String(8))
76+
operator = &operatorv1alpha1.Operator{
77+
ObjectMeta: metav1.ObjectMeta{
78+
Name: operatorName,
79+
},
80+
Spec: operatorv1alpha1.OperatorSpec{
81+
PackageName: pkgName,
82+
},
83+
}
84+
85+
By("creating the Operator resource")
86+
err := c.Create(ctx, operator)
87+
Expect(err).ToNot(HaveOccurred())
88+
89+
By("eventually reporting a successful resolution and bundle path")
90+
Eventually(func(g Gomega) {
91+
err = c.Get(ctx, types.NamespacedName{Name: operator.Name}, operator)
92+
g.Expect(err).ToNot(HaveOccurred())
93+
g.Expect(len(operator.Status.Conditions)).NotTo(Equal(0))
94+
g.Expect(operator.Status.Conditions[0].Reason).To(Equal("BundleDeploymentFailed"))
95+
g.Expect(operator.Status.Conditions[0].Message).To(ContainSubstring(`error observed by Rukpak`))
96+
}).WithTimeout(defaultTimeout).WithPolling(defaultPoll).Should(Succeed())
97+
98+
By("eventually reporting that installation of package was unsuccessful")
99+
Eventually(func(g Gomega) {
100+
bd := rukpakv1alpha1.BundleDeployment{}
101+
err = c.Get(ctx, types.NamespacedName{Name: operatorName}, &bd)
102+
g.Expect(err).ToNot(HaveOccurred())
103+
g.Expect(len(bd.Status.Conditions)).NotTo(BeEquivalentTo(0))
104+
g.Expect(bd.Status.Conditions[0].Reason).To(Equal("UnpackFailed"))
105+
}).WithTimeout(defaultTimeout).WithPolling(defaultPoll).Should(Succeed())
106+
107+
By("deleting the Operator resource")
108+
err = c.Delete(ctx, operator)
109+
Expect(err).ToNot(HaveOccurred())
110+
111+
})
67112
})

0 commit comments

Comments
 (0)