Repository: kubernetes-sigs/cluster-api-provider-aws
Pull request #3775 (2022-10-12 17:43:41)

PROPOSAL: Maintainers and reviewer changes
/hold

**What type of PR is this?**
/kind support

**What this PR does / why we need it**:

Make the following changes to maintainers & reviewers:

- @Skarlso moves to maintainer from reviewer
- @Ankitasw moves to maintainer from reviewer
- @AverageMarcus moves to reviewer

**Let me or @sedefsavas know if you want to become a reviewer**

This change will be on hold for approximately 1 week before its merged.

**Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*:
Fixes #

**Special notes for your reviewer**:

**Checklist**:
<!-- Put an "X" character inside the brackets of each completed task. Some may be optional depending on the PR in which case these can be deleted -->

- [ ] squashed commits
- [ ] includes documentation
- [ ] adds unit tests
- [ ] adds or updates e2e tests


k8s-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
**Once this PR has been reviewed and has the lgtm label**, please ask for approval from richardcase by writing `/assign @richardcase` in a comment. For more information see:[The Kubernetes Code Review Process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process).

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fcluster-api-provider-aws).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/kubernetes-sigs/cluster-api-provider-aws/blob/main/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["richardcase"]} -->
Skarlso: <3 <3 <3 <3

Massive thank you! :) 
richardcase: Lazy consensus until 19th October 2022
Ankitasw: Very well deserved @Skarlso its always been a pleasure working with you.
Skarlso: Thank you, Ankita! I really appreciate your words. 😊😊😊❤️
Ankitasw: Thank you for the proposal @richardcase. It has always been great working with CAPA and you folks 🙏 
richardcase: Just to echo what has been added in Slack for posterity against this change:

- @Ankitasw has been a consistent contributor of changes and reviews over the last year and has shown great commitment to the project, personally as a maintainer it has made my life easier, so thank you Ankita :pray:
- @Skarlso has made significant contributions in both reviews and new features (like ipv6) this year...thank you Gergely

You have both helped to push CAPA forward and i think as maintainers you will continue to make a significant impact and improvement on this project.
sedefsavas: Thanks @Ankitasw and @Skarlso for all the commitment and great work to keep CAPA healthy!! 🙏

Very happy to see that CAPA is growing stronger with more maintainers.

