Skip to content

Commit 01ffcc0

Browse files
committed
follow-ups for containers/image from catalogd and previous PR
Signed-off-by: Joe Lanford <joe.lanford@gmail.com>
1 parent df0e848 commit 01ffcc0

File tree

6 files changed

+222
-123
lines changed

6 files changed

+222
-123
lines changed

go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ require (
1313
github.com/go-logr/logr v1.4.2
1414
github.com/google/go-cmp v0.6.0
1515
github.com/google/go-containerregistry v0.20.2
16-
github.com/olareg/olareg v0.1.1
1716
github.com/onsi/ginkgo/v2 v2.20.2
1817
github.com/onsi/gomega v1.34.2
1918
github.com/opencontainers/go-digest v1.0.0

go.sum

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -513,8 +513,6 @@ github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
513513
github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
514514
github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
515515
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
516-
github.com/olareg/olareg v0.1.1 h1:Ui7q93zjcoF+U9U71sgqgZWByDoZOpqHitUXEu2xV+g=
517-
github.com/olareg/olareg v0.1.1/go.mod h1:w8NP4SWrHHtxsFaUiv1lnCnYPm4sN1seCd2h7FK/dc0=
518516
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
519517
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
520518
github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0=

internal/controllers/clusterextension_controller.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,7 @@ func (r *ClusterExtensionReconciler) Reconcile(ctx context.Context, req ctrl.Req
110110
}
111111

112112
reconciledExt := existingExt.DeepCopy()
113-
res, err := r.reconcile(ctx, reconciledExt)
114-
updateError := err
113+
res, reconcileErr := r.reconcile(ctx, reconciledExt)
115114

116115
// Do checks before any Update()s, as Update() may modify the resource structure!
117116
updateStatus := !equality.Semantic.DeepEqual(existingExt.Status, reconciledExt.Status)
@@ -120,7 +119,7 @@ func (r *ClusterExtensionReconciler) Reconcile(ctx context.Context, req ctrl.Req
120119

121120
if updateStatus {
122121
if err := r.Client.Status().Update(ctx, reconciledExt); err != nil {
123-
updateError = errors.Join(updateError, fmt.Errorf("error updating status: %v", err))
122+
reconcileErr = errors.Join(reconcileErr, fmt.Errorf("error updating status: %v", err))
124123
}
125124
}
126125

@@ -130,11 +129,11 @@ func (r *ClusterExtensionReconciler) Reconcile(ctx context.Context, req ctrl.Req
130129

131130
if updateFinalizers {
132131
if err := r.Client.Update(ctx, reconciledExt); err != nil {
133-
updateError = errors.Join(updateError, fmt.Errorf("error updating finalizers: %v", err))
132+
reconcileErr = errors.Join(reconcileErr, fmt.Errorf("error updating finalizers: %v", err))
134133
}
135134
}
136135

137-
return res, updateError
136+
return res, reconcileErr
138137
}
139138

140139
// ensureAllConditionsWithReason checks that all defined condition types exist in the given ClusterExtension,

internal/controllers/clusterextension_controller_test.go

Lines changed: 92 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"k8s.io/apimachinery/pkg/util/rand"
1919
ctrl "sigs.k8s.io/controller-runtime"
2020
"sigs.k8s.io/controller-runtime/pkg/client"
21+
"sigs.k8s.io/controller-runtime/pkg/reconcile"
2122

2223
"github.com/operator-framework/operator-registry/alpha/declcfg"
2324

@@ -172,79 +173,100 @@ func TestClusterExtensionResolutionSucceeds(t *testing.T) {
172173
}
173174

174175
func TestClusterExtensionUnpackFails(t *testing.T) {
175-
cl, reconciler := newClientAndReconciler(t)
176-
reconciler.Unpacker = &MockUnpacker{
177-
err: errors.New("unpack failure"),
176+
type testCase struct {
177+
name string
178+
unpackErr error
179+
expectTerminal bool
178180
}
179-
180-
ctx := context.Background()
181-
extKey := types.NamespacedName{Name: fmt.Sprintf("cluster-extension-test-%s", rand.String(8))}
182-
183-
t.Log("When the cluster extension specifies a channel with version that exist")
184-
t.Log("By initializing cluster state")
185-
pkgName := "prometheus"
186-
pkgVer := "1.0.0"
187-
pkgChan := "beta"
188-
namespace := fmt.Sprintf("test-ns-%s", rand.String(8))
189-
serviceAccount := fmt.Sprintf("test-sa-%s", rand.String(8))
190-
191-
clusterExtension := &ocv1alpha1.ClusterExtension{
192-
ObjectMeta: metav1.ObjectMeta{Name: extKey.Name},
193-
Spec: ocv1alpha1.ClusterExtensionSpec{
194-
Source: ocv1alpha1.SourceConfig{
195-
SourceType: "Catalog",
196-
Catalog: &ocv1alpha1.CatalogSource{
197-
PackageName: pkgName,
198-
Version: pkgVer,
199-
Channels: []string{pkgChan},
200-
},
201-
},
202-
Install: ocv1alpha1.ClusterExtensionInstallConfig{
203-
Namespace: namespace,
204-
ServiceAccount: ocv1alpha1.ServiceAccountReference{
205-
Name: serviceAccount,
206-
},
207-
},
181+
for _, tc := range []testCase{
182+
{
183+
name: "recoverable unpack failure",
184+
unpackErr: errors.New("unpack failure"),
208185
},
186+
{
187+
name: "unrecoverable unpack failure",
188+
unpackErr: reconcile.TerminalError(errors.New("unrecoverable unpack failure")),
189+
expectTerminal: true,
190+
},
191+
} {
192+
t.Run(tc.name, func(t *testing.T) {
193+
cl, reconciler := newClientAndReconciler(t)
194+
reconciler.Unpacker = &MockUnpacker{
195+
err: tc.unpackErr,
196+
}
197+
198+
ctx := context.Background()
199+
extKey := types.NamespacedName{Name: fmt.Sprintf("cluster-extension-test-%s", rand.String(8))}
200+
201+
t.Log("When the cluster extension specifies a channel with version that exist")
202+
t.Log("By initializing cluster state")
203+
pkgName := "prometheus"
204+
pkgVer := "1.0.0"
205+
pkgChan := "beta"
206+
namespace := fmt.Sprintf("test-ns-%s", rand.String(8))
207+
serviceAccount := fmt.Sprintf("test-sa-%s", rand.String(8))
208+
209+
clusterExtension := &ocv1alpha1.ClusterExtension{
210+
ObjectMeta: metav1.ObjectMeta{Name: extKey.Name},
211+
Spec: ocv1alpha1.ClusterExtensionSpec{
212+
Source: ocv1alpha1.SourceConfig{
213+
SourceType: "Catalog",
214+
Catalog: &ocv1alpha1.CatalogSource{
215+
PackageName: pkgName,
216+
Version: pkgVer,
217+
Channels: []string{pkgChan},
218+
},
219+
},
220+
Install: ocv1alpha1.ClusterExtensionInstallConfig{
221+
Namespace: namespace,
222+
ServiceAccount: ocv1alpha1.ServiceAccountReference{
223+
Name: serviceAccount,
224+
},
225+
},
226+
},
227+
}
228+
err := cl.Create(ctx, clusterExtension)
229+
require.NoError(t, err)
230+
231+
t.Log("It sets resolution success status")
232+
t.Log("By running reconcile")
233+
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1alpha1.ClusterExtension, _ *ocv1alpha1.BundleMetadata) (*declcfg.Bundle, *bsemver.Version, *declcfg.Deprecation, error) {
234+
v := bsemver.MustParse("1.0.0")
235+
return &declcfg.Bundle{
236+
Name: "prometheus.v1.0.0",
237+
Package: "prometheus",
238+
Image: "quay.io/operatorhubio/prometheus@fake1.0.0",
239+
}, &v, nil, nil
240+
})
241+
res, err := reconciler.Reconcile(ctx, ctrl.Request{NamespacedName: extKey})
242+
require.Equal(t, ctrl.Result{}, res)
243+
isTerminal := errors.Is(err, reconcile.TerminalError(nil))
244+
assert.Equal(t, tc.expectTerminal, isTerminal, "expected terminal error: %v, got: %v", tc.expectTerminal, isTerminal)
245+
assert.ErrorContains(t, err, tc.unpackErr.Error())
246+
247+
t.Log("By fetching updated cluster extension after reconcile")
248+
require.NoError(t, cl.Get(ctx, extKey, clusterExtension))
249+
250+
t.Log("By checking the status fields")
251+
require.Equal(t, ocv1alpha1.BundleMetadata{Name: "prometheus.v1.0.0", Version: "1.0.0"}, clusterExtension.Status.Resolution.Bundle)
252+
require.Empty(t, clusterExtension.Status.Install)
253+
254+
t.Log("By checking the expected conditions")
255+
resolvedCond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1alpha1.TypeResolved)
256+
require.NotNil(t, resolvedCond)
257+
require.Equal(t, metav1.ConditionTrue, resolvedCond.Status)
258+
require.Equal(t, ocv1alpha1.ReasonSuccess, resolvedCond.Reason)
259+
require.Equal(t, "resolved to \"quay.io/operatorhubio/prometheus@fake1.0.0\"", resolvedCond.Message)
260+
261+
t.Log("By checking the expected unpacked conditions")
262+
unpackedCond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1alpha1.TypeUnpacked)
263+
require.NotNil(t, unpackedCond)
264+
require.Equal(t, metav1.ConditionFalse, unpackedCond.Status)
265+
require.Equal(t, ocv1alpha1.ReasonFailed, unpackedCond.Reason)
266+
267+
require.NoError(t, cl.DeleteAllOf(ctx, &ocv1alpha1.ClusterExtension{}))
268+
})
209269
}
210-
err := cl.Create(ctx, clusterExtension)
211-
require.NoError(t, err)
212-
213-
t.Log("It sets resolution success status")
214-
t.Log("By running reconcile")
215-
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1alpha1.ClusterExtension, _ *ocv1alpha1.BundleMetadata) (*declcfg.Bundle, *bsemver.Version, *declcfg.Deprecation, error) {
216-
v := bsemver.MustParse("1.0.0")
217-
return &declcfg.Bundle{
218-
Name: "prometheus.v1.0.0",
219-
Package: "prometheus",
220-
Image: "quay.io/operatorhubio/prometheus@fake1.0.0",
221-
}, &v, nil, nil
222-
})
223-
res, err := reconciler.Reconcile(ctx, ctrl.Request{NamespacedName: extKey})
224-
require.Equal(t, ctrl.Result{}, res)
225-
require.Error(t, err)
226-
227-
t.Log("By fetching updated cluster extension after reconcile")
228-
require.NoError(t, cl.Get(ctx, extKey, clusterExtension))
229-
230-
t.Log("By checking the status fields")
231-
require.Equal(t, ocv1alpha1.BundleMetadata{Name: "prometheus.v1.0.0", Version: "1.0.0"}, clusterExtension.Status.Resolution.Bundle)
232-
require.Empty(t, clusterExtension.Status.Install)
233-
234-
t.Log("By checking the expected conditions")
235-
resolvedCond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1alpha1.TypeResolved)
236-
require.NotNil(t, resolvedCond)
237-
require.Equal(t, metav1.ConditionTrue, resolvedCond.Status)
238-
require.Equal(t, ocv1alpha1.ReasonSuccess, resolvedCond.Reason)
239-
require.Equal(t, "resolved to \"quay.io/operatorhubio/prometheus@fake1.0.0\"", resolvedCond.Message)
240-
241-
t.Log("By checking the expected unpacked conditions")
242-
unpackedCond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1alpha1.TypeUnpacked)
243-
require.NotNil(t, unpackedCond)
244-
require.Equal(t, metav1.ConditionFalse, unpackedCond.Status)
245-
require.Equal(t, ocv1alpha1.ReasonFailed, unpackedCond.Reason)
246-
247-
require.NoError(t, cl.DeleteAllOf(ctx, &ocv1alpha1.ClusterExtension{}))
248270
}
249271

250272
func TestClusterExtensionUnpackUnexpectedState(t *testing.T) {

0 commit comments

Comments
 (0)