Skip to content

Commit

Permalink
fix(controller): always keep CachedImage IsCached status updated
Browse files Browse the repository at this point in the history
  • Loading branch information
paullaffitte committed May 24, 2024
1 parent 7285f02 commit 172dd7b
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 23 deletions.
56 changes: 34 additions & 22 deletions controllers/cachedimage_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -197,26 +197,34 @@ func (r *CachedImageReconciler) Reconcile(ctx context.Context, req ctrl.Request)
}

// Removing forceUpdate annotation
forceUpdate := cachedImage.Annotations[cachedImageAnnotationForceUpdateName]
forceUpdate := cachedImage.Annotations[cachedImageAnnotationForceUpdateName] == "true"
patch := client.MergeFrom(cachedImage.DeepCopy())
if forceUpdate == "true" {
if forceUpdate {
delete(cachedImage.Annotations, cachedImageAnnotationForceUpdateName)
}
err = r.Patch(context.Background(), &cachedImage, patch)
if err != nil {
return ctrl.Result{}, err
}

isCached, err := registry.ImageIsCached(cachedImage.Spec.SourceImage)
if err != nil {
return ctrl.Result{}, err
}

err = updateStatusRaw(r.Client, &cachedImage, func(status *kuikv1alpha1.CachedImageStatus) {
cachedImage.Status.IsCached = isCached
})
if err != nil {
return ctrl.Result{}, err
}

// Adding image to registry
isCached := false
if forceUpdate != "true" {
isCached, err = registry.ImageIsCached(cachedImage.Spec.SourceImage)
if err != nil {
log.Error(err, "could not determine if the image present in cache")
return ctrl.Result{}, err
}
putImageInCache := true
if isCached && !forceUpdate {
putImageInCache = false
}
if !isCached {
if putImageInCache {
r.Recorder.Eventf(&cachedImage, "Normal", "Caching", "Start caching image %s", cachedImage.Spec.SourceImage)
err = r.cacheImage(&cachedImage)
if err != nil {
Expand Down Expand Up @@ -261,21 +269,25 @@ func (r *CachedImageReconciler) Reconcile(ctx context.Context, req ctrl.Request)
}

func updateStatus(c client.Client, cachedImage *kuikv1alpha1.CachedImage, upstreamDescriptor *remote.Descriptor, update func(*kuikv1alpha1.CachedImageStatus)) error {
patch := client.MergeFrom(cachedImage.DeepCopy())

cachedImage.Status.AvailableUpstream = upstreamDescriptor != nil
cachedImage.Status.LastSync = metav1.NewTime(time.Now())
return updateStatusRaw(c, cachedImage, func(status *kuikv1alpha1.CachedImageStatus) {
cachedImage.Status.AvailableUpstream = upstreamDescriptor != nil
cachedImage.Status.LastSync = metav1.NewTime(time.Now())

update(&cachedImage.Status)
update(&cachedImage.Status)

if upstreamDescriptor != nil {
cachedImage.Status.UpstreamDigest = upstreamDescriptor.Digest.Hex
cachedImage.Status.UpToDate = cachedImage.Status.Digest == upstreamDescriptor.Digest.Hex
} else {
cachedImage.Status.UpstreamDigest = ""
cachedImage.Status.UpToDate = false
}
if upstreamDescriptor != nil {
cachedImage.Status.UpstreamDigest = upstreamDescriptor.Digest.Hex
cachedImage.Status.UpToDate = cachedImage.Status.Digest == upstreamDescriptor.Digest.Hex
} else {
cachedImage.Status.UpstreamDigest = ""
cachedImage.Status.UpToDate = false
}
})
}

func updateStatusRaw(c client.Client, cachedImage *kuikv1alpha1.CachedImage, update func(*kuikv1alpha1.CachedImageStatus)) error {
patch := client.MergeFrom(cachedImage.DeepCopy())
update(&cachedImage.Status)
return c.Status().Patch(context.Background(), cachedImage, patch)
}

Expand Down
6 changes: 5 additions & 1 deletion internal/registry/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,11 @@ func ImageIsCached(imageName string) (bool, error) {
return false, err
}

return imageExists(reference)
exists, err := imageExists(reference)
if err != nil {
err = fmt.Errorf("could not determine if the image present in cache: %w", err)
}
return exists, err
}

func DeleteImage(imageName string) error {
Expand Down
4 changes: 4 additions & 0 deletions internal/registry/registry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,10 @@ func Test_ImageIsCached(t *testing.T) {
Endpoint = server.Addr()
isCached, err := ImageIsCached(tt.image)
if tt.wantErr != "" {
err2 := errors.Unwrap(err)
if err2 != nil {
err = err2
}
g.Expect(err).To(BeAssignableToTypeOf(tt.errType))
g.Expect(err).To(MatchError(ContainSubstring(tt.wantErr)))
} else {
Expand Down

0 comments on commit 172dd7b

Please sign in to comment.