diff --git a/README.md b/README.md index faa33da5ba802ff16929cd5dc1236640f89228bf..836e97371dac64a9da3b11b74832bfb858b498d7 100644 --- a/README.md +++ b/README.md @@ -586,6 +586,8 @@ The table below lists all potential capabilities associated to a user: | VM_WRITEFS_ANY | Can import files into **ANY** VM | | VM_SET_ACCESS | Can change (edit or delete) a VM's access | | TPL_CREATE | Can create a template | +| TPL_EDIT | Can edit a template | +| TPL_EDIT_ANY | Can edit **ANY** template | | TPL_DESTROY | Can destroy a template | | TPL_DESTROY_ANY | Can destroy **ANY** template | | TPL_LIST | Can list public or owned templates | diff --git a/src/cmdTemplate/templateDel.go b/src/cmdTemplate/templateDel.go index caebd1916cc9ac481f7a6c68ae1d3e43c32f6d64..c2dc40e41e8ea30143c0efc9717e900c8e05dbb1 100644 --- a/src/cmdTemplate/templateDel.go +++ b/src/cmdTemplate/templateDel.go @@ -20,7 +20,13 @@ func (cmd *Del)GetDesc() []string { } func (cmd *Del)PrintUsage() { - printUsage(cmd, "deleted") + for _, desc := range cmd.GetDesc() { + u.PrintlnErr(desc) + } + u.PrintlnErr("―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――") + u.PrintlnErr("USAGE: ",cmd.GetName()," ID") + u.PrintlnErr("―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――") + u.PrintlnErr("ID ID of the template to delete.") } func (cmd *Del)Run(args []string) int { @@ -28,39 +34,25 @@ func (cmd *Del)Run(args []string) int { host := g.GetInstance().Host argc := len(args) - if argc < 1 { + if argc != 1 { cmd.PrintUsage() return 1 } - templates, err := getFilteredTemplates("/templates", args) - if err != nil { - u.PrintlnErr(err.Error()) - return 1 - } - - if len(templates) == 0 { - u.PrintlnErr("No templates to delete!") - return 1 - } - + tplID := args[0] statusCode := 0 - for _, template := range(templates) { - uuid := template.ID.String() - resp, err := client.R().Delete(host+"/templates/"+uuid) - if err != nil { - u.PrintlnErr("Failed deleting template \""+template.Name+"\": "+err.Error()) - statusCode = 1 + resp, err := client.R().Delete(host+"/templates/"+tplID) + if err != nil { + u.PrintlnErr("Failed deleting template \""+tplID+"\": "+err.Error()) + statusCode = 1 + } else { + if resp.IsSuccess() { + u.Println("Deleted template \""+tplID+"\"") } else { - if resp.IsSuccess() { - u.Println("Deleted template \""+template.Name+"\"") - } else { - u.PrintlnErr("Failed deleting template \""+template.Name+"\": "+resp.Status()+": "+resp.String()) - statusCode = 1 - } + u.PrintlnErr("Failed deleting template \""+tplID+"\": "+resp.Status()+": "+resp.String()) + statusCode = 1 } - } return statusCode diff --git a/src/cmdTemplate/templateEdit.go b/src/cmdTemplate/templateEdit.go new file mode 100644 index 0000000000000000000000000000000000000000..866384980acdb3d7a18ac1f66fb333dcfff760f7 --- /dev/null +++ b/src/cmdTemplate/templateEdit.go @@ -0,0 +1,113 @@ +package cmdTemplate + +import ( + "strings" + u "nexus-client/utils" + g "nexus-client/globals" +) + +type Edit struct { + Name string +} + +type templateEditParameters struct { + Name string + Access string +} + +func (cmd *Edit)GetName() string { + return cmd.Name +} + +func (cmd *Edit)GetDesc() []string { + return []string{ + "Edits one or more template's properties: name, access.", + "Requires TPL_EDIT or TPL_EDIT_ANY user capability."} +} + +func (cmd *Edit)PrintUsage() { + for _, desc := range cmd.GetDesc() { + u.PrintlnErr(desc) + } + u.PrintlnErr("―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――") + u.PrintlnErr("USAGE: "+cmd.GetName()+" ID [name=\"new name\"] [access=private/public]") + u.PrintlnErr("―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――") + u.PrintlnErr("ID ID of the template to edit.") + const usage string = `Parameters that can be changed (at least one must be specified): +name Name of the template. +access Access type, either "private" or "public".` +} + +func (cmd *Edit)Run(args []string) int { + client := g.GetInstance().Client + host := g.GetInstance().Host + + argc := len(args) + if argc < 2 { + cmd.PrintUsage() + return 1 + } + + templateParams, err := cmd.parseArgs(args) + if err != nil { + u.PrintlnErr(err.Error()) + return 1 + } + + if templateParams == nil { + cmd.PrintUsage() + return 1 + } + + tplID := args[0] + statusCode := 0 + + resp, err := client.R().SetBody(templateParams).Put(host+"/templates/"+tplID) + if err != nil { + u.PrintlnErr("Failed editing template \""+tplID+"\": "+err.Error()) + statusCode = 1 + } else { + if resp.IsSuccess() { + u.Println("Edited template \""+tplID+"\"") + } else { + u.PrintlnErr("Failed editing template \""+tplID+"\": "+resp.Status()+": "+resp.String()) + statusCode = 1 + } + } + + return statusCode +} + +func (cmd *Edit)parseArgs(args []string) (*templateEditParameters, error) { + templateParams := &templateEditParameters {} + atLeastOneArg := false + + getStringVal := func(s string, prefix string) string { + if strings.HasPrefix(s, prefix) { + parts := strings.Split(s, prefix) + return parts[1] + } + return "" + } + + for _, arg := range args { + s := getStringVal(arg, "name=") + if s != "" { + templateParams.Name = s + atLeastOneArg = true + continue + } + s = getStringVal(arg, "access=") + if s != "" { + templateParams.Access = s + atLeastOneArg = true + continue + } + } + + if atLeastOneArg { + return templateParams, nil + } else { + return nil, nil + } +} diff --git a/src/cmdVM/vmEdit.go b/src/cmdVM/vmEdit.go index 6da01347539dfcd808bad5d5f01a804cd254495a..c9338e762ccb9f9554c0aa4ee2e4b9f9c51f52b3 100644 --- a/src/cmdVM/vmEdit.go +++ b/src/cmdVM/vmEdit.go @@ -36,7 +36,7 @@ func (cmd *Edit)PrintUsage() { u.PrintlnErr("―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――") u.PrintlnErr("USAGE: "+cmd.GetName()+" [ID ...] [regex ...] [name=\"new name\"] [cpus=n] [ram=n] [nic=none/user]") u.PrintlnErr("―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――") - const usage string = `Parameters that can be changed (all optional): + const usage string = `Parameters that can be changed (at least one must be specified): name Name of the VM. cpus Number of CPUs, between 1 and 16. ram Amount of RAM in MB, between 512 and 32768. diff --git a/src/nexush/nexush.go b/src/nexush/nexush.go index a052644aa34c881eab8e850c9f9adec13558e4ff..1b0ced37f5c2402268866e1f2e88f2060b201a2b 100644 --- a/src/nexush/nexush.go +++ b/src/nexush/nexush.go @@ -55,6 +55,7 @@ var cmdList = []cmd.Command { &cmdTemplate.List{"tpllist"}, &cmdTemplate.Create{"tplcreate"}, + &cmdTemplate.Edit{"tpledit"}, &cmdTemplate.Del{"tpldel"}, &cmdTemplate.ExportDisk{"tplexportdisk"}, }