Skip to content

Commit 41807fe

Browse files
Add support for PutPublicAccessBlock (#56)
Implements aws-controllers-k8s/community#1016 Description of changes: Adds support for the [`PutPublicAccessBlock`](https://docs.aws.amazon.com/sdk-for-go/api/service/s3/#S3.PutPublicAccessBlock) in a new field called `PublicAccessBlock`. By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent e04b890 commit 41807fe

File tree

14 files changed

+321
-12
lines changed

14 files changed

+321
-12
lines changed
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
ack_generate_info:
2-
build_date: "2021-10-12T16:58:37Z"
3-
build_hash: 4b30ff5578e2f570d1c5b1741f3098be0d78e246
4-
go_version: go1.16.5
2+
build_date: "2021-10-14T18:50:30Z"
3+
build_hash: f4166ae9942034b0552f244685515eef5a92dc25
4+
go_version: go1.17.1
55
version: v0.15.1
6-
api_directory_checksum: dfcc21d3fc7fcd228ae29942f020128e7a3bdb8e
6+
api_directory_checksum: e1236617364bb9947bcbfbeb21ce75841b5407f3
77
api_version: v1alpha1
88
aws_sdk_go_version: v1.37.10
99
generator_config_info:
10-
file_checksum: fc075d7f34ba66f75e207a25f763a5b74de48337
10+
file_checksum: 45772c7b934f89394b89fe6214164cd8fe76a59e
1111
original_file_name: generator.yaml
1212
last_modification:
1313
reason: API generation

apis/v1alpha1/bucket.go

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

apis/v1alpha1/generator.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ resources:
6565
from:
6666
operation: PutBucketPolicy
6767
path: Policy
68+
PublicAccessBlock:
69+
from:
70+
operation: PutPublicAccessBlock
71+
path: PublicAccessBlockConfiguration
6872
Replication:
6973
from:
7074
operation: PutBucketReplication

apis/v1alpha1/types.go

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

apis/v1alpha1/zz_generated.deepcopy.go

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

config/crd/bases/s3.services.k8s.aws_buckets.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,23 @@ spec:
467467
policy:
468468
description: The bucket policy as a JSON document.
469469
type: string
470+
publicAccessBlock:
471+
description: The PublicAccessBlock configuration that you want to
472+
apply to this Amazon S3 bucket. You can enable the configuration
473+
options in any combination. For more information about when Amazon
474+
S3 considers a bucket or object public, see The Meaning of "Public"
475+
(https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status)
476+
in the Amazon Simple Storage Service Developer Guide.
477+
properties:
478+
blockPublicACLs:
479+
type: boolean
480+
blockPublicPolicy:
481+
type: boolean
482+
ignorePublicACLs:
483+
type: boolean
484+
restrictPublicBuckets:
485+
type: boolean
486+
type: object
470487
replication:
471488
description: A container for replication rules. You can add up to
472489
1,000 rules. The maximum size of a replication configuration is

generator.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ resources:
6565
from:
6666
operation: PutBucketPolicy
6767
path: Policy
68+
PublicAccessBlock:
69+
from:
70+
operation: PutPublicAccessBlock
71+
path: PublicAccessBlockConfiguration
6872
Replication:
6973
from:
7074
operation: PutBucketReplication

helm/crds/s3.services.k8s.aws_buckets.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,23 @@ spec:
467467
policy:
468468
description: The bucket policy as a JSON document.
469469
type: string
470+
publicAccessBlock:
471+
description: The PublicAccessBlock configuration that you want to
472+
apply to this Amazon S3 bucket. You can enable the configuration
473+
options in any combination. For more information about when Amazon
474+
S3 considers a bucket or object public, see The Meaning of "Public"
475+
(https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status)
476+
in the Amazon Simple Storage Service Developer Guide.
477+
properties:
478+
blockPublicACLs:
479+
type: boolean
480+
blockPublicPolicy:
481+
type: boolean
482+
ignorePublicACLs:
483+
type: boolean
484+
restrictPublicBuckets:
485+
type: boolean
486+
type: object
470487
replication:
471488
description: A container for replication rules. You can add up to
472489
1,000 rules. The maximum size of a replication configuration is

pkg/resource/bucket/delta.go

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

pkg/resource/bucket/hook.go

Lines changed: 114 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,17 @@ import (
2525
)
2626

2727
var (
28-
DefaultAccelerationStatus = svcsdk.BucketAccelerateStatusSuspended
29-
DefaultRequestPayer = svcsdk.PayerBucketOwner
30-
DefaultVersioningStatus = svcsdk.BucketVersioningStatusSuspended
31-
DefaultACL = svcsdk.BucketCannedACLPrivate
32-
)
33-
34-
var (
28+
DefaultAccelerationStatus = svcsdk.BucketAccelerateStatusSuspended
29+
DefaultRequestPayer = svcsdk.PayerBucketOwner
30+
DefaultVersioningStatus = svcsdk.BucketVersioningStatusSuspended
31+
DefaultACL = svcsdk.BucketCannedACLPrivate
32+
DefaultPublicBlockAccessValue = false
33+
DefaultPublicBlockAccess = svcapitypes.PublicAccessBlockConfiguration{
34+
BlockPublicACLs: &DefaultPublicBlockAccessValue,
35+
BlockPublicPolicy: &DefaultPublicBlockAccessValue,
36+
IgnorePublicACLs: &DefaultPublicBlockAccessValue,
37+
RestrictPublicBuckets: &DefaultPublicBlockAccessValue,
38+
}
3539
CannedACLJoinDelimiter = "|"
3640
)
3741

@@ -87,6 +91,11 @@ func (rm *resourceManager) createPutFields(
8791
return err
8892
}
8993
}
94+
if r.ko.Spec.PublicAccessBlock != nil {
95+
if err := rm.syncPublicAccessBlock(ctx, r); err != nil {
96+
return err
97+
}
98+
}
9099
if r.ko.Spec.Replication != nil {
91100
if err := rm.syncReplication(ctx, r); err != nil {
92101
return err
@@ -178,6 +187,11 @@ func (rm *resourceManager) customUpdateBucket(
178187
return nil, err
179188
}
180189
}
190+
if delta.DifferentAt("Spec.PublicAccessBlock") {
191+
if err := rm.syncPublicAccessBlock(ctx, desired); err != nil {
192+
return nil, err
193+
}
194+
}
181195
if delta.DifferentAt("Spec.RequestPayment") {
182196
if err := rm.syncRequestPayment(ctx, desired); err != nil {
183197
return nil, err
@@ -307,6 +321,20 @@ func (rm *resourceManager) addPutFieldsToSpec(
307321
}
308322
ko.Spec.Policy = getPolicyResponse.Policy
309323

324+
getPublicAccessBlockResponse, err := rm.sdkapi.GetPublicAccessBlockWithContext(ctx, rm.newGetPublicAccessBlockPayload(r))
325+
if err != nil {
326+
if awsErr, ok := ackerr.AWSError(err); ok && awsErr.Code() == "NoSuchPublicAccessBlockConfiguration" {
327+
getPublicAccessBlockResponse = &svcsdk.GetPublicAccessBlockOutput{}
328+
} else {
329+
return err
330+
}
331+
}
332+
if getPublicAccessBlockResponse.PublicAccessBlockConfiguration != nil {
333+
ko.Spec.PublicAccessBlock = rm.setResourcePublicAccessBlock(r, getPublicAccessBlockResponse)
334+
} else {
335+
ko.Spec.PublicAccessBlock = nil
336+
}
337+
310338
getReplicationResponse, err := rm.sdkapi.GetBucketReplicationWithContext(ctx, rm.newGetBucketReplicationPayload(r))
311339
if err != nil {
312340
if awsErr, ok := ackerr.AWSError(err); ok && awsErr.Code() == "ReplicationConfigurationNotFoundError" {
@@ -436,6 +464,9 @@ func customPreCompare(
436464
if a.ko.Spec.OwnershipControls == nil && b.ko.Spec.OwnershipControls != nil {
437465
a.ko.Spec.OwnershipControls = &svcapitypes.OwnershipControls{}
438466
}
467+
if a.ko.Spec.PublicAccessBlock == nil && b.ko.Spec.PublicAccessBlock != nil {
468+
a.ko.Spec.PublicAccessBlock = &DefaultPublicBlockAccess
469+
}
439470
if a.ko.Spec.Replication == nil && b.ko.Spec.Replication != nil {
440471
a.ko.Spec.Replication = &svcapitypes.ReplicationConfiguration{}
441472
}
@@ -1081,6 +1112,82 @@ func (rm *resourceManager) syncPolicy(
10811112

10821113
//endregion
10831114

1115+
//region publicaccessblock
1116+
1117+
func (rm *resourceManager) newGetPublicAccessBlockPayload(
1118+
r *resource,
1119+
) *svcsdk.GetPublicAccessBlockInput {
1120+
res := &svcsdk.GetPublicAccessBlockInput{}
1121+
res.SetBucket(*r.ko.Spec.Name)
1122+
return res
1123+
}
1124+
1125+
func (rm *resourceManager) newPutPublicAccessBlockPayload(
1126+
r *resource,
1127+
) *svcsdk.PutPublicAccessBlockInput {
1128+
res := &svcsdk.PutPublicAccessBlockInput{}
1129+
res.SetBucket(*r.ko.Spec.Name)
1130+
res.SetPublicAccessBlockConfiguration(rm.newPublicAccessBlockConfiguration(r))
1131+
1132+
return res
1133+
}
1134+
1135+
func (rm *resourceManager) newDeletePublicAccessBlockPayload(
1136+
r *resource,
1137+
) *svcsdk.DeletePublicAccessBlockInput {
1138+
res := &svcsdk.DeletePublicAccessBlockInput{}
1139+
res.SetBucket(*r.ko.Spec.Name)
1140+
return res
1141+
}
1142+
1143+
func (rm *resourceManager) putPublicAccessBlock(
1144+
ctx context.Context,
1145+
r *resource,
1146+
) (err error) {
1147+
rlog := ackrtlog.FromContext(ctx)
1148+
exit := rlog.Trace("rm.putPublicAccessBlock")
1149+
defer exit(err)
1150+
input := rm.newPutPublicAccessBlockPayload(r)
1151+
1152+
_, err = rm.sdkapi.PutPublicAccessBlockWithContext(ctx, input)
1153+
rm.metrics.RecordAPICall("UPDATE", "PutPublicAccessBlock", err)
1154+
if err != nil {
1155+
return err
1156+
}
1157+
1158+
return nil
1159+
}
1160+
1161+
func (rm *resourceManager) deletePublicAccessBlock(
1162+
ctx context.Context,
1163+
r *resource,
1164+
) (err error) {
1165+
rlog := ackrtlog.FromContext(ctx)
1166+
exit := rlog.Trace("rm.deletePublicAccessBlock")
1167+
defer exit(err)
1168+
input := rm.newDeletePublicAccessBlockPayload(r)
1169+
1170+
_, err = rm.sdkapi.DeletePublicAccessBlockWithContext(ctx, input)
1171+
rm.metrics.RecordAPICall("UPDATE", "DeletePublicAccessBlock", err)
1172+
if err != nil {
1173+
return err
1174+
}
1175+
1176+
return nil
1177+
}
1178+
1179+
func (rm *resourceManager) syncPublicAccessBlock(
1180+
ctx context.Context,
1181+
r *resource,
1182+
) (err error) {
1183+
if r.ko.Spec.PublicAccessBlock == nil || *r.ko.Spec.PublicAccessBlock == DefaultPublicBlockAccess {
1184+
return rm.deletePublicAccessBlock(ctx, r)
1185+
}
1186+
return rm.putPublicAccessBlock(ctx, r)
1187+
}
1188+
1189+
//endregion
1190+
10841191
//region replication
10851192

10861193
func (rm *resourceManager) newGetBucketReplicationPayload(

0 commit comments

Comments
 (0)