Skip to content

Commit 29896f2

Browse files
luthermonsonSkarlso
authored andcommitted
adding IRSA functionality through an OIDC provider using an s3 bucket
1 parent b90810b commit 29896f2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1984
-247
lines changed

api/v1beta1/awscluster_conversion.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package v1beta1
1818

1919
import (
2020
apiconversion "k8s.io/apimachinery/pkg/conversion"
21+
"sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2"
2122
infrav2 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2"
2223
utilconversion "sigs.k8s.io/cluster-api/util/conversion"
2324
"sigs.k8s.io/controller-runtime/pkg/conversion"
@@ -50,6 +51,8 @@ func (src *AWSCluster) ConvertTo(dstRaw conversion.Hub) error {
5051
dst.Status.Bastion.PlacementGroupName = restored.Status.Bastion.PlacementGroupName
5152
}
5253
dst.Spec.Partition = restored.Spec.Partition
54+
dst.Spec.AssociateOIDCProvider = restored.Spec.AssociateOIDCProvider
55+
dst.Status.OIDCProvider = restored.Status.OIDCProvider
5356

5457
for role, sg := range restored.Status.Network.SecurityGroups {
5558
dst.Status.Network.SecurityGroups[role] = sg
@@ -170,3 +173,7 @@ func (r *AWSClusterList) ConvertFrom(srcRaw conversion.Hub) error {
170173
func Convert_v1beta2_SubnetSpec_To_v1beta1_SubnetSpec(in *infrav2.SubnetSpec, out *SubnetSpec, s apiconversion.Scope) error {
171174
return autoConvert_v1beta2_SubnetSpec_To_v1beta1_SubnetSpec(in, out, s)
172175
}
176+
177+
func Convert_v1beta2_AWSClusterStatus_To_v1beta1_AWSClusterStatus(in *v1beta2.AWSClusterStatus, out *AWSClusterStatus, scope apiconversion.Scope) error {
178+
return autoConvert_v1beta2_AWSClusterStatus_To_v1beta1_AWSClusterStatus(in, out, scope)
179+
}

api/v1beta1/conversion_test.go

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ package v1beta1
1919
import (
2020
"testing"
2121

22-
. "github.com/onsi/gomega"
23-
2422
fuzz "github.com/google/gofuzz"
23+
. "github.com/onsi/gomega"
2524
"k8s.io/apimachinery/pkg/api/apitesting/fuzzer"
2625
"k8s.io/apimachinery/pkg/runtime"
2726
runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer"
@@ -38,7 +37,7 @@ func fuzzFuncs(_ runtimeserializer.CodecFactory) []interface{} {
3837

3938
func AWSMachineFuzzer(obj *AWSMachine, c fuzz.Continue) {
4039
c.FuzzNoCustom(obj)
41-
40+
4241
// AWSMachine.Spec.FailureDomain, AWSMachine.Spec.Subnet.ARN and AWSMachine.Spec.AdditionalSecurityGroups.ARN has been removed in v1beta2, so setting it to nil in order to avoid v1beta1 --> v1beta2 --> v1beta1 round trip errors.
4342
if obj.Spec.Subnet != nil {
4443
obj.Spec.Subnet.ARN = nil
@@ -54,7 +53,7 @@ func AWSMachineFuzzer(obj *AWSMachine, c fuzz.Continue) {
5453

5554
func AWSMachineTemplateFuzzer(obj *AWSMachineTemplate, c fuzz.Continue) {
5655
c.FuzzNoCustom(obj)
57-
56+
5857
// AWSMachineTemplate.Spec.Template.Spec.FailureDomain, AWSMachineTemplate.Spec.Template.Spec.Subnet.ARN and AWSMachineTemplate.Spec.Template.Spec.AdditionalSecurityGroups.ARN has been removed in v1beta2, so setting it to nil in order to avoid v1beta1 --> v1beta2 --> v1beta round trip errors.
5958
if obj.Spec.Template.Spec.Subnet != nil {
6059
obj.Spec.Template.Spec.Subnet.ARN = nil
@@ -81,16 +80,16 @@ func TestFuzzyConversion(t *testing.T) {
8180
}))
8281

8382
t.Run("for AWSMachine", utilconversion.FuzzTestFunc(utilconversion.FuzzTestFuncInput{
84-
Scheme: scheme,
85-
Hub: &v1beta2.AWSMachine{},
86-
Spoke: &AWSMachine{},
83+
Scheme: scheme,
84+
Hub: &v1beta2.AWSMachine{},
85+
Spoke: &AWSMachine{},
8786
FuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzFuncs},
8887
}))
8988

9089
t.Run("for AWSMachineTemplate", utilconversion.FuzzTestFunc(utilconversion.FuzzTestFuncInput{
91-
Scheme: scheme,
92-
Hub: &v1beta2.AWSMachineTemplate{},
93-
Spoke: &AWSMachineTemplate{},
90+
Scheme: scheme,
91+
Hub: &v1beta2.AWSMachineTemplate{},
92+
Spoke: &AWSMachineTemplate{},
9493
FuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzFuncs},
9594
}))
9695

api/v1beta1/s3bucket.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ import (
2121
"net"
2222

2323
"k8s.io/apimachinery/pkg/util/validation/field"
24-
25-
"sigs.k8s.io/cluster-api-provider-aws/v2/feature"
2624
)
2725

2826
// Validate validates S3Bucket fields.
@@ -37,12 +35,6 @@ func (b *S3Bucket) Validate() []*field.Error {
3735
errs = append(errs, field.Required(field.NewPath("spec", "s3Bucket", "name"), "can't be empty"))
3836
}
3937

40-
// Feature gate is not enabled but ignition is enabled then send a forbidden error.
41-
if !feature.Gates.Enabled(feature.BootstrapFormatIgnition) {
42-
errs = append(errs, field.Forbidden(field.NewPath("spec", "s3Bucket"),
43-
"can be set only if the BootstrapFormatIgnition feature gate is enabled"))
44-
}
45-
4638
if b.ControlPlaneIAMInstanceProfile == "" {
4739
errs = append(errs,
4840
field.Required(field.NewPath("spec", "s3Bucket", "controlPlaneIAMInstanceProfiles"), "can't be empty"))

api/v1beta1/zz_generated.conversion.go

Lines changed: 11 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1beta2/awscluster_types.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,18 @@ type AWSClusterSpec struct {
9696
IdentityRef *AWSIdentityReference `json:"identityRef,omitempty"`
9797

9898
// S3Bucket contains options to configure a supporting S3 bucket for this
99-
// cluster - currently used for nodes requiring Ignition
99+
// cluster - Used for nodes requiring Ignition
100100
// (https://coreos.github.io/ignition/) for bootstrapping (requires
101-
// BootstrapFormatIgnition feature flag to be enabled).
101+
// BootstrapFormatIgnition feature flag to be enabled) and for storing OIDC endpoint
102+
// certificates for use with IRSA
102103
// +optional
103104
S3Bucket *S3Bucket `json:"s3Bucket,omitempty"`
105+
106+
// AssociateOIDCProvider can be enabled to automatically create an identity
107+
// provider and install the pod identity webhook from AWS for use with IRSA.
108+
// This will only work if the S3Bucket is configured properly.
109+
// +kubebuilder:default=false
110+
AssociateOIDCProvider bool `json:"associateOIDCProvider,omitempty"`
104111
}
105112

106113
// AWSIdentityKind defines allowed AWS identity types.
@@ -255,6 +262,10 @@ type AWSClusterStatus struct {
255262
FailureDomains clusterv1.FailureDomains `json:"failureDomains,omitempty"`
256263
Bastion *Instance `json:"bastion,omitempty"`
257264
Conditions clusterv1.Conditions `json:"conditions,omitempty"`
265+
266+
// OIDCProvider holds the status of the identity provider for this cluster
267+
// +optional
268+
OIDCProvider OIDCProviderStatus `json:"oidcProvider,omitempty"`
258269
}
259270

260271
type S3Bucket struct {

api/v1beta2/types.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,3 +407,11 @@ const (
407407
// AmazonLinuxGPU is the AmazonLinux GPU AMI type.
408408
AmazonLinuxGPU EKSAMILookupType = "AmazonLinuxGPU"
409409
)
410+
411+
// OIDCProviderStatus holds the status of the AWS OIDC identity provider.
412+
type OIDCProviderStatus struct {
413+
// ARN holds the ARN of the provider
414+
ARN string `json:"arn,omitempty"`
415+
// TrustPolicy contains the boilerplate IAM trust policy to use for IRSA
416+
TrustPolicy string `json:"trustPolicy,omitempty"`
417+
}

api/v1beta2/zz_generated.deepcopy.go

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/clusterawsadm/cloudformation/bootstrap/cluster_api_controller.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,11 @@ func (t Template) ControllersPolicy() *iamv1.PolicyDocument {
174174
"ec2:DeleteLaunchTemplateVersions",
175175
"ec2:DescribeKeyPairs",
176176
"ec2:ModifyInstanceMetadataOptions",
177+
"iam:CreateOpenIDConnectProvider",
178+
"iam:DeleteOpenIDConnectProvider",
179+
"iam:ListOpenIDConnectProviders",
180+
"iam:GetOpenIDConnectProvider",
181+
"iam:TagOpenIDConnectProvider",
177182
},
178183
},
179184
{
@@ -284,6 +289,9 @@ func (t Template) ControllersPolicy() *iamv1.PolicyDocument {
284289
"s3:DeleteObject",
285290
"s3:PutBucketPolicy",
286291
"s3:PutBucketTagging",
292+
"s3:PutBucketOwnershipControls",
293+
"s3:PutObjectAcl",
294+
"s3:PutBucketPublicAccessBlock",
287295
},
288296
})
289297
}

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/customsuffix.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,11 @@ Resources:
233233
- ec2:DeleteLaunchTemplateVersions
234234
- ec2:DescribeKeyPairs
235235
- ec2:ModifyInstanceMetadataOptions
236+
- iam:CreateOpenIDConnectProvider
237+
- iam:DeleteOpenIDConnectProvider
238+
- iam:ListOpenIDConnectProviders
239+
- iam:GetOpenIDConnectProvider
240+
- iam:TagOpenIDConnectProvider
236241
Effect: Allow
237242
Resource:
238243
- '*'

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/default.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,11 @@ Resources:
233233
- ec2:DeleteLaunchTemplateVersions
234234
- ec2:DescribeKeyPairs
235235
- ec2:ModifyInstanceMetadataOptions
236+
- iam:CreateOpenIDConnectProvider
237+
- iam:DeleteOpenIDConnectProvider
238+
- iam:ListOpenIDConnectProviders
239+
- iam:GetOpenIDConnectProvider
240+
- iam:TagOpenIDConnectProvider
236241
Effect: Allow
237242
Resource:
238243
- '*'

0 commit comments

Comments
 (0)