sigs.k8s.io/cluster-api-provider-azure@v1.14.3/azure/converters/resourcehealth.go (about)

     1  /*
     2  Copyright 2022 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package converters
    18  
    19  import (
    20  	"strings"
    21  
    22  	"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcehealth/armresourcehealth"
    23  	"k8s.io/utils/ptr"
    24  	infrav1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1"
    25  	clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
    26  	"sigs.k8s.io/cluster-api/util/conditions"
    27  )
    28  
    29  // SDKAvailabilityStatusToCondition converts an Azure Resource Health availability status to a status condition.
    30  func SDKAvailabilityStatusToCondition(availStatus armresourcehealth.AvailabilityStatus) *clusterv1.Condition {
    31  	if availStatus.Properties == nil {
    32  		return conditions.FalseCondition(infrav1.AzureResourceAvailableCondition, "", "", "")
    33  	}
    34  
    35  	state := availStatus.Properties.AvailabilityState
    36  
    37  	if ptr.Deref(state, "") == armresourcehealth.AvailabilityStateValuesAvailable {
    38  		return conditions.TrueCondition(infrav1.AzureResourceAvailableCondition)
    39  	}
    40  
    41  	var reason strings.Builder
    42  	if availStatus.Properties.ReasonType != nil {
    43  		// CAPI specifies Reason should be CamelCase, though the Azure API
    44  		// response may include spaces (e.g. "Customer Initiated")
    45  		words := strings.Split(*availStatus.Properties.ReasonType, " ")
    46  		for _, word := range words {
    47  			if len(word) > 0 {
    48  				reason.WriteString(strings.ToTitle(word[:1]))
    49  			}
    50  			if len(word) > 1 {
    51  				reason.WriteString(word[1:])
    52  			}
    53  		}
    54  	}
    55  
    56  	var severity clusterv1.ConditionSeverity
    57  	switch ptr.Deref(availStatus.Properties.AvailabilityState, "") {
    58  	case armresourcehealth.AvailabilityStateValuesUnavailable:
    59  		severity = clusterv1.ConditionSeverityError
    60  	case armresourcehealth.AvailabilityStateValuesDegraded, armresourcehealth.AvailabilityStateValuesUnknown:
    61  		severity = clusterv1.ConditionSeverityWarning
    62  	}
    63  
    64  	var message string
    65  	if availStatus.Properties.Summary != nil {
    66  		message = *availStatus.Properties.Summary
    67  	}
    68  
    69  	return conditions.FalseCondition(infrav1.AzureResourceAvailableCondition, reason.String(), severity, message)
    70  }