Skip to content

Commit 3629e56

Browse files
authored
feat(objectstorage): add --delete-buckets flag to delete command (#349)
Also, skip system policies when deleting policies as those can not be deleted by the user.
1 parent 2e7cb98 commit 3629e56

File tree

3 files changed

+70
-0
lines changed

3 files changed

+70
-0
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
### Added
1111

1212
- Allow using unix style glob pattern as an argument. For example, if there are two servers available with titles `server-1` and `server-2`, these servers can be stopped with `upctl server stop server-*` command.
13+
- `--delete-buckets` option to `objectstorage delete` command.
14+
15+
### Fixed
16+
17+
- In `objectstorage delete` command, delete only user defined policies when `--delete-policies` flag is enabled as trying to delete system defined policy will cause an error.
1318

1419
## [3.13.0] - 2024-12-13
1520

internal/commands/objectstorage/delete.go

+59
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package objectstorage
22

33
import (
44
"fmt"
5+
"time"
56

67
"github.com/UpCloudLtd/upcloud-cli/v3/internal/commands"
78
"github.com/UpCloudLtd/upcloud-cli/v3/internal/completion"
@@ -31,13 +32,15 @@ type deleteCommand struct {
3132

3233
deleteUsers config.OptionalBoolean
3334
deletePolicies config.OptionalBoolean
35+
deleteBuckets config.OptionalBoolean
3436
}
3537

3638
// InitCommand implements Command.InitCommand
3739
func (c *deleteCommand) InitCommand() {
3840
flags := &pflag.FlagSet{}
3941
config.AddToggleFlag(flags, &c.deleteUsers, "delete-users", false, "Delete all users from the service before deleting the object storage instance.")
4042
config.AddToggleFlag(flags, &c.deletePolicies, "delete-policies", false, "Delete all policies from the service before deleting the object storage instance.")
43+
config.AddToggleFlag(flags, &c.deleteBuckets, "delete-buckets", false, "Delete all buckets from the service before deleting the object storage instance.")
4144
c.AddFlags(flags)
4245
}
4346

@@ -75,6 +78,10 @@ func (c *deleteCommand) Execute(exec commands.Executor, arg string) (output.Outp
7578
}
7679

7780
for _, policy := range policies {
81+
if policy.System {
82+
continue
83+
}
84+
7885
err = svc.DeleteManagedObjectStoragePolicy(exec.Context(), &request.DeleteManagedObjectStoragePolicyRequest{
7986
ServiceUUID: arg,
8087
Name: policy.Name,
@@ -85,6 +92,32 @@ func (c *deleteCommand) Execute(exec commands.Executor, arg string) (output.Outp
8592
}
8693
}
8794

95+
if c.deleteBuckets.Value() {
96+
exec.PushProgressUpdateMessage(msg, fmt.Sprintf("Deleting buckets from the service %s", arg))
97+
98+
buckets, err := svc.GetManagedObjectStorageBucketMetrics(exec.Context(), &request.GetManagedObjectStorageBucketMetricsRequest{ServiceUUID: arg})
99+
if err != nil {
100+
return commands.HandleError(exec, msg, err)
101+
}
102+
103+
for _, bucket := range buckets {
104+
err = svc.DeleteManagedObjectStorageBucket(exec.Context(), &request.DeleteManagedObjectStorageBucketRequest{
105+
ServiceUUID: arg,
106+
Name: bucket.Name,
107+
})
108+
if err != nil {
109+
return commands.HandleError(exec, msg, err)
110+
}
111+
}
112+
113+
exec.PushProgressUpdateMessage(msg, fmt.Sprintf("Waiting buckets to be deleted from the service %s", arg))
114+
err = waitUntilBucketsHaveBeenDeleted(exec, arg)
115+
if err != nil {
116+
return commands.HandleError(exec, msg, err)
117+
}
118+
}
119+
120+
exec.PushProgressUpdateMessage(msg, msg)
88121
err := svc.DeleteManagedObjectStorage(exec.Context(), &request.DeleteManagedObjectStorageRequest{
89122
UUID: arg,
90123
})
@@ -96,3 +129,29 @@ func (c *deleteCommand) Execute(exec commands.Executor, arg string) (output.Outp
96129

97130
return output.None{}, nil
98131
}
132+
133+
func waitUntilBucketsHaveBeenDeleted(exec commands.Executor, serviceUUID string) error {
134+
ticker := time.NewTicker(5 * time.Second)
135+
defer ticker.Stop()
136+
137+
ctx := exec.Context()
138+
svc := exec.All()
139+
140+
for i := 0; ; i++ {
141+
select {
142+
case <-ticker.C:
143+
buckets, err := svc.GetManagedObjectStorageBucketMetrics(exec.Context(), &request.GetManagedObjectStorageBucketMetricsRequest{
144+
ServiceUUID: serviceUUID,
145+
})
146+
if err != nil {
147+
return err
148+
}
149+
150+
if len(buckets) == 0 {
151+
return nil
152+
}
153+
case <-ctx.Done():
154+
return ctx.Err()
155+
}
156+
}
157+
}

internal/commands/objectstorage/delete_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ func TestDeleteCommand(t *testing.T) {
4444
flags: []string{"--delete-policies"},
4545
req: request.DeleteManagedObjectStorageRequest{UUID: objectstorage.UUID},
4646
},
47+
{
48+
name: "delete with UUID including buckets",
49+
arg: objectstorage.UUID,
50+
flags: []string{"--delete-buckets"},
51+
req: request.DeleteManagedObjectStorageRequest{UUID: objectstorage.UUID},
52+
},
4753
{
4854
name: "delete with UUID including users and policies",
4955
arg: objectstorage.UUID,

0 commit comments

Comments
 (0)