Skip to content
Snippets Groups Projects
Commit 46ca7192 authored by Florent Gluck's avatar Florent Gluck
Browse files

Fixed a bug in vm_attach: code wasn't using the new route

VMs can be edited in bulk using regex expressions
parent 5a1ba593
No related branches found
No related tags found
No related merge requests found
...@@ -43,7 +43,7 @@ func (cmd *Attach)Run(args []string) int { ...@@ -43,7 +43,7 @@ func (cmd *Attach)Run(args []string) int {
id := args[0] id := args[0]
resp, err := client.R().Get(host+"/vms/"+id+"/list") resp, err := client.R().Get(host+"/vms/"+id)
if err != nil { if err != nil {
u.PrintlnErr("Error: "+err.Error()) u.PrintlnErr("Error: "+err.Error())
return 1 return 1
......
...@@ -12,7 +12,7 @@ type Edit struct { ...@@ -12,7 +12,7 @@ type Edit struct {
Name string Name string
} }
type vmArgsParameters struct { type vmEditParameters struct {
Name string Name string
Cpus int Cpus int
Ram int Ram int
...@@ -29,11 +29,19 @@ func (cmd *Edit)GetDesc() string { ...@@ -29,11 +29,19 @@ func (cmd *Edit)GetDesc() string {
func (cmd *Edit)PrintUsage() { func (cmd *Edit)PrintUsage() {
u.PrintlnErr(cmd.GetDesc()) u.PrintlnErr(cmd.GetDesc())
u.PrintlnErr("Usage: "+cmd.Name+" vmID [name=\"new name\"] [cpus=n] [ram=n] [nic=none/user]") u.PrintlnErr("Usage: "+cmd.GetName()+" [ID ...] [regex ...] [name=\"new name\"] [cpus=n] [ram=n] [nic=none/user]")
u.PrintlnErr("Parameters between [] are optional, but at least one must be defined.") u.PrintlnErr("Only VMs matching the specified IDs or regexes will be edited.")
u.PrintlnErr("cpus must be between 1 and 16") const usage string = `Any number of IDs or regexes can be specified.
u.PrintlnErr("ram must be between 512 and 32768") The regex only matches the VM's name and is case-insensitive.
u.PrintlnErr("nic must be either \"none\" or \"user\"") Regex examples:
"" -> matches any VMs
"." -> matches any VMs
"bla" -> matches any VMs containing "bla" in their name
VM parameters that can be edited are the following:
cpus must be between 1 and 16
ram must be between 512 and 32768
nic must be either "none" or "user`
u.PrintlnErr(usage)
} }
func (cmd *Edit)getStringVal(s string, prefix string) string { func (cmd *Edit)getStringVal(s string, prefix string) string {
...@@ -44,45 +52,52 @@ func (cmd *Edit)getStringVal(s string, prefix string) string { ...@@ -44,45 +52,52 @@ func (cmd *Edit)getStringVal(s string, prefix string) string {
return "" return ""
} }
func (cmd *Edit)parseArgs(args []string) (*vmArgsParameters, error) { func (cmd *Edit)parseArgs(args []string) (*vmEditParameters, []string, error) {
vmArgs := &vmArgsParameters {} vmParams := &vmEditParameters {}
var regex []string
atLeastOneArg := false atLeastOneArg := false
for _, arg := range args { for _, arg := range args {
s := cmd.getStringVal(arg, "name=") s := cmd.getStringVal(arg, "name=")
if s != "" { if s != "" {
vmArgs.Name = s vmParams.Name = s
atLeastOneArg = true atLeastOneArg = true
continue
} }
s = cmd.getStringVal(arg, "cpus=") s = cmd.getStringVal(arg, "cpus=")
if s != "" { if s != "" {
cpus, err := strconv.Atoi(s) cpus, err := strconv.Atoi(s)
if err != nil { if err != nil {
return nil, errors.New("Invalid number of CPU(s)") return nil, nil, errors.New("Invalid number of CPU(s)")
} }
vmArgs.Cpus = cpus vmParams.Cpus = cpus
atLeastOneArg = true atLeastOneArg = true
continue
} }
s = cmd.getStringVal(arg, "ram=") s = cmd.getStringVal(arg, "ram=")
if s != "" { if s != "" {
ram, err := strconv.Atoi(s) ram, err := strconv.Atoi(s)
if err != nil { if err != nil {
return nil, errors.New("Invalid amount of RAM") return nil, nil, errors.New("Invalid amount of RAM")
} }
vmArgs.Ram = ram vmParams.Ram = ram
atLeastOneArg = true atLeastOneArg = true
continue
} }
s = cmd.getStringVal(arg, "nic=") s = cmd.getStringVal(arg, "nic=")
if s != "" { if s != "" {
vmArgs.Nic = s vmParams.Nic = s
atLeastOneArg = true atLeastOneArg = true
continue
} }
regex = append(regex, arg)
} }
if atLeastOneArg { if atLeastOneArg {
return vmArgs, nil return vmParams, regex, nil
} else { } else {
return nil, nil return nil, nil, nil
} }
} }
...@@ -91,34 +106,46 @@ func (cmd *Edit)Run(args []string) int { ...@@ -91,34 +106,46 @@ func (cmd *Edit)Run(args []string) int {
host := g.GetInstance().Host host := g.GetInstance().Host
argc := len(args) argc := len(args)
if argc < 2 || argc > 5 { if argc < 1 {
cmd.PrintUsage() cmd.PrintUsage()
return 1 return 1
} }
id := args[0] vmParams, regex, err := cmd.parseArgs(args)
vmArgs, err := cmd.parseArgs(args[1:])
if err != nil { if err != nil {
u.PrintlnErr(err.Error()) u.PrintlnErr(err.Error())
return 1 return 1
} }
if vmArgs == nil { if vmParams == nil {
cmd.PrintUsage() cmd.PrintUsage()
return 1 return 1
} }
resp, err := client.R().SetBody(vmArgs).Put(host+"/vms/"+id) vms, err := getFilteredVMs("/vms/edit", regex)
if err != nil { if err != nil {
u.PrintlnErr("Error: "+err.Error()) u.PrintlnErr(err.Error())
return 1 return 1
} }
statusCode := 0
for _, vm := range(vms) {
uuid := vm.ID.String()
resp, err := client.R().SetBody(vmParams).Put(host+"/vms/"+uuid)
if err != nil {
u.PrintlnErr("Failed editing VM \""+vm.Name+"\" ("+uuid+"): "+err.Error())
statusCode = 1
} else {
if resp.IsSuccess() { if resp.IsSuccess() {
u.Println(resp) u.Println("Edited VM \""+vm.Name+"\" ("+uuid+")")
return 0
} else { } else {
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String()) u.PrintlnErr("Failed editing VM \""+vm.Name+"\" ("+uuid+"): "+resp.Status()+": "+resp.String())
return 1 statusCode = 1
}
} }
}
return statusCode
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment