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

VMs can be deleted, started and stopped in bulk using regex expressions

parent 7adba566
No related branches found
No related tags found
No related merge requests found
Showing
with 173 additions and 123 deletions
...@@ -43,8 +43,9 @@ Regex examples: ...@@ -43,8 +43,9 @@ Regex examples:
u.PrintlnErr(usage) u.PrintlnErr(usage)
} }
// Call the given route and filter the results based on ID and regex. // Returns a list of filtered templates for a given route.
// Arguments (args) can either be: // The filter is based on the specified IDs and regexes.
// The filters argument can either be:
// - any number of "template IDs" (UUID) // - any number of "template IDs" (UUID)
// - any number of "template names" // - any number of "template names"
// - any combination of "template IDs" and "template names" // - any combination of "template IDs" and "template names"
...@@ -54,25 +55,24 @@ Regex examples: ...@@ -54,25 +55,24 @@ 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 getFilteredTemplates(c cmd.Command, args []string, route string) int { func printFilteredTemplates(c cmd.Command, filters []string, route string) int {
client := g.GetInstance().Client client := g.GetInstance().Client
host := g.GetInstance().Host host := g.GetInstance().Host
argc := len(args) if len(filters) < 1 {
if argc < 1 {
c.PrintUsage() c.PrintUsage()
return 1 return 1
} }
var ids []string var ids []string
var namePatterns []string var regexes []string
for _, arg := range args { for _, filter := range filters {
_, err := uuid.Parse(arg) _, err := uuid.Parse(filter)
if err != nil { if err != nil {
namePatterns = append(namePatterns, arg) regexes = append(regexes, filter)
} else { } else {
ids = append(ids, arg) ids = append(ids, filter)
} }
} }
...@@ -89,7 +89,7 @@ func getFilteredTemplates(c cmd.Command, args []string, route string) int { ...@@ -89,7 +89,7 @@ func getFilteredTemplates(c cmd.Command, args []string, route string) int {
return 1 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() {
...@@ -101,10 +101,10 @@ func getFilteredTemplates(c cmd.Command, args []string, route string) int { ...@@ -101,10 +101,10 @@ func getFilteredTemplates(c cmd.Command, args []string, route string) int {
if found { if found {
continue continue
} }
for _, namePattern := range namePatterns { for _, regex := range regexes {
match, err := regexp.MatchString(strings.ToLower(namePattern), 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 \""+namePattern+"\": "+err.Error()) u.PrintlnErr("Error matching \""+regex+"\": "+err.Error())
} else { } else {
if match { if match {
u.Println(template.String()) u.Println(template.String())
...@@ -120,10 +120,10 @@ func getFilteredTemplates(c cmd.Command, args []string, route string) int { ...@@ -120,10 +120,10 @@ func getFilteredTemplates(c cmd.Command, args []string, route string) int {
} }
} }
func getTemplates(resp *resty.Response) (*[]Template, error) { func getTemplates(resp *resty.Response) ([]Template, error) {
var templates []Template templates := []Template{}
if err := json.Unmarshal(resp.Body(), &templates); err != nil { if err := json.Unmarshal(resp.Body(), &templates); err != nil {
return nil, err return nil, err
} }
return &templates, nil return templates, nil
} }
\ No newline at end of file
...@@ -17,5 +17,5 @@ func (cmd *List)PrintUsage() { ...@@ -17,5 +17,5 @@ func (cmd *List)PrintUsage() {
} }
func (cmd *List)Run(args []string) int { func (cmd *List)Run(args []string) int {
return getFilteredTemplates(cmd, args, "/templates") return printFilteredTemplates(cmd, args, "/templates")
} }
...@@ -45,18 +45,18 @@ Regex examples: ...@@ -45,18 +45,18 @@ Regex examples:
u.PrintlnErr(usage) u.PrintlnErr(usage)
} }
// Call the given route and filter the results based on a regex. // Prints a list of filtered users for a given route.
// The filter is based on regexes.
// Remark: the regex matches the user email, first name and last name and is case-insensitive. // Remark: the regex matches the user email, first name and last name and is case-insensitive.
// Regular expression examples: // Regular expression examples:
// "" -> matches everything // "" -> matches everything
// "." -> matches everything // "." -> matches everything
// "bla" -> matches any user containing "bla" // "bla" -> matches any user containing "bla"
func getFilteredUsers(c cmd.Command, args []string, route string) int { func printFilteredUsers(c cmd.Command, regexes []string, route string) int {
client := g.GetInstance().Client client := g.GetInstance().Client
host := g.GetInstance().Host host := g.GetInstance().Host
argc := len(args) if len(regexes) < 1 {
if argc < 1 {
c.PrintUsage() c.PrintUsage()
return 1 return 1
} }
...@@ -74,12 +74,12 @@ func getFilteredUsers(c cmd.Command, args []string, route string) int { ...@@ -74,12 +74,12 @@ func getFilteredUsers(c cmd.Command, args []string, route string) int {
return 1 return 1
} }
for _, user := range *users { for _, user := range users {
for _, pattern := range args { for _, regex := range regexes {
fieldsToMatch := user.Email+" "+user.FirstName+" "+user.LastName fieldsToMatch := user.Email+" "+user.FirstName+" "+user.LastName
match, err := regexp.MatchString(strings.ToLower(pattern), strings.ToLower(fieldsToMatch)) match, err := regexp.MatchString(strings.ToLower(regex), strings.ToLower(fieldsToMatch))
if err != nil { if err != nil {
u.PrintlnErr("Error matching \""+pattern+"\": "+err.Error()) u.PrintlnErr("Error matching \""+regex+"\": "+err.Error())
} else { } else {
if match { if match {
u.Println(user.String()) u.Println(user.String())
...@@ -95,10 +95,10 @@ func getFilteredUsers(c cmd.Command, args []string, route string) int { ...@@ -95,10 +95,10 @@ func getFilteredUsers(c cmd.Command, args []string, route string) int {
} }
} }
func getUsers(resp *resty.Response) (*[]User, error) { func getUsers(resp *resty.Response) ([]User, error) {
var users []User users := []User{}
if err := json.Unmarshal(resp.Body(), &users); err != nil { if err := json.Unmarshal(resp.Body(), &users); err != nil {
return nil, err return nil, err
} }
return &users, nil return users, nil
} }
\ No newline at end of file
...@@ -17,5 +17,5 @@ func (cmd *List)PrintUsage() { ...@@ -17,5 +17,5 @@ func (cmd *List)PrintUsage() {
} }
func (cmd *List)Run(args []string) int { func (cmd *List)Run(args []string) int {
return getFilteredUsers(cmd, args, "/users") return printFilteredUsers(cmd, args, "/users")
} }
package cmdVM package cmdVM
import ( import (
"strings"
"regexp" "regexp"
"errors"
"strings"
"encoding/json" "encoding/json"
"nexus-client/cmd" "nexus-client/cmd"
u "nexus-client/utils" u "nexus-client/utils"
...@@ -51,11 +52,11 @@ func (vm *VM)String() string { ...@@ -51,11 +52,11 @@ func (vm *VM)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 VMs matching the specified IDs or regexes will be listed. u.PrintlnErr("Only VMs 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 VM's name and is case-insensitive. The regex only matches the VM's name and is case-insensitive.
Regex examples: Regex examples:
"" -> matches any VMs "" -> matches any VMs
...@@ -64,8 +65,30 @@ Regex examples: ...@@ -64,8 +65,30 @@ Regex examples:
u.PrintlnErr(usage) u.PrintlnErr(usage)
} }
// Call the given route and filter the results based on ID and regex. // Prints a list of filtered VMs for a given route.
// Arguments (args) can either be: // Return 0 if everything went well or 1 in case of failure.
func printFilteredVMs(c cmd.Command, args []string, route string) int {
if len(args) < 1 {
c.PrintUsage()
return 1
}
vms, err := getFilteredVMs(route, args)
if err != nil {
u.PrintlnErr("Error: "+err.Error())
return 1
}
for _, vm := range vms {
u.Println(vm.String())
}
return 0
}
// Returns a list of filtered VMs for a given route.
// The filter is based on the specified IDs and regexes.
// The filters argument can either be:
// - any number of "VM IDs" (UUID) // - any number of "VM IDs" (UUID)
// - any number of "VM names" // - any number of "VM names"
// - any combination of "VM IDs" and "VM names" // - any combination of "VM IDs" and "VM names"
...@@ -75,46 +98,45 @@ Regex examples: ...@@ -75,46 +98,45 @@ Regex examples:
// "" -> matches everything // "" -> matches everything
// "." -> matches everything // "." -> matches everything
// "bla" -> matches any VM name containing "bla" // "bla" -> matches any VM name containing "bla"
func getFilteredVMs(c cmd.Command, args []string, route string) int { func getFilteredVMs(route string, filters []string) ([]VM, error) {
client := g.GetInstance().Client client := g.GetInstance().Client
host := g.GetInstance().Host host := g.GetInstance().Host
argc := len(args)
if argc < 1 {
c.PrintUsage()
return 1
}
var ids []string var ids []string
var namePatterns []string var regexes []string
for _, arg := range args { for _, filter := range filters {
_, err := uuid.Parse(arg) _, err := uuid.Parse(filter)
if err != nil { if err != nil {
namePatterns = append(namePatterns, arg) regexes = append(regexes, filter)
} else { } else {
ids = append(ids, arg) ids = append(ids, filter)
} }
} }
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()) //u.PrintlnErr("Error: "+err.Error())
return 1 //return 1
return nil, err
} }
vmsList := []VM{}
if resp.IsSuccess() { if resp.IsSuccess() {
vms, err := getVMs(resp) vms, err := getVMs(resp)
if err != nil { if err != nil {
u.PrintlnErr("Error: "+err.Error()) //u.PrintlnErr("Error: "+err.Error())
return 1 //return 1
return nil, err
} }
for _, vm := range *vms { for _, vm := range vms {
found := false found := false
for _, id := range ids { for _, id := range ids {
if id == vm.ID.String() { if id == vm.ID.String() {
u.Println(vm.String()) vmsList = append(vmsList, vm)
//u.Println(vm.String())
found = true found = true
break break
} }
...@@ -122,29 +144,33 @@ func getFilteredVMs(c cmd.Command, args []string, route string) int { ...@@ -122,29 +144,33 @@ func getFilteredVMs(c cmd.Command, args []string, route string) int {
if found { if found {
continue continue
} }
for _, namePattern := range namePatterns { for _, regex := range regexes {
match, err := regexp.MatchString(strings.ToLower(namePattern), strings.ToLower(vm.Name)) match, err := regexp.MatchString(strings.ToLower(regex), strings.ToLower(vm.Name))
if err != nil { if err != nil {
u.PrintlnErr("Error matching \""+namePattern+"\": "+err.Error()) //u.PrintlnErr("Error matching \""+regex+"\": "+err.Error())
return nil, errors.New("Error matching \""+regex+"\": "+err.Error())
} else { } else {
if match { if match {
u.Println(vm.String()) //u.Println(vm.String())
vmsList = append(vmsList, vm)
break break
} }
} }
} }
} }
return 0 return vmsList, nil
} else { } else {
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String()) return nil, errors.New("Error: "+resp.Status()+": "+resp.String())
return 1 //u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
//return 1
} }
} }
func getVMs(resp *resty.Response) (*[]VM, error) { // Retrieves all VMs (no filtering).
var vms []VM func getVMs(resp *resty.Response) ([]VM, error) {
vms := []VM{}
if err := json.Unmarshal(resp.Body(), &vms); err != nil { if err := json.Unmarshal(resp.Body(), &vms); err != nil {
return nil, err return nil, err
} }
return &vms, nil return vms, nil
} }
\ No newline at end of file
...@@ -21,7 +21,7 @@ func (cmd *Attach)GetName() string { ...@@ -21,7 +21,7 @@ func (cmd *Attach)GetName() string {
} }
func (cmd *Attach)GetDesc() string { func (cmd *Attach)GetDesc() string {
return "Attach to a VM in order to see its desktop" return "Attach to a VM in order to use its desktop environment"
} }
func (cmd *Attach)PrintUsage() { func (cmd *Attach)PrintUsage() {
......
...@@ -84,7 +84,7 @@ func (cmd *Create)Run(args []string) int { ...@@ -84,7 +84,7 @@ func (cmd *Create)Run(args []string) int {
TemplateID: template, TemplateID: template,
} }
errors := false statusCode := 0
for i := 1; i <= count; i++ { for i := 1; i <= count; i++ {
if count > 1 { if count > 1 {
...@@ -94,20 +94,16 @@ func (cmd *Create)Run(args []string) int { ...@@ -94,20 +94,16 @@ func (cmd *Create)Run(args []string) int {
resp, err := client.R().SetBody(vmArgs).Post(host+"/vms") resp, err := client.R().SetBody(vmArgs).Post(host+"/vms")
if err != nil { if err != nil {
u.PrintlnErr("Failed creating VM \""+vmArgs.Name+"\": "+err.Error()) u.PrintlnErr("Failed creating VM \""+vmArgs.Name+"\": "+err.Error())
errors = true statusCode = 1
} else { } else {
if resp.IsSuccess() { if resp.IsSuccess() {
u.Println("Successfully created VM \""+vmArgs.Name+"\"") u.Println("Created VM \""+vmArgs.Name+"\"")
} else { } else {
u.PrintlnErr("Failed creating VM \""+vmArgs.Name+"\": "+resp.Status()+": "+resp.String()) u.PrintlnErr("Failed creating VM \""+vmArgs.Name+"\": "+resp.Status()+": "+resp.String())
errors = true statusCode = 1
} }
} }
} }
if errors { return statusCode
return 1
} else {
return 0
}
} }
...@@ -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 VMs" return "Delete one or more VMs."
} }
func (cmd *Del)PrintUsage() { func (cmd *Del)PrintUsage() {
u.PrintlnErr(cmd.GetDesc()) printUsage(cmd, "deleted")
u.PrintlnErr("Usage: "+cmd.Name+" vmID [vmID ...]")
} }
func (cmd *Del)Run(args []string) int { func (cmd *Del)Run(args []string) int {
...@@ -32,23 +31,30 @@ func (cmd *Del)Run(args []string) int { ...@@ -32,23 +31,30 @@ func (cmd *Del)Run(args []string) int {
return 1 return 1
} }
vms, err := getFilteredVMs("/vms/del", args)
if err != nil {
u.PrintlnErr(err.Error())
return 1
}
statusCode := 0 statusCode := 0
// Iterates through each uuid to delete for _, vm := range(vms) {
for i:= range(args) { uuid := vm.ID.String()
uuid := args[i]
resp, err := client.R().Delete(host+"/vms/"+uuid) resp, err := client.R().Delete(host+"/vms/"+uuid)
if err != nil { if err != nil {
u.PrintlnErr("Error: "+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("VM "+uuid+" deleted.") u.Println("Deleted VM \""+vm.Name+"\" ("+uuid+")")
} else { } else {
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String()) u.PrintlnErr("Failed deleting VM \""+vm.Name+"\" ("+uuid+"): "+resp.Status()+": "+resp.String())
statusCode = 1 statusCode = 1
} }
} }
} }
return statusCode return statusCode
} }
...@@ -13,9 +13,9 @@ func (cmd *List)GetDesc() string { ...@@ -13,9 +13,9 @@ 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 {
return getFilteredVMs(cmd, args, "/vms") return printFilteredVMs(cmd, args, "/vms")
} }
...@@ -13,9 +13,9 @@ func (cmd *ListAttach)GetDesc() string { ...@@ -13,9 +13,9 @@ func (cmd *ListAttach)GetDesc() string {
} }
func (cmd *ListAttach)PrintUsage() { func (cmd *ListAttach)PrintUsage() {
printUsage(cmd) printUsage(cmd, "listed")
} }
func (cmd *ListAttach)Run(args []string) int { func (cmd *ListAttach)Run(args []string) int {
return getFilteredVMs(cmd, args, "/vms/attach") return printFilteredVMs(cmd, args, "/vms/attach")
} }
...@@ -13,9 +13,9 @@ func (cmd *ListDel)GetDesc() string { ...@@ -13,9 +13,9 @@ func (cmd *ListDel)GetDesc() string {
} }
func (cmd *ListDel)PrintUsage() { func (cmd *ListDel)PrintUsage() {
printUsage(cmd) printUsage(cmd, "listed")
} }
func (cmd *ListDel)Run(args []string) int { func (cmd *ListDel)Run(args []string) int {
return getFilteredVMs(cmd, args, "/vms/del") return printFilteredVMs(cmd, args, "/vms/del")
} }
...@@ -13,9 +13,9 @@ func (cmd *ListEdit)GetDesc() string { ...@@ -13,9 +13,9 @@ func (cmd *ListEdit)GetDesc() string {
} }
func (cmd *ListEdit)PrintUsage() { func (cmd *ListEdit)PrintUsage() {
printUsage(cmd) printUsage(cmd, "listed")
} }
func (cmd *ListEdit)Run(args []string) int { func (cmd *ListEdit)Run(args []string) int {
return getFilteredVMs(cmd, args, "/vms/edit") return printFilteredVMs(cmd, args, "/vms/edit")
} }
...@@ -13,9 +13,9 @@ func (cmd *ListEditAccess)GetDesc() string { ...@@ -13,9 +13,9 @@ func (cmd *ListEditAccess)GetDesc() string {
} }
func (cmd *ListEditAccess)PrintUsage() { func (cmd *ListEditAccess)PrintUsage() {
printUsage(cmd) printUsage(cmd, "listed")
} }
func (cmd *ListEditAccess)Run(args []string) int { func (cmd *ListEditAccess)Run(args []string) int {
return getFilteredVMs(cmd, args, "/vms/editaccess") return printFilteredVMs(cmd, args, "/vms/editaccess")
} }
...@@ -13,9 +13,9 @@ func (cmd *ListStart)GetDesc() string { ...@@ -13,9 +13,9 @@ func (cmd *ListStart)GetDesc() string {
} }
func (cmd *ListStart)PrintUsage() { func (cmd *ListStart)PrintUsage() {
printUsage(cmd) printUsage(cmd, "listed")
} }
func (cmd *ListStart)Run(args []string) int { func (cmd *ListStart)Run(args []string) int {
return getFilteredVMs(cmd, args, "/vms/start") return printFilteredVMs(cmd, args, "/vms/start")
} }
...@@ -13,9 +13,9 @@ func (cmd *ListStop)GetDesc() string { ...@@ -13,9 +13,9 @@ func (cmd *ListStop)GetDesc() string {
} }
func (cmd *ListStop)PrintUsage() { func (cmd *ListStop)PrintUsage() {
printUsage(cmd) printUsage(cmd, "listed")
} }
func (cmd *ListStop)Run(args []string) int { func (cmd *ListStop)Run(args []string) int {
return getFilteredVMs(cmd, args, "/vms/stop") return printFilteredVMs(cmd, args, "/vms/stop")
} }
...@@ -14,12 +14,11 @@ func (cmd *Start)GetName() string { ...@@ -14,12 +14,11 @@ func (cmd *Start)GetName() string {
} }
func (cmd *Start)GetDesc() string { func (cmd *Start)GetDesc() string {
return "Start a VM" return "Start one or more VMs."
} }
func (cmd *Start)PrintUsage() { func (cmd *Start)PrintUsage() {
u.PrintlnErr(cmd.GetDesc()) printUsage(cmd, "started")
u.PrintlnErr("Usage: "+cmd.Name+" vmID")
} }
func (cmd *Start)Run(args []string) int { func (cmd *Start)Run(args []string) int {
...@@ -27,23 +26,35 @@ func (cmd *Start)Run(args []string) int { ...@@ -27,23 +26,35 @@ func (cmd *Start)Run(args []string) int {
host := g.GetInstance().Host host := g.GetInstance().Host
argc := len(args) argc := len(args)
if argc != 1 { if argc < 1 {
cmd.PrintUsage() cmd.PrintUsage()
return 1 return 1
} }
uuid := args[0] vms, err := getFilteredVMs("/vms/start", args)
resp, err := client.R().Put(host+"/vms/"+uuid+"/start")
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().Put(host+"/vms/"+uuid+"/start")
if err != nil {
u.PrintlnErr("Failed starting VM \""+vm.Name+"\" ("+uuid+"): "+err.Error())
statusCode = 1
} else {
if resp.IsSuccess() { if resp.IsSuccess() {
u.Println(resp) u.Println("Started VM \""+vm.Name+"\" ("+uuid+")")
return 0
} else { } else {
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String()) u.PrintlnErr("Failed starting VM \""+vm.Name+"\" ("+uuid+"): "+resp.Status()+": "+resp.String())
return 1 statusCode = 1
}
} }
}
return statusCode
} }
...@@ -14,12 +14,11 @@ func (cmd *Stop)GetName() string { ...@@ -14,12 +14,11 @@ func (cmd *Stop)GetName() string {
} }
func (cmd *Stop)GetDesc() string { func (cmd *Stop)GetDesc() string {
return "Stop a VM" return "Stop one or more VMs."
} }
func (cmd *Stop)PrintUsage() { func (cmd *Stop)PrintUsage() {
u.PrintlnErr(cmd.GetDesc()) printUsage(cmd, "stopped")
u.PrintlnErr("Usage: "+cmd.Name+" vmID")
} }
func (cmd *Stop)Run(args []string) int { func (cmd *Stop)Run(args []string) int {
...@@ -27,23 +26,35 @@ func (cmd *Stop)Run(args []string) int { ...@@ -27,23 +26,35 @@ func (cmd *Stop)Run(args []string) int {
host := g.GetInstance().Host host := g.GetInstance().Host
argc := len(args) argc := len(args)
if argc != 1 { if argc < 1 {
cmd.PrintUsage() cmd.PrintUsage()
return 1 return 1
} }
uuid := args[0] vms, err := getFilteredVMs("/vms/stop", args)
resp, err := client.R().Put(host+"/vms/"+uuid+"/stop")
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().Put(host+"/vms/"+uuid+"/stop")
if err != nil {
u.PrintlnErr("Failed stopping VM \""+vm.Name+"\" ("+uuid+"): "+err.Error())
statusCode = 1
} else {
if resp.IsSuccess() { if resp.IsSuccess() {
u.Println(resp) u.Println("Stopped VM \""+vm.Name+"\" ("+uuid+")")
return 0
} else { } else {
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String()) u.PrintlnErr("Failed stopping 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