knife-vsphere 1.0.1 → 1.2.0
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 +4 -4
- data/lib/chef/knife/base_vsphere_command.rb +383 -371
- data/lib/chef/knife/customization_helper.rb +40 -0
- data/lib/chef/knife/vsphere_cluster_list.rb +47 -0
- data/lib/chef/knife/vsphere_cpu_ratio.rb +41 -45
- data/lib/chef/knife/vsphere_customization_list.rb +24 -29
- data/lib/chef/knife/vsphere_datastore_list.rb +68 -72
- data/lib/chef/knife/vsphere_datastore_maxfree.rb +48 -49
- data/lib/chef/knife/vsphere_datastorecluster_list.rb +66 -71
- data/lib/chef/knife/vsphere_datastorecluster_maxfree.rb +75 -84
- data/lib/chef/knife/vsphere_folder_list.rb +28 -30
- data/lib/chef/knife/vsphere_hosts_list.rb +42 -42
- data/lib/chef/knife/vsphere_pool_list.rb +46 -48
- data/lib/chef/knife/vsphere_pool_query.rb +58 -58
- data/lib/chef/knife/vsphere_template_list.rb +30 -32
- data/lib/chef/knife/vsphere_vlan_create.rb +51 -0
- data/lib/chef/knife/vsphere_vlan_list.rb +35 -37
- data/lib/chef/knife/vsphere_vm_clone.rb +834 -581
- data/lib/chef/knife/vsphere_vm_config.rb +48 -46
- data/lib/chef/knife/vsphere_vm_delete.rb +70 -66
- data/lib/chef/knife/vsphere_vm_execute.rb +62 -66
- data/lib/chef/knife/vsphere_vm_list.rb +57 -61
- data/lib/chef/knife/vsphere_vm_markastemplate.rb +48 -54
- data/lib/chef/knife/vsphere_vm_migrate.rb +73 -0
- data/lib/chef/knife/vsphere_vm_move.rb +88 -0
- data/lib/chef/knife/vsphere_vm_net.rb +57 -0
- data/lib/chef/knife/vsphere_vm_property_get.rb +44 -46
- data/lib/chef/knife/vsphere_vm_property_set.rb +83 -84
- data/lib/chef/knife/vsphere_vm_query.rb +48 -48
- data/lib/chef/knife/vsphere_vm_snapshot.rb +124 -130
- data/lib/chef/knife/vsphere_vm_state.rb +122 -127
- data/lib/chef/knife/vsphere_vm_toolsconfig.rb +54 -52
- data/lib/chef/knife/vsphere_vm_vmdk_add.rb +234 -241
- data/lib/chef/knife/vsphere_vm_wait_sysprep.rb +54 -0
- data/lib/knife-vsphere/version.rb +3 -4
- metadata +43 -15
- data/lib/chef/knife/vshpere_vm_migrate.rb +0 -80
- data/lib/chef/knife/vshpere_vm_move.rb +0 -92
- data/lib/chef/knife/vshpere_vm_net.rb +0 -57
@@ -1,54 +1,48 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Ezra Pagel (<ezra@cpan.org>)
|
3
|
-
# Contributor:: Jesse Campbell (<hikeit@gmail.com>)
|
4
|
-
# Contributor:: Bethany Erskine (<bethany@paperlesspost.com>)
|
5
|
-
# Contributor:: Adrian Stanila (https://github.com/sacx)
|
6
|
-
# License:: Apache License, Version 2.0
|
7
|
-
#
|
8
|
-
|
9
|
-
require 'chef/knife'
|
10
|
-
require 'chef/knife/base_vsphere_command'
|
11
|
-
require 'rbvmomi'
|
12
|
-
|
13
|
-
# Clone an existing template into a new VM, optionally applying a customization specification.
|
14
|
-
# usage:
|
15
|
-
# knife vsphere vm markastemplate MyVM --folder /templates
|
16
|
-
class Chef::Knife::VsphereVmMarkastemplate < Chef::Knife::BaseVsphereCommand
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
:
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
vmname
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
config[:
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
puts "Marking VM #{vmname} as template"
|
51
|
-
vm.MarkAsTemplate()
|
52
|
-
puts "Finished marking VM #{vmname} as template"
|
53
|
-
end
|
54
|
-
end
|
1
|
+
#
|
2
|
+
# Author:: Ezra Pagel (<ezra@cpan.org>)
|
3
|
+
# Contributor:: Jesse Campbell (<hikeit@gmail.com>)
|
4
|
+
# Contributor:: Bethany Erskine (<bethany@paperlesspost.com>)
|
5
|
+
# Contributor:: Adrian Stanila (https://github.com/sacx)
|
6
|
+
# License:: Apache License, Version 2.0
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'chef/knife'
|
10
|
+
require 'chef/knife/base_vsphere_command'
|
11
|
+
require 'rbvmomi'
|
12
|
+
|
13
|
+
# Clone an existing template into a new VM, optionally applying a customization specification.
|
14
|
+
# usage:
|
15
|
+
# knife vsphere vm markastemplate MyVM --folder /templates
|
16
|
+
class Chef::Knife::VsphereVmMarkastemplate < Chef::Knife::BaseVsphereCommand
|
17
|
+
banner 'knife vsphere vm markastemplate VMNAME'
|
18
|
+
|
19
|
+
common_options
|
20
|
+
|
21
|
+
option :folder,
|
22
|
+
long: '--folder FOLDER',
|
23
|
+
description: 'The folder which contains the VM'
|
24
|
+
|
25
|
+
def run
|
26
|
+
$stdout.sync = true
|
27
|
+
|
28
|
+
vmname = @name_args[0]
|
29
|
+
if vmname.nil?
|
30
|
+
show_usage
|
31
|
+
fatal_exit('You must specify a virtual machine name')
|
32
|
+
end
|
33
|
+
config[:chef_node_name] = vmname unless config[:chef_node_name]
|
34
|
+
config[:vmname] = vmname
|
35
|
+
|
36
|
+
vim_connection
|
37
|
+
|
38
|
+
dc = datacenter
|
39
|
+
|
40
|
+
src_folder = find_folder(get_config(:folder)) || dc.vmFolder
|
41
|
+
|
42
|
+
vm = find_in_folder(src_folder, RbVmomi::VIM::VirtualMachine, config[:vmname]) || abort('VM not found')
|
43
|
+
|
44
|
+
puts "Marking VM #{vmname} as template"
|
45
|
+
vm.MarkAsTemplate()
|
46
|
+
puts "Finished marking VM #{vmname} as template"
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Raducu Deaconu (<rhadoo_io@yahoo.com>)
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
require 'chef/knife'
|
6
|
+
require 'chef/knife/base_vsphere_command'
|
7
|
+
|
8
|
+
# migrate vm to specified resource pool , datastore and host
|
9
|
+
class Chef::Knife::VsphereVmMigrate < Chef::Knife::BaseVsphereCommand
|
10
|
+
# migrate --resource-pool --dest-host --dest-datastore
|
11
|
+
banner 'knife vsphere vm migrate (options)'
|
12
|
+
|
13
|
+
common_options
|
14
|
+
|
15
|
+
option :dest_host,
|
16
|
+
long: '--dest-host HOST',
|
17
|
+
description: 'Destination host for the VM or template'
|
18
|
+
|
19
|
+
option :dest_datastore,
|
20
|
+
long: '--dest-datastore DATASTORE',
|
21
|
+
description: 'The destination datastore'
|
22
|
+
|
23
|
+
option :priority,
|
24
|
+
long: '--priority PRIORITY',
|
25
|
+
description: 'migration priority'
|
26
|
+
|
27
|
+
option :resource_pool,
|
28
|
+
long: '--resource-pool POOL',
|
29
|
+
description: 'The resource pool into which to put the VM'
|
30
|
+
|
31
|
+
def traverse_folders_for_pool(folder, poolname)
|
32
|
+
children = folder.children.find_all
|
33
|
+
children.each do |child|
|
34
|
+
if child.class == RbVmomi::VIM::ClusterComputeResource || child.class == RbVmomi::VIM::ComputeResource || child.class == RbVmomi::VIM::ResourcePool
|
35
|
+
return child if child.name == poolname
|
36
|
+
elsif child.class == RbVmomi::VIM::Folder
|
37
|
+
pool = traverse_folders_for_pool(child, poolname)
|
38
|
+
return pool if pool
|
39
|
+
end
|
40
|
+
end
|
41
|
+
false
|
42
|
+
end
|
43
|
+
|
44
|
+
def find_host_folder(folder, _type, name)
|
45
|
+
folder.host.find { |o| o.name == name }
|
46
|
+
end
|
47
|
+
|
48
|
+
def run
|
49
|
+
$stdout.sync = true
|
50
|
+
vmname = @name_args[0]
|
51
|
+
if vmname.nil?
|
52
|
+
show_usage
|
53
|
+
fatal_exit('You must specify a virtual machine name')
|
54
|
+
end
|
55
|
+
|
56
|
+
vim_connection
|
57
|
+
dc = datacenter
|
58
|
+
folder = find_folder(get_config(:folder)) || dc.vmFolder
|
59
|
+
|
60
|
+
vm = find_in_folder(folder, RbVmomi::VIM::VirtualMachine, vmname) || abort("VM #{vmname} not found")
|
61
|
+
|
62
|
+
priority = config[:priority]
|
63
|
+
dest_host = config[:dest_host]
|
64
|
+
ndc = find_datastore(config[:dest_datastore]) || abort('dest-datastore not found')
|
65
|
+
npool = find_pool(config[:resource_pool])
|
66
|
+
folderd = dc.hostFolder
|
67
|
+
pool = traverse_folders_for_pool(folderd, config[:resource_pool]) || abort("Pool #{poolname} not found")
|
68
|
+
h = find_host_folder(pool, RbVmomi::VIM::HostSystem, dest_host)
|
69
|
+
migrate_spec = RbVmomi::VIM.VirtualMachineRelocateSpec(datastore: ndc, pool: npool, host: h)
|
70
|
+
# puts migrate_spec.host.name
|
71
|
+
vm.RelocateVM_Task(spec: migrate_spec, priority: priority).wait_for_completion
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Brian Dupras (<bdupras@rallydev.com>)
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
require 'chef/knife'
|
6
|
+
require 'chef/knife/base_vsphere_command'
|
7
|
+
|
8
|
+
# Lists all known virtual machines in the configured datacenter
|
9
|
+
class Chef::Knife::VsphereVmMove < Chef::Knife::BaseVsphereCommand
|
10
|
+
banner 'knife vsphere vm move'
|
11
|
+
|
12
|
+
common_options
|
13
|
+
|
14
|
+
option :dest_name,
|
15
|
+
long: '--dest-name NAME',
|
16
|
+
short: '-r',
|
17
|
+
description: 'Destination name of the VM or template'
|
18
|
+
|
19
|
+
option :dest_folder,
|
20
|
+
long: '--dest-folder FOLDER',
|
21
|
+
description: 'The destination folder into which the VM or template should be moved'
|
22
|
+
|
23
|
+
option :datastore,
|
24
|
+
long: '--datastore STORE',
|
25
|
+
description: 'The datastore into which to put the cloned VM'
|
26
|
+
|
27
|
+
option :thin_provision,
|
28
|
+
long: '--thin-provision',
|
29
|
+
description: 'Indicates whether disk should be thin provisioned.',
|
30
|
+
boolean: true
|
31
|
+
|
32
|
+
option :thick_provision,
|
33
|
+
long: '--thick-provision',
|
34
|
+
description: 'Indicates whether disk should be thick provisioned.',
|
35
|
+
boolean: true
|
36
|
+
|
37
|
+
# Convert VM
|
38
|
+
def convert_vm(vm)
|
39
|
+
dc = datacenter
|
40
|
+
hosts = find_all_in_folder(dc.hostFolder, RbVmomi::VIM::ComputeResource)
|
41
|
+
rp = hosts.first.resourcePool
|
42
|
+
rspec = RbVmomi::VIM.VirtualMachineRelocateSpec(pool: rp)
|
43
|
+
|
44
|
+
if get_config(:thin_provision)
|
45
|
+
puts "Thin provsisioning #{vm.name}"
|
46
|
+
rspec = RbVmomi::VIM.VirtualMachineRelocateSpec(datastore: find_datastore(get_config(:datastore)), transform: :sparse)
|
47
|
+
end
|
48
|
+
|
49
|
+
if get_config(:thick_provision)
|
50
|
+
puts "Thick provsisioning #{vm.name}"
|
51
|
+
rspec = RbVmomi::VIM.VirtualMachineRelocateSpec(datastore: find_datastore(get_config(:datastore)), transform: :flat)
|
52
|
+
end
|
53
|
+
|
54
|
+
task = vm.RelocateVM_Task(spec: rspec)
|
55
|
+
task.wait_for_completion
|
56
|
+
end
|
57
|
+
|
58
|
+
# Move VM
|
59
|
+
def move_vm(vm)
|
60
|
+
dest_name = config[:dest_name] || vmname
|
61
|
+
dest_folder = config[:dest_folder].nil? ? (vm.parent) : (find_folder(get_config(:dest_folder)))
|
62
|
+
|
63
|
+
vm.Rename_Task(newName: dest_name).wait_for_completion unless vmname == dest_name
|
64
|
+
dest_folder.MoveIntoFolder_Task(list: [vm]).wait_for_completion unless folder == dest_folder
|
65
|
+
end
|
66
|
+
|
67
|
+
def run
|
68
|
+
$stdout.sync = true
|
69
|
+
vmname = @name_args[0]
|
70
|
+
if vmname.nil?
|
71
|
+
show_usage
|
72
|
+
fatal_exit('You must specify a virtual machine name')
|
73
|
+
end
|
74
|
+
|
75
|
+
vim = vim_connection
|
76
|
+
dcname = get_config(:vsphere_dc)
|
77
|
+
dc = vim.serviceInstance.find_datacenter(dcname) || abort('datacenter not found')
|
78
|
+
folder = find_folder(get_config(:folder)) || dc.vmFolder
|
79
|
+
|
80
|
+
vm = find_in_folder(folder, RbVmomi::VIM::VirtualMachine, vmname) || abort("VM #{vmname} not found")
|
81
|
+
|
82
|
+
if get_config(:thin_provision) || get_config(:thick_provision)
|
83
|
+
convert_vm(vm)
|
84
|
+
else
|
85
|
+
move_vm(vm)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Raducu Deaconu (<rhadoo_io@yahoo.com>)
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
require 'chef/knife'
|
6
|
+
require 'chef/knife/base_vsphere_command'
|
7
|
+
# Switch VM networking state up/down (on all network interfaces)
|
8
|
+
class Chef::Knife::VsphereVmNet < Chef::Knife::BaseVsphereCommand
|
9
|
+
banner 'knife vsphere vm net STATE VMNAME'
|
10
|
+
common_options
|
11
|
+
def run
|
12
|
+
$stdout.sync = true
|
13
|
+
vmname = @name_args[1]
|
14
|
+
if vmname.nil?
|
15
|
+
show_usage
|
16
|
+
fatal_exit('You must specify a virtual machine name')
|
17
|
+
end
|
18
|
+
|
19
|
+
state = @name_args[0]
|
20
|
+
if state.nil?
|
21
|
+
show_usage
|
22
|
+
fatal_exit('You must specify networking state up/down')
|
23
|
+
end
|
24
|
+
|
25
|
+
if state == 'up'
|
26
|
+
if_state = true
|
27
|
+
elsif state == 'down'
|
28
|
+
if_state = false
|
29
|
+
end
|
30
|
+
vim_connection
|
31
|
+
dc = datacenter
|
32
|
+
folder = find_folder(get_config(:folder)) || dc.vmFolder
|
33
|
+
vm = find_in_folder(folder, RbVmomi::VIM::VirtualMachine, vmname) ||
|
34
|
+
abort("VM #{vmname} not found")
|
35
|
+
vm.config.hardware.device.each.grep(RbVmomi::VIM::VirtualEthernetCard) do |a|
|
36
|
+
backing = a.backing
|
37
|
+
key = a.key
|
38
|
+
|
39
|
+
puts "#{ui.color('Setting network adapter', :cyan)} :#{a.deviceInfo.label} on vlan :#{a.deviceInfo.summary} :#{state}"
|
40
|
+
|
41
|
+
conninfo = RbVmomi::VIM.VirtualDeviceConnectInfo(startConnected: true,
|
42
|
+
allowGuestControl: true,
|
43
|
+
connected: if_state)
|
44
|
+
|
45
|
+
ndevice = RbVmomi::VIM.VirtualE1000(key: key,
|
46
|
+
backing: backing,
|
47
|
+
connectable: conninfo)
|
48
|
+
|
49
|
+
device_spec = RbVmomi::VIM.VirtualDeviceConfigSpec(operation: :edit,
|
50
|
+
device: ndevice)
|
51
|
+
|
52
|
+
vmspec = RbVmomi::VIM.VirtualMachineConfigSpec(deviceChange: [device_spec])
|
53
|
+
|
54
|
+
vm.ReconfigVM_Task(spec: vmspec).wait_for_completion
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -1,46 +1,44 @@
|
|
1
|
-
# Author:: Brian Dupras (<bdupras@rallydev.com>)
|
2
|
-
# License:: Apache License, Version 2.0
|
3
|
-
|
4
|
-
require 'chef/knife'
|
5
|
-
require 'chef/knife/base_vsphere_command'
|
6
|
-
require 'rbvmomi'
|
7
|
-
require 'netaddr'
|
8
|
-
|
9
|
-
class Chef::Knife::VsphereVmPropertyGet < Chef::Knife::BaseVsphereCommand
|
10
|
-
banner
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
def run
|
15
|
-
$stdout.sync = true
|
16
|
-
vmname = @name_args[0]
|
17
|
-
if vmname.nil?
|
18
|
-
show_usage
|
19
|
-
fatal_exit(
|
20
|
-
end
|
21
|
-
|
22
|
-
property_name = @name_args[1]
|
23
|
-
if property_name.nil?
|
24
|
-
show_usage
|
25
|
-
fatal_exit(
|
26
|
-
end
|
27
|
-
property_name = property_name.to_sym
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
dc =
|
32
|
-
folder = find_folder(get_config(:folder)) || dc.vmFolder
|
33
|
-
|
34
|
-
vm = find_in_folder(folder, RbVmomi::VIM::VirtualMachine, vmname)
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
-
end
|
1
|
+
# Author:: Brian Dupras (<bdupras@rallydev.com>)
|
2
|
+
# License:: Apache License, Version 2.0
|
3
|
+
|
4
|
+
require 'chef/knife'
|
5
|
+
require 'chef/knife/base_vsphere_command'
|
6
|
+
require 'rbvmomi'
|
7
|
+
require 'netaddr'
|
8
|
+
|
9
|
+
class Chef::Knife::VsphereVmPropertyGet < Chef::Knife::BaseVsphereCommand
|
10
|
+
banner 'knife vsphere vm property get VMNAME PROPERTY. Gets a vApp Property on VMNAME.'
|
11
|
+
|
12
|
+
common_options
|
13
|
+
|
14
|
+
def run
|
15
|
+
$stdout.sync = true
|
16
|
+
vmname = @name_args[0]
|
17
|
+
if vmname.nil?
|
18
|
+
show_usage
|
19
|
+
fatal_exit('You must specify a virtual machine name')
|
20
|
+
end
|
21
|
+
|
22
|
+
property_name = @name_args[1]
|
23
|
+
if property_name.nil?
|
24
|
+
show_usage
|
25
|
+
fatal_exit('You must specify a PROPERTY name (e.g. annotation)')
|
26
|
+
end
|
27
|
+
property_name = property_name.to_sym
|
28
|
+
|
29
|
+
vim_connection
|
30
|
+
|
31
|
+
dc = datacenter
|
32
|
+
folder = find_folder(get_config(:folder)) || dc.vmFolder
|
33
|
+
|
34
|
+
vm = find_in_folder(folder, RbVmomi::VIM::VirtualMachine, vmname) || abort("VM #{vmname} not found")
|
35
|
+
|
36
|
+
existing_property = vm.config.vAppConfig.property.find { |p| p.props[:id] == property_name.to_s }
|
37
|
+
|
38
|
+
if existing_property
|
39
|
+
puts existing_property.props[:value]
|
40
|
+
else
|
41
|
+
fatal_exit("PROPERTY [#{property_name}] not found")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,84 +1,83 @@
|
|
1
|
-
# Author:: Brian Dupras (<bdupras@rallydev.com>)
|
2
|
-
# License:: Apache License, Version 2.0
|
3
|
-
|
4
|
-
require 'chef/knife'
|
5
|
-
require 'chef/knife/base_vsphere_command'
|
6
|
-
require 'rbvmomi'
|
7
|
-
require 'netaddr'
|
8
|
-
|
9
|
-
class Chef::Knife::VsphereVmPropertySet < Chef::Knife::BaseVsphereCommand
|
10
|
-
banner
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
option :ovf_environment_transport,
|
15
|
-
:
|
16
|
-
:
|
17
|
-
|
18
|
-
def run
|
19
|
-
$stdout.sync = true
|
20
|
-
vmname = @name_args[0]
|
21
|
-
if vmname.nil?
|
22
|
-
show_usage
|
23
|
-
fatal_exit(
|
24
|
-
end
|
25
|
-
|
26
|
-
property_name = @name_args[1]
|
27
|
-
if property_name.nil?
|
28
|
-
show_usage
|
29
|
-
fatal_exit(
|
30
|
-
end
|
31
|
-
property_name = property_name.to_sym
|
32
|
-
|
33
|
-
property_value = @name_args[2]
|
34
|
-
if property_value.nil?
|
35
|
-
show_usage
|
36
|
-
fatal_exit(
|
37
|
-
end
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
dc =
|
42
|
-
folder = find_folder(get_config(:folder)) || dc.vmFolder
|
43
|
-
|
44
|
-
vm = find_in_folder(folder, RbVmomi::VIM::VirtualMachine, vmname)
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
:
|
64
|
-
|
65
|
-
:
|
66
|
-
:
|
67
|
-
:
|
68
|
-
:
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
transport =
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
end
|
1
|
+
# Author:: Brian Dupras (<bdupras@rallydev.com>)
|
2
|
+
# License:: Apache License, Version 2.0
|
3
|
+
|
4
|
+
require 'chef/knife'
|
5
|
+
require 'chef/knife/base_vsphere_command'
|
6
|
+
require 'rbvmomi'
|
7
|
+
require 'netaddr'
|
8
|
+
|
9
|
+
class Chef::Knife::VsphereVmPropertySet < Chef::Knife::BaseVsphereCommand
|
10
|
+
banner 'knife vsphere vm property set VMNAME PROPERTY VALUE. Sets a vApp Property on VMNAME.'
|
11
|
+
|
12
|
+
common_options
|
13
|
+
|
14
|
+
option :ovf_environment_transport,
|
15
|
+
long: '--ovf-environment-transport STRING',
|
16
|
+
description: 'Comma delimited string. Configures the transports to use for properties. Supported values are: iso and com.vmware.guestInfo.'
|
17
|
+
|
18
|
+
def run
|
19
|
+
$stdout.sync = true
|
20
|
+
vmname = @name_args[0]
|
21
|
+
if vmname.nil?
|
22
|
+
show_usage
|
23
|
+
fatal_exit('You must specify a virtual machine name')
|
24
|
+
end
|
25
|
+
|
26
|
+
property_name = @name_args[1]
|
27
|
+
if property_name.nil?
|
28
|
+
show_usage
|
29
|
+
fatal_exit('You must specify a PROPERTY name (e.g. annotation)')
|
30
|
+
end
|
31
|
+
property_name = property_name.to_sym
|
32
|
+
|
33
|
+
property_value = @name_args[2]
|
34
|
+
if property_value.nil?
|
35
|
+
show_usage
|
36
|
+
fatal_exit('You must specify a PROPERTY value')
|
37
|
+
end
|
38
|
+
|
39
|
+
vim_connection
|
40
|
+
|
41
|
+
dc = datacenter
|
42
|
+
folder = find_folder(get_config(:folder)) || dc.vmFolder
|
43
|
+
|
44
|
+
vm = find_in_folder(folder, RbVmomi::VIM::VirtualMachine, vmname) || abort("VM #{vmname} not found")
|
45
|
+
|
46
|
+
if vm.config.vAppConfig && vm.config.vAppConfig.property
|
47
|
+
existing_property = vm.config.vAppConfig.property.find { |p| p.props[:id] == property_name.to_s }
|
48
|
+
end
|
49
|
+
|
50
|
+
if existing_property
|
51
|
+
operation = 'edit'
|
52
|
+
property_key = existing_property.props[:key]
|
53
|
+
else
|
54
|
+
operation = 'add'
|
55
|
+
property_key = property_name.object_id
|
56
|
+
end
|
57
|
+
|
58
|
+
vm_config_spec = RbVmomi::VIM.VirtualMachineConfigSpec(
|
59
|
+
vAppConfig: RbVmomi::VIM.VmConfigSpec(
|
60
|
+
property: [
|
61
|
+
RbVmomi::VIM.VAppPropertySpec(
|
62
|
+
operation: operation,
|
63
|
+
info: {
|
64
|
+
key: property_key,
|
65
|
+
id: property_name.to_s,
|
66
|
+
type: 'string',
|
67
|
+
userConfigurable: true,
|
68
|
+
value: property_value
|
69
|
+
}
|
70
|
+
)
|
71
|
+
]
|
72
|
+
)
|
73
|
+
)
|
74
|
+
|
75
|
+
unless config[:ovf_environment_transport].nil?
|
76
|
+
transport = config[:ovf_environment_transport].split(',')
|
77
|
+
transport = [''] if transport == [] ## because "".split returns [] and vmware wants [""]
|
78
|
+
vm_config_spec[:vAppConfig][:ovfEnvironmentTransport] = transport
|
79
|
+
end
|
80
|
+
|
81
|
+
vm.ReconfigVM_Task(spec: vm_config_spec).wait_for_completion
|
82
|
+
end
|
83
|
+
end
|