diff --git a/docs/stackit_object-storage_bucket_create.md b/docs/stackit_object-storage_bucket_create.md index 1c07eb540..58f14a21a 100644 --- a/docs/stackit_object-storage_bucket_create.md +++ b/docs/stackit_object-storage_bucket_create.md @@ -15,12 +15,16 @@ stackit object-storage bucket create BUCKET_NAME [flags] ``` Create an Object Storage bucket with name "my-bucket" $ stackit object-storage bucket create my-bucket + + Create an Object Storage bucket with enabled object-lock + $ stackit object-storage bucket create my-bucket --object-lock-enabled ``` ### Options ``` - -h, --help Help for "stackit object-storage bucket create" + -h, --help Help for "stackit object-storage bucket create" + --object-lock-enabled is the object-lock enabled for the bucket ``` ### Options inherited from parent commands diff --git a/internal/cmd/object-storage/bucket/create/create.go b/internal/cmd/object-storage/bucket/create/create.go index b0a387572..ea10274db 100644 --- a/internal/cmd/object-storage/bucket/create/create.go +++ b/internal/cmd/object-storage/bucket/create/create.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -21,12 +22,14 @@ import ( ) const ( - bucketNameArg = "BUCKET_NAME" + bucketNameArg = "BUCKET_NAME" + objectLockEnabledFlag = "object-lock-enabled" ) type inputModel struct { *globalflags.GlobalFlagModel - BucketName string + BucketName string + ObjectLockEnabled bool } func NewCmd(params *types.CmdParams) *cobra.Command { @@ -39,6 +42,9 @@ func NewCmd(params *types.CmdParams) *cobra.Command { examples.NewExample( `Create an Object Storage bucket with name "my-bucket"`, "$ stackit object-storage bucket create my-bucket"), + examples.NewExample( + `Create an Object Storage bucket with enabled object-lock`, + `$ stackit object-storage bucket create my-bucket --object-lock-enabled`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() @@ -91,9 +97,14 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return outputResult(params.Printer, model.OutputFormat, model.Async, model.BucketName, resp) }, } + configureFlags(cmd) return cmd } +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Bool(objectLockEnabledFlag, false, "is the object-lock enabled for the bucket") +} + func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { bucketName := inputArgs[0] @@ -103,8 +114,9 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } model := inputModel{ - GlobalFlagModel: globalFlags, - BucketName: bucketName, + GlobalFlagModel: globalFlags, + BucketName: bucketName, + ObjectLockEnabled: flags.FlagToBoolValue(p, cmd, objectLockEnabledFlag), } p.DebugInputModel(model) @@ -112,7 +124,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiCreateBucketRequest { - req := apiClient.DefaultAPI.CreateBucket(ctx, model.ProjectId, model.Region, model.BucketName) + req := apiClient.DefaultAPI.CreateBucket(ctx, model.ProjectId, model.Region, model.BucketName).ObjectLockEnabled(model.ObjectLockEnabled) return req } diff --git a/internal/cmd/object-storage/bucket/create/create_test.go b/internal/cmd/object-storage/bucket/create/create_test.go index 905677814..2460b63c7 100644 --- a/internal/cmd/object-storage/bucket/create/create_test.go +++ b/internal/cmd/object-storage/bucket/create/create_test.go @@ -55,7 +55,8 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { Verbosity: globalflags.VerbosityDefault, Region: testRegion, }, - BucketName: testBucketName, + BucketName: testBucketName, + ObjectLockEnabled: false, } for _, mod := range mods { mod(model) @@ -63,10 +64,10 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { return model } -func fixtureRequest(mods ...func(request *objectstorage.ApiCreateBucketRequest)) objectstorage.ApiCreateBucketRequest { - request := testClient.DefaultAPI.CreateBucket(testCtx, testProjectId, testRegion, testBucketName) +func fixtureRequest(mods ...func(request objectstorage.ApiCreateBucketRequest) objectstorage.ApiCreateBucketRequest) objectstorage.ApiCreateBucketRequest { + request := testClient.DefaultAPI.CreateBucket(testCtx, testProjectId, testRegion, testBucketName).ObjectLockEnabled(false) for _, mod := range mods { - mod(&request) + request = mod(request) } return request } @@ -134,6 +135,17 @@ func TestParseInput(t *testing.T) { flagValues: fixtureFlagValues(), isValid: false, }, + { + description: "enable object-lock", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[objectLockEnabledFlag] = "true" + }), + expectedModel: fixtureInputModel(func(model *inputModel) { + model.ObjectLockEnabled = true + }), + isValid: true, + }, } for _, tt := range tests { @@ -154,6 +166,15 @@ func TestBuildRequest(t *testing.T) { model: fixtureInputModel(), expectedRequest: fixtureRequest(), }, + { + description: "object-lock enabled", + model: fixtureInputModel(func(model *inputModel) { + model.ObjectLockEnabled = true + }), + expectedRequest: fixtureRequest(func(request objectstorage.ApiCreateBucketRequest) objectstorage.ApiCreateBucketRequest { + return request.ObjectLockEnabled(true) + }), + }, } for _, tt := range tests { diff --git a/internal/cmd/object-storage/bucket/describe/describe.go b/internal/cmd/object-storage/bucket/describe/describe.go index de374c8d8..1375ff05a 100644 --- a/internal/cmd/object-storage/bucket/describe/describe.go +++ b/internal/cmd/object-storage/bucket/describe/describe.go @@ -103,6 +103,8 @@ func outputResult(p *print.Printer, outputFormat string, resp *objectstorage.Get table.AddSeparator() table.AddRow("URL (Virtual Hosted Style)", resp.Bucket.UrlVirtualHostedStyle) table.AddSeparator() + table.AddRow("Object Lock Enabled", resp.Bucket.ObjectLockEnabled) + table.AddSeparator() err := table.Display(p) if err != nil { return fmt.Errorf("render table: %w", err) diff --git a/internal/cmd/object-storage/bucket/list/list.go b/internal/cmd/object-storage/bucket/list/list.go index e26c926e5..ebb3c70a0 100644 --- a/internal/cmd/object-storage/bucket/list/list.go +++ b/internal/cmd/object-storage/bucket/list/list.go @@ -129,7 +129,7 @@ func outputResult(p *print.Printer, outputFormat, projectLabel string, buckets [ } table := tables.NewTable() - table.SetHeader("NAME", "REGION", "URL (PATH STYLE)", "URL (VIRTUAL HOSTED STYLE)") + table.SetHeader("NAME", "REGION", "URL (PATH STYLE)", "URL (VIRTUAL HOSTED STYLE)", "OBJECT LOCK ENABLED") for i := range buckets { bucket := buckets[i] table.AddRow( @@ -137,6 +137,7 @@ func outputResult(p *print.Printer, outputFormat, projectLabel string, buckets [ bucket.Region, bucket.UrlPathStyle, bucket.UrlVirtualHostedStyle, + bucket.ObjectLockEnabled, ) } err := table.Display(p)