func()

in controllers/stage/chain/put_codebase_image_stream.go [108:162]


func (h PutCodebaseImageStream) createCodebaseImageStreamIfNotExists(
	ctx context.Context,
	name, imageName, codebaseName, namespace string,
	stage *cdPipeApi.Stage,
) error {
	log := ctrl.LoggerFrom(ctx).WithValues("CodebaseImageStream", name)
	cis := &codebaseApi.CodebaseImageStream{
		ObjectMeta: metaV1.ObjectMeta{
			Name:      name,
			Namespace: namespace,
		},
		Spec: codebaseApi.CodebaseImageStreamSpec{
			Codebase:  codebaseName,
			ImageName: imageName,
		},
	}

	if err := controllerutil.SetControllerReference(stage, 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) {
			// 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(stage, 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)
			}

			log.Info("CodebaseImageStream already exists. Skip creating")

			return nil
		}

		return fmt.Errorf("failed to create codebase stream: %w", err)
	}

	log.Info("CodebaseImageStream has been created")

	return nil
}