func()

in pkg/controller/integrationkit/build.go [101:197]


func (action *buildAction) createBuild(ctx context.Context, kit *v1.IntegrationKit) (*v1.Build, error) {
	env, err := trait.Apply(ctx, action.client, nil, kit)
	if err != nil {
		return nil, err
	}

	if env.CamelCatalog == nil {
		return nil, errors.New("undefined camel catalog")
	}

	labels := kubernetes.FilterCamelCreatorLabels(kit.Labels)
	labels[v1.IntegrationKitLayoutLabel] = kit.Labels[v1.IntegrationKitLayoutLabel]

	annotations := make(map[string]string)
	if v, ok := kit.Annotations[v1.PlatformSelectorAnnotation]; ok {
		annotations[v1.PlatformSelectorAnnotation] = v
	}

	if v, ok := kit.Annotations[v1.IntegrationProfileAnnotation]; ok {
		annotations[v1.IntegrationProfileAnnotation] = v

		if v, ok := kit.Annotations[v1.IntegrationProfileNamespaceAnnotation]; ok {
			annotations[v1.IntegrationProfileNamespaceAnnotation] = v
		}
	}

	operatorID := defaults.OperatorID()
	if operatorID != "" {
		annotations[v1.OperatorIDAnnotation] = operatorID
	}

	timeout := env.Platform.Status.Build.GetTimeout()
	if layout := labels[v1.IntegrationKitLayoutLabel]; env.Platform.Spec.Build.Timeout == nil && layout == v1.IntegrationKitLayoutNativeSources {
		// Increase the timeout to a sensible default
		timeout = metav1.Duration{
			Duration: buildTimeout,
		}
	}

	// We may need to change certain builder configuration values
	operatorNamespace := platform.GetOperatorNamespace()
	buildConfig := v1.ConfigurationTasksByName(env.Pipeline, "builder")
	if buildConfig.IsEmpty() {
		// default to IntegrationPlatform configuration
		buildConfig = &env.Platform.Status.Build.BuildConfiguration
	} else {
		if buildConfig.Strategy == "" {
			// we always need to define a strategy, so we default to platform if none
			buildConfig.Strategy = env.Platform.Status.Build.BuildConfiguration.Strategy
		}

		if buildConfig.OrderStrategy == "" {
			// we always need to define an order strategy, so we default to platform if none
			buildConfig.OrderStrategy = env.Platform.Status.Build.BuildConfiguration.OrderStrategy
		}
	}

	// The build operation, when executed as a Pod, should be executed by a container image containing the
	// `kamel builder` command. Likely the same image running the operator should be fine.
	buildConfig.ToolImage = platform.OperatorImage
	buildConfig.BuilderPodNamespace = operatorNamespace
	v1.SetBuilderConfigurationTasks(env.Pipeline, buildConfig)

	build := &v1.Build{
		TypeMeta: metav1.TypeMeta{
			APIVersion: v1.SchemeGroupVersion.String(),
			Kind:       v1.BuildKind,
		},
		ObjectMeta: metav1.ObjectMeta{
			Namespace:   kit.Namespace,
			Name:        kit.Name,
			Labels:      labels,
			Annotations: annotations,
		},
		Spec: v1.BuildSpec{
			Tasks:   env.Pipeline,
			Timeout: timeout,
		},
	}

	// Set the integration kit instance as the owner and controller
	if err := controllerutil.SetControllerReference(kit, build, action.client.GetScheme()); err != nil {
		return nil, err
	}

	err = action.client.Delete(ctx, build)
	if err != nil && !k8serrors.IsNotFound(err) {
		return nil, fmt.Errorf("cannot delete build: %w", err)
	}

	err = action.client.Create(ctx, build)
	if err != nil {
		return nil, fmt.Errorf("cannot create build: %w", err)
	}

	return build, nil
}