Skip to content

Commit f1c96c9

Browse files
authored
Merge pull request #56 from serverscom/implement-rbs-commands
Implement rbs commands
2 parents 2a6abc7 + 82ae51b commit f1c96c9

21 files changed

Lines changed: 1267 additions & 0 deletions

File tree

cmd/entities/rbs_volumes/add.go

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package rbsvolumes
2+
3+
import (
4+
serverscom "github.com/serverscom/serverscom-go-client/pkg"
5+
"github.com/serverscom/srvctl/cmd/base"
6+
"github.com/spf13/cobra"
7+
)
8+
9+
type AddFlags struct {
10+
Skeleton bool
11+
InputPath string
12+
Name string
13+
Size int64
14+
LocationID int
15+
FlavorID int
16+
Labels []string
17+
}
18+
19+
func newAddCmd(cmdContext *base.CmdContext) *cobra.Command {
20+
flags := &AddFlags{}
21+
22+
cmd := &cobra.Command{
23+
Use: "add",
24+
Short: "Add a RBS volume",
25+
Long: "Add a new Remote Block Storage volume",
26+
Args: cobra.ExactArgs(0),
27+
RunE: func(cmd *cobra.Command, args []string) error {
28+
formatter := cmdContext.GetOrCreateFormatter(cmd)
29+
30+
if flags.Skeleton {
31+
return formatter.FormatSkeleton("rbs-volumes/add.json")
32+
}
33+
34+
manager := cmdContext.GetManager()
35+
36+
ctx, cancel := base.SetupContext(cmd, manager)
37+
defer cancel()
38+
39+
base.SetupProxy(cmd, manager)
40+
41+
input := &serverscom.RemoteBlockStorageVolumeCreateInput{}
42+
43+
if flags.InputPath != "" {
44+
if err := base.ReadInputJSON(flags.InputPath, cmd.InOrStdin(), input); err != nil {
45+
return err
46+
}
47+
} else {
48+
required := []string{"name", "size", "flavor-id"}
49+
if err := base.ValidateFlags(cmd, required); err != nil {
50+
return err
51+
}
52+
}
53+
54+
if err := flags.FillInput(cmd, input); err != nil {
55+
return err
56+
}
57+
58+
scClient := cmdContext.GetClient().SetVerbose(manager.GetVerbose(cmd)).GetScClient()
59+
volume, err := scClient.RemoteBlockStorageVolumes.Create(ctx, *input)
60+
if err != nil {
61+
return err
62+
}
63+
64+
if volume != nil {
65+
return formatter.Format(volume)
66+
}
67+
return nil
68+
},
69+
}
70+
71+
cmd.Flags().StringVarP(&flags.InputPath, "input", "i", "", "path to input file or '-' to read from stdin")
72+
cmd.Flags().BoolVarP(&flags.Skeleton, "skeleton", "s", false, "JSON object with structure that is required to be passed")
73+
74+
cmd.Flags().StringVarP(&flags.Name, "name", "n", "", "name of the RBS volume")
75+
cmd.Flags().Int64Var(&flags.Size, "size", 0, "size of the volume in GB")
76+
cmd.Flags().IntVar(&flags.LocationID, "location-id", 0, "ID of the location")
77+
cmd.Flags().IntVar(&flags.FlavorID, "flavor-id", 0, "ID of the flavor")
78+
cmd.Flags().StringArrayVarP(&flags.Labels, "label", "l", []string{}, "string in key=value format")
79+
80+
return cmd
81+
}
82+
83+
func (f *AddFlags) FillInput(cmd *cobra.Command, input *serverscom.RemoteBlockStorageVolumeCreateInput) error {
84+
if cmd.Flags().Changed("name") {
85+
input.Name = f.Name
86+
}
87+
if cmd.Flags().Changed("size") {
88+
input.Size = f.Size
89+
}
90+
if cmd.Flags().Changed("location-id") {
91+
input.LocationID = f.LocationID
92+
}
93+
if cmd.Flags().Changed("flavor-id") {
94+
input.FlavorID = f.FlavorID
95+
}
96+
if cmd.Flags().Changed("label") {
97+
labelsMap, err := base.ParseLabels(f.Labels)
98+
if err != nil {
99+
return err
100+
}
101+
input.Labels = labelsMap
102+
}
103+
104+
return nil
105+
}

cmd/entities/rbs_volumes/delete.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package rbsvolumes
2+
3+
import (
4+
"github.com/serverscom/srvctl/cmd/base"
5+
"github.com/spf13/cobra"
6+
)
7+
8+
func newDeleteCmd(cmdContext *base.CmdContext) *cobra.Command {
9+
cmd := &cobra.Command{
10+
Use: "delete <volume-id>",
11+
Short: "Delete a RBS volume",
12+
Long: "Delete a Remote Block Storage volume by ID",
13+
Args: cobra.ExactArgs(1),
14+
RunE: func(cmd *cobra.Command, args []string) error {
15+
manager := cmdContext.GetManager()
16+
17+
ctx, cancel := base.SetupContext(cmd, manager)
18+
defer cancel()
19+
20+
base.SetupProxy(cmd, manager)
21+
22+
scClient := cmdContext.GetClient().SetVerbose(manager.GetVerbose(cmd)).GetScClient()
23+
24+
volumeID := args[0]
25+
return scClient.RemoteBlockStorageVolumes.Delete(ctx, volumeID)
26+
},
27+
}
28+
29+
return cmd
30+
}

