knife-vsphere 0.9.9 → 1.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/chef/knife/base_vsphere_command.rb +39 -0
- data/lib/chef/knife/vshpere_vm_move.rb +47 -47
- data/lib/chef/knife/vsphere_customization_list.rb +29 -29
- data/lib/chef/knife/vsphere_datastore_list.rb +58 -58
- data/lib/chef/knife/vsphere_pool_list.rb +44 -44
- data/lib/chef/knife/vsphere_vlan_list.rb +37 -37
- data/lib/chef/knife/vsphere_vm_clone.rb +20 -2
- data/lib/chef/knife/vsphere_vm_execute.rb +66 -66
- data/lib/chef/knife/vsphere_vm_markastemplate.rb +54 -0
- data/lib/chef/knife/vsphere_vm_snapshot.rb +129 -129
- data/lib/chef/knife/vsphere_vm_state.rb +127 -111
- data/lib/chef/knife/vsphere_vm_vmdk_add.rb +241 -241
- data/lib/knife-vsphere/version.rb +4 -4
- metadata +58 -59
@@ -30,6 +30,10 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
|
|
30
30
|
:long => "--datastore STORE",
|
31
31
|
:description => "The datastore into which to put the cloned VM"
|
32
32
|
|
33
|
+
option :datastorecluster,
|
34
|
+
:long => "--datastorecluster STORE",
|
35
|
+
:description => "The datastorecluster into which to put the cloned VM"
|
36
|
+
|
33
37
|
option :resource_pool,
|
34
38
|
:long => "--resource-pool POOL",
|
35
39
|
:description => "The resource pool into which to put the cloned VM"
|
@@ -303,10 +307,24 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
|
|
303
307
|
rspec = RbVmomi::VIM.VirtualMachineRelocateSpec(:diskMoveType => :moveChildMostDiskBacking)
|
304
308
|
end
|
305
309
|
|
310
|
+
if get_config(:datastore) && get_config(:datastorecluster)
|
311
|
+
abort "Please select either datastore or datastorecluster"
|
312
|
+
end
|
313
|
+
|
306
314
|
if get_config(:datastore)
|
307
315
|
rspec.datastore = find_datastore(get_config(:datastore))
|
308
316
|
end
|
309
317
|
|
318
|
+
if get_config(:datastorecluster)
|
319
|
+
dsc = find_datastorecluster(get_config(:datastorecluster))
|
320
|
+
|
321
|
+
dsc.childEntity.each do |store|
|
322
|
+
if (rspec.datastore == nil or rspec.datastore.summary[:freeSpace] < store.summary[:freeSpace])
|
323
|
+
rspec.datastore = store
|
324
|
+
end
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
310
328
|
clone_spec = RbVmomi::VIM.VirtualMachineCloneSpec(:location => rspec,
|
311
329
|
:powerOn => false,
|
312
330
|
:template => false)
|
@@ -393,11 +411,11 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
|
|
393
411
|
cust_spec.identity = ident
|
394
412
|
end
|
395
413
|
|
414
|
+
clone_spec.customization = cust_spec
|
415
|
+
|
396
416
|
if customization_plugin && customization_plugin.respond_to?(:customize_clone_spec)
|
397
417
|
clone_spec = customization_plugin.customize_clone_spec(src_config, clone_spec)
|
398
418
|
end
|
399
|
-
|
400
|
-
clone_spec.customization = cust_spec
|
401
419
|
end
|
402
420
|
clone_spec
|
403
421
|
end
|
@@ -1,66 +1,66 @@
|
|
1
|
-
# Author:: Ian Delahorne (<ian@delahorne.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::VsphereVmExecute < Chef::Knife::BaseVsphereCommand
|
10
|
-
banner "knife vsphere vm execute VMNAME COMMAND ARGS"
|
11
|
-
|
12
|
-
option :exec_user,
|
13
|
-
:long => "--exec-user USER",
|
14
|
-
:description => "User to execute as",
|
15
|
-
:required => true
|
16
|
-
|
17
|
-
option :exec_passwd,
|
18
|
-
:long => "--exec-passwd PASSWORD",
|
19
|
-
:description => "Password for execute user",
|
20
|
-
:required => true
|
21
|
-
|
22
|
-
option :exec_dir,
|
23
|
-
:long => "--exec-dir DIRECTORY",
|
24
|
-
:description => "Working directory to execute in"
|
25
|
-
|
26
|
-
get_common_options
|
27
|
-
|
28
|
-
def run
|
29
|
-
$stdout.sync = true
|
30
|
-
vmname = @name_args[0]
|
31
|
-
if vmname.nil?
|
32
|
-
show_usage
|
33
|
-
fatal_exit("You must specify a virtual machine name")
|
34
|
-
end
|
35
|
-
command = @name_args[1]
|
36
|
-
if command.nil?
|
37
|
-
show_usage
|
38
|
-
fatal_exit("You must specify a command to execute")
|
39
|
-
end
|
40
|
-
|
41
|
-
args = @name_args[2]
|
42
|
-
if args.nil?
|
43
|
-
args = ""
|
44
|
-
end
|
45
|
-
|
46
|
-
vim = get_vim_connection
|
47
|
-
|
48
|
-
dc = get_datacenter
|
49
|
-
folder = find_folder(get_config(:folder)) || dc.vmFolder
|
50
|
-
|
51
|
-
vm = find_in_folder(folder, RbVmomi::VIM::VirtualMachine, vmname) or
|
52
|
-
abort "VM #{vmname} not found"
|
53
|
-
|
54
|
-
gom = vim.serviceContent.guestOperationsManager
|
55
|
-
|
56
|
-
guest_auth = RbVmomi::VIM::NamePasswordAuthentication(:interactiveSession => false,
|
57
|
-
:username => config[:exec_user],
|
58
|
-
:password => config[:exec_passwd])
|
59
|
-
prog_spec = RbVmomi::VIM::GuestProgramSpec(:programPath => command,
|
60
|
-
:arguments => args,
|
61
|
-
:workingDirectory => get_config(:exec_dir))
|
62
|
-
|
63
|
-
gom.processManager.StartProgramInGuest(:vm => vm, :auth => guest_auth, :spec => prog_spec)
|
64
|
-
|
65
|
-
end
|
66
|
-
end
|
1
|
+
# Author:: Ian Delahorne (<ian@delahorne.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::VsphereVmExecute < Chef::Knife::BaseVsphereCommand
|
10
|
+
banner "knife vsphere vm execute VMNAME COMMAND ARGS"
|
11
|
+
|
12
|
+
option :exec_user,
|
13
|
+
:long => "--exec-user USER",
|
14
|
+
:description => "User to execute as",
|
15
|
+
:required => true
|
16
|
+
|
17
|
+
option :exec_passwd,
|
18
|
+
:long => "--exec-passwd PASSWORD",
|
19
|
+
:description => "Password for execute user",
|
20
|
+
:required => true
|
21
|
+
|
22
|
+
option :exec_dir,
|
23
|
+
:long => "--exec-dir DIRECTORY",
|
24
|
+
:description => "Working directory to execute in"
|
25
|
+
|
26
|
+
get_common_options
|
27
|
+
|
28
|
+
def run
|
29
|
+
$stdout.sync = true
|
30
|
+
vmname = @name_args[0]
|
31
|
+
if vmname.nil?
|
32
|
+
show_usage
|
33
|
+
fatal_exit("You must specify a virtual machine name")
|
34
|
+
end
|
35
|
+
command = @name_args[1]
|
36
|
+
if command.nil?
|
37
|
+
show_usage
|
38
|
+
fatal_exit("You must specify a command to execute")
|
39
|
+
end
|
40
|
+
|
41
|
+
args = @name_args[2]
|
42
|
+
if args.nil?
|
43
|
+
args = ""
|
44
|
+
end
|
45
|
+
|
46
|
+
vim = get_vim_connection
|
47
|
+
|
48
|
+
dc = get_datacenter
|
49
|
+
folder = find_folder(get_config(:folder)) || dc.vmFolder
|
50
|
+
|
51
|
+
vm = find_in_folder(folder, RbVmomi::VIM::VirtualMachine, vmname) or
|
52
|
+
abort "VM #{vmname} not found"
|
53
|
+
|
54
|
+
gom = vim.serviceContent.guestOperationsManager
|
55
|
+
|
56
|
+
guest_auth = RbVmomi::VIM::NamePasswordAuthentication(:interactiveSession => false,
|
57
|
+
:username => config[:exec_user],
|
58
|
+
:password => config[:exec_passwd])
|
59
|
+
prog_spec = RbVmomi::VIM::GuestProgramSpec(:programPath => command,
|
60
|
+
:arguments => args,
|
61
|
+
:workingDirectory => get_config(:exec_dir))
|
62
|
+
|
63
|
+
gom.processManager.StartProgramInGuest(:vm => vm, :auth => guest_auth, :spec => prog_spec)
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,54 @@
|
|
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
|
+
banner "knife vsphere vm markastemplate VMNAME"
|
19
|
+
|
20
|
+
get_common_options
|
21
|
+
|
22
|
+
option :folder,
|
23
|
+
:long => "--folder FOLDER",
|
24
|
+
:description => "The folder which contains the VM"
|
25
|
+
|
26
|
+
def run
|
27
|
+
$stdout.sync = true
|
28
|
+
|
29
|
+
vmname = @name_args[0]
|
30
|
+
if vmname.nil?
|
31
|
+
show_usage
|
32
|
+
fatal_exit("You must specify a virtual machine name")
|
33
|
+
end
|
34
|
+
config[:chef_node_name] = vmname unless config[:chef_node_name]
|
35
|
+
config[:vmname] = vmname
|
36
|
+
|
37
|
+
if get_config(:bootstrap) && get_config(:distro) && !@@chef_config_dir
|
38
|
+
fatal_exit("Can't find .chef for bootstrap files. chdir to a location with a .chef directory and try again")
|
39
|
+
end
|
40
|
+
|
41
|
+
vim = get_vim_connection
|
42
|
+
|
43
|
+
dc = get_datacenter
|
44
|
+
|
45
|
+
src_folder = find_folder(get_config(:folder)) || dc.vmFolder
|
46
|
+
|
47
|
+
vm = find_in_folder(src_folder, RbVmomi::VIM::VirtualMachine, config[:vmname]) or
|
48
|
+
abort "VM not found"
|
49
|
+
|
50
|
+
puts "Marking VM #{vmname} as template"
|
51
|
+
vm.MarkAsTemplate()
|
52
|
+
puts "Finished marking VM #{vmname} as template"
|
53
|
+
end
|
54
|
+
end
|
@@ -1,129 +1,129 @@
|
|
1
|
-
#
|
2
|
-
# License:: Apache License, Version 2.0
|
3
|
-
#
|
4
|
-
|
5
|
-
require 'chef/knife'
|
6
|
-
require 'chef/knife/base_vsphere_command'
|
7
|
-
require 'rbvmomi'
|
8
|
-
require 'netaddr'
|
9
|
-
|
10
|
-
|
11
|
-
# Manage snapshots of a virtual machine
|
12
|
-
class Chef::Knife::VsphereVmSnapshot < Chef::Knife::BaseVsphereCommand
|
13
|
-
|
14
|
-
banner "knife vsphere vm snapshot VMNAME (options)"
|
15
|
-
|
16
|
-
get_common_options
|
17
|
-
|
18
|
-
option :list,
|
19
|
-
:long => "--list",
|
20
|
-
:description => "The current tree of snapshots"
|
21
|
-
|
22
|
-
option :create_new_snapshot,
|
23
|
-
:long => "--create SNAPSHOT",
|
24
|
-
:description => "Create a new snapshot off of the current snapshot."
|
25
|
-
|
26
|
-
option :remove_named_snapshot,
|
27
|
-
:long => "--remove SNAPSHOT",
|
28
|
-
:description => "Remove a named snapshot."
|
29
|
-
|
30
|
-
option :revert_snapshot,
|
31
|
-
:long => "--revert SNAPSHOT",
|
32
|
-
:description => "Revert to a named snapshot."
|
33
|
-
|
34
|
-
option :revert_current_snapshot,
|
35
|
-
:long => "--revert-current",
|
36
|
-
:description => "Revert to current snapshot.",
|
37
|
-
:boolean => false
|
38
|
-
|
39
|
-
option :power,
|
40
|
-
:long => "--start",
|
41
|
-
:description => "Indicates whether to start the VM after a successful revert",
|
42
|
-
:boolean => false
|
43
|
-
|
44
|
-
def run
|
45
|
-
|
46
|
-
$stdout.sync = true
|
47
|
-
|
48
|
-
vmname = @name_args[0]
|
49
|
-
if vmname.nil?
|
50
|
-
show_usage
|
51
|
-
ui.fatal("You must specify a virtual machine name")
|
52
|
-
exit 1
|
53
|
-
end
|
54
|
-
|
55
|
-
vim = get_vim_connection
|
56
|
-
|
57
|
-
baseFolder = find_folder(get_config(:folder));
|
58
|
-
|
59
|
-
vm = find_in_folder(baseFolder, RbVmomi::VIM::VirtualMachine, vmname) or
|
60
|
-
abort "VM #{vmname} not found"
|
61
|
-
|
62
|
-
if vm.snapshot
|
63
|
-
snapshot_list = vm.snapshot.rootSnapshotList
|
64
|
-
current_snapshot = vm.snapshot.currentSnapshot
|
65
|
-
end
|
66
|
-
|
67
|
-
if config[:list] && vm.snapshot
|
68
|
-
puts "Current snapshot tree: "
|
69
|
-
puts "#{vmname}"
|
70
|
-
snapshot_list.each { |i| puts display_node(i, current_snapshot) }
|
71
|
-
end
|
72
|
-
|
73
|
-
if config[:create_new_snapshot]
|
74
|
-
vm.CreateSnapshot_Task(:name => config[:create_new_snapshot], :description => "", :memory => false, :quiesce => false)
|
75
|
-
end
|
76
|
-
|
77
|
-
if config[:remove_named_snapshot]
|
78
|
-
ss_name = config[:remove_named_snapshot]
|
79
|
-
snapshot = find_node(snapshot_list, ss_name)
|
80
|
-
puts "Found snapshot #{ss_name} removing."
|
81
|
-
snapshot.RemoveSnapshot_Task(:removeChildren => false)
|
82
|
-
end
|
83
|
-
|
84
|
-
if config[:revert_current_snapshot]
|
85
|
-
puts "Reverting to Current Snapshot"
|
86
|
-
vm.RevertToCurrentSnapshot_Task(:suppressPowerOn => false).wait_for_completion
|
87
|
-
if get_config(:power)
|
88
|
-
vm.PowerOnVM_Task.wait_for_completion
|
89
|
-
puts "Powered on virtual machine #{vmname}"
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
if config[:revert_snapshot]
|
94
|
-
ss_name = config[:revert_snapshot]
|
95
|
-
snapshot = find_node(snapshot_list, ss_name)
|
96
|
-
snapshot.RevertToSnapshot_Task(:suppressPowerOn => false).wait_for_completion
|
97
|
-
if get_config(:power)
|
98
|
-
vm.PowerOnVM_Task.wait_for_completion
|
99
|
-
puts "Powered on virtual machine #{vmname}"
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
def find_node(tree, name)
|
105
|
-
snapshot = nil
|
106
|
-
tree.each do |node|
|
107
|
-
if node.name == name
|
108
|
-
snapshot = node.snapshot
|
109
|
-
elsif !node.childSnapshotList.empty?
|
110
|
-
snapshot = find_node(node.childSnapshotList, name)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
return snapshot
|
114
|
-
end
|
115
|
-
|
116
|
-
def display_node(node, current, shift=1)
|
117
|
-
out = ""
|
118
|
-
out << "+--"*shift
|
119
|
-
if node.snapshot == current
|
120
|
-
out << "#{ui.color(node.name, :cyan)}" << "\n"
|
121
|
-
else
|
122
|
-
out << "#{node.name}" << "\n"
|
123
|
-
end
|
124
|
-
if !node.childSnapshotList.empty?
|
125
|
-
node.childSnapshotList.each { |item| out << display_node(item, current, shift+1) }
|
126
|
-
end
|
127
|
-
out
|
128
|
-
end
|
129
|
-
end
|
1
|
+
#
|
2
|
+
# License:: Apache License, Version 2.0
|
3
|
+
#
|
4
|
+
|
5
|
+
require 'chef/knife'
|
6
|
+
require 'chef/knife/base_vsphere_command'
|
7
|
+
require 'rbvmomi'
|
8
|
+
require 'netaddr'
|
9
|
+
|
10
|
+
|
11
|
+
# Manage snapshots of a virtual machine
|
12
|
+
class Chef::Knife::VsphereVmSnapshot < Chef::Knife::BaseVsphereCommand
|
13
|
+
|
14
|
+
banner "knife vsphere vm snapshot VMNAME (options)"
|
15
|
+
|
16
|
+
get_common_options
|
17
|
+
|
18
|
+
option :list,
|
19
|
+
:long => "--list",
|
20
|
+
:description => "The current tree of snapshots"
|
21
|
+
|
22
|
+
option :create_new_snapshot,
|
23
|
+
:long => "--create SNAPSHOT",
|
24
|
+
:description => "Create a new snapshot off of the current snapshot."
|
25
|
+
|
26
|
+
option :remove_named_snapshot,
|
27
|
+
:long => "--remove SNAPSHOT",
|
28
|
+
:description => "Remove a named snapshot."
|
29
|
+
|
30
|
+
option :revert_snapshot,
|
31
|
+
:long => "--revert SNAPSHOT",
|
32
|
+
:description => "Revert to a named snapshot."
|
33
|
+
|
34
|
+
option :revert_current_snapshot,
|
35
|
+
:long => "--revert-current",
|
36
|
+
:description => "Revert to current snapshot.",
|
37
|
+
:boolean => false
|
38
|
+
|
39
|
+
option :power,
|
40
|
+
:long => "--start",
|
41
|
+
:description => "Indicates whether to start the VM after a successful revert",
|
42
|
+
:boolean => false
|
43
|
+
|
44
|
+
def run
|
45
|
+
|
46
|
+
$stdout.sync = true
|
47
|
+
|
48
|
+
vmname = @name_args[0]
|
49
|
+
if vmname.nil?
|
50
|
+
show_usage
|
51
|
+
ui.fatal("You must specify a virtual machine name")
|
52
|
+
exit 1
|
53
|
+
end
|
54
|
+
|
55
|
+
vim = get_vim_connection
|
56
|
+
|
57
|
+
baseFolder = find_folder(get_config(:folder));
|
58
|
+
|
59
|
+
vm = find_in_folder(baseFolder, RbVmomi::VIM::VirtualMachine, vmname) or
|
60
|
+
abort "VM #{vmname} not found"
|
61
|
+
|
62
|
+
if vm.snapshot
|
63
|
+
snapshot_list = vm.snapshot.rootSnapshotList
|
64
|
+
current_snapshot = vm.snapshot.currentSnapshot
|
65
|
+
end
|
66
|
+
|
67
|
+
if config[:list] && vm.snapshot
|
68
|
+
puts "Current snapshot tree: "
|
69
|
+
puts "#{vmname}"
|
70
|
+
snapshot_list.each { |i| puts display_node(i, current_snapshot) }
|
71
|
+
end
|
72
|
+
|
73
|
+
if config[:create_new_snapshot]
|
74
|
+
vm.CreateSnapshot_Task(:name => config[:create_new_snapshot], :description => "", :memory => false, :quiesce => false)
|
75
|
+
end
|
76
|
+
|
77
|
+
if config[:remove_named_snapshot]
|
78
|
+
ss_name = config[:remove_named_snapshot]
|
79
|
+
snapshot = find_node(snapshot_list, ss_name)
|
80
|
+
puts "Found snapshot #{ss_name} removing."
|
81
|
+
snapshot.RemoveSnapshot_Task(:removeChildren => false)
|
82
|
+
end
|
83
|
+
|
84
|
+
if config[:revert_current_snapshot]
|
85
|
+
puts "Reverting to Current Snapshot"
|
86
|
+
vm.RevertToCurrentSnapshot_Task(:suppressPowerOn => false).wait_for_completion
|
87
|
+
if get_config(:power)
|
88
|
+
vm.PowerOnVM_Task.wait_for_completion
|
89
|
+
puts "Powered on virtual machine #{vmname}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
if config[:revert_snapshot]
|
94
|
+
ss_name = config[:revert_snapshot]
|
95
|
+
snapshot = find_node(snapshot_list, ss_name)
|
96
|
+
snapshot.RevertToSnapshot_Task(:suppressPowerOn => false).wait_for_completion
|
97
|
+
if get_config(:power)
|
98
|
+
vm.PowerOnVM_Task.wait_for_completion
|
99
|
+
puts "Powered on virtual machine #{vmname}"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def find_node(tree, name)
|
105
|
+
snapshot = nil
|
106
|
+
tree.each do |node|
|
107
|
+
if node.name == name
|
108
|
+
snapshot = node.snapshot
|
109
|
+
elsif !node.childSnapshotList.empty?
|
110
|
+
snapshot = find_node(node.childSnapshotList, name)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
return snapshot
|
114
|
+
end
|
115
|
+
|
116
|
+
def display_node(node, current, shift=1)
|
117
|
+
out = ""
|
118
|
+
out << "+--"*shift
|
119
|
+
if node.snapshot == current
|
120
|
+
out << "#{ui.color(node.name, :cyan)}" << "\n"
|
121
|
+
else
|
122
|
+
out << "#{node.name}" << "\n"
|
123
|
+
end
|
124
|
+
if !node.childSnapshotList.empty?
|
125
|
+
node.childSnapshotList.each { |item| out << display_node(item, current, shift+1) }
|
126
|
+
end
|
127
|
+
out
|
128
|
+
end
|
129
|
+
end
|