in pkg/controller/integrationkit/build.go [70:178]
func (action *buildAction) handleBuildSubmitted(ctx context.Context, kit *v1.IntegrationKit) (*v1.IntegrationKit, error) {
build, err := kubernetes.GetBuild(ctx, action.client, kit.Name, kit.Namespace)
if err != nil && !k8serrors.IsNotFound(err) {
return nil, err
}
if err != nil && k8serrors.IsNotFound(err) ||
build.Status.Phase == v1.BuildPhaseError ||
build.Status.Phase == v1.BuildPhaseInterrupted ||
build.Status.Phase == v1.BuildPhaseSucceeded {
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
}
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.IntegrationKitLayoutNative {
// Increase the timeout to a sensible default
timeout = metav1.Duration{
Duration: 10 * time.Minute,
}
}
// We may need to change certain builder configuration values
operatorNamespace := platform.GetOperatorNamespace()
buildConfig := v1.BuilderConfigurationTasks(env.Pipeline)
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
}
}
// nolint: contextcheck
if buildConfig.Strategy == v1.BuildStrategyPod {
err = platform.CreateBuilderServiceAccount(env.Ctx, env.Client, env.Platform)
if err != nil {
return nil, fmt.Errorf("error while creating Camel K Builder service account: %w", err)
}
}
buildConfig.ToolImage = env.CamelCatalog.Image
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)
}
}
if build.Status.Phase == v1.BuildPhaseRunning {
kit.Status.Phase = v1.IntegrationKitPhaseBuildRunning
return kit, nil
}
return nil, nil
}