cmd/entities/rbs_volumes/get.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package rbsvolumes
2+
3+
import (
4+
"github.com/serverscom/srvctl/cmd/base"
5+
"github.com/spf13/cobra"
6+
)
7+
8+
func newGetCmd(cmdContext *base.CmdContext) *cobra.Command {
9+
cmd := &cobra.Command{
10+
Use: "get <volume-id>",
11+
Short: "Get a RBS volume",
12+
Long: "Get a Remote Block Storage volume by ID",
13+
Args: cobra.ExactArgs(1),
14+
RunE: func(cmd *cobra.Command, args []string) error {
15+
manager := cmdContext.GetManager()
16+
17+
ctx, cancel := base.SetupContext(cmd, manager)
18+
defer cancel()
19+
20+
base.SetupProxy(cmd, manager)
21+
22+
scClient := cmdContext.GetClient().SetVerbose(manager.GetVerbose(cmd)).GetScClient()
23+
24+
volumeID := args[0]
25+
volume, err := scClient.RemoteBlockStorageVolumes.Get(ctx, volumeID)
26+
if err != nil {
27+
return err
28+
}
29+
30+
if volume != nil {
31+
formatter := cmdContext.GetOrCreateFormatter(cmd)
32+
return formatter.Format(volume)
33+
}
34+
return nil
35+
},
36+
}
37+
38+
return cmd
39+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package rbsvolumes
2+
3+
import (
4+
"github.com/serverscom/srvctl/cmd/base"
5+
"github.com/spf13/cobra"
6+
)
7+
8+
func newGetCredentialsCmd(cmdContext *base.CmdContext) *cobra.Command {
9+
cmd := &cobra.Command{
10+
Use: "get-credentials <volume-id>",
11+
Short: "Get credentials for a RBS volume",
12+
Long: "Get credentials for a Remote Block Storage volume by ID",
13+
Args: cobra.ExactArgs(1),
14+
RunE: func(cmd *cobra.Command, args []string) error {
15+
manager := cmdContext.GetManager()
16+
17+
ctx, cancel := base.SetupContext(cmd, manager)
18+
defer cancel()
19+
20+
base.SetupProxy(cmd, manager)
21+
22+
scClient := cmdContext.GetClient().SetVerbose(manager.GetVerbose(cmd)).GetScClient()
23+
24+
volumeID := args[0]
25+
credentials, err := scClient.RemoteBlockStorageVolumes.GetCredentials(ctx, volumeID)
26+
if err != nil {
27+
return err
28+
}
29+
30+
if credentials != nil {
31+
formatter := cmdContext.GetOrCreateFormatter(cmd)
32+
return formatter.Format(credentials)
33+
}
34+
return nil
35+
},
36+
}
37+
38+
return cmd
39+
}

cmd/entities/rbs_volumes/list.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package rbsvolumes
2+
3+
import (
4+
serverscom "github.com/serverscom/serverscom-go-client/pkg"
5+
"github.com/serverscom/srvctl/cmd/base"
6+
"github.com/spf13/cobra"
7+
)
8+
9+
func newListCmd(cmdContext *base.CmdContext) *cobra.Command {
10+
factory := func(verbose bool, args ...string) serverscom.Collection[serverscom.RemoteBlockStorageVolume] {
11+
scClient := cmdContext.GetClient().SetVerbose(verbose).GetScClient()
12+
return scClient.RemoteBlockStorageVolumes.Collection()
13+
}
14+
15+
opts := base.NewListOptions(
16+
&base.BaseListOptions[serverscom.RemoteBlockStorageVolume]{},
17+
&base.LabelSelectorOption[serverscom.RemoteBlockStorageVolume]{},
18+
)
19+
20+
return base.NewListCmd("list", "RBS servers", factory, cmdContext, opts...)
21+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package rbsvolumes
2+
3+
import (
4+
"log"
5+
6+
serverscom "github.com/serverscom/serverscom-go-client/pkg"
7+
"github.com/serverscom/srvctl/cmd/base"
8+
"github.com/serverscom/srvctl/internal/output/entities"
9+
"github.com/spf13/cobra"
10+
)
11+
12+
func NewCmd(cmdContext *base.CmdContext) *cobra.Command {
13+
rbsVolumeEntity, err := entities.Registry.GetEntityFromValue(serverscom.RemoteBlockStorageVolume{})
14+
if err != nil {
15+
log.Fatal(err)
16+
}
17+
rbsCredentialsEntity, err := entities.Registry.GetEntityFromValue(serverscom.RemoteBlockStorageVolumeCredentials{})
18+
if err != nil {
19+
log.Fatal(err)
20+
}
21+
entitiesMap := make(map[string]entities.EntityInterface)
22+
entitiesMap["rbs"] = rbsVolumeEntity
23+
entitiesMap["rbs-credentials"] = rbsCredentialsEntity
24+
cmd := &cobra.Command{
25+
Use: "rbs",
26+
Short: "Manage RBS servers",
27+
PersistentPreRunE: base.CombinePreRunE(
28+
base.CheckFormatterFlags(cmdContext, entitiesMap),
29+
base.CheckEmptyContexts(cmdContext),
30+
),
31+
Args: base.NoArgs,
32+
Run: base.UsageRun,
33+
}
34+
35+
cmd.AddCommand(
36+
newListCmd(cmdContext),
37+
newAddCmd(cmdContext),
38+
newGetCmd(cmdContext),
39+
newUpdateCmd(cmdContext),
40+
newDeleteCmd(cmdContext),
41+
newGetCredentialsCmd(cmdContext),
42+
newResetCredentialsCmd(cmdContext),
43+
)
44+
45+
base.AddFormatFlags(cmd)
46+
47+
return cmd
48+
}

0 commit comments

Comments
 (0)