in pkg/controller/integration/build_kit.go [46:153]
func (action *buildKitAction) Handle(ctx context.Context, integration *v1.Integration) (*v1.Integration, error) {
// TODO: we may need to add a timeout strategy, i.e give up after some time in case of an unrecoverable error.
secrets, configmaps := getIntegrationSecretAndConfigmapResourceVersions(ctx, action.client, integration)
hash, err := digest.ComputeForIntegration(integration, configmaps, secrets)
if err != nil {
return nil, err
}
if hash != integration.Status.Digest {
action.L.Info("Integration %s digest has changed: resetting its status. Will check if it needs to be rebuilt and restarted.", integration.Name)
integration.Initialize()
integration.Status.Digest = hash
return integration, nil
}
//
// IntegrationKit may be nil if its being upgraded
//
if integration.Status.IntegrationKit != nil {
it, err := action.checkIntegrationKit(ctx, integration)
if err != nil {
return nil, err
}
return it, nil
}
action.L.Debug("No kit specified in integration status so looking up", "integration", integration.Name, "namespace", integration.Namespace)
existingKits, err := lookupKitsForIntegration(ctx, action.client, integration)
if err != nil {
err = fmt.Errorf("failed to lookup kits for integration %s/%s: %w", integration.Namespace, integration.Name, err)
integration.Status.Phase = v1.IntegrationPhaseError
integration.SetReadyConditionError(err.Error())
return integration, err
}
action.L.Debug("Applying traits to integration",
"integration", integration.Name,
"namespace", integration.Namespace)
env, err := trait.Apply(ctx, action.client, integration, nil)
if err != nil {
err = fmt.Errorf("failed to apply traits to integration %s/%s: %w", integration.Namespace, integration.Name, err)
integration.Status.Phase = v1.IntegrationPhaseError
integration.SetReadyConditionError(err.Error())
return integration, err
}
action.L.Debug("Searching integration kits to assign to integration", "integration",
integration.Name, "namespace", integration.Namespace)
var integrationKit *v1.IntegrationKit
kits:
for j := range env.IntegrationKits {
kit := env.IntegrationKits[j]
for i := range existingKits {
k := &existingKits[i]
action.L.Debug("Comparing existing kit with environment", "env kit", kit.Name, "existing kit", k.Name)
match, err := kitMatches(action.client, &kit, k)
if err != nil {
err = fmt.Errorf("error occurred matches integration kits with environment for integration %s/%s: %w", integration.Namespace, integration.Name, err)
integration.Status.Phase = v1.IntegrationPhaseError
integration.SetReadyConditionError(err.Error())
return integration, err
}
if match {
if integrationKit == nil ||
integrationKit.Status.Phase != v1.IntegrationKitPhaseReady && k.Status.Phase == v1.IntegrationKitPhaseReady ||
integrationKit.Status.Phase == v1.IntegrationKitPhaseReady && k.Status.Phase == v1.IntegrationKitPhaseReady && k.HasHigherPriorityThan(integrationKit) {
integrationKit = k
action.L.Debug("Found matching kit", "integration kit", integrationKit.Name)
}
continue kits
} else {
action.L.Debug("Cannot match kits", "env kit", kit.Name, "existing kit", k.Name)
}
}
action.L.Debug("No existing kit available for integration. Creating a new one.",
"integration", integration.Name,
"namespace", integration.Namespace,
"integration kit", kit.Name)
if err := action.client.Create(ctx, &kit); err != nil {
err = fmt.Errorf("failed to create new integration kit for integration %s/%s: %w", integration.Namespace, integration.Name, err)
integration.Status.Phase = v1.IntegrationPhaseError
integration.SetReadyConditionError(err.Error())
return integration, err
}
if integrationKit == nil {
integrationKit = &kit
}
}
if integrationKit != nil {
action.L.Debug("Setting integration kit for integration", "integration", integration.Name, "namespace", integration.Namespace, "integration kit", integrationKit.Name)
// Set the kit name so the next handle loop, will fall through the
// same path as integration with a user defined kit
integration.SetIntegrationKit(integrationKit)
if integrationKit.Status.Phase == v1.IntegrationKitPhaseReady {
integration.Status.Phase = v1.IntegrationPhaseDeploying
}
} else {
action.L.Debug("Not yet able to assign an integration kit to integration",
"integration", integration.Name,
"namespace", integration.Namespace)
}
return integration, nil
}