Skip to content

Commit

Permalink
[Disk Manager] add release base disk cmd to admin tool (#1799)
Browse files Browse the repository at this point in the history
* add release base disk cmd to admin tool

* resolve issues

* fix build

* fix issues
  • Loading branch information
BarkovBG committed Aug 15, 2024
1 parent e48ee9e commit 7ba6718
Show file tree
Hide file tree
Showing 9 changed files with 120 additions and 6 deletions.
6 changes: 6 additions & 0 deletions cloud/disk_manager/internal/api/private_service.proto
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ service PrivateService {
// Schedules blank (no op) operation, used for testing.
rpc ScheduleBlankOperation(google.protobuf.Empty) returns (cloud.disk_manager.Operation);

rpc ReleaseBaseDisk(ReleaseBaseDiskRequest) returns (cloud.disk_manager.Operation);

rpc RebaseOverlayDisk(RebaseOverlayDiskRequest) returns (cloud.disk_manager.Operation);

rpc RetireBaseDisk(RetireBaseDiskRequest) returns (cloud.disk_manager.Operation);
Expand Down Expand Up @@ -50,6 +52,10 @@ service PrivateService {
rpc GetAliveNodes(google.protobuf.Empty) returns (GetAliveNodesResponse);
}

message ReleaseBaseDiskRequest {
cloud.disk_manager.DiskId disk_id = 1;
}

message RebaseOverlayDiskRequest {
cloud.disk_manager.DiskId disk_id = 1;
string base_disk_id = 4;
Expand Down
13 changes: 13 additions & 0 deletions cloud/disk_manager/internal/pkg/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,11 @@ type PrivateClient interface {
// Used for testing.
ScheduleBlankOperation(ctx context.Context) (*disk_manager.Operation, error)

ReleaseBaseDisk(
ctx context.Context,
req *api.ReleaseBaseDiskRequest,
) (*disk_manager.Operation, error)

RebaseOverlayDisk(
ctx context.Context,
req *api.RebaseOverlayDiskRequest,
Expand Down Expand Up @@ -269,6 +274,14 @@ func (c *privateClient) ScheduleBlankOperation(
return c.privateServiceClient.ScheduleBlankOperation(ctx, &empty.Empty{})
}

func (c *privateClient) ReleaseBaseDisk(
ctx context.Context,
req *api.ReleaseBaseDiskRequest,
) (*disk_manager.Operation, error) {

return c.privateServiceClient.ReleaseBaseDisk(ctx, req)
}

func (c *privateClient) RebaseOverlayDisk(
ctx context.Context,
req *api.RebaseOverlayDiskRequest,
Expand Down
21 changes: 21 additions & 0 deletions cloud/disk_manager/internal/pkg/facade/private_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,27 @@ func (s *privateService) ScheduleBlankOperation(
return getOperation(ctx, s.taskScheduler, taskID)
}

func (s *privateService) ReleaseBaseDisk(
ctx context.Context,
req *api.ReleaseBaseDiskRequest,
) (*disk_manager.Operation, error) {

taskID, err := s.poolService.ReleaseBaseDisk(
ctx,
&pools_protos.ReleaseBaseDiskRequest{
OverlayDisk: &types.Disk{
ZoneId: req.DiskId.ZoneId,
DiskId: req.DiskId.DiskId,
},
},
)
if err != nil {
return nil, err
}

return getOperation(ctx, s.taskScheduler, taskID)
}

func (s *privateService) RebaseOverlayDisk(
ctx context.Context,
req *api.RebaseOverlayDiskRequest,
Expand Down
4 changes: 2 additions & 2 deletions cloud/disk_manager/pkg/admin/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ func getRequestContext(ctx context.Context) context.Context {
return ctx
}

func requestDeletionConfirmation(objectType string, objectID string) error {
log.Printf("confirm destruction by typing %s id to stdin", objectType)
func requestConfirmation(objectType string, objectID string) error {
log.Printf("confirm command by typing %s id to stdin", objectType)
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
if scanner.Text() != objectID {
Expand Down
2 changes: 1 addition & 1 deletion cloud/disk_manager/pkg/admin/disks.go
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ type deleteDisk struct {
func (c *deleteDisk) run() error {
ctx := newContext(c.clientConfig)

err := requestDeletionConfirmation("disk", c.diskID)
err := requestConfirmation("disk", c.diskID)
if err != nil {
return err
}
Expand Down
2 changes: 1 addition & 1 deletion cloud/disk_manager/pkg/admin/filesystem.go
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ type deleteFilesystem struct {
func (c *deleteFilesystem) run() error {
ctx := newContext(c.clientConfig)

err := requestDeletionConfirmation("filesystem", c.filesystemID)
err := requestConfirmation("filesystem", c.filesystemID)
if err != nil {
return err
}
Expand Down
2 changes: 1 addition & 1 deletion cloud/disk_manager/pkg/admin/images.go
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ type deleteImage struct {
func (c *deleteImage) run() error {
ctx := newContext(c.clientConfig)

err := requestDeletionConfirmation("image", c.imageID)
err := requestConfirmation("image", c.imageID)
if err != nil {
return err
}
Expand Down
74 changes: 74 additions & 0 deletions cloud/disk_manager/pkg/admin/private.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,80 @@ func newRebaseOverlayDiskCmd(config *client_config.ClientConfig) *cobra.Command

////////////////////////////////////////////////////////////////////////////////

type releaseBaseDisk struct {
config *client_config.ClientConfig
zoneID string
overlayDiskID string
}

func (c *releaseBaseDisk) run() error {
ctx := newContext(c.config)

err := requestConfirmation("overlay disk", c.overlayDiskID)
if err != nil {
return err
}

client, err := internal_client.NewPrivateClientForCLI(ctx, c.config)
if err != nil {
return fmt.Errorf("failed to create client: %w", err)
}
defer client.Close()

req := &api.ReleaseBaseDiskRequest{
DiskId: &disk_manager.DiskId{
ZoneId: c.zoneID,
DiskId: c.overlayDiskID,
},
}

resp, err := client.ReleaseBaseDisk(getRequestContext(ctx), req)
if err != nil {
return err
}

fmt.Printf("Operation: %v\n", resp.Id)

return internal_client.WaitOperation(ctx, client, resp.Id)
}

func newReleaseBaseDiskCmd(config *client_config.ClientConfig) *cobra.Command {
c := &releaseBaseDisk{
config: config,
}

cmd := &cobra.Command{
Use: "release_base_disk",
RunE: func(cmd *cobra.Command, args []string) error {
return c.run()
},
}

cmd.Flags().StringVar(
&c.zoneID,
"zone-id",
"",
"overlay disk zone ID where disk is located; required",
)
if err := cmd.MarkFlagRequired("zone-id"); err != nil {
log.Fatalf("Error setting flag zone-id as required: %v", err)
}

cmd.Flags().StringVar(
&c.overlayDiskID,
"overlay-disk-id",
"",
"overlay disk ID; required",
)
if err := cmd.MarkFlagRequired("overlay-disk-id"); err != nil {
log.Fatalf("Error setting flag overlay-disk-id as required: %v", err)
}

return cmd
}

////////////////////////////////////////////////////////////////////////////////

type retireBaseDisk struct {
config *client_config.ClientConfig
baseDiskID string
Expand Down
2 changes: 1 addition & 1 deletion cloud/disk_manager/pkg/admin/snapshots.go
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ type deleteSnapshot struct {
func (c *deleteSnapshot) run() error {
ctx := newContext(c.clientConfig)

err := requestDeletionConfirmation("snapshot", c.snapshotID)
err := requestConfirmation("snapshot", c.snapshotID)
if err != nil {
return err
}
Expand Down

0 comments on commit 7ba6718

Please sign in to comment.