knife-vsphere 2.1.1 → 2.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/lib/chef/knife/base_vsphere_command.rb +69 -70
- data/lib/chef/knife/customization_helper.rb +4 -4
- data/lib/chef/knife/search_helper.rb +16 -7
- data/lib/chef/knife/vsphere_cluster_list.rb +8 -8
- data/lib/chef/knife/vsphere_cpu_ratio.rb +4 -4
- data/lib/chef/knife/vsphere_customization_list.rb +3 -3
- data/lib/chef/knife/vsphere_datastore_file.rb +17 -17
- data/lib/chef/knife/vsphere_datastore_list.rb +11 -11
- data/lib/chef/knife/vsphere_datastore_maxfree.rb +14 -14
- data/lib/chef/knife/vsphere_datastorecluster_list.rb +7 -7
- data/lib/chef/knife/vsphere_datastorecluster_maxfree.rb +10 -10
- data/lib/chef/knife/vsphere_folder_list.rb +4 -4
- data/lib/chef/knife/vsphere_hosts_list.rb +10 -10
- data/lib/chef/knife/vsphere_pool_list.rb +5 -5
- data/lib/chef/knife/vsphere_pool_query.rb +7 -7
- data/lib/chef/knife/vsphere_pool_show.rb +8 -8
- data/lib/chef/knife/vsphere_template_list.rb +7 -7
- data/lib/chef/knife/vsphere_vlan_create.rb +8 -8
- data/lib/chef/knife/vsphere_vlan_list.rb +3 -3
- data/lib/chef/knife/vsphere_vm_cdrom.rb +27 -27
- data/lib/chef/knife/vsphere_vm_clone.rb +224 -214
- data/lib/chef/knife/vsphere_vm_config.rb +6 -6
- data/lib/chef/knife/vsphere_vm_delete.rb +17 -17
- data/lib/chef/knife/vsphere_vm_disk_extend.rb +11 -11
- data/lib/chef/knife/vsphere_vm_disk_list.rb +6 -6
- data/lib/chef/knife/vsphere_vm_execute.rb +14 -14
- data/lib/chef/knife/vsphere_vm_find.rb +87 -87
- data/lib/chef/knife/vsphere_vm_list.rb +12 -12
- data/lib/chef/knife/vsphere_vm_markastemplate.rb +5 -5
- data/lib/chef/knife/vsphere_vm_migrate.rb +20 -25
- data/lib/chef/knife/vsphere_vm_move.rb +17 -17
- data/lib/chef/knife/vsphere_vm_net.rb +8 -8
- data/lib/chef/knife/vsphere_vm_network_add.rb +22 -24
- data/lib/chef/knife/vsphere_vm_network_delete.rb +8 -8
- data/lib/chef/knife/vsphere_vm_network_list.rb +5 -5
- data/lib/chef/knife/vsphere_vm_network_set.rb +10 -10
- data/lib/chef/knife/vsphere_vm_property_get.rb +7 -7
- data/lib/chef/knife/vsphere_vm_property_set.rb +16 -16
- data/lib/chef/knife/vsphere_vm_show.rb +8 -8
- data/lib/chef/knife/vsphere_vm_snapshot.rb +35 -35
- data/lib/chef/knife/vsphere_vm_state.rb +31 -31
- data/lib/chef/knife/vsphere_vm_toolsconfig.rb +11 -11
- data/lib/chef/knife/vsphere_vm_vmdk_add.rb +32 -32
- data/lib/chef/knife/vsphere_vm_vnc_set.rb +15 -15
- data/lib/chef/knife/vsphere_vm_wait_sysprep.rb +10 -11
- data/lib/knife-vsphere/version.rb +1 -1
- metadata +5 -89
@@ -2,23 +2,23 @@
|
|
2
2
|
# Author:: Ezra Pagel (<ezra@cpan.org>)
|
3
3
|
# License:: Apache License, Version 2.0
|
4
4
|
#
|
5
|
-
require
|
6
|
-
require
|
5
|
+
require "chef/knife"
|
6
|
+
require "chef/knife/base_vsphere_command"
|
7
7
|
|
8
8
|
# Lists all known virtual machines in the configured datacenter
|
9
9
|
class Chef::Knife::VsphereVmList < Chef::Knife::BaseVsphereCommand
|
10
|
-
banner
|
10
|
+
banner "knife vsphere vm list"
|
11
11
|
|
12
12
|
common_options
|
13
13
|
|
14
14
|
option :recursive,
|
15
|
-
long:
|
16
|
-
short:
|
17
|
-
description:
|
15
|
+
long: "--recursive",
|
16
|
+
short: "-r",
|
17
|
+
description: "Recurse into sub-folders"
|
18
18
|
|
19
19
|
option :onlyfolders,
|
20
|
-
long:
|
21
|
-
description:
|
20
|
+
long: "--only-folders",
|
21
|
+
description: "List only the folders found",
|
22
22
|
boolean: false
|
23
23
|
|
24
24
|
def traverse_folders(folder, is_top = false, recurse = false, only_folders = false)
|
@@ -44,11 +44,11 @@ class Chef::Knife::VsphereVmList < Chef::Knife::BaseVsphereCommand
|
|
44
44
|
def print_vm(vm)
|
45
45
|
state = case vm.runtime.powerState
|
46
46
|
when PS_ON
|
47
|
-
ui.color(
|
47
|
+
ui.color("on", :green)
|
48
48
|
when PS_OFF
|
49
|
-
ui.color(
|
49
|
+
ui.color("off", :red)
|
50
50
|
when PS_SUSPENDED
|
51
|
-
ui.color(
|
51
|
+
ui.color("suspended", :yellow)
|
52
52
|
end
|
53
53
|
puts "\t#{ui.color('VM Name:', :cyan)} #{vm.name}"
|
54
54
|
puts "\t\t#{ui.color('IP:', :magenta)} #{vm.guest.ipAddress}"
|
@@ -57,7 +57,7 @@ class Chef::Knife::VsphereVmList < Chef::Knife::BaseVsphereCommand
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def print_folder(folder)
|
60
|
-
puts "#{ui.color('Folder', :cyan)}: " + (folder.path[3..-1].map { |x| x[1] }.*
|
60
|
+
puts "#{ui.color('Folder', :cyan)}: " + (folder.path[3..-1].map { |x| x[1] }.* "/")
|
61
61
|
end
|
62
62
|
|
63
63
|
def run
|
@@ -6,9 +6,9 @@
|
|
6
6
|
# License:: Apache License, Version 2.0
|
7
7
|
#
|
8
8
|
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
9
|
+
require "chef/knife"
|
10
|
+
require "chef/knife/base_vsphere_command"
|
11
|
+
require "chef/knife/search_helper"
|
12
12
|
|
13
13
|
# Clone an existing template into a new VM, optionally applying a customization specification.
|
14
14
|
# usage:
|
@@ -16,7 +16,7 @@ require 'chef/knife/search_helper'
|
|
16
16
|
# Vspherevmmarkastemplate extends the Basevspherecommand
|
17
17
|
class Chef::Knife::VsphereVmMarkastemplate < Chef::Knife::BaseVsphereCommand
|
18
18
|
include SearchHelper
|
19
|
-
banner
|
19
|
+
banner "knife vsphere vm markastemplate VMNAME"
|
20
20
|
|
21
21
|
common_options
|
22
22
|
|
@@ -28,7 +28,7 @@ class Chef::Knife::VsphereVmMarkastemplate < Chef::Knife::BaseVsphereCommand
|
|
28
28
|
vmname = @name_args[0]
|
29
29
|
if vmname.nil?
|
30
30
|
show_usage
|
31
|
-
fatal_exit(
|
31
|
+
fatal_exit("You must specify a virtual machine name")
|
32
32
|
end
|
33
33
|
|
34
34
|
vm = get_vm_by_name(vmname, get_config(:folder)) || fatal_exit("Could not find #{vmname}")
|
@@ -2,58 +2,53 @@
|
|
2
2
|
# Author:: Raducu Deaconu (<rhadoo_io@yahoo.com>)
|
3
3
|
# License:: Apache License, Version 2.0
|
4
4
|
#
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
5
|
+
require "chef/knife"
|
6
|
+
require "chef/knife/base_vsphere_command"
|
7
|
+
require "chef/knife/search_helper"
|
8
8
|
|
9
9
|
# migrate vm to specified resource pool , datastore and host
|
10
10
|
class Chef::Knife::VsphereVmMigrate < Chef::Knife::BaseVsphereCommand
|
11
11
|
include SearchHelper
|
12
12
|
# migrate --resource-pool --dest-host --dest-datastore
|
13
|
-
banner
|
13
|
+
banner "knife vsphere vm migrate VMNAME (options)"
|
14
14
|
|
15
15
|
common_options
|
16
16
|
|
17
17
|
option :dest_host,
|
18
|
-
long:
|
19
|
-
description:
|
18
|
+
long: "--dest-host HOST",
|
19
|
+
description: "Destination host for the VM or template"
|
20
20
|
|
21
21
|
option :dest_datastore,
|
22
|
-
long:
|
23
|
-
description:
|
22
|
+
long: "--dest-datastore DATASTORE",
|
23
|
+
description: "The destination datastore"
|
24
24
|
|
25
25
|
option :priority,
|
26
|
-
long:
|
27
|
-
description:
|
26
|
+
long: "--priority PRIORITY",
|
27
|
+
description: "migration priority"
|
28
28
|
|
29
29
|
option :resource_pool,
|
30
|
-
long:
|
31
|
-
description:
|
32
|
-
|
33
|
-
def find_host_folder(folder, name)
|
34
|
-
folder.childEntity.each do |cluster|
|
35
|
-
cluster.host.each do |host|
|
36
|
-
return host if host.name == name
|
37
|
-
end
|
38
|
-
end
|
39
|
-
nil
|
40
|
-
end
|
30
|
+
long: "--resource-pool POOL",
|
31
|
+
description: "The resource pool into which to put the VM"
|
41
32
|
|
42
33
|
def run
|
43
34
|
$stdout.sync = true
|
44
35
|
vmname = @name_args[0]
|
45
36
|
if vmname.nil?
|
46
37
|
show_usage
|
47
|
-
fatal_exit(
|
38
|
+
fatal_exit("You must specify a virtual machine name")
|
48
39
|
end
|
49
40
|
|
50
41
|
vm = get_vm_by_name(vmname, get_config(:folder)) || fatal_exit("Could not find #{vmname}")
|
51
42
|
|
52
43
|
priority = config[:priority]
|
53
|
-
dest_host = config[:dest_host]
|
54
|
-
ndc = find_datastore(config[:dest_datastore])
|
44
|
+
dest_host = get_vm_host_by_name(config[:dest_host]) if config[:dest_host]
|
45
|
+
ndc = find_datastore(config[:dest_datastore]) if config[:dest_datastore]
|
55
46
|
pool = find_pool(config[:resource_pool]) if config[:resource_pool]
|
56
|
-
|
47
|
+
|
48
|
+
unless dest_host || ndc || pool
|
49
|
+
fatal_exit("You need to specify one or more of --dest-host, --dest-datastore, or --resource-pool")
|
50
|
+
end
|
51
|
+
|
57
52
|
migrate_spec = RbVmomi::VIM.VirtualMachineRelocateSpec(datastore: ndc, pool: pool, host: dest_host)
|
58
53
|
vm.RelocateVM_Task(spec: migrate_spec, priority: priority).wait_for_completion
|
59
54
|
end
|
@@ -2,39 +2,39 @@
|
|
2
2
|
# Author:: Brian Dupras (<bdupras@rallydev.com>)
|
3
3
|
# License:: Apache License, Version 2.0
|
4
4
|
#
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
5
|
+
require "chef/knife"
|
6
|
+
require "chef/knife/base_vsphere_command"
|
7
|
+
require "chef/knife/search_helper"
|
8
8
|
|
9
|
-
#
|
9
|
+
# Moves the VM to another folder or datastore
|
10
10
|
# VsphereVmMove extends the BaseVspherecommand
|
11
11
|
class Chef::Knife::VsphereVmMove < Chef::Knife::BaseVsphereCommand
|
12
12
|
include SearchHelper
|
13
|
-
banner
|
13
|
+
banner "knife vsphere vm move VMNAME"
|
14
14
|
|
15
15
|
common_options
|
16
16
|
|
17
17
|
option :dest_name,
|
18
|
-
long:
|
19
|
-
short:
|
20
|
-
description:
|
18
|
+
long: "--dest-name NAME",
|
19
|
+
short: "-r",
|
20
|
+
description: "Destination name of the VM or template"
|
21
21
|
|
22
22
|
option :dest_folder,
|
23
|
-
long:
|
24
|
-
description:
|
23
|
+
long: "--dest-folder FOLDER",
|
24
|
+
description: "The destination folder into which the VM or template should be moved"
|
25
25
|
|
26
26
|
option :datastore,
|
27
|
-
long:
|
28
|
-
description:
|
27
|
+
long: "--datastore STORE",
|
28
|
+
description: "The datastore into which to put the cloned VM"
|
29
29
|
|
30
30
|
option :thin_provision,
|
31
|
-
long:
|
32
|
-
description:
|
31
|
+
long: "--thin-provision",
|
32
|
+
description: "Indicates whether disk should be thin provisioned.",
|
33
33
|
boolean: true
|
34
34
|
|
35
35
|
option :thick_provision,
|
36
|
-
long:
|
37
|
-
description:
|
36
|
+
long: "--thick-provision",
|
37
|
+
description: "Indicates whether disk should be thick provisioned.",
|
38
38
|
boolean: true
|
39
39
|
|
40
40
|
# Convert VM
|
@@ -78,7 +78,7 @@ class Chef::Knife::VsphereVmMove < Chef::Knife::BaseVsphereCommand
|
|
78
78
|
vmname = @name_args[0]
|
79
79
|
if vmname.nil?
|
80
80
|
show_usage
|
81
|
-
fatal_exit(
|
81
|
+
fatal_exit("You must specify a virtual machine name")
|
82
82
|
end
|
83
83
|
|
84
84
|
vm = get_vm_by_name(vmname, get_config(:folder)) || fatal_exit("Could not find #{vmname}")
|
@@ -2,15 +2,15 @@
|
|
2
2
|
# Author:: Raducu Deaconu (<rhadoo_io@yahoo.com>)
|
3
3
|
# License:: Apache License, Version 2.0
|
4
4
|
#
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
5
|
+
require "chef/knife"
|
6
|
+
require "chef/knife/base_vsphere_command"
|
7
|
+
require "chef/knife/search_helper"
|
8
8
|
|
9
9
|
# Switch VM networking state up/down (on all network interfaces)
|
10
10
|
# VsphereVmNet extends the BaseVspherecommand
|
11
11
|
class Chef::Knife::VsphereVmNet < Chef::Knife::BaseVsphereCommand
|
12
12
|
include SearchHelper
|
13
|
-
banner
|
13
|
+
banner "knife vsphere vm net STATE VMNAME"
|
14
14
|
common_options
|
15
15
|
|
16
16
|
# The main run method for vm_net
|
@@ -20,18 +20,18 @@ class Chef::Knife::VsphereVmNet < Chef::Knife::BaseVsphereCommand
|
|
20
20
|
vmname = @name_args[1]
|
21
21
|
if vmname.nil?
|
22
22
|
show_usage
|
23
|
-
fatal_exit(
|
23
|
+
fatal_exit("You must specify a virtual machine name")
|
24
24
|
end
|
25
25
|
|
26
26
|
state = @name_args[0]
|
27
27
|
if state.nil?
|
28
28
|
show_usage
|
29
|
-
fatal_exit(
|
29
|
+
fatal_exit("You must specify networking state up/down")
|
30
30
|
end
|
31
31
|
|
32
|
-
if state ==
|
32
|
+
if state == "up"
|
33
33
|
if_state = true
|
34
|
-
elsif state ==
|
34
|
+
elsif state == "down"
|
35
35
|
if_state = false
|
36
36
|
end
|
37
37
|
|
@@ -2,50 +2,48 @@
|
|
2
2
|
# Author:: Scott Williams (<scott@backups.net.au>)
|
3
3
|
# License:: Apache License, Version 2.0
|
4
4
|
#
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
5
|
+
require "chef/knife"
|
6
|
+
require "chef/knife/base_vsphere_command"
|
7
|
+
require "chef/knife/search_helper"
|
8
|
+
require "netaddr"
|
9
9
|
|
10
10
|
class Chef::Knife::VsphereVmNetworkAdd < Chef::Knife::BaseVsphereCommand
|
11
11
|
include SearchHelper
|
12
|
-
banner
|
12
|
+
banner "knife vsphere vm network add VMNAME NETWORKNAME"
|
13
13
|
|
14
14
|
option :adapter_type,
|
15
|
-
long:
|
16
|
-
description:
|
15
|
+
long: "--adapter-type STRING",
|
16
|
+
description: "Adapter type eg e1000,vmxnet3",
|
17
17
|
required: true
|
18
18
|
|
19
19
|
option :mac_address,
|
20
|
-
long:
|
21
|
-
description:
|
20
|
+
long: "--mac-address STRING",
|
21
|
+
description: "Adapter MAC address eg. AA:BB:CC:DD:EE:FF",
|
22
22
|
required: false
|
23
23
|
|
24
24
|
common_options
|
25
25
|
|
26
|
-
|
27
26
|
def run
|
28
27
|
$stdout.sync = true
|
29
28
|
vmname = @name_args[0]
|
30
29
|
if vmname.nil?
|
31
30
|
show_usage
|
32
|
-
fatal_exit(
|
31
|
+
fatal_exit("You must specify a virtual machine name")
|
33
32
|
end
|
34
33
|
|
35
34
|
networkname = @name_args[1]
|
36
35
|
if networkname.nil?
|
37
36
|
show_usage
|
38
|
-
fatal_exit(
|
37
|
+
fatal_exit("You must specify the network name")
|
39
38
|
end
|
40
39
|
|
41
|
-
|
42
40
|
vm = get_vm_by_name(vmname, get_config(:folder)) || fatal_exit("Could not find #{vmname}")
|
43
41
|
|
44
42
|
network = find_network(networkname)
|
45
43
|
|
46
44
|
case network
|
47
45
|
when RbVmomi::VIM::DistributedVirtualPortgroup
|
48
|
-
switch, pg_key = network.collect
|
46
|
+
switch, pg_key = network.collect "config.distributedVirtualSwitch", "key"
|
49
47
|
port = RbVmomi::VIM.DistributedVirtualSwitchPortConnection(
|
50
48
|
switchUuid: switch.uuid,
|
51
49
|
portgroupKey: pg_key
|
@@ -55,23 +53,23 @@ class Chef::Knife::VsphereVmNetworkAdd < Chef::Knife::BaseVsphereCommand
|
|
55
53
|
when RbVmomi::VIM::Network
|
56
54
|
summary = network.name
|
57
55
|
backing = RbVmomi::VIM.VirtualEthernetCardNetworkBackingInfo(deviceName: network.name)
|
58
|
-
else
|
56
|
+
else raise
|
59
57
|
end
|
60
58
|
|
61
59
|
device_type = case get_config(:adapter_type)
|
62
|
-
when
|
60
|
+
when "e1000"
|
63
61
|
:VirtualE1000
|
64
|
-
when
|
62
|
+
when "vmxnet3"
|
65
63
|
:VirtualVmxnet3
|
66
64
|
when *
|
67
|
-
fatal_exit(
|
65
|
+
fatal_exit("The adapter must be either e1000 or vmxnet3")
|
68
66
|
end
|
69
67
|
|
70
68
|
if get_config(:mac_address).nil?
|
71
|
-
address_type =
|
72
|
-
mac_address =
|
69
|
+
address_type = "generated"
|
70
|
+
mac_address = ""
|
73
71
|
else
|
74
|
-
address_type =
|
72
|
+
address_type = "manual"
|
75
73
|
mac_address = get_config(:mac_address)
|
76
74
|
end
|
77
75
|
|
@@ -82,12 +80,12 @@ class Chef::Knife::VsphereVmNetworkAdd < Chef::Knife::BaseVsphereCommand
|
|
82
80
|
fileOperation: nil,
|
83
81
|
device: RbVmomi::VIM.send(device_type,
|
84
82
|
key: -1,
|
85
|
-
deviceInfo: { summary: summary, label:
|
83
|
+
deviceInfo: { summary: summary, label: "" },
|
86
84
|
backing: backing,
|
87
85
|
addressType: address_type,
|
88
86
|
macAddress: mac_address
|
89
|
-
)
|
90
|
-
}]
|
87
|
+
),
|
88
|
+
}],
|
91
89
|
}
|
92
90
|
).wait_for_completion
|
93
91
|
end
|
@@ -2,13 +2,13 @@
|
|
2
2
|
# Author:: Scott Williams (<scott@backups.net.au>)
|
3
3
|
# License:: Apache License, Version 2.0
|
4
4
|
#
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
5
|
+
require "chef/knife"
|
6
|
+
require "chef/knife/base_vsphere_command"
|
7
|
+
require "chef/knife/search_helper"
|
8
8
|
|
9
9
|
class Chef::Knife::VsphereVmNetworkDelete < Chef::Knife::BaseVsphereCommand
|
10
10
|
include SearchHelper
|
11
|
-
banner
|
11
|
+
banner "knife vsphere vm network delete VMNAME NICNAME"
|
12
12
|
|
13
13
|
common_options
|
14
14
|
|
@@ -18,13 +18,13 @@ class Chef::Knife::VsphereVmNetworkDelete < Chef::Knife::BaseVsphereCommand
|
|
18
18
|
vmname = @name_args[0]
|
19
19
|
if vmname.nil?
|
20
20
|
show_usage
|
21
|
-
fatal_exit(
|
21
|
+
fatal_exit("You must specify a virtual machine name")
|
22
22
|
end
|
23
23
|
|
24
24
|
nicname = @name_args[1]
|
25
25
|
if nicname.nil?
|
26
26
|
show_usage
|
27
|
-
fatal_exit(
|
27
|
+
fatal_exit("You must specify the name of the NIC to delete")
|
28
28
|
end
|
29
29
|
|
30
30
|
vm = get_vm_by_name(vmname, get_config(:folder)) || fatal_exit("Could not find #{vmname}")
|
@@ -32,13 +32,13 @@ class Chef::Knife::VsphereVmNetworkDelete < Chef::Knife::BaseVsphereCommand
|
|
32
32
|
cards = vm.config.hardware.device.grep(RbVmomi::VIM::VirtualEthernetCard)
|
33
33
|
card = cards.detect { |c| c.deviceInfo.label == nicname }
|
34
34
|
if card.nil?
|
35
|
-
found = cards.map { |c| c.deviceInfo.label }.join
|
35
|
+
found = cards.map { |c| c.deviceInfo.label }.join ", "
|
36
36
|
fatal_exit "Could not find #{nicname}. I did find #{found}."
|
37
37
|
else
|
38
38
|
spec = RbVmomi::VIM.VirtualMachineConfigSpec(
|
39
39
|
deviceChange: [{
|
40
40
|
operation: :remove,
|
41
|
-
device: card
|
41
|
+
device: card,
|
42
42
|
}]
|
43
43
|
)
|
44
44
|
|
@@ -2,14 +2,14 @@
|
|
2
2
|
# Author:: Scott Williams (<scott@backups.net.au>)
|
3
3
|
# License:: Apache License, Version 2.0
|
4
4
|
#
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
5
|
+
require "chef/knife"
|
6
|
+
require "chef/knife/base_vsphere_command"
|
7
|
+
require "chef/knife/search_helper"
|
8
8
|
|
9
9
|
# VsphereVmNetworklist extends the BaseVspherecommand
|
10
10
|
class Chef::Knife::VsphereVmNetworkList < Chef::Knife::BaseVsphereCommand
|
11
11
|
include SearchHelper
|
12
|
-
banner
|
12
|
+
banner "knife vsphere vm network list VMNAME"
|
13
13
|
|
14
14
|
common_options
|
15
15
|
|
@@ -21,7 +21,7 @@ class Chef::Knife::VsphereVmNetworkList < Chef::Knife::BaseVsphereCommand
|
|
21
21
|
vmname = @name_args[0]
|
22
22
|
if vmname.nil?
|
23
23
|
show_usage
|
24
|
-
fatal_exit(
|
24
|
+
fatal_exit("You must specify a virtual machine name")
|
25
25
|
end
|
26
26
|
|
27
27
|
vm = get_vm_by_name(vmname, get_config(:folder)) || fatal_exit("Could not find #{vmname}")
|