-
Notifications
You must be signed in to change notification settings - Fork 149
/
custom_volume.go
144 lines (120 loc) · 4.22 KB
/
custom_volume.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package instance
import (
"context"
"fmt"
"reflect"
"time"
"github.com/fatih/color"
"github.com/scaleway/scaleway-cli/v2/internal/core"
"github.com/scaleway/scaleway-cli/v2/internal/human"
"github.com/scaleway/scaleway-sdk-go/api/instance/v1"
"github.com/scaleway/scaleway-sdk-go/scw"
)
//
// Marshalers
//
var (
volumeStateMarshalSpecs = human.EnumMarshalSpecs{
instance.VolumeStateAvailable: &human.EnumMarshalSpec{Attribute: color.FgGreen},
instance.VolumeStateError: &human.EnumMarshalSpec{Attribute: color.FgRed},
instance.VolumeStateFetching: &human.EnumMarshalSpec{Attribute: color.FgBlue},
instance.VolumeStateHotsyncing: &human.EnumMarshalSpec{Attribute: color.FgBlue},
instance.VolumeStateResizing: &human.EnumMarshalSpec{Attribute: color.FgBlue},
instance.VolumeStateSaving: &human.EnumMarshalSpec{Attribute: color.FgBlue},
instance.VolumeStateSnapshotting: &human.EnumMarshalSpec{Attribute: color.FgBlue},
}
)
// serversMarshalerFunc marshals a VolumeSummary.
func volumeSummaryMarshalerFunc(i interface{}, opt *human.MarshalOpt) (string, error) {
volumeSummary := i.(instance.VolumeSummary)
return human.Marshal(volumeSummary.ID, opt)
}
// volumeMapMarshalerFunc returns the length of the map.
func volumeMapMarshalerFunc(i interface{}, _ *human.MarshalOpt) (string, error) {
volumes := i.(map[string]*instance.Volume)
return fmt.Sprintf("%v", len(volumes)), nil
}
// Builders
func volumeCreateBuilder(c *core.Command) *core.Command {
type customCreateVolumeRequest struct {
*instance.CreateVolumeRequest
OrganizationID *string
ProjectID *string
}
renameOrganizationIDArgSpec(c.ArgSpecs)
renameProjectIDArgSpec(c.ArgSpecs)
c.ArgsType = reflect.TypeOf(customCreateVolumeRequest{})
c.AddInterceptors(func(ctx context.Context, argsI interface{}, runner core.CommandRunner) (i interface{}, err error) {
args := argsI.(*customCreateVolumeRequest)
if args.CreateVolumeRequest == nil {
args.CreateVolumeRequest = &instance.CreateVolumeRequest{}
}
request := args.CreateVolumeRequest
request.Organization = args.OrganizationID
request.Project = args.ProjectID
return runner(ctx, request)
})
return c
}
func volumeListBuilder(c *core.Command) *core.Command {
type customListVolumesRequest struct {
*instance.ListVolumesRequest
OrganizationID *string
ProjectID *string
}
renameOrganizationIDArgSpec(c.ArgSpecs)
renameProjectIDArgSpec(c.ArgSpecs)
c.ArgsType = reflect.TypeOf(customListVolumesRequest{})
c.AddInterceptors(func(ctx context.Context, argsI interface{}, runner core.CommandRunner) (i interface{}, err error) {
args := argsI.(*customListVolumesRequest)
if args.ListVolumesRequest == nil {
args.ListVolumesRequest = &instance.ListVolumesRequest{}
}
request := args.ListVolumesRequest
request.Organization = args.OrganizationID
request.Project = args.ProjectID
return runner(ctx, request)
})
return c
}
type volumeWaitRequest struct {
Zone scw.Zone
VolumeID string
Timeout time.Duration
}
func volumeWaitCommand() *core.Command {
return &core.Command{
Short: `Wait for volume to reach a stable state`,
Long: `Wait for volume to reach a stable state. This is similar to using --wait flag on other action commands, but without requiring a new action on the volume.`,
Namespace: "instance",
Resource: "volume",
Verb: "wait",
Groups: []string{"workflow"},
ArgsType: reflect.TypeOf(volumeWaitRequest{}),
Run: func(ctx context.Context, argsI interface{}) (i interface{}, err error) {
args := argsI.(*volumeWaitRequest)
return instance.NewAPI(core.ExtractClient(ctx)).WaitForVolume(&instance.WaitForVolumeRequest{
Zone: args.Zone,
VolumeID: args.VolumeID,
Timeout: scw.TimeDurationPtr(args.Timeout),
RetryInterval: core.DefaultRetryInterval,
})
},
ArgSpecs: core.ArgSpecs{
core.WaitTimeoutArgSpec(serverActionTimeout),
{
Name: "volume-id",
Short: `ID of the volume affected by the action.`,
Required: true,
Positional: true,
},
core.ZoneArgSpec(),
},
Examples: []*core.Example{
{
Short: "Wait for a volume to reach a stable state",
ArgsJSON: `{"volume_id": "11111111-1111-1111-1111-111111111111"}`,
},
},
}
}