Skip to content

Commit 0abb2b0

Browse files
authored
Merge pull request #4518 from AndiDog/tag-s3-bucket
🌱 Tag S3 bucket as owned by cluster
2 parents 29063e0 + 722abcd commit 0abb2b0

File tree

4 files changed

+65
-0
lines changed

4 files changed

+65
-0
lines changed

cmd/clusterawsadm/cloudformation/bootstrap/cluster_api_controller.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@ func (t Template) ControllersPolicy() *iamv1.PolicyDocument {
283283
"s3:PutObject",
284284
"s3:DeleteObject",
285285
"s3:PutBucketPolicy",
286+
"s3:PutBucketTagging",
286287
},
287288
})
288289
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ Resources:
288288
- s3:PutObject
289289
- s3:DeleteObject
290290
- s3:PutBucketPolicy
291+
- s3:PutBucketTagging
291292
Effect: Allow
292293
Resource:
293294
- arn:*:s3:::cluster-api-provider-aws-*

pkg/cloud/services/s3/s3.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"github.com/aws/aws-sdk-go/service/sts/stsiface"
3232
"github.com/pkg/errors"
3333

34+
infrav1 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2"
3435
iam "sigs.k8s.io/cluster-api-provider-aws/v2/iam/api/v1beta1"
3536
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope"
3637
"sigs.k8s.io/cluster-api-provider-aws/v2/util/system"
@@ -68,6 +69,10 @@ func (s *Service) ReconcileBucket() error {
6869
return errors.Wrap(err, "ensuring bucket exists")
6970
}
7071

72+
if err := s.tagBucket(bucketName); err != nil {
73+
return errors.Wrap(err, "tagging bucket")
74+
}
75+
7176
if err := s.ensureBucketPolicy(bucketName); err != nil {
7277
return errors.Wrap(err, "ensuring bucket policy")
7378
}
@@ -230,6 +235,39 @@ func (s *Service) ensureBucketPolicy(bucketName string) error {
230235
return nil
231236
}
232237

