in pkg/apis/common/v1alpha1/autoscaling_status.go [240:360]
func (asb *AutoscalingStatusBuilder) Build() ElasticsearchAutoscalerStatus {
policyStates := make([]AutoscalingPolicyStatus, len(asb.policyStatusBuilder))
i := 0
for _, policyStateBuilder := range asb.policyStatusBuilder {
for eventType := range policyStateBuilder.states {
if eventType == VerticalScalingLimitReached || eventType == HorizontalScalingLimitReached {
asb.scalingLimitEvents.Add(policyStateBuilder.policyName)
} else {
asb.nonScalingLimitEvents.Add(policyStateBuilder.policyName)
}
}
policyStates[i] = policyStateBuilder.Build()
i++
}
now := metav1.Now()
var conditions Conditions
// Update the ElasticsearchAutoscalerLimited condition.
if asb.scalingLimitEvents.Count() > 0 {
conditions = conditions.MergeWith(
Condition{
Type: ElasticsearchAutoscalerLimited,
Status: corev1.ConditionTrue,
LastTransitionTime: now,
Message: fmt.Sprintf("Limit reached for policies %s", strings.Join(asb.scalingLimitEvents.AsSortedSlice(), ",")),
})
} else {
conditions = conditions.MergeWith(
Condition{
Type: ElasticsearchAutoscalerLimited,
Status: corev1.ConditionFalse,
LastTransitionTime: now,
})
}
// Update the ElasticsearchAutoscalerHealthy condition if there is any other event to report.
if asb.nonScalingLimitEvents.Count() > 0 {
conditions = conditions.MergeWith(
Condition{
Type: ElasticsearchAutoscalerHealthy,
Status: corev1.ConditionFalse,
LastTransitionTime: now,
Message: fmt.Sprintf(
"Issues reported for the following policies: [%s]. Check operator logs, Kubernetes events, and policies status for more details",
strings.Join(asb.nonScalingLimitEvents.AsSortedSlice(), ","),
),
})
} else {
conditions = conditions.MergeWith(
Condition{
Type: ElasticsearchAutoscalerHealthy,
Status: corev1.ConditionTrue,
LastTransitionTime: now,
})
}
// Set active status
conditions = conditions.MergeWith(
Condition{
Type: ElasticsearchAutoscalerActive,
Status: corev1.ConditionTrue,
LastTransitionTime: now,
},
)
// Set online status
switch {
case asb.online == nil:
// Unlikely to happen since online status should be set early by the driver.
conditions = conditions.MergeWith(
Condition{
Type: ElasticsearchAutoscalerOnline,
Status: corev1.ConditionUnknown,
LastTransitionTime: now,
},
)
case *asb.online:
// The operator attempted a call to the Elasticsearch API
conditions = conditions.MergeWith(
Condition{
Type: ElasticsearchAutoscalerOnline,
Status: corev1.ConditionTrue,
LastTransitionTime: now,
Message: asb.onlineMessage,
},
)
default:
// The operator did not attempt a call to the Elasticsearch API, or the call failed.
conditions = conditions.MergeWith(
Condition{
Type: ElasticsearchAutoscalerOnline,
Status: corev1.ConditionFalse,
LastTransitionTime: now,
Message: asb.onlineMessage,
},
)
}
if asb.online == nil || !*asb.online {
// Also update the healthy condition if not online
var healthyCondition Condition
healthyConditionIdx := conditions.Index(ElasticsearchAutoscalerHealthy)
if healthyConditionIdx > 0 {
healthyCondition = conditions[healthyConditionIdx]
}
conditions = conditions.MergeWith(
Condition{
Type: ElasticsearchAutoscalerHealthy,
Status: corev1.ConditionFalse,
LastTransitionTime: now,
Message: strings.TrimSpace(fmt.Sprintf("%s. %s", NotOnlineErrorMessage, healthyCondition.Message)),
},
)
}
return ElasticsearchAutoscalerStatus{
Conditions: conditions,
AutoscalingPolicyStatuses: policyStates,
}
}