Skip to content

Commit 39c3b7f

Browse files
committed
fix: return the last verified version that fits the constraint
1 parent 8588071 commit 39c3b7f

File tree

3 files changed

+86
-4
lines changed

3 files changed

+86
-4
lines changed

pkg/ocm/fakes/fakes.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ func (m *MockFetcher) GetLatestComponentVersionWasNotCalled() bool {
150150
return len(m.getLatestComponentVersionCalledWith) == 0
151151
}
152152

153-
func (m *MockFetcher) ListComponentVersions(logger logr.Logger, octx ocm.Context, obj *v1alpha1.ComponentVersion) ([]ocmctrl.Version, error) {
153+
func (m *MockFetcher) ListComponentVersions(ctx context.Context, logger logr.Logger, octx ocm.Context, obj *v1alpha1.ComponentVersion) ([]ocmctrl.Version, error) {
154154
m.listComponentVersionsCalledWith = append(m.listComponentVersionsCalledWith, []any{obj})
155155
return m.listComponentVersionsVersions, m.listComponentVersionsErr
156156
}

pkg/ocm/ocm.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ type Contract interface {
5858
repositoryURL, name, version string,
5959
) (ocm.ComponentVersionAccess, error)
6060
GetLatestValidComponentVersion(ctx context.Context, octx ocm.Context, obj *v1alpha1.ComponentVersion) (string, error)
61-
ListComponentVersions(logger logr.Logger, octx ocm.Context, obj *v1alpha1.ComponentVersion) ([]Version, error)
61+
ListComponentVersions(ctx context.Context, logger logr.Logger, octx ocm.Context, obj *v1alpha1.ComponentVersion) ([]Version, error)
6262
VerifyComponent(ctx context.Context, octx ocm.Context, obj *v1alpha1.ComponentVersion, version string) (bool, error)
6363
TransferComponent(
6464
octx ocm.Context,
@@ -427,7 +427,7 @@ func (c *Client) GetLatestValidComponentVersion(
427427
) (string, error) {
428428
logger := log.FromContext(ctx)
429429

430-
versions, err := c.ListComponentVersions(logger, octx, obj)
430+
versions, err := c.ListComponentVersions(ctx, logger, octx, obj)
431431
if err != nil {
432432
return "", fmt.Errorf("failed to get component versions: %w", err)
433433
}
@@ -462,6 +462,7 @@ type Version struct {
462462
}
463463

464464
func (c *Client) ListComponentVersions(
465+
ctx context.Context,
465466
logger logr.Logger,
466467
octx ocm.Context,
467468
obj *v1alpha1.ComponentVersion,
@@ -488,6 +489,15 @@ func (c *Client) ListComponentVersions(
488489

489490
var result []Version
490491
for _, v := range versions {
492+
// make sure we don't do any lookup if we don't need to
493+
if len(obj.Spec.Verify) > 0 {
494+
if _, err := c.VerifyComponent(ctx, octx, obj, v); err != nil {
495+
logger.Error(err, "ignoring version as it failed verification", "version", v, "component", obj.Spec.Component)
496+
497+
continue
498+
}
499+
}
500+
491501
parsed, err := semver.NewVersion(v)
492502
if err != nil {
493503
logger.Error(err, "ignoring version as it was invalid semver", "version", v)

pkg/ocm/ocm_test.go

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,11 @@ func TestClient_CreateAuthenticatedOCMContextWithServiceAccount(t *testing.T) {
555555
}
556556

557557
func TestClient_GetLatestValidComponentVersion(t *testing.T) {
558+
publicKey1, err := os.ReadFile(filepath.Join("testdata", "public1_key.pem"))
559+
require.NoError(t, err)
560+
privateKey, err := os.ReadFile(filepath.Join("testdata", "private_key.pem"))
561+
require.NoError(t, err)
562+
558563
testCases := []struct {
559564
name string
560565
componentVersion func(name string) *v1alpha1.ComponentVersion
@@ -709,12 +714,79 @@ func TestClient_GetLatestValidComponentVersion(t *testing.T) {
709714

710715
expectedVersion: "v0.0.5",
711716
},
717+
{
718+
name: "latest _verified_ version is returned",
719+
componentVersion: func(name string) *v1alpha1.ComponentVersion {
720+
return &v1alpha1.ComponentVersion{
721+
ObjectMeta: metav1.ObjectMeta{
722+
Name: "test-name",
723+
Namespace: "default",
724+
},
725+
Spec: v1alpha1.ComponentVersionSpec{
726+
Component: name,
727+
Version: v1alpha1.Version{
728+
Semver: ">=v0.0.1",
729+
},
730+
Repository: v1alpha1.Repository{
731+
URL: "localhost",
732+
},
733+
Verify: []v1alpha1.Signature{
734+
{
735+
Name: Signature,
736+
PublicKey: v1alpha1.PublicKey{
737+
SecretRef: &corev1.LocalObjectReference{
738+
Name: "sign-secret",
739+
},
740+
},
741+
},
742+
},
743+
},
744+
}
745+
},
746+
setupComponents: func(name string, context *fakeocm.Context) {
747+
for _, v := range []string{"v0.0.1", "v0.0.2", "v0.0.4", "v0.0.5"} {
748+
if v == "v0.0.4" {
749+
// sign it
750+
_ = context.AddComponent(&fakeocm.Component{
751+
Name: name,
752+
Version: v,
753+
Sign: &fakeocm.Sign{
754+
Name: Signature,
755+
PrivKey: privateKey,
756+
PubKey: publicKey1,
757+
Digest: "3d879ecdea45acb7f8d85b89fd653288d84af4476eac4141822142ec59c13745",
758+
},
759+
})
760+
761+
continue
762+
}
763+
764+
_ = context.AddComponent(&fakeocm.Component{
765+
Name: name,
766+
Version: v,
767+
})
768+
}
769+
},
770+
771+
expectedVersion: "v0.0.4", // v0.0.4 is the only signed version and should be returned.
772+
},
712773
}
713774
for _, tt := range testCases {
714775
t.Run(tt.name, func(t *testing.T) {
715776
t.Helper()
716777

717-
fakeKubeClient := env.FakeKubeClient()
778+
secretName := "sign-secret"
779+
secret := &corev1.Secret{
780+
ObjectMeta: metav1.ObjectMeta{
781+
Name: secretName,
782+
Namespace: "default",
783+
},
784+
Data: map[string][]byte{
785+
Signature: publicKey1,
786+
},
787+
}
788+
789+
fakeKubeClient := env.FakeKubeClient(WithObjects(secret))
718790
cache := &fakes.FakeCache{}
719791
ocmClient := NewClient(fakeKubeClient, cache)
720792
octx := fakeocm.NewFakeOCMContext()

0 commit comments

Comments
 (0)