sigs.k8s.io/cluster-api-provider-aws@v1.5.5/pkg/cloud/converters/eks.go (about) 1 /* 2 Copyright 2021 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 "errors" 21 "fmt" 22 23 "github.com/aws/aws-sdk-go/aws" 24 "github.com/aws/aws-sdk-go/service/eks" 25 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 26 27 ekscontrolplanev1 "sigs.k8s.io/cluster-api-provider-aws/controlplane/eks/api/v1beta1" 28 expinfrav1 "sigs.k8s.io/cluster-api-provider-aws/exp/api/v1beta1" 29 "sigs.k8s.io/cluster-api-provider-aws/pkg/eks/identityprovider" 30 ) 31 32 var ( 33 // ErrUnknowTaintEffect is an error when a unknown TaintEffect is used. 34 ErrUnknowTaintEffect = errors.New("uknown taint effect") 35 36 // ErrUnknownCapacityType is an error when a unknown CapacityType is used. 37 ErrUnknownCapacityType = errors.New("unknown capacity type") 38 ) 39 40 // AddonSDKToAddonState is used to convert an AWS SDK Addon to a control plane AddonState. 41 func AddonSDKToAddonState(eksAddon *eks.Addon) *ekscontrolplanev1.AddonState { 42 addonState := &ekscontrolplanev1.AddonState{ 43 Name: aws.StringValue(eksAddon.AddonName), 44 Version: aws.StringValue(eksAddon.AddonVersion), 45 ARN: aws.StringValue(eksAddon.AddonArn), 46 CreatedAt: metav1.NewTime(*eksAddon.CreatedAt), 47 ModifiedAt: metav1.NewTime(*eksAddon.ModifiedAt), 48 Status: eksAddon.Status, 49 ServiceAccountRoleArn: eksAddon.ServiceAccountRoleArn, 50 Issues: []ekscontrolplanev1.AddonIssue{}, 51 } 52 if eksAddon.Health != nil { 53 for _, issue := range eksAddon.Health.Issues { 54 addonState.Issues = append(addonState.Issues, ekscontrolplanev1.AddonIssue{ 55 Code: issue.Code, 56 Message: issue.Message, 57 ResourceIDs: FromAWSStringSlice(issue.ResourceIds), 58 }) 59 } 60 } 61 62 return addonState 63 } 64 65 // FromAWSStringSlice will converts an AWS string pointer slice. 66 func FromAWSStringSlice(from []*string) []string { 67 converted := []string{} 68 for _, s := range from { 69 converted = append(converted, *s) 70 } 71 72 return converted 73 } 74 75 // TaintToSDK is used to a CAPA Taint to AWS SDK taint. 76 func TaintToSDK(taint expinfrav1.Taint) (*eks.Taint, error) { 77 convertedEffect, err := TaintEffectToSDK(taint.Effect) 78 if err != nil { 79 return nil, fmt.Errorf("converting taint effect %s: %w", taint.Effect, err) 80 } 81 return &eks.Taint{ 82 Effect: aws.String(convertedEffect), 83 Key: aws.String(taint.Key), 84 Value: aws.String(taint.Value), 85 }, nil 86 } 87 88 // TaintsToSDK is used to convert an array of CAPA Taints to AWS SDK taints. 89 func TaintsToSDK(taints expinfrav1.Taints) ([]*eks.Taint, error) { 90 converted := []*eks.Taint{} 91 92 for _, taint := range taints { 93 convertedTaint, err := TaintToSDK(taint) 94 if err != nil { 95 return nil, fmt.Errorf("converting taint: %w", err) 96 } 97 converted = append(converted, convertedTaint) 98 } 99 100 return converted, nil 101 } 102 103 // TaintsFromSDK is used to convert an array of AWS SDK taints to CAPA Taints. 104 func TaintsFromSDK(taints []*eks.Taint) (expinfrav1.Taints, error) { 105 converted := expinfrav1.Taints{} 106 for _, taint := range taints { 107 convertedEffect, err := TaintEffectFromSDK(*taint.Effect) 108 if err != nil { 109 return nil, fmt.Errorf("converting taint effect %s: %w", *taint.Effect, err) 110 } 111 converted = append(converted, expinfrav1.Taint{ 112 Effect: convertedEffect, 113 Key: *taint.Key, 114 Value: *taint.Value, 115 }) 116 } 117 118 return converted, nil 119 } 120 121 // TaintEffectToSDK is used to convert a TaintEffect to the AWS SDK taint effect value. 122 func TaintEffectToSDK(effect expinfrav1.TaintEffect) (string, error) { 123 switch effect { 124 case expinfrav1.TaintEffectNoExecute: 125 return eks.TaintEffectNoExecute, nil 126 case expinfrav1.TaintEffectPreferNoSchedule: 127 return eks.TaintEffectPreferNoSchedule, nil 128 case expinfrav1.TaintEffectNoSchedule: 129 return eks.TaintEffectNoSchedule, nil 130 default: 131 return "", ErrUnknowTaintEffect 132 } 133 } 134 135 // TaintEffectFromSDK is used to convert a AWS SDK taint effect value to a TaintEffect. 136 func TaintEffectFromSDK(effect string) (expinfrav1.TaintEffect, error) { 137 switch effect { 138 case eks.TaintEffectNoExecute: 139 return expinfrav1.TaintEffectNoExecute, nil 140 case eks.TaintEffectPreferNoSchedule: 141 return expinfrav1.TaintEffectPreferNoSchedule, nil 142 case eks.TaintEffectNoSchedule: 143 return expinfrav1.TaintEffectNoSchedule, nil 144 default: 145 return "", ErrUnknowTaintEffect 146 } 147 } 148 149 func ConvertSDKToIdentityProvider(in *ekscontrolplanev1.OIDCIdentityProviderConfig) *identityprovider.OidcIdentityProviderConfig { 150 if in != nil { 151 return &identityprovider.OidcIdentityProviderConfig{ 152 ClientID: in.ClientID, 153 GroupsClaim: in.GroupsClaim, 154 GroupsPrefix: in.GroupsPrefix, 155 IdentityProviderConfigName: in.IdentityProviderConfigName, 156 IssuerURL: in.IssuerURL, 157 RequiredClaims: aws.StringMap(in.RequiredClaims), 158 Tags: in.Tags, 159 UsernameClaim: in.UsernameClaim, 160 UsernamePrefix: in.UsernamePrefix, 161 } 162 } 163 164 return nil 165 } 166 167 // CapacityTypeToSDK is used to convert a CapacityType to the AWS SDK capacity type value. 168 func CapacityTypeToSDK(capacityType expinfrav1.ManagedMachinePoolCapacityType) (string, error) { 169 switch capacityType { 170 case expinfrav1.ManagedMachinePoolCapacityTypeOnDemand: 171 return eks.CapacityTypesOnDemand, nil 172 case expinfrav1.ManagedMachinePoolCapacityTypeSpot: 173 return eks.CapacityTypesSpot, nil 174 default: 175 return "", ErrUnknownCapacityType 176 } 177 } 178 179 // NodegroupUpdateconfigToSDK is used to convert a CAPA UpdateConfig to AWS SDK NodegroupUpdateConfig. 180 func NodegroupUpdateconfigToSDK(updateConfig *expinfrav1.UpdateConfig) *eks.NodegroupUpdateConfig { 181 if updateConfig == nil { 182 return nil 183 } 184 185 converted := &eks.NodegroupUpdateConfig{} 186 if updateConfig.MaxUnavailable != nil { 187 converted.MaxUnavailable = aws.Int64(int64(*updateConfig.MaxUnavailable)) 188 } 189 if updateConfig.MaxUnavailablePercentage != nil { 190 converted.MaxUnavailablePercentage = aws.Int64(int64(*updateConfig.MaxUnavailablePercentage)) 191 } 192 193 return converted 194 } 195 196 // NodegroupUpdateconfigFromSDK is used to convert a AWS SDK NodegroupUpdateConfig to a CAPA UpdateConfig. 197 func NodegroupUpdateconfigFromSDK(ngUpdateConfig *eks.NodegroupUpdateConfig) *expinfrav1.UpdateConfig { 198 if ngUpdateConfig == nil { 199 return nil 200 } 201 202 converted := &expinfrav1.UpdateConfig{} 203 if ngUpdateConfig.MaxUnavailable != nil { 204 converted.MaxUnavailable = aws.Int(int(*ngUpdateConfig.MaxUnavailable)) 205 } 206 if ngUpdateConfig.MaxUnavailablePercentage != nil { 207 converted.MaxUnavailablePercentage = aws.Int(int(*ngUpdateConfig.MaxUnavailablePercentage)) 208 } 209 210 return converted 211 }