diff --git a/api/v1alpha1/componentversion_types.go b/api/v1alpha1/componentversion_types.go index b42f951c..536eb45b 100644 --- a/api/v1alpha1/componentversion_types.go +++ b/api/v1alpha1/componentversion_types.go @@ -179,6 +179,11 @@ func (in *ComponentVersion) GetComponentName() string { return in.Spec.Component } +// GetRepositoryURL returns the repository URL that the component version has been reconciled to. +func (in *ComponentVersion) GetRepositoryURL() string { + return in.Status.ReplicatedRepositoryURL +} + // GetVersion returns the reconciled version for the component. func (in *ComponentVersion) GetVersion() string { return in.Status.ReconciledVersion diff --git a/controllers/componentversion_contoller_test.go b/controllers/componentversion_contoller_test.go index 47beb0d4..89b2d438 100644 --- a/controllers/componentversion_contoller_test.go +++ b/controllers/componentversion_contoller_test.go @@ -260,7 +260,7 @@ func TestComponentVersionWithTransferReconcile(t *testing.T) { assert.Len(t, cv.Status.ComponentDescriptor.References, 1) assert.Equal(t, "test-ref-1", cv.Status.ComponentDescriptor.References[0].Name) - assert.Equal(t, "github.com/open-component-model/internal-test", cv.Status.ReplicatedRepositoryURL) + assert.Equal(t, "github.com/open-component-model/internal-test", cv.GetRepositoryURL()) assert.True(t, conditions.IsTrue(cv, meta.ReadyCondition)) t.Log("checking label values") diff --git a/controllers/componentversion_controller.go b/controllers/componentversion_controller.go index c2248477..d3804f58 100644 --- a/controllers/componentversion_controller.go +++ b/controllers/componentversion_controller.go @@ -242,7 +242,8 @@ func (r *ComponentVersionReconciler) reconcile( obj.Status.ReplicatedRepositoryURL = obj.Spec.Repository.URL - cv, err := r.OCMClient.GetComponentVersion(ctx, octx, obj.Status.ReplicatedRepositoryURL, obj.Spec.Component, version) + // Get the component version from the original repository URL. + cv, err := r.OCMClient.GetComponentVersion(ctx, octx, obj.GetRepositoryURL(), obj.Spec.Component, version) if err != nil { err = fmt.Errorf("failed to get component version: %w", err) status.MarkNotReady( @@ -257,6 +258,7 @@ func (r *ComponentVersionReconciler) reconcile( defer cv.Close() + // If there is a transfer requested, transfer the cv to that location. if obj.Spec.Destination != nil { rreconcile.ProgressiveStatus(false, obj, meta.ProgressingReason, "transferring component to target repository: %s", obj.Spec.Destination.URL) @@ -267,10 +269,11 @@ func (r *ComponentVersionReconciler) reconcile( return ctrl.Result{}, err } + // set the new URL to the destination URL obj.Status.ReplicatedRepositoryURL = obj.Spec.Destination.URL - // overwrite the component version - cv, err = r.OCMClient.GetComponentVersion(ctx, octx, obj.Status.ReplicatedRepositoryURL, obj.Spec.Component, version) + // update the ocm component version to be the new version from the replicated destination + cv, err = r.OCMClient.GetComponentVersion(ctx, octx, obj.GetRepositoryURL(), obj.Spec.Component, version) if err != nil { err = fmt.Errorf("failed to get transferred component version: %w", err) status.MarkNotReady( @@ -444,7 +447,7 @@ func (r *ComponentVersionReconciler) constructComponentDescriptorsForReference( ref ocmdesc.ComponentReference, ) (*v1alpha1.Reference, error) { // get component version - rcv, err := r.OCMClient.GetComponentVersion(ctx, octx, parent.Status.ReplicatedRepositoryURL, ref.ComponentName, ref.Version) + rcv, err := r.OCMClient.GetComponentVersion(ctx, octx, parent.GetRepositoryURL(), ref.ComponentName, ref.Version) if err != nil { return nil, fmt.Errorf("failed to get component version: %w", err) } diff --git a/controllers/mutation_reconcile_looper.go b/controllers/mutation_reconcile_looper.go index aae7f89b..f2bc4360 100644 --- a/controllers/mutation_reconcile_looper.go +++ b/controllers/mutation_reconcile_looper.go @@ -199,6 +199,10 @@ func (m *MutationReconcileLooper) localize( return "", fmt.Errorf("failed to get component version: %w", err) } + if !conditions.IsReady(cv) || cv.GetRepositoryURL() == "" { + return "", fmt.Errorf("component version is not ready yet") + } + var refPath []ocmmetav1.Identity if mutationSpec.ConfigRef.ResourceRef != nil { refPath = mutationSpec.ConfigRef.ResourceRef.ReferencePath @@ -374,7 +378,7 @@ func (m *MutationReconcileLooper) createSubstitutionRulesForLocalization( return nil, fmt.Errorf("failed to create authenticated client: %w", err) } - compvers, err := m.OCMClient.GetComponentVersion(ctx, octx, cv.Status.ReplicatedRepositoryURL, cv.Spec.Component, cv.Status.ReconciledVersion) + compvers, err := m.OCMClient.GetComponentVersion(ctx, octx, cv.GetRepositoryURL(), cv.Spec.Component, cv.Status.ReconciledVersion) if err != nil { return nil, fmt.Errorf("failed to get component version: %w", err) } diff --git a/controllers/resource_controller.go b/controllers/resource_controller.go index b25a18df..6815dc21 100644 --- a/controllers/resource_controller.go +++ b/controllers/resource_controller.go @@ -171,8 +171,8 @@ func (r *ResourceReconciler) reconcile( return ctrl.Result{}, err } - var componentVersion v1alpha1.ComponentVersion - if err := r.Get(ctx, obj.Spec.SourceRef.GetObjectKey(), &componentVersion); err != nil { + componentVersion := &v1alpha1.ComponentVersion{} + if err := r.Get(ctx, obj.Spec.SourceRef.GetObjectKey(), componentVersion); err != nil { if apierrors.IsNotFound(err) { return ctrl.Result{RequeueAfter: obj.GetRequeueAfter()}, nil } @@ -183,7 +183,7 @@ func (r *ResourceReconciler) reconcile( return ctrl.Result{}, err } - if !conditions.IsReady(&componentVersion) { + if !conditions.IsReady(componentVersion) || componentVersion.GetRepositoryURL() == "" { status.MarkNotReady(r.EventRecorder, obj, v1alpha1.ComponentVersionNotReadyReason, "component version not ready yet") return ctrl.Result{RequeueAfter: obj.GetRequeueAfter()}, nil @@ -191,7 +191,7 @@ func (r *ResourceReconciler) reconcile( rreconcile.ProgressiveStatus(false, obj, meta.ProgressingReason, "component version %s ready, processing ocm resource", componentVersion.Name) - octx, err := r.OCMClient.CreateAuthenticatedOCMContext(ctx, &componentVersion) + octx, err := r.OCMClient.CreateAuthenticatedOCMContext(ctx, componentVersion) if err != nil { err = fmt.Errorf("failed to create authenticated client: %w", err) status.MarkAsStalled(r.EventRecorder, obj, v1alpha1.AuthenticatedContextCreationFailedReason, err.Error()) @@ -199,7 +199,7 @@ func (r *ResourceReconciler) reconcile( return ctrl.Result{}, nil } - reader, digest, size, err := r.OCMClient.GetResource(ctx, octx, &componentVersion, obj.Spec.SourceRef.ResourceRef) + reader, digest, size, err := r.OCMClient.GetResource(ctx, octx, componentVersion, obj.Spec.SourceRef.ResourceRef) if err != nil { err = fmt.Errorf("failed to get resource: %w", err) status.MarkNotReady(r.EventRecorder, obj, v1alpha1.GetResourceFailedReason, err.Error()) diff --git a/controllers/resourcepipeline_controller.go b/controllers/resourcepipeline_controller.go index ff3c0ae2..48978923 100644 --- a/controllers/resourcepipeline_controller.go +++ b/controllers/resourcepipeline_controller.go @@ -263,20 +263,20 @@ func (r *ResourcePipelineReconciler) getComponentVersionAccess( ctx context.Context, obj *v1alpha1.ResourcePipeline, ) (ocmcore.ComponentVersionAccess, error) { - var componentVersion v1alpha1.ComponentVersion + componentVersion := &v1alpha1.ComponentVersion{} key := types.NamespacedName{ Name: obj.Spec.SourceRef.Name, Namespace: obj.Spec.SourceRef.Namespace, } - if err := r.Get(ctx, key, &componentVersion); err != nil { + if err := r.Get(ctx, key, componentVersion); err != nil { return nil, err } - if !conditions.IsReady(&componentVersion) { + if !conditions.IsReady(componentVersion) { return nil, errCVNotReady } - octx, err := r.OCMClient.CreateAuthenticatedOCMContext(ctx, &componentVersion) + octx, err := r.OCMClient.CreateAuthenticatedOCMContext(ctx, componentVersion) if err != nil { return nil, fmt.Errorf("could not create auth context: %w", err) } @@ -284,7 +284,7 @@ func (r *ResourcePipelineReconciler) getComponentVersionAccess( return r.OCMClient.GetComponentVersion( ctx, octx, - componentVersion.Status.ReplicatedRepositoryURL, + componentVersion.GetRepositoryURL(), componentVersion.GetComponentName(), componentVersion.GetVersion(), ) diff --git a/controllers/suite_test.go b/controllers/suite_test.go index 4246f627..57b9c342 100644 --- a/controllers/suite_test.go +++ b/controllers/suite_test.go @@ -99,6 +99,9 @@ var ( }, Verify: []v1alpha1.Signature{}, }, + Status: v1alpha1.ComponentVersionStatus{ + ReplicatedRepositoryURL: "github.com/open-component-model/test", + }, } DefaultResource = &v1alpha1.Resource{ TypeMeta: metav1.TypeMeta{ diff --git a/pkg/ocm/ocm.go b/pkg/ocm/ocm.go index 6045b728..9c760ffd 100644 --- a/pkg/ocm/ocm.go +++ b/pkg/ocm/ocm.go @@ -225,7 +225,7 @@ func (c *Client) GetResource( return c.cache.FetchDataByIdentity(ctx, name, version) } - cva, err := c.GetComponentVersion(ctx, octx, cv.Status.ReplicatedRepositoryURL, cv.Spec.Component, cv.Status.ReconciledVersion) + cva, err := c.GetComponentVersion(ctx, octx, cv.GetRepositoryURL(), cv.Spec.Component, cv.Status.ReconciledVersion) if err != nil { return nil, "", -1, fmt.Errorf("failed to get component Version: %w", err) } diff --git a/pkg/ocm/ocm_test.go b/pkg/ocm/ocm_test.go index 37987fd2..2631f906 100644 --- a/pkg/ocm/ocm_test.go +++ b/pkg/ocm/ocm_test.go @@ -430,7 +430,7 @@ func TestClient_GetComponentVersion(t *testing.T) { }, } - cva, err := ocmClient.GetComponentVersion(context.Background(), octx, cv.Status.ReplicatedRepositoryURL, component, "v0.0.1") + cva, err := ocmClient.GetComponentVersion(context.Background(), octx, cv.GetRepositoryURL(), component, "v0.0.1") assert.NoError(t, err) assert.Equal(t, cv.Spec.Component, cva.GetName()) }