@@ -2,6 +2,7 @@ package put_codebase_image_stream
22
33import (
44 "context"
5+ "errors"
56 "fmt"
67 "strings"
78
@@ -14,6 +15,7 @@ import (
1415
1516 codebaseApi "github.com/epam/edp-codebase-operator/v2/api/v1"
1617 "github.com/epam/edp-codebase-operator/v2/controllers/codebasebranch/chain/handler"
18+ "github.com/epam/edp-codebase-operator/v2/pkg/codebaseimagestream"
1719 "github.com/epam/edp-codebase-operator/v2/pkg/model"
1820 "github.com/epam/edp-codebase-operator/v2/pkg/platform"
1921 "github.com/epam/edp-codebase-operator/v2/pkg/util"
@@ -43,23 +45,8 @@ func (h PutCodebaseImageStream) ServeRequest(ctx context.Context, cb *codebaseAp
4345 return fmt .Errorf ("failed to fetch Codebase resource: %w" , err )
4446 }
4547
46- registryUrl , err := h .getDockerRegistryUrl (ctx , cb .Namespace )
47- if err != nil {
48- err = fmt .Errorf ("failed to get container registry url: %w" , err )
49- setFailedFields (cb , codebaseApi .PutCodebaseImageStream , err .Error ())
50-
51- return err
52- }
53-
54- cisName := fmt .Sprintf ("%v-%v" , c .Name , ProcessNameToK8sConvention (cb .Spec .BranchName ))
55- imageName := fmt .Sprintf ("%v/%v" , registryUrl , cb .Spec .CodebaseName )
56-
57- if err = h .createCodebaseImageStreamIfNotExists (
48+ if err := h .createCodebaseImageStreamIfNotExists (
5849 ctrl .LoggerInto (ctx , log ),
59- cisName ,
60- imageName ,
61- cb .Spec .CodebaseName ,
62- cb .Namespace ,
6350 cb ,
6451 ); err != nil {
6552 setFailedFields (cb , codebaseApi .PutCodebaseImageStream , err .Error ())
@@ -69,14 +56,15 @@ func (h PutCodebaseImageStream) ServeRequest(ctx context.Context, cb *codebaseAp
6956
7057 log .Info ("End creating CodebaseImageStream" )
7158
72- err = handler .NextServeOrNil (ctx , h .Next , cb )
73- if err != nil {
59+ if err := handler .NextServeOrNil (ctx , h .Next , cb ); err != nil {
7460 return fmt .Errorf ("failed to process next handler in chain: %w" , err )
7561 }
7662
7763 return nil
7864}
7965
66+ // Deprecated: We don't need to make this conversion anymore in the future.
67+ // TODO: Remove this function in the next releases.
8068func ProcessNameToK8sConvention (name string ) string {
8169 r := strings .NewReplacer ("/" , "-" , "." , "-" )
8270 return r .Replace (name )
@@ -101,59 +89,102 @@ func (h PutCodebaseImageStream) getDockerRegistryUrl(ctx context.Context, namesp
10189
10290func (h PutCodebaseImageStream ) createCodebaseImageStreamIfNotExists (
10391 ctx context.Context ,
104- name , imageName , codebaseName , namespace string ,
10592 codebaseBranch * codebaseApi.CodebaseBranch ,
10693) error {
10794 log := ctrl .LoggerFrom (ctx )
10895
109- cis := & codebaseApi.CodebaseImageStream {
96+ cis , err := h .getCodebaseImageStream (ctx , codebaseBranch )
97+ if err != nil {
98+ if ! k8sErrors .IsNotFound (err ) {
99+ return fmt .Errorf ("failed to get CodebaseImageStream: %w" , err )
100+ }
101+ }
102+
103+ if err == nil {
104+ log .Info ("CodebaseImageStream already exists. Skip creating" , "CodebaseImageStream" , cis .Name )
105+
106+ // For backward compatibility, we need to set branch label for the existing CodebaseImageStream.
107+ // TODO: remove this in the next releases.
108+ if v , ok := cis .GetLabels ()[codebaseApi .CodebaseImageStreamCodebaseBranchLabel ]; ! ok || v != codebaseBranch .Name {
109+ patch := client .MergeFrom (cis .DeepCopy ())
110+
111+ if cis .Labels == nil {
112+ cis .Labels = make (map [string ]string , 2 )
113+ }
114+
115+ cis .Labels [codebaseApi .CodebaseImageStreamCodebaseBranchLabel ] = codebaseBranch .Name
116+ cis .Labels [codebaseApi .CodebaseImageStreamCodebaseLabel ] = codebaseBranch .Spec .CodebaseName
117+
118+ if err = h .Client .Patch (ctx , cis , patch ); err != nil {
119+ return fmt .Errorf ("failed to set branch label: %w" , err )
120+ }
121+ }
122+
123+ return nil
124+ }
125+
126+ registryUrl , err := h .getDockerRegistryUrl (ctx , codebaseBranch .Namespace )
127+ if err != nil {
128+ return fmt .Errorf ("failed to get container registry url: %w" , err )
129+ }
130+
131+ cis = & codebaseApi.CodebaseImageStream {
110132 ObjectMeta : metaV1.ObjectMeta {
111- Name : name ,
112- Namespace : namespace ,
133+ Name : codebaseBranch .Name ,
134+ Namespace : codebaseBranch .Namespace ,
135+ Labels : map [string ]string {
136+ codebaseApi .CodebaseImageStreamCodebaseBranchLabel : codebaseBranch .Name ,
137+ codebaseApi .CodebaseImageStreamCodebaseLabel : codebaseBranch .Spec .CodebaseName ,
138+ },
113139 },
114140 Spec : codebaseApi.CodebaseImageStreamSpec {
115- Codebase : codebaseName ,
116- ImageName : imageName ,
141+ Codebase : codebaseBranch . Spec . CodebaseName ,
142+ ImageName : fmt . Sprintf ( "%v/%v" , registryUrl , codebaseBranch . Spec . CodebaseName ) ,
117143 },
118144 }
119145
120- if err : = controllerutil .SetControllerReference (codebaseBranch , cis , h .Client .Scheme ()); err != nil {
146+ if err = controllerutil .SetControllerReference (codebaseBranch , cis , h .Client .Scheme ()); err != nil {
121147 return fmt .Errorf ("failed to set controller reference for CodebaseImageStream: %w" , err )
122148 }
123149
124- if err : = h .Client .Create (ctx , cis ); err != nil {
125- if k8sErrors . IsAlreadyExists ( err ) {
126- log . Info ( "CodebaseImageStream already exists. Skip creating" , "CodebaseImageStream" , cis . Name )
150+ if err = h .Client .Create (ctx , cis ); err != nil {
151+ return fmt . Errorf ( "failed to create CodebaseImageStream: %w" , err )
152+ }
127153
128- // For backward compatibility, we need to update the controller reference for the existing CodebaseImageStream.
129- // We can remove this in the next releases.
130- existingCIS := & codebaseApi.CodebaseImageStream {}
131- if err = h .Client .Get (ctx , types.NamespacedName {
132- Namespace : namespace ,
133- Name : name ,
134- }, existingCIS ); err != nil {
135- return fmt .Errorf ("failed to get CodebaseImageStream: %w" , err )
136- }
154+ return nil
155+ }
137156
138- if metaV1 .GetControllerOf (existingCIS ) == nil {
139- if err = controllerutil .SetControllerReference (codebaseBranch , existingCIS , h .Client .Scheme ()); err != nil {
140- return fmt .Errorf ("failed to set controller reference for CodebaseImageStream: %w" , err )
141- }
142- }
157+ func (h PutCodebaseImageStream ) getCodebaseImageStream (
158+ ctx context.Context ,
159+ codebaseBranch * codebaseApi.CodebaseBranch ,
160+ ) (* codebaseApi.CodebaseImageStream , error ) {
161+ cis , err := codebaseimagestream .GetCodebaseImageStreamByCodebaseBaseBranchName (
162+ ctx ,
163+ h .Client ,
164+ codebaseBranch .Name ,
165+ codebaseBranch .Namespace ,
166+ )
167+ if err == nil {
168+ return cis , nil
169+ }
143170
144- if err = h . Client . Update ( ctx , existingCIS ); err != nil {
145- return fmt .Errorf ("failed to update CodebaseImageStream controller reference : %w" , err )
146- }
171+ if ! errors . Is ( err , codebaseimagestream . ErrCodebaseImageStreamNotFound ) {
172+ return nil , fmt .Errorf ("failed to get CodebaseImageStream: %w" , err )
173+ }
147174
148- return nil
149- }
175+ // Get CodebaseImageStream by name old version for backward compatibility.
176+ // TODO: remove this in the next releases.
177+ cis = & codebaseApi.CodebaseImageStream {}
178+ err = h .Client .Get (ctx , types.NamespacedName {
179+ Namespace : codebaseBranch .Namespace ,
180+ Name : fmt .Sprintf ("%v-%v" , codebaseBranch .Spec .CodebaseName , ProcessNameToK8sConvention (codebaseBranch .Spec .BranchName )),
181+ }, cis )
150182
151- return fmt .Errorf ("failed to create CodebaseImageStream %s: %w" , name , err )
183+ if err != nil {
184+ return nil , fmt .Errorf ("failed to get CodebaseImageStream: %w" , err )
152185 }
153186
154- log .Info ("CodebaseImageStream has been created" , "CodebaseImageStream" , name )
155-
156- return nil
187+ return cis , nil
157188}
158189
159190func setFailedFields (cb * codebaseApi.CodebaseBranch , a codebaseApi.ActionType , message string ) {
0 commit comments