in pkg/trait/cron.go [76:183]
func (t *cronTrait) Configure(e *Environment) (bool, error) {
if e.Integration == nil || !pointer.BoolDeref(t.Enabled, true) {
if e.Integration != nil {
e.Integration.Status.SetCondition(
v1.IntegrationConditionCronJobAvailable,
corev1.ConditionFalse,
v1.IntegrationConditionCronJobNotAvailableReason,
"explicitly disabled",
)
}
return false, nil
}
if !e.IntegrationInPhase(v1.IntegrationPhaseInitialization) && !e.IntegrationInRunningPhases() {
return false, nil
}
if _, ok := e.CamelCatalog.Runtime.Capabilities[v1.CapabilityCron]; !ok {
e.Integration.Status.SetCondition(
v1.IntegrationConditionCronJobAvailable,
corev1.ConditionFalse,
v1.IntegrationConditionCronJobNotAvailableReason,
"the runtime provider %s does not declare 'cron' capability",
)
return false, nil
}
if pointer.BoolDeref(t.Auto, true) {
globalCron, err := t.getGlobalCron(e)
if err != nil {
e.Integration.Status.SetErrorCondition(
v1.IntegrationConditionCronJobAvailable,
v1.IntegrationConditionCronJobNotAvailableReason,
err,
)
return false, err
}
if t.Schedule == "" && globalCron != nil {
t.Schedule = globalCron.schedule
}
if globalCron != nil {
configuredComponents := strings.FieldsFunc(t.Components, func(c rune) bool { return c == ',' })
for _, c := range globalCron.components {
util.StringSliceUniqueAdd(&configuredComponents, c)
}
t.Components = strings.Join(configuredComponents, ",")
}
if t.ConcurrencyPolicy == "" {
t.ConcurrencyPolicy = string(batchv1.ForbidConcurrent)
}
if (t.Schedule == "" && t.Components == "") && t.Fallback == nil {
// If there's at least a `cron` endpoint, add a fallback implementation
fromURIs, err := t.getSourcesFromURIs(e)
if err != nil {
return false, err
}
for _, fromURI := range fromURIs {
if uri.GetComponent(fromURI) == genericCronComponent {
t.Fallback = pointer.Bool(true)
break
}
}
}
}
// Fallback strategy can be implemented in any other controller
if pointer.BoolDeref(t.Fallback, false) {
if e.IntegrationInPhase(v1.IntegrationPhaseDeploying) {
e.Integration.Status.SetCondition(
v1.IntegrationConditionCronJobAvailable,
corev1.ConditionFalse,
v1.IntegrationConditionCronJobNotAvailableReason,
"fallback strategy selected",
)
}
return true, nil
}
// CronJob strategy requires common schedule
strategy, err := e.DetermineControllerStrategy()
if err != nil {
e.Integration.Status.SetErrorCondition(
v1.IntegrationConditionCronJobAvailable,
v1.IntegrationConditionCronJobNotAvailableReason,
err,
)
return false, err
}
if strategy != ControllerStrategyCronJob {
if e.IntegrationInPhase(v1.IntegrationPhaseDeploying) {
e.Integration.Status.SetCondition(
v1.IntegrationConditionCronJobAvailable,
corev1.ConditionFalse,
v1.IntegrationConditionCronJobNotAvailableReason,
fmt.Sprintf("different controller strategy used (%s)", string(strategy)),
)
}
return false, nil
}
return t.Schedule != "", nil
}