Skip to content

Commit b95a984

Browse files
committed
Add support for backup gateways and agent-level backups
1 parent d2a8ec3 commit b95a984

12 files changed

Lines changed: 950 additions & 6 deletions

cmd/ecloud/ecloud.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ func ECloudRootCmd(f factory.ClientFactory, fs afero.Fs) *cobra.Command {
7474
cmd.AddCommand(ecloudAffinityRuleRootCmd(f))
7575
cmd.AddCommand(ecloudAffinityRuleMemberRootCmd(f))
7676
cmd.AddCommand(ecloudResourceTierRootCmd(f))
77+
cmd.AddCommand(ecloudBackupGatewayRootCmd(f))
7778
}
7879

7980
return cmd

cmd/ecloud/ecloud_backupgateway.go

Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
package ecloud
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
7+
"github.com/ans-group/cli/internal/pkg/factory"
8+
"github.com/ans-group/cli/internal/pkg/helper"
9+
"github.com/ans-group/cli/internal/pkg/output"
10+
"github.com/ans-group/sdk-go/pkg/service/ecloud"
11+
"github.com/spf13/cobra"
12+
)
13+
14+
func ecloudBackupGatewayRootCmd(f factory.ClientFactory) *cobra.Command {
15+
cmd := &cobra.Command{
16+
Use: "backupgateway",
17+
Short: "sub-commands relating to backup gateways",
18+
}
19+
20+
// Child commands
21+
cmd.AddCommand(ecloudBackupGatewaySpecificationRootCmd(f))
22+
cmd.AddCommand(ecloudBackupGatewayListCmd(f))
23+
cmd.AddCommand(ecloudBackupGatewayShowCmd(f))
24+
cmd.AddCommand(ecloudBackupGatewayCreateCmd(f))
25+
cmd.AddCommand(ecloudBackupGatewayUpdateCmd(f))
26+
cmd.AddCommand(ecloudBackupGatewayDeleteCmd(f))
27+
28+
return cmd
29+
}
30+
31+
func ecloudBackupGatewayListCmd(f factory.ClientFactory) *cobra.Command {
32+
cmd := &cobra.Command{
33+
Use: "list",
34+
Short: "Lists backup gateways",
35+
Example: "ans ecloud backupgateway list",
36+
RunE: ecloudCobraRunEFunc(f, ecloudBackupGatewayList),
37+
}
38+
39+
cmd.Flags().String("name", "", "Backup gateway name for filtering")
40+
41+
return cmd
42+
}
43+
44+
func ecloudBackupGatewayList(service ecloud.ECloudService, cmd *cobra.Command, args []string) error {
45+
params, err := helper.GetAPIRequestParametersFromFlags(cmd,
46+
helper.NewStringFilterFlagOption("name", "name"),
47+
)
48+
if err != nil {
49+
return err
50+
}
51+
52+
gateways, err := service.GetBackupGateways(params)
53+
if err != nil {
54+
return fmt.Errorf("Error retrieving backup gateways: %s", err)
55+
}
56+
57+
return output.CommandOutput(cmd, OutputECloudBackupGatewaysProvider(gateways))
58+
}
59+
60+
func ecloudBackupGatewayShowCmd(f factory.ClientFactory) *cobra.Command {
61+
return &cobra.Command{
62+
Use: "show <gateway: id>...",
63+
Short: "Show details of a backup gateway",
64+
Example: "ans ecloud backupgateway show bgw-abcdef12",
65+
Args: func(cmd *cobra.Command, args []string) error {
66+
if len(args) < 1 {
67+
return errors.New("Missing backup gateway ID")
68+
}
69+
70+
return nil
71+
},
72+
RunE: ecloudCobraRunEFunc(f, ecloudBackupGatewayShow),
73+
}
74+
}
75+
76+
func ecloudBackupGatewayShow(service ecloud.ECloudService, cmd *cobra.Command, args []string) error {
77+
var backupGateways []ecloud.BackupGateway
78+
for _, arg := range args {
79+
backupGateway, err := service.GetBackupGateway(arg)
80+
if err != nil {
81+
output.OutputWithErrorLevelf("Error retrieving backup gateway [%s]: %s", arg, err)
82+
continue
83+
}
84+
85+
backupGateways = append(backupGateways, backupGateway)
86+
}
87+
88+
return output.CommandOutput(cmd, OutputECloudBackupGatewaysProvider(backupGateways))
89+
}
90+
91+
func ecloudBackupGatewayCreateCmd(f factory.ClientFactory) *cobra.Command {
92+
cmd := &cobra.Command{
93+
Use: "create",
94+
Short: "Creates a backup gateway",
95+
Example: "ans ecloud backupgateway create --router rtr-abcdef12 --vpc vpc-abcd1234 --specification bgws-abcdef12",
96+
RunE: ecloudCobraRunEFunc(f, ecloudBackupGatewayCreate),
97+
}
98+
99+
// Setup flags
100+
cmd.Flags().String("name", "", "Name of gateway")
101+
cmd.Flags().String("vpc", "", "ID of VPC")
102+
cmd.MarkFlagRequired("vpc")
103+
cmd.Flags().String("router", "", "ID of router")
104+
cmd.MarkFlagRequired("router")
105+
cmd.Flags().String("specification", "", "ID of backup gateway specification")
106+
cmd.MarkFlagRequired("specification")
107+
cmd.Flags().Bool("wait", false, "Specifies that the command should wait until the backup gateway has been completely created")
108+
109+
return cmd
110+
}
111+
112+
func ecloudBackupGatewayCreate(service ecloud.ECloudService, cmd *cobra.Command, args []string) error {
113+
createRequest := ecloud.CreateBackupGatewayRequest{}
114+
createRequest.Name, _ = cmd.Flags().GetString("name")
115+
createRequest.VPCID, _ = cmd.Flags().GetString("vpc")
116+
createRequest.RouterID, _ = cmd.Flags().GetString("router")
117+
createRequest.GatewaySpecID, _ = cmd.Flags().GetString("specification")
118+
119+
taskRef, err := service.CreateBackupGateway(createRequest)
120+
if err != nil {
121+
return fmt.Errorf("Error creating backup gateway: %s", err)
122+
}
123+
124+
waitFlag, _ := cmd.Flags().GetBool("wait")
125+
if waitFlag {
126+
err := helper.WaitForCommand(TaskStatusWaitFunc(service, taskRef.TaskID, ecloud.TaskStatusComplete))
127+
if err != nil {
128+
return fmt.Errorf("Error waiting for backup gateway task to complete: %s", err)
129+
}
130+
}
131+
132+
backupGateway, err := service.GetBackupGateway(taskRef.ResourceID)
133+
if err != nil {
134+
return fmt.Errorf("Error retrieving new backup gateway: %s", err)
135+
}
136+
137+
return output.CommandOutput(cmd, OutputECloudBackupGatewaysProvider([]ecloud.BackupGateway{backupGateway}))
138+
}
139+
140+
func ecloudBackupGatewayUpdateCmd(f factory.ClientFactory) *cobra.Command {
141+
cmd := &cobra.Command{
142+
Use: "update <gateway: id>...",
143+
Short: "Updates a backup gateway",
144+
Long: "Update the name of a backup gateway",
145+
Example: "ans ecloud backupgateway update bgw-abcdef12 --name \"my gateway\"",
146+
Args: func(cmd *cobra.Command, args []string) error {
147+
if len(args) < 1 {
148+
return errors.New("Missing backup gateway")
149+
}
150+
151+
return nil
152+
},
153+
RunE: ecloudCobraRunEFunc(f, ecloudBackupGatewayUpdate),
154+
}
155+
156+
cmd.Flags().String("name", "", "Name of gateway")
157+
cmd.Flags().Bool("wait", false, "Specifies that the command should wait until the backup gateway has been completely updated")
158+
159+
return cmd
160+
}
161+
162+
func ecloudBackupGatewayUpdate(service ecloud.ECloudService, cmd *cobra.Command, args []string) error {
163+
patchRequest := ecloud.PatchBackupGatewayRequest{}
164+
165+
if cmd.Flags().Changed("name") {
166+
patchRequest.Name, _ = cmd.Flags().GetString("name")
167+
}
168+
169+
var backupGateways []ecloud.BackupGateway
170+
for _, arg := range args {
171+
task, err := service.PatchBackupGateway(arg, patchRequest)
172+
if err != nil {
173+
output.OutputWithErrorLevelf("Error updating backup gateway [%s]: %s", arg, err)
174+
continue
175+
}
176+
177+
waitFlag, _ := cmd.Flags().GetBool("wait")
178+
if waitFlag {
179+
err := helper.WaitForCommand(TaskStatusWaitFunc(service, task.TaskID, ecloud.TaskStatusComplete))
180+
if err != nil {
181+
output.OutputWithErrorLevelf("Error waiting for task to complete for backup gateway [%s]: %s", arg, err)
182+
continue
183+
}
184+
}
185+
186+
backupGateway, err := service.GetBackupGateway(arg)
187+
if err != nil {
188+
output.OutputWithErrorLevelf("Error retrieving updated backup gateway [%s]: %s", arg, err)
189+
continue
190+
}
191+
192+
backupGateways = append(backupGateways, backupGateway)
193+
}
194+
195+
return output.CommandOutput(cmd, OutputECloudBackupGatewaysProvider(backupGateways))
196+
}
197+
198+
func ecloudBackupGatewayDeleteCmd(f factory.ClientFactory) *cobra.Command {
199+
cmd := &cobra.Command{
200+
Use: "delete <gateway: id>...",
201+
Short: "Removes a backup gateway",
202+
Example: "ans ecloud backupgateway delete bgw-abcdef12",
203+
Args: func(cmd *cobra.Command, args []string) error {
204+
if len(args) < 1 {
205+
return errors.New("Missing backup gateway")
206+
}
207+
208+
return nil
209+
},
210+
RunE: ecloudCobraRunEFunc(f, ecloudBackupGatewayDelete),
211+
}
212+
213+
cmd.Flags().Bool("wait", false, "Specifies that the command should wait until the backup gateway has been completely removed")
214+
215+
return cmd
216+
}
217+
218+
func ecloudBackupGatewayDelete(service ecloud.ECloudService, cmd *cobra.Command, args []string) error {
219+
for _, arg := range args {
220+
taskID, err := service.DeleteBackupGateway(arg)
221+
if err != nil {
222+
output.OutputWithErrorLevelf("Error removing backup gateway [%s]: %s", arg, err)
223+
continue
224+
}
225+
226+
waitFlag, _ := cmd.Flags().GetBool("wait")
227+
if waitFlag {
228+
err := helper.WaitForCommand(TaskStatusWaitFunc(service, taskID, ecloud.TaskStatusComplete))
229+
if err != nil {
230+
output.OutputWithErrorLevelf("Error waiting for task to complete for backup gateway [%s]: %s", arg, err)
231+
continue
232+
}
233+
}
234+
}
235+
return nil
236+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package ecloud
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
7+
"github.com/ans-group/cli/internal/pkg/factory"
8+
"github.com/ans-group/cli/internal/pkg/helper"
9+
"github.com/ans-group/cli/internal/pkg/output"
10+
"github.com/ans-group/sdk-go/pkg/service/ecloud"
11+
"github.com/spf13/cobra"
12+
)
13+
14+
func ecloudBackupGatewaySpecificationRootCmd(f factory.ClientFactory) *cobra.Command {
15+
cmd := &cobra.Command{
16+
Use: "spec",
17+
Short: "sub-commands relating to backup gateway specifications",
18+
}
19+
20+
// Child commands
21+
cmd.AddCommand(ecloudBackupGatewaySpecificationListCmd(f))
22+
cmd.AddCommand(ecloudBackupGatewaySpecificationShowCmd(f))
23+
24+
return cmd
25+
}
26+
27+
func ecloudBackupGatewaySpecificationListCmd(f factory.ClientFactory) *cobra.Command {
28+
cmd := &cobra.Command{
29+
Use: "list",
30+
Short: "Lists Backup gateway specifications",
31+
Example: "ans ecloud backupgateway spec list",
32+
RunE: ecloudCobraRunEFunc(f, ecloudBackupGatewaySpecificationList),
33+
}
34+
35+
cmd.Flags().String("name", "", "Backup gateway specification name for filtering")
36+
37+
return cmd
38+
}
39+
40+
func ecloudBackupGatewaySpecificationList(service ecloud.ECloudService, cmd *cobra.Command, args []string) error {
41+
params, err := helper.GetAPIRequestParametersFromFlags(cmd,
42+
helper.NewStringFilterFlagOption("name", "name"),
43+
)
44+
if err != nil {
45+
return err
46+
}
47+
48+
specs, err := service.GetBackupGatewaySpecifications(params)
49+
if err != nil {
50+
return fmt.Errorf("Error retrieving backup gateway specifications: %s", err)
51+
}
52+
53+
return output.CommandOutput(cmd, OutputECloudBackupGatewaySpecificationsProvider(specs))
54+
}
55+
56+
func ecloudBackupGatewaySpecificationShowCmd(f factory.ClientFactory) *cobra.Command {
57+
return &cobra.Command{
58+
Use: "show <specification: id>...",
59+
Short: "Show details of a backup gateway specification",
60+
Example: "ans ecloud backupgateway spec show bgws-abcdef12",
61+
Args: func(cmd *cobra.Command, args []string) error {
62+
if len(args) < 1 {
63+
return errors.New("Missing backup gateway specification")
64+
}
65+
66+
return nil
67+
},
68+
RunE: ecloudCobraRunEFunc(f, ecloudBackupGatewaySpecificationShow),
69+
}
70+
}
71+
72+
func ecloudBackupGatewaySpecificationShow(service ecloud.ECloudService, cmd *cobra.Command, args []string) error {
73+
var specs []ecloud.BackupGatewaySpecification
74+
for _, arg := range args {
75+
spec, err := service.GetBackupGatewaySpecification(arg)
76+
if err != nil {
77+
output.OutputWithErrorLevelf("Error retrieving backup gateway specification [%s]: %s", arg, err)
78+
continue
79+
}
80+
81+
specs = append(specs, spec)
82+
}
83+
84+
return output.CommandOutput(cmd, OutputECloudBackupGatewaySpecificationsProvider(specs))
85+
}

0 commit comments

Comments
 (0)