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

tpldel now support regexes

Slight change to the output: uses | as a separator when several fields are printed out (e.g.: VM name | vm ID | state)
parent bf2e4a55
No related branches found
No related tags found
No related merge requests found
...@@ -58,7 +58,7 @@ List of supported Commands: ...@@ -58,7 +58,7 @@ List of supported Commands:
vmdelaccess Delete a user's VM access in one or more VMs (regex matching). vmdelaccess Delete a user's VM access in one or more VMs (regex matching).
tpllist List available templates (regex matching). tpllist List available templates (regex matching).
tplcreate Create a template, either from an existing VM or from a .qcow file. tplcreate Create a template, either from an existing VM or from a .qcow file.
tpldel Delete one or more templates. tpldel Delete one or more templates (regex matching).
``` ```
When attached to a VM's desktop (`vmattach` command), ctrl+F12 toggles between fullscreen/non-fullscreen modes. When attached to a VM's desktop (`vmattach` command), ctrl+F12 toggles between fullscreen/non-fullscreen modes.
...@@ -293,6 +293,11 @@ Delete template `8ae56a30-3195-4aea-960d-abb45c47f99e`: ...@@ -293,6 +293,11 @@ Delete template `8ae56a30-3195-4aea-960d-abb45c47f99e`:
nexus-client tpldel 8ae56a30-3195-4aea-960d-abb45c47f99e nexus-client tpldel 8ae56a30-3195-4aea-960d-abb45c47f99e
``` ```
Delete all templates matching the "test" pattern:
```
nexus-client tpldel test
```
## nexus-client-exam ## nexus-client-exam
### Compiling nexus-client-exam ### Compiling nexus-client-exam
......
package cmdTemplate package cmdTemplate
import ( import (
"strings" "errors"
"regexp" "regexp"
"strings"
"encoding/json" "encoding/json"
"nexus-client/cmd" "nexus-client/cmd"
u "nexus-client/utils" u "nexus-client/utils"
...@@ -30,11 +31,11 @@ func (tpl *Template)String() string { ...@@ -30,11 +31,11 @@ func (tpl *Template)String() string {
return string(output) return string(output)
} }
func printUsage(c cmd.Command) { func printUsage(c cmd.Command, action string) {
u.PrintlnErr(c.GetDesc()) u.PrintlnErr(c.GetDesc())
u.PrintlnErr("Usage: ",c.GetName()," [ID ...] [regex ...]") u.PrintlnErr("Usage: ",c.GetName()," [ID ...] [regex ...]")
const usage string = `Only templates matching the specified IDs or regexes will be listed. u.PrintlnErr("Only templates matching the specified IDs or regexes will be "+action+".")
Any number of IDs or regexes can be specified. const usage string = `Any number of IDs or regexes can be specified.
The regex only matches the templates's name and is case-insensitive. The regex only matches the templates's name and is case-insensitive.
Regex examples: Regex examples:
"" -> matches any templates "" -> matches any templates
...@@ -43,6 +44,27 @@ Regex examples: ...@@ -43,6 +44,27 @@ Regex examples:
u.PrintlnErr(usage) u.PrintlnErr(usage)
} }
// Prints a list of filtered templates for a given route.
// Return 0 if everything went well or 1 in case of failure.
func printFilteredTemplates(c cmd.Command, args []string, route string) int {
if len(args) == 0 {
c.PrintUsage()
return 1
}
templates, err := getFilteredTemplates(route, args)
if err != nil {
u.PrintlnErr("Error: "+err.Error())
return 1
}
for _, template := range templates {
u.Println(template.Name+" | "+template.ID.String()+" | "+template.Access)
}
return 0
}
// Returns a list of filtered templates for a given route. // Returns a list of filtered templates for a given route.
// Filters are based on patterns describing IDs or regexes. // Filters are based on patterns describing IDs or regexes.
// Patterns can either be: // Patterns can either be:
...@@ -55,10 +77,9 @@ Regex examples: ...@@ -55,10 +77,9 @@ Regex examples:
// "" -> matches everything // "" -> matches everything
// "." -> matches everything // "." -> matches everything
// "bla" -> matches any template name containing "bla" // "bla" -> matches any template name containing "bla"
func printFilteredTemplates(c cmd.Command, patterns []string, route string) int { func getFilteredTemplates(route string, patterns []string) ([]Template, error) {
if len(patterns) < 1 { if len(patterns) < 1 {
c.PrintUsage() return nil, errors.New("At least one ID or regex must be specified")
return 1
} }
client := g.GetInstance().Client client := g.GetInstance().Client
...@@ -78,22 +99,22 @@ func printFilteredTemplates(c cmd.Command, patterns []string, route string) int ...@@ -78,22 +99,22 @@ func printFilteredTemplates(c cmd.Command, patterns []string, route string) int
resp, err := client.R().Get(host+route) resp, err := client.R().Get(host+route)
if err != nil { if err != nil {
u.PrintlnErr("Error: "+err.Error()) return nil, err
return 1
} }
templatesList := []Template{}
if resp.IsSuccess() { if resp.IsSuccess() {
templates, err := getTemplates(resp) templates, err := getTemplates(resp)
if err != nil { if err != nil {
u.PrintlnErr("Error: "+err.Error()) return nil, err
return 1
} }
for _, template := range templates { for _, template := range templates {
found := false found := false
for _, id := range ids { for _, id := range ids {
if id == template.ID.String() { if id == template.ID.String() {
u.Println(template.String()) templatesList = append(templatesList, template)
found = true found = true
break break
} }
...@@ -104,22 +125,22 @@ func printFilteredTemplates(c cmd.Command, patterns []string, route string) int ...@@ -104,22 +125,22 @@ func printFilteredTemplates(c cmd.Command, patterns []string, route string) int
for _, regex := range regexes { for _, regex := range regexes {
match, err := regexp.MatchString(strings.ToLower(regex), strings.ToLower(template.Name)) match, err := regexp.MatchString(strings.ToLower(regex), strings.ToLower(template.Name))
if err != nil { if err != nil {
u.PrintlnErr("Error matching \""+regex+"\": "+err.Error()) return nil, errors.New("Error matching \""+regex+"\": "+err.Error())
} else { } else {
if match { if match {
u.Println(template.String()) templatesList = append(templatesList, template)
break break
} }
} }
} }
} }
return 0 return templatesList, nil
} else { } else {
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String()) return nil, errors.New("Error: "+resp.Status()+": "+resp.String())
return 1
} }
} }
// Retrieves all templates (no filtering).
func getTemplates(resp *resty.Response) ([]Template, error) { func getTemplates(resp *resty.Response) ([]Template, error) {
templates := []Template{} templates := []Template{}
if err := json.Unmarshal(resp.Body(), &templates); err != nil { if err := json.Unmarshal(resp.Body(), &templates); err != nil {
......
...@@ -14,12 +14,11 @@ func (cmd *Del)GetName() string { ...@@ -14,12 +14,11 @@ func (cmd *Del)GetName() string {
} }
func (cmd *Del)GetDesc() string { func (cmd *Del)GetDesc() string {
return "Delete one or more templates." return "Delete one or more templates (regex matching)."
} }
func (cmd *Del)PrintUsage() { func (cmd *Del)PrintUsage() {
u.PrintlnErr(cmd.GetDesc()) printUsage(cmd, "deleted")
u.PrintlnErr("Usage: "+cmd.Name+" id [id ...]")
} }
func (cmd *Del)Run(args []string) int { func (cmd *Del)Run(args []string) int {
...@@ -32,23 +31,35 @@ func (cmd *Del)Run(args []string) int { ...@@ -32,23 +31,35 @@ func (cmd *Del)Run(args []string) int {
return 1 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
}
statusCode := 0 statusCode := 0
// Iterates through each template to delete for _, template := range(templates) {
for i:= range(args) { uuid := template.ID.String()
id := args[i] resp, err := client.R().Delete(host+"/templates/"+uuid)
resp, err := client.R().Delete(host+"/templates/"+id)
if err != nil { if err != nil {
u.PrintlnErr("Error: "+err.Error()) u.PrintlnErr("Failed deleting template \""+template.Name+"\" | "+uuid+" : "+err.Error())
statusCode = 1 statusCode = 1
} else { } else {
if resp.IsSuccess() { if resp.IsSuccess() {
u.Println("Template "+id+" deleted.") u.Println("Deleted template \""+template.Name+"\" | "+uuid)
} else { } else {
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String()) u.PrintlnErr("Failed deleting template \""+template.Name+"\" | "+uuid+" : "+resp.Status()+": "+resp.String())
statusCode = 1 statusCode = 1
} }
} }
} }
return statusCode return statusCode
} }
...@@ -13,7 +13,7 @@ func (cmd *List)GetDesc() string { ...@@ -13,7 +13,7 @@ func (cmd *List)GetDesc() string {
} }
func (cmd *List)PrintUsage() { func (cmd *List)PrintUsage() {
printUsage(cmd) printUsage(cmd, "listed")
} }
func (cmd *List)Run(args []string) int { func (cmd *List)Run(args []string) int {
......
...@@ -197,3 +197,12 @@ func getVMs(resp *resty.Response) ([]VM, error) { ...@@ -197,3 +197,12 @@ func getVMs(resp *resty.Response) ([]VM, error) {
} }
return vms, nil return vms, nil
} }
// Retrieve a single VM.
func getVM(resp *resty.Response) (*VM, error) {
var vm *VM = &VM{}
if err := json.Unmarshal(resp.Body(), vm); err != nil {
return vm, err
}
return vm, nil
}
\ No newline at end of file
...@@ -97,7 +97,12 @@ func (cmd *Create)Run(args []string) int { ...@@ -97,7 +97,12 @@ func (cmd *Create)Run(args []string) int {
statusCode = 1 statusCode = 1
} else { } else {
if resp.IsSuccess() { if resp.IsSuccess() {
u.Println("Created VM \""+vmArgs.Name+"\"") vm, err := getVM(resp)
if err != nil {
u.PrintlnErr("Failed retrieving server's response: "+err.Error())
statusCode = 1
}
u.Println("Created VM \""+vm.Name+"\" | "+vm.ID.String())
} else { } else {
u.PrintlnErr("Failed creating VM \""+vmArgs.Name+"\": "+resp.Status()+": "+resp.String()) u.PrintlnErr("Failed creating VM \""+vmArgs.Name+"\": "+resp.Status()+": "+resp.String())
statusCode = 1 statusCode = 1
......
...@@ -48,13 +48,13 @@ func (cmd *Del)Run(args []string) int { ...@@ -48,13 +48,13 @@ func (cmd *Del)Run(args []string) int {
uuid := vm.ID.String() uuid := vm.ID.String()
resp, err := client.R().Delete(host+"/vms/"+uuid) resp, err := client.R().Delete(host+"/vms/"+uuid)
if err != nil { if err != nil {
u.PrintlnErr("Failed deleting VM \""+vm.Name+"\" ("+uuid+"): "+err.Error()) u.PrintlnErr("Failed deleting VM \""+vm.Name+"\" | "+uuid+" : "+err.Error())
statusCode = 1 statusCode = 1
} else { } else {
if resp.IsSuccess() { if resp.IsSuccess() {
u.Println("Deleted VM \""+vm.Name+"\" ("+uuid+")") u.Println("Deleted VM \""+vm.Name+"\" | "+uuid)
} else { } else {
u.PrintlnErr("Failed deleting VM \""+vm.Name+"\" ("+uuid+"): "+resp.Status()+": "+resp.String()) u.PrintlnErr("Failed deleting VM \""+vm.Name+"\" | "+uuid+" : "+resp.Status()+": "+resp.String())
statusCode = 1 statusCode = 1
} }
} }
......
...@@ -69,13 +69,13 @@ func (cmd *DelAccess)Run(args []string) int { ...@@ -69,13 +69,13 @@ func (cmd *DelAccess)Run(args []string) int {
uuid := vm.ID.String() uuid := vm.ID.String()
resp, err := client.R().Delete(host+"/vms/"+uuid+"/access/"+email) resp, err := client.R().Delete(host+"/vms/"+uuid+"/access/"+email)
if err != nil { if err != nil {
u.PrintlnErr("Failed removing VM access for "+email+" in VM \""+vm.Name+"\" ("+uuid+"): "+err.Error()) u.PrintlnErr("Failed removing VM access for "+email+" in VM \""+vm.Name+"\" | "+uuid+" : "+err.Error())
statusCode = 1 statusCode = 1
} else { } else {
if resp.IsSuccess() { if resp.IsSuccess() {
u.Println("Removed VM access for "+email+" in VM \""+vm.Name+"\" ("+uuid+")") u.Println("Removed VM access for "+email+" in VM \""+vm.Name+"\" | "+uuid)
} else { } else {
u.PrintlnErr("Failed removing VM access for "+email+" in VM \""+vm.Name+"\" ("+uuid+"): "+resp.Status()+": "+resp.String()) u.PrintlnErr("Failed removing VM access for "+email+" in VM \""+vm.Name+"\" | "+uuid+" : "+resp.Status()+": "+resp.String())
statusCode = 1 statusCode = 1
} }
} }
......
...@@ -82,13 +82,13 @@ func (cmd *Edit)Run(args []string) int { ...@@ -82,13 +82,13 @@ func (cmd *Edit)Run(args []string) int {
uuid := vm.ID.String() uuid := vm.ID.String()
resp, err := client.R().SetBody(vmParams).Put(host+"/vms/"+uuid) resp, err := client.R().SetBody(vmParams).Put(host+"/vms/"+uuid)
if err != nil { if err != nil {
u.PrintlnErr("Failed editing VM \""+vm.Name+"\" ("+uuid+"): "+err.Error()) u.PrintlnErr("Failed editing VM \""+vm.Name+"\" | "+uuid+" : "+err.Error())
statusCode = 1 statusCode = 1
} else { } else {
if resp.IsSuccess() { if resp.IsSuccess() {
u.Println("Edited VM \""+vm.Name+"\" ("+uuid+")") u.Println("Edited VM \""+vm.Name+"\" | "+uuid)
} else { } else {
u.PrintlnErr("Failed editing VM \""+vm.Name+"\" ("+uuid+"): "+resp.Status()+": "+resp.String()) u.PrintlnErr("Failed editing VM \""+vm.Name+"\" | "+uuid+" : "+resp.Status()+": "+resp.String())
statusCode = 1 statusCode = 1
} }
} }
......
...@@ -75,13 +75,13 @@ func (cmd *SetAccess)Run(args []string) int { ...@@ -75,13 +75,13 @@ func (cmd *SetAccess)Run(args []string) int {
uuid := vm.ID.String() uuid := vm.ID.String()
resp, err := client.R().SetBody(userUpdatedAccessArgs).Put(host+"/vms/"+uuid+"/access/"+email) resp, err := client.R().SetBody(userUpdatedAccessArgs).Put(host+"/vms/"+uuid+"/access/"+email)
if err != nil { if err != nil {
u.PrintlnErr("Failed removing VM access for "+email+" in VM \""+vm.Name+"\" ("+uuid+"): "+err.Error()) u.PrintlnErr("Failed removing VM access for "+email+" in VM \""+vm.Name+"\" | "+uuid+" : "+err.Error())
statusCode = 1 statusCode = 1
} else { } else {
if resp.IsSuccess() { if resp.IsSuccess() {
u.Println("Removed VM access for "+email+" in VM \""+vm.Name+"\" ("+uuid+")") u.Println("Removed VM access for "+email+" in VM \""+vm.Name+"\" | "+uuid)
} else { } else {
u.PrintlnErr("Failed removing VM access for "+email+" in VM \""+vm.Name+"\" ("+uuid+"): "+resp.Status()+": "+resp.String()) u.PrintlnErr("Failed removing VM access for "+email+" in VM \""+vm.Name+"\" | "+uuid+" : "+resp.Status()+": "+resp.String())
statusCode = 1 statusCode = 1
} }
} }
......
...@@ -48,13 +48,13 @@ func (cmd *Start)Run(args []string) int { ...@@ -48,13 +48,13 @@ func (cmd *Start)Run(args []string) int {
uuid := vm.ID.String() uuid := vm.ID.String()
resp, err := client.R().Put(host+"/vms/"+uuid+"/start") resp, err := client.R().Put(host+"/vms/"+uuid+"/start")
if err != nil { if err != nil {
u.PrintlnErr("Failed starting VM \""+vm.Name+"\" ("+uuid+"): "+err.Error()) u.PrintlnErr("Failed starting VM \""+vm.Name+"\" | "+uuid+" : "+err.Error())
statusCode = 1 statusCode = 1
} else { } else {
if resp.IsSuccess() { if resp.IsSuccess() {
u.Println("Started VM \""+vm.Name+"\" ("+uuid+")") u.Println("Started VM \""+vm.Name+"\" | "+uuid)
} else { } else {
u.PrintlnErr("Failed starting VM \""+vm.Name+"\" ("+uuid+"): "+resp.Status()+": "+resp.String()) u.PrintlnErr("Failed starting VM \""+vm.Name+"\" | "+uuid+" : "+resp.Status()+": "+resp.String())
statusCode = 1 statusCode = 1
} }
} }
......
...@@ -48,13 +48,13 @@ func (cmd *Stop)Run(args []string) int { ...@@ -48,13 +48,13 @@ func (cmd *Stop)Run(args []string) int {
uuid := vm.ID.String() uuid := vm.ID.String()
resp, err := client.R().Put(host+"/vms/"+uuid+"/stop") resp, err := client.R().Put(host+"/vms/"+uuid+"/stop")
if err != nil { if err != nil {
u.PrintlnErr("Failed stopping VM \""+vm.Name+"\" ("+uuid+"): "+err.Error()) u.PrintlnErr("Failed stopping VM \""+vm.Name+"\" | "+uuid+" : "+err.Error())
statusCode = 1 statusCode = 1
} else { } else {
if resp.IsSuccess() { if resp.IsSuccess() {
u.Println("Stopped VM \""+vm.Name+"\" ("+uuid+")") u.Println("Stopped VM \""+vm.Name+"\" | "+uuid)
} else { } else {
u.PrintlnErr("Failed stopping VM \""+vm.Name+"\" ("+uuid+"): "+resp.Status()+": "+resp.String()) u.PrintlnErr("Failed stopping VM \""+vm.Name+"\" | "+uuid+" : "+resp.Status()+": "+resp.String())
statusCode = 1 statusCode = 1
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment