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 {
id := args[0]
resp, err := client.R().Get(host+"/vms/"+id+"/list")
resp, err := client.R().Get(host+"/vms/"+id)
if err != nil {
u.PrintlnErr("Error: "+err.Error())
return 1
......
......@@ -12,7 +12,7 @@ type Edit struct {
Name string
}
type vmArgsParameters struct {
type vmEditParameters struct {
Name string
Cpus int
Ram int
......@@ -29,11 +29,19 @@ func (cmd *Edit)GetDesc() string {
func (cmd *Edit)PrintUsage() {
u.PrintlnErr(cmd.GetDesc())
u.PrintlnErr("Usage: "+cmd.Name+" vmID [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("cpus must be between 1 and 16")
u.PrintlnErr("ram must be between 512 and 32768")
u.PrintlnErr("nic must be either \"none\" or \"user\"")
u.PrintlnErr("Usage: "+cmd.GetName()+" [ID ...] [regex ...] [name=\"new name\"] [cpus=n] [ram=n] [nic=none/user]")
u.PrintlnErr("Only VMs matching the specified IDs or regexes will be edited.")
const usage string = `Any number of IDs or regexes can be specified.
The regex only matches the VM's name and is case-insensitive.
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 {
......@@ -44,45 +52,52 @@ func (cmd *Edit)getStringVal(s string, prefix string) string {
return ""
}
func (cmd *Edit)parseArgs(args []string) (*vmArgsParameters, error) {
vmArgs := &vmArgsParameters {}
func (cmd *Edit)parseArgs(args []string) (*vmEditParameters, []string, error) {
vmParams := &vmEditParameters {}
var regex []string
atLeastOneArg := false
for _, arg := range args {
s := cmd.getStringVal(arg, "name=")
if s != "" {
vmArgs.Name = s
vmParams.Name = s
atLeastOneArg = true
continue
}
s = cmd.getStringVal(arg, "cpus=")
if s != "" {
cpus, err := strconv.Atoi(s)
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
continue
}
s = cmd.getStringVal(arg, "ram=")
if s != "" {
ram, err := strconv.Atoi(s)
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
continue
}
s = cmd.getStringVal(arg, "nic=")
if s != "" {
vmArgs.Nic = s
vmParams.Nic = s
atLeastOneArg = true
continue
}
regex = append(regex, arg)
}
if atLeastOneArg {
return vmArgs, nil
return vmParams, regex, nil
} else {
return nil, nil
return nil, nil, nil
}
}
......@@ -91,34 +106,46 @@ func (cmd *Edit)Run(args []string) int {
host := g.GetInstance().Host
argc := len(args)
if argc < 2 || argc > 5 {
if argc < 1 {
cmd.PrintUsage()
return 1
}
id := args[0]
vmArgs, err := cmd.parseArgs(args[1:])
vmParams, regex, err := cmd.parseArgs(args)
if err != nil {
u.PrintlnErr(err.Error())
return 1
}
if vmArgs == nil {
if vmParams == nil {
cmd.PrintUsage()
return 1
}
resp, err := client.R().SetBody(vmArgs).Put(host+"/vms/"+id)
vms, err := getFilteredVMs("/vms/edit", regex)
if err != nil {
u.PrintlnErr("Error: "+err.Error())
u.PrintlnErr(err.Error())
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() {
u.Println(resp)
return 0
u.Println("Edited VM \""+vm.Name+"\" ("+uuid+")")
} else {
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
return 1
u.PrintlnErr("Failed editing VM \""+vm.Name+"\" ("+uuid+"): "+resp.Status()+": "+resp.String())
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