Skip to content

Commit 0334a98

Browse files
Support Bucket versioning (#34)
Support creating and updating `VersioningConfiguration` for Buckets. I have disabled the `MFADelete` field path. [Configuring MFA Delete](https://docs.aws.amazon.com/AmazonS3/latest/userguide/MultiFactorAuthenticationDelete.html) requires that users include an MFA token along with any subsequent requests to disable bucket versioning. Since the controllers do not support MFA authentication, setting this option would block the user from changing versioning after the fact.
1 parent da4eb61 commit 0334a98

File tree

12 files changed

+187
-15
lines changed

12 files changed

+187
-15
lines changed
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
ack_generate_info:
2-
build_date: "2021-08-11T18:08:42Z"
3-
build_hash: 605d747a4da2a01ec3a25fb67a271291f529e810
2+
build_date: "2021-08-12T22:22:41Z"
3+
build_hash: 4d0db1b6f794e5221eb88b052b52a1a95017cf20
44
go_version: go1.15.6 linux/amd64
55
version: v0.9.2
6-
api_directory_checksum: 78ef91732ff85b6e22c35d0b1bd5a1211aad02d8
6+
api_directory_checksum: a111b8798ffa13b2cf948befafae28feaef463ab
77
api_version: v1alpha1
88
aws_sdk_go_version: v1.37.10
99
generator_config_info:
10-
file_checksum: ded17f6f1ac538a0e908d4198303253514bcb5aa
10+
file_checksum: 85625c1a8af87eb3bbda9c6764a356bd3751cb31
1111
original_file_name: generator.yaml
1212
last_modification:
1313
reason: API generation
14-
timestamp: 2021-08-11 18:08:48.788384628 +0000 UTC
14+
timestamp: 2021-08-12 22:22:48.65031987 +0000 UTC

apis/v1alpha1/bucket.go

Lines changed: 2 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: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ ignore:
55
shape_names:
66
# These shapes are structs with no members...
77
- SSES3
8+
field_paths:
9+
# We cannot support MFA, so if it is set we cannot unset
10+
- "VersioningConfiguration.MFADelete"
811
operations:
912
ListBuckets:
1013
primary_identifier_field_name: Name
@@ -71,10 +74,10 @@ resources:
7174
from:
7275
operation: PutBucketTagging
7376
path: Tagging
74-
# Versioning:
75-
# from:
76-
# operation: PutBucketVersioning
77-
# path: VersioningConfiguration # Double check about MFA
77+
Versioning:
78+
from:
79+
operation: PutBucketVersioning
80+
path: VersioningConfiguration
7881
Website:
7982
from:
8083
operation: PutBucketWebsite

apis/v1alpha1/types.go

Lines changed: 7 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: 25 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: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,12 @@ spec:
214214
type: object
215215
type: array
216216
type: object
217+
versioning:
218+
description: Container for setting the versioning state.
219+
properties:
220+
status:
221+
type: string
222+
type: object
217223
website:
218224
description: Container for the request.
219225
properties:

generator.yaml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ ignore:
55
shape_names:
66
# These shapes are structs with no members...
77
- SSES3
8+
field_paths:
9+
# We cannot support MFA, so if it is set we cannot unset
10+
- "VersioningConfiguration.MFADelete"
811
operations:
912
ListBuckets:
1013
primary_identifier_field_name: Name
@@ -71,10 +74,10 @@ resources:
7174
from:
7275
operation: PutBucketTagging
7376
path: Tagging
74-
# Versioning:
75-
# from:
76-
# operation: PutBucketVersioning
77-
# path: VersioningConfiguration # Double check about MFA
77+
Versioning:
78+
from:
79+
operation: PutBucketVersioning
80+
path: VersioningConfiguration
7881
Website:
7982
from:
8083
operation: PutBucketWebsite

pkg/resource/bucket/delta.go

Lines changed: 11 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: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ import (
2525
)
2626

2727
var (
28-
DefaultAccelerationConfigurationStatus = "Suspended"
29-
DefaultRequestPayer = "BucketOwner"
28+
DefaultAccelerationConfigurationStatus = svcsdk.BucketAccelerateStatusSuspended
29+
DefaultRequestPayer = svcsdk.PayerBucketOwner
30+
DefaultVersioningStatus = svcsdk.BucketVersioningStatusSuspended
3031
)
3132

3233
var (
@@ -72,6 +73,11 @@ func (rm *resourceManager) createPutFields(
7273
return err
7374
}
7475
}
76+
if r.ko.Spec.Versioning != nil {
77+
if err := rm.syncVersioning(ctx, r); err != nil {
78+
return err
79+
}
80+
}
7581
if r.ko.Spec.Website != nil {
7682
if err := rm.syncWebsite(ctx, r); err != nil {
7783
return err
@@ -143,6 +149,11 @@ func (rm *resourceManager) customUpdateBucket(
143149
return nil, err
144150
}
145151
}
152+
if delta.DifferentAt("Spec.Versioning") {
153+
if err := rm.syncVersioning(ctx, desired); err != nil {
154+
return nil, err
155+
}
156+
}
146157
if delta.DifferentAt("Spec.Website") {
147158
if err := rm.syncWebsite(ctx, desired); err != nil {
148159
return nil, err
@@ -227,6 +238,12 @@ func (rm *resourceManager) addPutFieldsToSpec(
227238
}
228239
ko.Spec.Tagging = rm.setResourceTagging(r, getTaggingResponse)
229240

241+
getVersioningResponse, err := rm.sdkapi.GetBucketVersioningWithContext(ctx, rm.newGetBucketVersioningPayload(r))
242+
if err != nil {
243+
return err
244+
}
245+
ko.Spec.Versioning = rm.setResourceVersioning(r, getVersioningResponse)
246+
230247
getWebsiteResponse, err := rm.sdkapi.GetBucketWebsiteWithContext(ctx, rm.newGetBucketWebsitePayload(r))
231248
if err != nil {
232249
if awsErr, ok := ackerr.AWSError(err); ok && awsErr.Code() == "NoSuchWebsiteConfiguration" {
@@ -297,6 +314,11 @@ func customPreCompare(
297314
if a.ko.Spec.Tagging == nil && b.ko.Spec.Tagging != nil {
298315
a.ko.Spec.Tagging = &svcapitypes.Tagging{}
299316
}
317+
if a.ko.Spec.Versioning == nil && b.ko.Spec.Versioning != nil {
318+
a.ko.Spec.Versioning = &svcapitypes.VersioningConfiguration{
319+
Status: &DefaultVersioningStatus,
320+
}
321+
}
300322
if a.ko.Spec.Website == nil && b.ko.Spec.Website != nil {
301323
a.ko.Spec.Website = &svcapitypes.WebsiteConfiguration{}
302324
}
@@ -658,6 +680,50 @@ func (rm *resourceManager) syncTagging(
658680
return nil
659681
}
660682

683+
func (rm *resourceManager) newGetBucketVersioningPayload(
684+
r *resource,
685+
) *svcsdk.GetBucketVersioningInput {
686+
res := &svcsdk.GetBucketVersioningInput{}
687+
res.SetBucket(*r.ko.Spec.Name)
688+
return res
689+
}
690+
691+
func (rm *resourceManager) newPutBucketVersioningPayload(
692+
r *resource,
693+
) *svcsdk.PutBucketVersioningInput {
694+
res := &svcsdk.PutBucketVersioningInput{}
695+
res.SetBucket(*r.ko.Spec.Name)
696+
if r.ko.Spec.Versioning != nil {
697+
res.SetVersioningConfiguration(rm.newVersioningConfiguration(r))
698+
} else {
699+
res.SetVersioningConfiguration(&svcsdk.VersioningConfiguration{})
700+
}
701+
702+
if res.VersioningConfiguration.Status == nil {
703+
res.VersioningConfiguration.SetStatus(DefaultVersioningStatus)
704+
}
705+
706+
return res
707+
}
708+
709+
func (rm *resourceManager) syncVersioning(
710+
ctx context.Context,
711+
r *resource,
712+
) (err error) {
713+
rlog := ackrtlog.FromContext(ctx)
714+
exit := rlog.Trace("rm.syncVersioning")
715+
defer exit(err)
716+
input := rm.newPutBucketVersioningPayload(r)
717+
718+
_, err = rm.sdkapi.PutBucketVersioningWithContext(ctx, input)
719+
rm.metrics.RecordAPICall("UPDATE", "PutBucketVersioning", err)
720+
if err != nil {
721+
return err
722+
}
723+
724+
return nil
725+
}
726+
661727
func (rm *resourceManager) newGetBucketWebsitePayload(
662728
r *resource,
663729
) *svcsdk.GetBucketWebsiteInput {

pkg/resource/bucket/sdk.go

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

0 commit comments

Comments
 (0)