@@ -6,12 +6,15 @@ import (
66 "time"
77
88 releasecontroller "github.com/openshift/release-controller/pkg/release-controller"
9+ corev1 "k8s.io/api/core/v1"
910 "k8s.io/apimachinery/pkg/api/errors"
1011 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1112 "k8s.io/apimachinery/pkg/labels"
1213 utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1314 "k8s.io/apimachinery/pkg/util/sets"
1415 "k8s.io/klog"
16+
17+ imagev1 "github.com/openshift/api/image/v1"
1518)
1619
1720// garbageCollectSync checks for unreferenced objects and deletes them. Because this can run
@@ -122,11 +125,55 @@ func (c *Controller) garbageCollectSync() error {
122125 }
123126 }
124127
125- // all releasepayloads created for releases that no longer exist should be deleted
128+ // all releasepayloads created for releases that no longer exist should be garbage collected
129+ // create a tag in quay.io with remove__ prefix - the pruner will handle deletion of both tags
126130 for _ , payload := range payloads {
127131 if active .Has (payload .Name ) {
128132 continue
129133 }
134+ // Get the target ImageStream from the ReleasePayload coordinates
135+ targetNamespace := payload .Spec .PayloadCoordinates .Namespace
136+ targetImageStreamName := payload .Spec .PayloadCoordinates .ImagestreamName
137+ if len (targetNamespace ) == 0 || len (targetImageStreamName ) == 0 {
138+ utilruntime .HandleError (fmt .Errorf ("releasepayload %s/%s missing payload coordinates" , payload .Namespace , payload .Name ))
139+ continue
140+ }
141+ // Get the target ImageStream
142+ targetImageStream , err := c .imageClient .ImageStreams (targetNamespace ).Get (context .TODO (), targetImageStreamName , metav1.GetOptions {})
143+ if err != nil {
144+ if errors .IsNotFound (err ) {
145+ continue
146+ }
147+ utilruntime .HandleError (fmt .Errorf ("can't get target imagestream %s/%s for releasepayload %s/%s: %v" , targetNamespace , targetImageStreamName , payload .Namespace , payload .Name , err ))
148+ continue
149+ }
150+ // Create a tag with remove__ prefix pointing to the original tag
151+ removeTagName := fmt .Sprintf ("remove__%s" , payload .Name )
152+ // Check if the remove__ tag already exists
153+ if existingTag := releasecontroller .FindTagReference (targetImageStream , removeTagName ); existingTag != nil {
154+ // Tag already exists, just delete the ReleasePayload
155+ klog .V (2 ).Infof ("Removing orphaned releasepayload %s/%s (remove__ tag already exists)" , payload .Namespace , payload .Name )
156+ if err := c .releasePayloadClient .ReleasePayloads (payload .Namespace ).Delete (context .TODO (), payload .Name , metav1.DeleteOptions {}); err != nil && ! errors .IsNotFound (err ) {
157+ utilruntime .HandleError (fmt .Errorf ("can't delete orphaned releasepayload %s/%s: %v" , payload .Namespace , payload .Name , err ))
158+ }
159+ continue
160+ }
161+ // Create the tag in the target ImageStream
162+ target := targetImageStream .DeepCopy ()
163+ target .Spec .Tags = append (target .Spec .Tags , imagev1.TagReference {
164+ Name : removeTagName ,
165+ From : & corev1.ObjectReference {
166+ Kind : "ImageStreamTag" ,
167+ Name : payload .Name ,
168+ },
169+ ImportPolicy : imagev1.TagImportPolicy {ImportMode : imagev1 .ImportModePreserveOriginal },
170+ })
171+ klog .V (2 ).Infof ("Garbage collecting releasepayload %s/%s by creating tag %s/%s:%s" , payload .Namespace , payload .Name , targetNamespace , targetImageStreamName , removeTagName )
172+ _ , err = c .imageClient .ImageStreams (target .Namespace ).Update (context .TODO (), target , metav1.UpdateOptions {})
173+ if err != nil && ! errors .IsNotFound (err ) {
174+ utilruntime .HandleError (fmt .Errorf ("can't create tag %s/%s:%s for garbage collection: %v" , targetNamespace , targetImageStreamName , removeTagName , err ))
175+ continue
176+ }
130177 klog .V (2 ).Infof ("Removing orphaned releasepayload %s/%s" , payload .Namespace , payload .Name )
131178 if err := c .releasePayloadClient .ReleasePayloads (payload .Namespace ).Delete (context .TODO (), payload .Name , metav1.DeleteOptions {}); err != nil && ! errors .IsNotFound (err ) {
132179 utilruntime .HandleError (fmt .Errorf ("can't delete orphaned releasepayload %s/%s: %v" , payload .Namespace , payload .Name , err ))
0 commit comments