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  }