238+
func (s *Service) tagBucket(bucketName string) error {
239+
taggingInput := &s3.PutBucketTaggingInput{
240+
Bucket: aws.String(bucketName),
241+
Tagging: &s3.Tagging{
242+
TagSet: nil,
243+
},
244+
}
245+
246+
tags := infrav1.Build(infrav1.BuildParams{
247+
ClusterName: s.scope.Name(),
248+
Lifecycle: infrav1.ResourceLifecycleOwned,
249+
Name: nil,
250+
Role: aws.String("node"),
251+
Additional: nil,
252+
})
253+
254+
for key, value := range tags {
255+
taggingInput.Tagging.TagSet = append(taggingInput.Tagging.TagSet, &s3.Tag{
256+
Key: aws.String(key),
257+
Value: aws.String(value),
258+
})
259+
}
260+
261+
_, err := s.S3Client.PutBucketTagging(taggingInput)
262+
if err != nil {
263+
return err
264+
}
265+
266+
s.scope.Trace("Tagged bucket", "bucket_name", bucketName)
267+
268+
return nil
269+
}
270+
233271
func (s *Service) bucketPolicy(bucketName string) (string, error) {
234272
accountID, err := s.STSClient.GetCallerIdentity(&sts.GetCallerIdentityInput{})
235273
if err != nil {

pkg/cloud/services/s3/s3_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,25 @@ func TestReconcileBucket(t *testing.T) {
7575
}
7676

7777
s3Mock.EXPECT().CreateBucket(gomock.Eq(input)).Return(nil, nil).Times(1)
78+
79+
taggingInput := &s3svc.PutBucketTaggingInput{
80+
Bucket: aws.String(expectedBucketName),
81+
Tagging: &s3svc.Tagging{
82+
TagSet: []*s3svc.Tag{
83+
{
84+
Key: aws.String("sigs.k8s.io/cluster-api-provider-aws/cluster/test-cluster"),
85+
Value: aws.String("owned"),
86+
},
87+
{
88+
Key: aws.String("sigs.k8s.io/cluster-api-provider-aws/role"),
89+
Value: aws.String("node"),
90+
},
91+
},
92+
},
93+
}
94+
95+
s3Mock.EXPECT().PutBucketTagging(gomock.Eq(taggingInput)).Return(nil, nil).Times(1)
96+
7897
s3Mock.EXPECT().PutBucketPolicy(gomock.Any()).Return(nil, nil).Times(1)
7998

8099
if err := svc.ReconcileBucket(); err != nil {
@@ -129,6 +148,7 @@ func TestReconcileBucket(t *testing.T) {
129148
}
130149
}).Return(nil, nil).Times(1)
131150

151+
s3Mock.EXPECT().PutBucketTagging(gomock.Any()).Return(nil, nil).Times(1)
132152
s3Mock.EXPECT().PutBucketPolicy(gomock.Any()).Return(nil, nil).Times(1)
133153

134154
if err := svc.ReconcileBucket(); err != nil {
@@ -150,6 +170,7 @@ func TestReconcileBucket(t *testing.T) {
150170
})
151171

152172
s3Mock.EXPECT().CreateBucket(gomock.Any()).Return(nil, nil).Times(1)
173+
s3Mock.EXPECT().PutBucketTagging(gomock.Any()).Return(nil, nil).Times(1)
153174
s3Mock.EXPECT().PutBucketPolicy(gomock.Any()).Do(func(input *s3svc.PutBucketPolicyInput) {
154175
if input.Policy == nil {
155176
t.Fatalf("Policy must be defined")
@@ -189,6 +210,7 @@ func TestReconcileBucket(t *testing.T) {
189210
svc, s3Mock := testService(t, &infrav1.S3Bucket{})
190211

191212
s3Mock.EXPECT().CreateBucket(gomock.Any()).Return(nil, nil).Times(2)
213+
s3Mock.EXPECT().PutBucketTagging(gomock.Any()).Return(nil, nil).Times(2)
192214
s3Mock.EXPECT().PutBucketPolicy(gomock.Any()).Return(nil, nil).Times(2)
193215

194216
if err := svc.ReconcileBucket(); err != nil {
@@ -208,6 +230,7 @@ func TestReconcileBucket(t *testing.T) {
208230
err := awserr.New(s3svc.ErrCodeBucketAlreadyOwnedByYou, "err", errors.New("err"))
209231

210232
s3Mock.EXPECT().CreateBucket(gomock.Any()).Return(nil, err).Times(1)
233+
s3Mock.EXPECT().PutBucketTagging(gomock.Any()).Return(nil, nil).Times(1)
211234
s3Mock.EXPECT().PutBucketPolicy(gomock.Any()).Return(nil, nil).Times(1)
212235

213236
if err := svc.ReconcileBucket(); err != nil {
@@ -248,6 +271,7 @@ func TestReconcileBucket(t *testing.T) {
248271
svc, s3Mock := testService(t, &infrav1.S3Bucket{})
249272

250273
s3Mock.EXPECT().CreateBucket(gomock.Any()).Return(nil, nil).Times(1)
274+
s3Mock.EXPECT().PutBucketTagging(gomock.Any()).Return(nil, nil).Times(1)
251275

252276
mockCtrl := gomock.NewController(t)
253277
stsMock := mock_stsiface.NewMockSTSAPI(mockCtrl)
@@ -265,6 +289,7 @@ func TestReconcileBucket(t *testing.T) {
265289
svc, s3Mock := testService(t, &infrav1.S3Bucket{})
266290

267291
s3Mock.EXPECT().CreateBucket(gomock.Any()).Return(nil, nil).Times(1)
292+
s3Mock.EXPECT().PutBucketTagging(gomock.Any()).Return(nil, nil).Times(1)
268293
s3Mock.EXPECT().PutBucketPolicy(gomock.Any()).Return(nil, errors.New("error")).Times(1)
269294

270295
if err := svc.ReconcileBucket(); err == nil {

0 commit comments

Comments
 (0)