@@ -121,6 +121,10 @@ func (s *Service) reconcileCluster(ctx context.Context) error {
121121 return errors .Wrap (err , "failed reconciling cluster config" )
122122 }
123123
124+ if err := s .reconcileAccessConfig (cluster .AccessConfig ); err != nil {
125+ return errors .Wrap (err , "failed reconciling access config" )
126+ }
127+
124128 if err := s .reconcileLogging (cluster .Logging ); err != nil {
125129 return errors .Wrap (err , "failed reconciling logging" )
126130 }
@@ -375,6 +379,13 @@ func (s *Service) createCluster(eksClusterName string) (*eks.Cluster, error) {
375379 return nil , errors .Wrap (err , "couldn't create vpc config for cluster" )
376380 }
377381
382+ var accessConfig * eks.CreateAccessConfigRequest
383+ if s .scope .ControlPlane .Spec .AccessConfig != nil && s .scope .ControlPlane .Spec .AccessConfig .AuthenticationMode != "" {
384+ accessConfig = & eks.CreateAccessConfigRequest {
385+ AuthenticationMode : aws .String (string (s .scope .ControlPlane .Spec .AccessConfig .AuthenticationMode )),
386+ }
387+ }
388+
378389 var netConfig * eks.KubernetesNetworkConfigRequest
379390 if s .scope .VPC ().IsIPv6Enabled () {
380391 netConfig = & eks.KubernetesNetworkConfigRequest {
@@ -416,13 +427,18 @@ func (s *Service) createCluster(eksClusterName string) (*eks.Cluster, error) {
416427 Name : aws .String (eksClusterName ),
417428 Version : eksVersion ,
418429 Logging : logging ,
430+ AccessConfig : accessConfig ,
419431 EncryptionConfig : encryptionConfigs ,
420432 ResourcesVpcConfig : vpcConfig ,
421433 RoleArn : role .Arn ,
422434 Tags : tags ,
423435 KubernetesNetworkConfig : netConfig ,
424436 }
425437
438+ if err := input .Validate (); err != nil {
439+ return nil , errors .Wrap (err , "created invalid CreateClusterInput" )
440+ }
441+
426442 var out * eks.CreateClusterOutput
427443 if err := wait .WaitForWithRetryable (wait .NewBackoff (), func () (bool , error ) {
428444 if out , err = s .EKSClient .CreateCluster (input ); err != nil {
@@ -501,6 +517,44 @@ func (s *Service) reconcileClusterConfig(cluster *eks.Cluster) error {
501517 return nil
502518}
503519
520+ func (s * Service ) reconcileAccessConfig (accessConfig * eks.AccessConfigResponse ) error {
521+ input := eks.UpdateClusterConfigInput {Name : aws .String (s .scope .KubernetesClusterName ())}
522+
523+ if s .scope .ControlPlane .Spec .AccessConfig == nil || s .scope .ControlPlane .Spec .AccessConfig .AuthenticationMode == "" {
524+ return nil
525+ }
526+
527+ expectedAuthenticationMode := string (s .scope .ControlPlane .Spec .AccessConfig .AuthenticationMode )
528+ if expectedAuthenticationMode != aws .StringValue (accessConfig .AuthenticationMode ) {
529+ input .AccessConfig = & eks.UpdateAccessConfigRequest {
530+ AuthenticationMode : aws .String (expectedAuthenticationMode ),
531+ }
532+ }
533+
534+ if input .AccessConfig != nil {
535+ if err := input .Validate (); err != nil {
536+ return errors .Wrap (err , "created invalid UpdateClusterConfigInput" )
537+ }
538+
539+ if err := wait .WaitForWithRetryable (wait .NewBackoff (), func () (bool , error ) {
540+ if _ , err := s .EKSClient .UpdateClusterConfig (& input ); err != nil {
541+ if aerr , ok := err .(awserr.Error ); ok {
542+ return false , aerr
543+ }
544+ return false , err
545+ }
546+ conditions .MarkTrue (s .scope .ControlPlane , ekscontrolplanev1 .EKSControlPlaneUpdatingCondition )
547+ record .Eventf (s .scope .ControlPlane , "InitiatedUpdateEKSControlPlane" , "Initiated auth config update for EKS control plane %s" , s .scope .KubernetesClusterName ())
548+ return true , nil
549+ }); err != nil {
550+ record .Warnf (s .scope .ControlPlane , "FailedUpdateEKSControlPlane" , "Failed to update EKS control plane auth config: %v" , err )
551+ return errors .Wrapf (err , "failed to update EKS cluster" )
552+ }
553+ }
554+
555+ return nil
556+ }
557+
504558func (s * Service ) reconcileLogging (logging * eks.Logging ) error {
505559 input := eks.UpdateClusterConfigInput {Name : aws .String (s .scope .KubernetesClusterName ())}
506560
0 commit comments