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  }