Patch:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 3c8807dcf..ed96f7407 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -13,33 +13,64 @@ Kubernetes projects require that you sign a Contributor License Agreement (CLA)
 > See the [developer guide](https://cluster-api-aws.sigs.k8s.io/development/development.html) on how to setup your development environment.
 5. Submit a pull request.
 
-### Becoming a reviewer
+### Contributer Ladder
 
-If you would like to become a reviewer, then please ask one of the maintainers.
-There's no hard and defined limit as to who can become a reviewer, but a good
-heuristic is 5 or more contributions. A reviewer can get PRs automatically assigned
-for review, and can `/lgtm` PRs.
+We broadly follow the requirements from the [Kubernetes Community Membership](https://github.com/kubernetes/community/blob/master/community-membership.md).
 
-To become a reviewer, ensure you are a member of the kubernetes-sigs Github organisation
-following https://github.com/kubernetes/org/issues/new/choose .
+> When making changes to **OWNER_ALIASES** please check that the **sig-cluster-lifecycle-leads**, **cluster-api-admins** and **cluster-api-maintainers** are correct.
 
-### Steps needed to become a maintainer
-If you have made significant contributions to Cluster API
-Provider AWS, a maintainer may nominate you to become a
-maintainer, first by opening a PR to add you to the OWNERS_ALIASES file of the repository.
+#### Becoming a reviewer
 
-Maintainers are able to approve PRs, as well as participate
-in release processes.
+If you would like to become a reviewer, then please ask one of the current maintainers.
 
-Maintainers require membership of the Kubernetes Github organisation via
+We generally try to follow the [requirements for a reviewer](https://github.com/kubernetes/community/blob/master/community-membership.md#reviewer) from upstream Kubernetes. But if you feel that you don't full meet the requirements then reach out to us, they are not set in stone.
+
+A reviewer can get PRs automatically assigned for review, and can `/lgtm` PRs.
+
+To become a reviewer, ensure you are a member of the **kubernetes-sigs** Github organisation
+following https://github.com/kubernetes/org/issues/new/choose.
+
+The steps to add someone as a reviewer are:
+
+- Add the GitHub alias to the **cluster-api-aws-reviewers** section of [OWNERS_ALIASES](https://github.com/kubernetes-sigs/cluster-api-provider-aws/blob/main/OWNERS_ALIASES)
+- Create a PR with the change that is held (i.e. by using `/hold`)
+- Announce the change within the CAPA slack channel and as a PSA in the next CAPA office hours
+- After 7 days of lazy consensus or after the next CAPA office hours (whichever is longer) the PR can be merged
+
+#### Becoming a maintainer
+
+If you have made significant contributions to Cluster API Provider AWS, a maintainer may nominate you to become a maintainer for the project.
+
+We generally follow the [requirements for a approver](https://github.com/kubernetes/community/blob/master/community-membership.md#approver) from upstream Kubernetes. However, if you don't fully meet the requirements then a quorum of maintainers may still propose you if they feel you will make significant contributions.
+
+Maintainers are able to approve PRs, as well as participate in release processes and have write access to the repo. **As a maintainer you will be expected to run the office hours, especially if no else wants to**.
+
+Maintainers require membership of the **Kubernetes** Github organisation via
 https://github.com/kubernetes/org/issues/new/choose
 
-The complete list of tasks required to set up maintainer status
-follow:
+The steps to add someone as a reviewer are:
+
+- Add the GitHub alias to the **cluster-api-aws-maintainers** and remove them from **cluster-api-aws-reviewers** sections of [OWNERS_ALIASES](https://github.com/kubernetes-sigs/cluster-api-provider-aws/blob/main/OWNERS_ALIASES)
+- Create a PR with the change that is held (i.e. by using `/hold`)
+- Announce the change within the CAPA slack channel and as a PSA in the next CAPA office hours
+- After 7 days of lazy consensus or after the next CAPA office hours (whichever is longer) the PR can be merged
+- Open PR to add Github username to **cluster-api-provider-aws-maintainers**
+to https://github.com/kubernetes/org/blob/main/config/kubernetes-sigs/sig-cluster-lifecycle/teams.yaml
+- Open PR to add Github username to https://github.com/kubernetes/test-infra/blob/master/config/jobs/kubernetes-sigs/cluster-api-provider-aws/OWNERS
+- Open PR to add Github username to https://github.com/kubernetes/k8s.io/blob/main/k8s.gcr.io/images/k8s-staging-cluster-api-aws/OWNERS
+- Open PR to add Google ID to the k8s-infra-staging-cluster-api-aws@kubernetes.io Google group in https://github.com/kubernetes/k8s.io/blob/main/groups/groups.yaml
+
+#### Becoming a admin
+
+After a period of time one of the existing CAPA or CAPI admins may propose you to become an admin of the CAPA project.
+
+Admins have GitHub **admin** access to perform tasks on the repo.
+
+The steps to add someone as an admin are:
 
-* Open PR to add Github username to the OWNERS_ALIASES file under cluster-api-aws-maintainers
-* Open PR to add Github username to cluster-api-provider-aws-admins and cluster-api-provider-aws-maintainers
+- Add the GitHub alias to the **cluster-api-aws-admins** section of [OWNERS_ALIASES](https://github.com/kubernetes-sigs/cluster-api-provider-aws/blob/main/OWNERS_ALIASES)
+- Create a PR with the change that is held (i.e. by using `/hold`)
+- Announce the change within the CAPA slack channel and as a PSA in the next CAPA office hours
+- After 7 days of lazy consensus or after the next CAPA office hours (whichever is longer) the PR can be merged
+- Open PR to add Github username to **cluster-api-provider-aws-admins**
 to https://github.com/kubernetes/org/blob/main/config/kubernetes-sigs/sig-cluster-lifecycle/teams.yaml
-* Open PR to add Github username to https://github.com/kubernetes/test-infra/blob/master/config/jobs/kubernetes-sigs/cluster-api-provider-aws/OWNERS
-* Open PR to add Github username to https://github.com/kubernetes/k8s.io/blob/main/k8s.gcr.io/images/k8s-staging-cluster-api-aws/OWNERS
-* Open PR to add Google ID to the k8s-infra-staging-cluster-api-aws@kubernetes.io Google group in https://github.com/kubernetes/k8s.io/blob/main/groups/groups.yaml
diff --git a/OWNERS b/OWNERS
index e07729547..70b9881eb 100644
--- a/OWNERS
+++ b/OWNERS
@@ -4,9 +4,11 @@ approvers:
   - sig-cluster-lifecycle-leads
   - cluster-api-admins
   - cluster-api-maintainers
+  - cluster-api-aws-admins
   - cluster-api-aws-maintainers
 
 reviewers:
+  - cluster-api-aws-admins
   - cluster-api-aws-maintainers
   - cluster-api-aws-reviewers
 
diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES
index 3d7c5f718..959b755a2 100644
--- a/OWNERS_ALIASES
+++ b/OWNERS_ALIASES
@@ -1,29 +1,35 @@
 # See the OWNERS docs: https://github.com/kubernetes/community/blob/master/contributors/guide/owners.md
 
 aliases:
-  # Correct as of 2022/01/05
+  # Correct as of 2022/10/13
   sig-cluster-lifecycle-leads:
     - fabriziopandini
     - justinsb
     - neolit123
-    - vincepri
-  # Correct as of 2022/01/05
+    - timothysc
+  # Correct as of 2022/10/13
   cluster-api-admins:
     - CecileRobertMichon
     - vincepri
-  # Correct as of 2022/01/05
+  # Correct as of 2022/10/13
   cluster-api-maintainers:
     - CecileRobertMichon
     - enxebre
     - fabriziopandini
+    - sbueringer
     - vincepri
+  # Correct as of 2022/10/19
+  cluster-api-aws-admins:
+    - richardcase
+    - sedefsavas
   cluster-api-aws-maintainers:
     - richardcase
     - sedefsavas
-  cluster-api-aws-reviewers:
+    - Skarlso
     - Ankitasw
+  cluster-api-aws-reviewers:
     - dthorsen
     - dlipovetsky
     - pydctw
     - shivi28
-    - Skarlso
+    - AverageMarcus
diff --git a/README.md b/README.md
index fb246ee4c..95fc4330a 100644
--- a/README.md
+++ b/README.md
@@ -62,12 +62,11 @@ cluster on AWS.
 This provider's versions are compatible with the following versions of Cluster API
 and support all Kubernetes versions that is supported by its compatible Cluster API version:
 
-|                             | Cluster API v1alpha3 (v0.3) | Cluster API v1alpha4 (v0.4) | Cluster API v1beta1 (v1.x)  |
-| --------------------------- | :-------------------------: | :-------------------------: | :-------------------------: | 
-| CAPA v1alpha3 `(v0.6)`      |              ✓              |              ☓              |              ☓              |
-| CAPA v1alpha4 `(v0.7)`      |              ☓              |              ✓              |              ☓              |
-| CAPA v1beta1  `(v1.x, main)`|              ☓              |              ☓              |               ✓             |
-
+|                             | Cluster API v1alpha4 (v0.4) | Cluster API v1beta1 (v1.x)  |
+| --------------------------- | :-------------------------: | :-------------------------: |
+| CAPA v1alpha4 `(v0.7)`      |              ✓              |              ☓              |
+| CAPA v1beta1  `(v1.x)`      |              ☓              |               ✓             |
+| CAPA v1beta2  `(v2.x, main)`|              ☓              |               ✓             |
 
 (See [Kubernetes support matrix][cluster-api-supported-v] of Cluster API versions).
 
@@ -86,6 +85,7 @@ See [amis] for the list of most recently published AMIs.
 `clusterawsadm` binaries are released with each release, can be found under [assets](https://github.com/kubernetes-sigs/cluster-api-provider-aws/releases/latest) section.
 
 ------
+
 ## Getting involved and contributing
 
 Are you interested in contributing to cluster-api-provider-aws? We, the
@@ -113,16 +113,13 @@ This repository uses the Kubernetes bots.  See a full list of the commands [here
 
 If you want to just build the CAPA containers locally, run
 
-```
-	REGISTRY=docker.io/my-reg make docker-build
+```shell
+  REGISTRY=docker.io/my-reg make docker-build
 ```
 
 ### Tilt-based development environment
 
-See [development][development] section for details
-
-[development]: https://cluster-api-aws.sigs.k8s.io/development/development.html
-
+See [development][development] section for details.
 
 ### Implementer office hours
 
@@ -172,16 +169,15 @@ and/or other countries."
 
 Thank you to all contributors and a special thanks to our current maintainers & reviewers:
 
-| Maintainers                                       | Reviewers                                      |
-| ------------------------------------------------- | ---------------------------------------------- |
-| [@richardcase](https://github.com/richardcase)    | [@Ankitasw](https://github.com/Ankitasw)       |
-| [@sedefsavas](https://github.com/sedefsavas)      | [@dthorsen](https://github.com/dthorsen)       |
-|                                                   | [@dlipovetsky](https://github.com/dlipovetsky) |
-|                                                   | [@pydctw](https://github.com/pydctw)           |
-|                                                   | [@shivi28](https://github.com/shivi28)         |
-|                                                   | [@Skarlso](https://github.com/Skarlso)         |
+| Maintainers                                                          | Reviewers                                                            |
+| -------------------------------------------------------------------- | -------------------------------------------------------------------- |
+| [@richardcase](https://github.com/richardcase) (from 2020-12-04)     | [@shivi28](https://github.com/shivi28) (from 2021-08-27)             |
+| [@sedefsavas](https://github.com/sedefsavas) (from 2021-03-21)       | [@dthorsen](https://github.com/dthorsen) (from 2020-12-04)           |
+| [@Skarlso](https://github.com/Skarlso) (from 2022-10-19)             | [@dlipovetsky](https://github.com/dlipovetsky) (from 2021-08-27)     |
+| [@Ankitasw](https://github.com/Ankitasw) (from 2022-10-19)           | [@pydctw](https://github.com/pydctw) (from 2021-12-09)               |
+|                                                                      | [@AverageMarcus](https://github.com/AverageMarcus) (from 2022-10-19) |
 
-and the previous/emeritus maintainers & reviwers:
+and the previous/emeritus maintainers & reviewers:
 
 | Emeritus Maintainers                                 | Emeritus Reviewers                                     |
 | ---------------------------------------------------- | ------------------------------------------------------ |
@@ -200,7 +196,6 @@ All the CAPA contributors:
 </a>
 </p>
 
-
 <!-- References -->
 [slack]: https://kubernetes.slack.com/messages/CD6U2V71N
 [good_first_issue]: https://github.com/kubernetes-sigs/cluster-api-provider-aws/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22good+first+issue%22
@@ -210,9 +205,8 @@ All the CAPA contributors:
 [cluster_api]: https://github.com/kubernetes-sigs/cluster-api
 [kops]: https://github.com/kubernetes/kops
 [kubicorn]: http://kubicorn.io/
-[tilt]: https://tilt.dev
-[cluster_api_tilt]: https://master.cluster-api.sigs.k8s.io/developer/tilt.html
 [amis]: https://cluster-api-aws.sigs.k8s.io/topics/images/amis.html
 [published_amis]: https://cluster-api-aws.sigs.k8s.io/topics/images/built-amis.html
 [eks_support]: https://cluster-api-aws.sigs.k8s.io/topics/eks/index.html
 [cluster-api-supported-v]: https://cluster-api.sigs.k8s.io/reference/versions.html
+[development]: https://cluster-api-aws.sigs.k8s.io/development/development.html
diff --git a/pkg/cloud/converters/eks.go b/pkg/cloud/converters/eks.go
index bffbb930a..0b1e64cd2 100644
--- a/pkg/cloud/converters/eks.go
+++ b/pkg/cloud/converters/eks.go
@@ -148,19 +148,16 @@ func TaintEffectFromSDK(effect string) (expinfrav1.TaintEffect, error) {
 
 func ConvertSDKToIdentityProvider(in *ekscontrolplanev1.OIDCIdentityProviderConfig) *identityprovider.OidcIdentityProviderConfig {
 	if in != nil {
-		if in.RequiredClaims == nil {
-			in.RequiredClaims = make(map[string]string)
-		}
 		return &identityprovider.OidcIdentityProviderConfig{
 			ClientID:                   in.ClientID,
-			GroupsClaim:                aws.StringValue(in.GroupsClaim),
-			GroupsPrefix:               aws.StringValue(in.GroupsPrefix),
+			GroupsClaim:                in.GroupsClaim,
+			GroupsPrefix:               in.GroupsPrefix,
 			IdentityProviderConfigName: in.IdentityProviderConfigName,
 			IssuerURL:                  in.IssuerURL,
-			RequiredClaims:             in.RequiredClaims,
+			RequiredClaims:             aws.StringMap(in.RequiredClaims),
 			Tags:                       in.Tags,
-			UsernameClaim:              aws.StringValue(in.UsernameClaim),
-			UsernamePrefix:             aws.StringValue(in.UsernamePrefix),
+			UsernameClaim:              in.UsernameClaim,
+			UsernamePrefix:             in.UsernamePrefix,
 		}
 	}
 
diff --git a/pkg/cloud/services/eks/identity_provider.go b/pkg/cloud/services/eks/identity_provider.go
index befc4d669..561b1ca40 100644
--- a/pkg/cloud/services/eks/identity_provider.go
+++ b/pkg/cloud/services/eks/identity_provider.go
@@ -49,20 +49,14 @@ func (s *Service) reconcileIdentityProvider(ctx context.Context) error {
 	}
 
 	s.scope.V(2).Info("creating oidc provider plan", "desired", desired, "current", current)
-	procedures, err := identityprovider.
-		NewPlan(clusterName, current, desired, s.EKSClient, s.scope.Logger).
-		Create(ctx)
 
+	identityProviderPlan := identityprovider.NewPlan(clusterName, current, desired, s.EKSClient, s.scope.Logger)
+
+	procedures, err := identityProviderPlan.Create(ctx)
 	if err != nil {
 		s.scope.Error(err, "failed creating eks identity provider plan")
 		return fmt.Errorf("creating eks identity provider plan: %w", err)
 	}
-
-	// nothing will be done, we can leave
-	if len(procedures) == 0 {
-		return nil
-	}
-
 	s.scope.V(2).Info("computed EKS identity provider plan", "numprocs", len(procedures))
 
 	// Perform required operations
@@ -79,24 +73,16 @@ func (s *Service) reconcileIdentityProvider(ctx context.Context) error {
 		return errors.Wrap(err, "getting associated identity provider")
 	}
 
-	if latest == nil {
-		return nil
-	}
-
-	// don't patch if arn/status is the same
-	if latest.IdentityProviderConfigArn == s.scope.ControlPlane.Status.IdentityProviderStatus.ARN &&
-		latest.Status == s.scope.ControlPlane.Status.IdentityProviderStatus.Status {
-		return nil
-	}
-
-	// idp status has changed, patch the control plane
-	s.scope.ControlPlane.Status.IdentityProviderStatus = ekscontrolplanev1.IdentityProviderStatus{
-		ARN:    latest.IdentityProviderConfigArn,
-		Status: latest.Status,
-	}
+	if latest != nil {
+		s.scope.ControlPlane.Status.IdentityProviderStatus = ekscontrolplanev1.IdentityProviderStatus{
+			ARN:    aws.StringValue(latest.IdentityProviderConfigArn),
+			Status: aws.StringValue(latest.Status),
+		}
 
-	if err := s.scope.PatchObject(); err != nil {
-		return errors.Wrap(err, "updating identity provider status")
+		err := s.scope.PatchObject()
+		if err != nil {
+			return errors.Wrap(err, "updating identity provider status")
+		}
 	}
 
 	return nil
@@ -128,16 +114,16 @@ func (s *Service) getAssociatedIdentityProvider(ctx context.Context, clusterName
 	config := providerconfig.IdentityProviderConfig.Oidc
 
 	return &identityprovider.OidcIdentityProviderConfig{
-		ClientID:                   aws.StringValue(config.ClientId),
-		GroupsClaim:                aws.StringValue(config.GroupsClaim),
-		GroupsPrefix:               aws.StringValue(config.GroupsPrefix),
-		IdentityProviderConfigArn:  aws.StringValue(config.IdentityProviderConfigArn),
-		IdentityProviderConfigName: aws.StringValue(config.IdentityProviderConfigName),
-		IssuerURL:                  aws.StringValue(config.IssuerUrl),
-		RequiredClaims:             aws.StringValueMap(config.RequiredClaims),
-		Status:                     aws.StringValue(config.Status),
+		ClientID:                   *config.ClientId,
+		GroupsClaim:                config.GroupsClaim,
+		GroupsPrefix:               config.GroupsPrefix,
+		IdentityProviderConfigArn:  config.IdentityProviderConfigArn,
+		IdentityProviderConfigName: *config.IdentityProviderConfigName,
+		IssuerURL:                  *config.IssuerUrl,
+		RequiredClaims:             config.RequiredClaims,
+		Status:                     config.Status,
 		Tags:                       converters.MapPtrToMap(config.Tags),
-		UsernameClaim:              aws.StringValue(config.UsernameClaim),
-		UsernamePrefix:             aws.StringValue(config.UsernamePrefix),
+		UsernameClaim:              config.UsernameClaim,
+		UsernamePrefix:             config.UsernamePrefix,
 	}, nil
 }
diff --git a/pkg/eks/identityprovider/plan.go b/pkg/eks/identityprovider/plan.go
index 240fcf7e3..75f6b434d 100644
--- a/pkg/eks/identityprovider/plan.go
+++ b/pkg/eks/identityprovider/plan.go
@@ -19,6 +19,7 @@ package identityprovider
 import (
 	"context"
 
+	"github.com/aws/aws-sdk-go/aws"
 	"github.com/aws/aws-sdk-go/service/eks"
 	"github.com/aws/aws-sdk-go/service/eks/eksiface"
 	"github.com/go-logr/logr"
@@ -57,7 +58,7 @@ func (p *plan) Create(ctx context.Context) ([]planner.Procedure, error) {
 	if p.desiredIdentityProvider == nil {
 		// disassociation will also also trigger deletion hence
 		// we do nothing in case of ConfigStatusDeleting as it will happen eventually
-		if p.currentIdentityProvider.Status == eks.ConfigStatusActive {
+		if aws.StringValue(p.currentIdentityProvider.Status) == eks.ConfigStatusActive {
 			procedures = append(procedures, &DisassociateIdentityProviderConfig{plan: p})
 		}
 
@@ -79,7 +80,7 @@ func (p *plan) Create(ctx context.Context) ([]planner.Procedure, error) {
 		if len(p.desiredIdentityProvider.Tags) == 0 && len(p.currentIdentityProvider.Tags) != 0 {
 			procedures = append(procedures, &RemoveIdentityProviderTagsProcedure{plan: p})
 		}
-		switch p.currentIdentityProvider.Status {
+		switch aws.StringValue(p.currentIdentityProvider.Status) {
 		case eks.ConfigStatusActive:
 			// config active no work to be done
 			return procedures, nil
diff --git a/pkg/eks/identityprovider/procedures.go b/pkg/eks/identityprovider/procedures.go
index 6338f6620..dd617046f 100644
--- a/pkg/eks/identityprovider/procedures.go
+++ b/pkg/eks/identityprovider/procedures.go
@@ -106,13 +106,13 @@ func (a *AssociateIdentityProviderProcedure) Do(ctx context.Context) error {
 		ClusterName: aws.String(a.plan.clusterName),
 		Oidc: &eks.OidcIdentityProviderConfigRequest{
 			ClientId:                   aws.String(oidc.ClientID),
-			GroupsClaim:                aws.String(oidc.GroupsClaim),
-			GroupsPrefix:               aws.String(oidc.GroupsPrefix),
+			GroupsClaim:                oidc.GroupsClaim,
+			GroupsPrefix:               oidc.GroupsPrefix,
 			IdentityProviderConfigName: aws.String(oidc.IdentityProviderConfigName),
 			IssuerUrl:                  aws.String(oidc.IssuerURL),
-			RequiredClaims:             aws.StringMap(oidc.RequiredClaims),
-			UsernameClaim:              aws.String(oidc.UsernameClaim),
-			UsernamePrefix:             aws.String(oidc.UsernamePrefix),
+			RequiredClaims:             oidc.RequiredClaims,
+			UsernameClaim:              oidc.UsernameClaim,
+			UsernamePrefix:             oidc.UsernamePrefix,
 		},
 	}
 
@@ -139,7 +139,7 @@ func (u *UpdatedIdentityProviderTagsProcedure) Name() string {
 func (u *UpdatedIdentityProviderTagsProcedure) Do(ctx context.Context) error {
 	arn := u.plan.currentIdentityProvider.IdentityProviderConfigArn
 	_, err := u.plan.eksClient.TagResource(&eks.TagResourceInput{
-		ResourceArn: &arn,
+		ResourceArn: arn,
 		Tags:        aws.StringMap(u.plan.desiredIdentityProvider.Tags),
 	})
 
@@ -164,10 +164,8 @@ func (r *RemoveIdentityProviderTagsProcedure) Do(ctx context.Context) error {
 	for key := range r.plan.currentIdentityProvider.Tags {
 		keys = append(keys, aws.String(key))
 	}
-
-	arn := r.plan.currentIdentityProvider.IdentityProviderConfigArn
 	_, err := r.plan.eksClient.UntagResource(&eks.UntagResourceInput{
-		ResourceArn: &arn,
+		ResourceArn: r.plan.currentIdentityProvider.IdentityProviderConfigArn,
 		TagKeys:     keys,
 	})
 
diff --git a/pkg/eks/identityprovider/types.go b/pkg/eks/identityprovider/types.go
index d9e99b59b..2b5cf45d3 100644
--- a/pkg/eks/identityprovider/types.go
+++ b/pkg/eks/identityprovider/types.go
@@ -17,26 +17,25 @@ limitations under the License.
 package identityprovider
 
 import (
-	"reflect"
+	"github.com/google/go-cmp/cmp"
 
 	infrav1 "sigs.k8s.io/cluster-api-provider-aws/api/v1beta2"
 )
 
-// OidcIdentityProviderConfig represents a normalized version of the configuration for an OpenID Connect (OIDC)
-// identity provider configuration. To reconcile the config we are going to get the version from EKS and
-// AWSManagedControlPlane and will need to have one consistent version of string values from each API.
+// OidcIdentityProviderConfig represents the configuration for an OpenID Connect (OIDC)
+// identity provider.
 type OidcIdentityProviderConfig struct {
 	ClientID                   string
-	GroupsClaim                string
-	GroupsPrefix               string
-	IdentityProviderConfigArn  string
+	GroupsClaim                *string
+	GroupsPrefix               *string
+	IdentityProviderConfigArn  *string
 	IdentityProviderConfigName string
 	IssuerURL                  string
-	RequiredClaims             map[string]string
-	Status                     string
+	RequiredClaims             map[string]*string
+	Status                     *string
 	Tags                       infrav1.Tags
-	UsernameClaim              string
-	UsernamePrefix             string
+	UsernameClaim              *string
+	UsernamePrefix             *string
 }
 
 func (o *OidcIdentityProviderConfig) IsEqual(other *OidcIdentityProviderConfig) bool {
@@ -44,35 +43,35 @@ func (o *OidcIdentityProviderConfig) IsEqual(other *OidcIdentityProviderConfig)
 		return true
 	}
 
-	if o.ClientID != other.ClientID {
+	if !cmp.Equal(o.ClientID, other.ClientID) {
 		return false
 	}
 
-	if o.GroupsClaim != other.GroupsClaim {
+	if !cmp.Equal(o.GroupsClaim, other.GroupsClaim) {
 		return false
 	}
 
-	if o.GroupsPrefix != other.GroupsPrefix {
+	if !cmp.Equal(o.GroupsPrefix, other.GroupsPrefix) {
 		return false
 	}
 
-	if o.IdentityProviderConfigName != other.IdentityProviderConfigName {
+	if !cmp.Equal(o.IdentityProviderConfigName, other.IdentityProviderConfigName) {
 		return false
 	}
 
-	if o.IssuerURL != other.IssuerURL {
+	if !cmp.Equal(o.IssuerURL, other.IssuerURL) {
 		return false
 	}
 
-	if !reflect.DeepEqual(o.RequiredClaims, other.RequiredClaims) {
+	if !cmp.Equal(o.RequiredClaims, other.RequiredClaims) {
 		return false
 	}
 
-	if o.UsernameClaim != other.UsernameClaim {
+	if !cmp.Equal(o.UsernameClaim, other.UsernameClaim) {
 		return false
 	}
 
-	if o.UsernamePrefix != other.UsernamePrefix {
+	if !cmp.Equal(o.UsernamePrefix, other.UsernamePrefix) {
 		return false
 	}
 


Test patch:
diff --git a/pkg/eks/identityprovider/plan_test.go b/pkg/eks/identityprovider/plan_test.go
index 989413e8e..fab427f45 100644
--- a/pkg/eks/identityprovider/plan_test.go
+++ b/pkg/eks/identityprovider/plan_test.go
@@ -227,8 +227,8 @@ func createDesiredIdentityProvider(name string, tags infrav1.Tags) *OidcIdentity
 
 func createCurrentIdentityProvider(name string, arn, status string, tags infrav1.Tags) *OidcIdentityProviderConfig {
 	config := createDesiredIdentityProvider(name, tags)
-	config.IdentityProviderConfigArn = arn
-	config.Status = status
+	config.IdentityProviderConfigArn = aws.String(arn)
+	config.Status = aws.String(status)
 
 	return config
 }
@@ -243,11 +243,6 @@ func createDesiredIdentityProviderRequest(name *string) *eks.OidcIdentityProvide
 		ClientId:                   aws.String("clientId"),
 		IdentityProviderConfigName: name,
 		IssuerUrl:                  aws.String("http://IssuerURL.com"),
-		RequiredClaims:             make(map[string]*string),
-		GroupsClaim:                aws.String(""),
-		GroupsPrefix:               aws.String(""),
-		UsernameClaim:              aws.String(""),
-		UsernamePrefix:             aws.String(""),
 	}
 }
 
diff --git a/pkg/eks/identityprovider/types_test.go b/pkg/eks/identityprovider/types_test.go
index c172758f8..ed2f593e2 100644
--- a/pkg/eks/identityprovider/types_test.go
+++ b/pkg/eks/identityprovider/types_test.go
@@ -19,6 +19,7 @@ package identityprovider
 import (
 	"testing"
 
+	"github.com/aws/aws-sdk-go/aws"
 	"github.com/onsi/gomega"
 )
 
@@ -38,7 +39,7 @@ func TestIdentityProviderEqual(t *testing.T) {
 				ClientID:                   "a",
 				IdentityProviderConfigName: "b",
 				IssuerURL:                  "c",
-				Status:                     "e",
+				Status:                     aws.String("e"),
 			},
 		},
 	}