sigs.k8s.io/cluster-api-provider-aws@v1.5.5/pkg/eks/identityprovider/plan.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 identityprovider 18 19 import ( 20 "context" 21 22 "github.com/aws/aws-sdk-go/aws" 23 "github.com/aws/aws-sdk-go/service/eks" 24 "github.com/aws/aws-sdk-go/service/eks/eksiface" 25 "github.com/go-logr/logr" 26 27 "sigs.k8s.io/cluster-api-provider-aws/pkg/planner" 28 ) 29 30 // NewPlan creates plan to manage EKS OIDC identity provider association. 31 func NewPlan(clusterName string, currentIdentityProvider, desiredIdentityProvider *OidcIdentityProviderConfig, client eksiface.EKSAPI, log logr.Logger) planner.Plan { 32 return &plan{ 33 currentIdentityProvider: currentIdentityProvider, 34 desiredIdentityProvider: desiredIdentityProvider, 35 eksClient: client, 36 clusterName: clusterName, 37 log: log, 38 } 39 } 40 41 // Plan is a plan that will manage EKS OIDC identity provider association. 42 type plan struct { 43 currentIdentityProvider *OidcIdentityProviderConfig 44 desiredIdentityProvider *OidcIdentityProviderConfig 45 eksClient eksiface.EKSAPI 46 log logr.Logger 47 clusterName string 48 } 49 50 func (p *plan) Create(ctx context.Context) ([]planner.Procedure, error) { 51 procedures := []planner.Procedure{} 52 53 if p.desiredIdentityProvider == nil && p.currentIdentityProvider == nil { 54 return procedures, nil 55 } 56 57 // no config is mentioned deleted provider if we have one 58 if p.desiredIdentityProvider == nil { 59 // disassociation will also also trigger deletion hence 60 // we do nothing in case of ConfigStatusDeleting as it will happen eventually 61 if aws.StringValue(p.currentIdentityProvider.Status) == eks.ConfigStatusActive { 62 procedures = append(procedures, &DisassociateIdentityProviderConfig{plan: p}) 63 } 64 65 return procedures, nil 66 } 67 68 // create case 69 if p.currentIdentityProvider == nil { 70 procedures = append(procedures, &AssociateIdentityProviderProcedure{plan: p}) 71 return procedures, nil 72 } 73 74 if p.currentIdentityProvider.IsEqual(p.desiredIdentityProvider) { 75 tagsDiff := p.desiredIdentityProvider.Tags.Difference(p.currentIdentityProvider.Tags) 76 if len(tagsDiff) > 0 { 77 procedures = append(procedures, &UpdatedIdentityProviderTagsProcedure{plan: p}) 78 } 79 80 if len(p.desiredIdentityProvider.Tags) == 0 && len(p.currentIdentityProvider.Tags) != 0 { 81 procedures = append(procedures, &RemoveIdentityProviderTagsProcedure{plan: p}) 82 } 83 switch aws.StringValue(p.currentIdentityProvider.Status) { 84 case eks.ConfigStatusActive: 85 // config active no work to be done 86 return procedures, nil 87 case eks.ConfigStatusCreating: 88 // no change need wait for association to complete 89 procedures = append(procedures, &WaitIdentityProviderAssociatedProcedure{plan: p}) 90 } 91 } else { 92 procedures = append(procedures, &DisassociateIdentityProviderConfig{plan: p}) 93 } 94 95 return procedures, nil 96 }