func()

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,
	}
}