in controllers/codebasebranch/chain/put_codebase_image_stream/put_codebase_image_stream.go [111:166]
func (h PutCodebaseImageStream) createCodebaseImageStreamIfNotExists(
ctx context.Context,
name, imageName, codebaseName, namespace string,
codebaseBranch *codebaseApi.CodebaseBranch,
) error {
log := ctrl.LoggerFrom(ctx)
cis := &codebaseApi.CodebaseImageStream{
ObjectMeta: metaV1.ObjectMeta{
Name: name,
Namespace: namespace,
},
Spec: codebaseApi.CodebaseImageStreamSpec{
Codebase: codebaseName,
ImageName: imageName,
},
}
if err := controllerutil.SetControllerReference(codebaseBranch, cis, h.Client.Scheme()); err != nil {
return fmt.Errorf("failed to set controller reference for CodebaseImageStream: %w", err)
}
if err := h.Client.Create(ctx, cis); err != nil {
if k8sErrors.IsAlreadyExists(err) {
log.Info("CodebaseImageStream already exists. Skip creating", "CodebaseImageStream", cis.Name)
// For backward compatibility, we need to update the controller reference for the existing CodebaseImageStream.
// We can remove this in the next releases.
existingCIS := &codebaseApi.CodebaseImageStream{}
if err = h.Client.Get(ctx, types.NamespacedName{
Namespace: namespace,
Name: name,
}, existingCIS); err != nil {
return fmt.Errorf("failed to get CodebaseImageStream: %w", err)
}
if metaV1.GetControllerOf(existingCIS) == nil {
if err = controllerutil.SetControllerReference(codebaseBranch, existingCIS, h.Client.Scheme()); err != nil {
return fmt.Errorf("failed to set controller reference for CodebaseImageStream: %w", err)
}
}
if err = h.Client.Update(ctx, existingCIS); err != nil {
return fmt.Errorf("failed to update CodebaseImageStream controller reference: %w", err)
}
return nil
}
return fmt.Errorf("failed to create CodebaseImageStream %s: %w", name, err)
}
log.Info("CodebaseImageStream has been created", "CodebaseImageStream", name)
return nil
}