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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/lib/chef/knife/base_vsphere_command.rb +383 -371
  3. data/lib/chef/knife/customization_helper.rb +40 -0
  4. data/lib/chef/knife/vsphere_cluster_list.rb +47 -0
  5. data/lib/chef/knife/vsphere_cpu_ratio.rb +41 -45
  6. data/lib/chef/knife/vsphere_customization_list.rb +24 -29
  7. data/lib/chef/knife/vsphere_datastore_list.rb +68 -72
  8. data/lib/chef/knife/vsphere_datastore_maxfree.rb +48 -49
  9. data/lib/chef/knife/vsphere_datastorecluster_list.rb +66 -71
  10. data/lib/chef/knife/vsphere_datastorecluster_maxfree.rb +75 -84
  11. data/lib/chef/knife/vsphere_folder_list.rb +28 -30
  12. data/lib/chef/knife/vsphere_hosts_list.rb +42 -42
  13. data/lib/chef/knife/vsphere_pool_list.rb +46 -48
  14. data/lib/chef/knife/vsphere_pool_query.rb +58 -58
  15. data/lib/chef/knife/vsphere_template_list.rb +30 -32
  16. data/lib/chef/knife/vsphere_vlan_create.rb +51 -0
  17. data/lib/chef/knife/vsphere_vlan_list.rb +35 -37
  18. data/lib/chef/knife/vsphere_vm_clone.rb +834 -581
  19. data/lib/chef/knife/vsphere_vm_config.rb +48 -46
  20. data/lib/chef/knife/vsphere_vm_delete.rb +70 -66
  21. data/lib/chef/knife/vsphere_vm_execute.rb +62 -66
  22. data/lib/chef/knife/vsphere_vm_list.rb +57 -61
  23. data/lib/chef/knife/vsphere_vm_markastemplate.rb +48 -54
  24. data/lib/chef/knife/vsphere_vm_migrate.rb +73 -0
  25. data/lib/chef/knife/vsphere_vm_move.rb +88 -0
  26. data/lib/chef/knife/vsphere_vm_net.rb +57 -0
  27. data/lib/chef/knife/vsphere_vm_property_get.rb +44 -46
  28. data/lib/chef/knife/vsphere_vm_property_set.rb +83 -84
  29. data/lib/chef/knife/vsphere_vm_query.rb +48 -48
  30. data/lib/chef/knife/vsphere_vm_snapshot.rb +124 -130
  31. data/lib/chef/knife/vsphere_vm_state.rb +122 -127
  32. data/lib/chef/knife/vsphere_vm_toolsconfig.rb +54 -52
  33. data/lib/chef/knife/vsphere_vm_vmdk_add.rb +234 -241
  34. data/lib/chef/knife/vsphere_vm_wait_sysprep.rb +54 -0
  35. data/lib/knife-vsphere/version.rb +3 -4
  36. metadata +43 -15
  37. data/lib/chef/knife/vshpere_vm_migrate.rb +0 -80
  38. data/lib/chef/knife/vshpere_vm_move.rb +0 -92
  39. data/lib/chef/knife/vshpere_vm_net.rb +0 -57
@@ -1,48 +1,48 @@
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::VsphereVmQuery < Chef::Knife::BaseVsphereCommand
10
- banner "knife vsphere vm query VMNAME QUERY. See \"http://pubs.vmware.com/vi3/sdk/ReferenceGuide/vim.VirtualMachine.html\" for allowed QUERY values."
11
-
12
- get_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
- query_string = @name_args[1]
23
- if query_string.nil?
24
- show_usage
25
- fatal_exit("You must specify a QUERY value (e.g. guest.ipAddress or network[0].name)")
26
- end
27
-
28
- vim = get_vim_connection
29
-
30
- dc = get_datacenter
31
- folder = find_folder(get_config(:folder)) || dc.vmFolder
32
-
33
- vm = traverse_folders_for_vm(folder, vmname) or abort "VM #{vmname} not found"
34
-
35
- # split QUERY by dots, and walk the object model
36
- query = query_string.split '.'
37
- result = vm
38
- query.each do |part|
39
- message, index = part.split(/[\[\]]/)
40
- unless result.respond_to? message.to_sym
41
- fatal_exit("\"#{query_string}\" not recognized.")
42
- end
43
-
44
- result = index ? result.send(message)[index.to_i] : result.send(message)
45
- end
46
- puts result
47
- end
48
- 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::VsphereVmQuery < Chef::Knife::BaseVsphereCommand
10
+ banner "knife vsphere vm query VMNAME QUERY. See \"http://pubs.vmware.com/vi3/sdk/ReferenceGuide/vim.VirtualMachine.html\" for allowed QUERY values."
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
+ query_string = @name_args[1]
23
+ if query_string.nil?
24
+ show_usage
25
+ fatal_exit('You must specify a QUERY value (e.g. guest.ipAddress or network[0].name)')
26
+ end
27
+
28
+ vim_connection
29
+
30
+ dc = datacenter
31
+ folder = find_folder(get_config(:folder)) || dc.vmFolder
32
+
33
+ vm = traverse_folders_for_vm(folder, vmname) || abort("VM #{vmname} not found")
34
+
35
+ # split QUERY by dots, and walk the object model
36
+ query = query_string.split '.'
37
+ result = vm
38
+ query.each do |part|
39
+ message, index = part.split(/[\[\]]/)
40
+ unless result.respond_to? message.to_sym
41
+ fatal_exit("\"#{query_string}\" not recognized.")
42
+ end
43
+
44
+ result = index ? result.send(message)[index.to_i] : result.send(message)
45
+ end
46
+ puts result
47
+ end
48
+ end
@@ -1,130 +1,124 @@
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
- break
110
- elsif !node.childSnapshotList.empty?
111
- snapshot = find_node(node.childSnapshotList, name)
112
- end
113
- end
114
- return snapshot
115
- end
116
-
117
- def display_node(node, current, shift=1)
118
- out = ""
119
- out << "+--"*shift
120
- if node.snapshot == current
121
- out << "#{ui.color(node.name, :cyan)}" << "\n"
122
- else
123
- out << "#{node.name}" << "\n"
124
- end
125
- if !node.childSnapshotList.empty?
126
- node.childSnapshotList.each { |item| out << display_node(item, current, shift+1) }
127
- end
128
- out
129
- end
130
- 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
+ # Manage snapshots of a virtual machine
11
+ class Chef::Knife::VsphereVmSnapshot < Chef::Knife::BaseVsphereCommand
12
+ banner 'knife vsphere vm snapshot VMNAME (options)'
13
+
14
+ common_options
15
+
16
+ option :list,
17
+ long: '--list',
18
+ description: 'The current tree of snapshots'
19
+
20
+ option :create_new_snapshot,
21
+ long: '--create SNAPSHOT',
22
+ description: 'Create a new snapshot off of the current snapshot.'
23
+
24
+ option :remove_named_snapshot,
25
+ long: '--remove SNAPSHOT',
26
+ description: 'Remove a named snapshot.'
27
+
28
+ option :revert_snapshot,
29
+ long: '--revert SNAPSHOT',
30
+ description: 'Revert to a named snapshot.'
31
+
32
+ option :revert_current_snapshot,
33
+ long: '--revert-current',
34
+ description: 'Revert to current snapshot.',
35
+ boolean: false
36
+
37
+ option :power,
38
+ long: '--start',
39
+ description: 'Indicates whether to start the VM after a successful revert',
40
+ boolean: false
41
+
42
+ def run
43
+ $stdout.sync = true
44
+
45
+ vmname = @name_args[0]
46
+ if vmname.nil?
47
+ show_usage
48
+ ui.fatal('You must specify a virtual machine name')
49
+ exit 1
50
+ end
51
+
52
+ vim_connection
53
+
54
+ base_folder = find_folder(get_config(:folder))
55
+
56
+ vm = find_in_folder(base_folder, RbVmomi::VIM::VirtualMachine, vmname) || abort("VM #{vmname} not found")
57
+
58
+ if vm.snapshot
59
+ snapshot_list = vm.snapshot.rootSnapshotList
60
+ current_snapshot = vm.snapshot.currentSnapshot
61
+ end
62
+
63
+ if config[:list] && vm.snapshot
64
+ puts 'Current snapshot tree: '
65
+ puts "#{vmname}"
66
+ snapshot_list.each { |i| puts display_node(i, current_snapshot) }
67
+ end
68
+
69
+ if config[:create_new_snapshot]
70
+ vm.CreateSnapshot_Task(name: config[:create_new_snapshot], description: '', memory: false, quiesce: false)
71
+ end
72
+
73
+ if config[:remove_named_snapshot]
74
+ ss_name = config[:remove_named_snapshot]
75
+ snapshot = find_node(snapshot_list, ss_name)
76
+ puts "Found snapshot #{ss_name} removing."
77
+ snapshot.RemoveSnapshot_Task(removeChildren: false)
78
+ end
79
+
80
+ if config[:revert_current_snapshot]
81
+ puts 'Reverting to Current Snapshot'
82
+ vm.RevertToCurrentSnapshot_Task(suppressPowerOn: false).wait_for_completion
83
+ if get_config(:power)
84
+ vm.PowerOnVM_Task.wait_for_completion
85
+ puts "Powered on virtual machine #{vmname}"
86
+ end
87
+ end
88
+
89
+ return unless config[:revert_snapshot]
90
+ ss_name = config[:revert_snapshot]
91
+ snapshot = find_node(snapshot_list, ss_name)
92
+ snapshot.RevertToSnapshot_Task(suppressPowerOn: false).wait_for_completion
93
+ return unless get_config(:power)
94
+ vm.PowerOnVM_Task.wait_for_completion
95
+ puts "Powered on virtual machine #{vmname}"
96
+ end
97
+
98
+ def find_node(tree, name)
99
+ snapshot = nil
100
+ tree.each do |node|
101
+ if node.name == name
102
+ snapshot = node.snapshot
103
+ break
104
+ elsif !node.childSnapshotList.empty?
105
+ snapshot = find_node(node.childSnapshotList, name)
106
+ end
107
+ end
108
+ snapshot
109
+ end
110
+
111
+ def display_node(node, current, shift = 1)
112
+ out = ''
113
+ out << '+--' * shift
114
+ if node.snapshot == current
115
+ out << "#{ui.color(node.name, :cyan)}" << "\n"
116
+ else
117
+ out << "#{node.name}" << "\n"
118
+ end
119
+ unless node.childSnapshotList.empty?
120
+ node.childSnapshotList.each { |item| out << display_node(item, current, shift + 1) }
121
+ end
122
+ out
123
+ end
124
+ end
@@ -1,127 +1,122 @@
1
- #
2
- # Author:: Ezra Pagel (<ezra@cpan.org>)
3
- # License:: Apache License, Version 2.0
4
- #
5
-
6
- require 'chef/knife'
7
- require 'chef/knife/base_vsphere_command'
8
- require 'rbvmomi'
9
- require 'netaddr'
10
-
11
- PsOn = 'poweredOn'
12
- PsOff = 'poweredOff'
13
- PsSuspended = 'suspended'
14
-
15
- PowerStates = {
16
- PsOn => 'powered on',
17
- PsOff => 'powered off',
18
- PsSuspended => 'suspended'
19
- }
20
-
21
- # Manage power state of a virtual machine
22
- class Chef::Knife::VsphereVmState < Chef::Knife::BaseVsphereCommand
23
-
24
- banner "knife vsphere vm state VMNAME (options)"
25
-
26
- get_common_options
27
-
28
- option :state,
29
- :short => "-s STATE",
30
- :long => "--state STATE",
31
- :description => "The power state to transition the VM into; one of on|off|suspended"
32
-
33
- option :wait_port,
34
- :short => "-w PORT",
35
- :long => "--wait-port PORT",
36
- :description => "Wait for VM to be accessible on a port"
37
-
38
- option :shutdown,
39
- :short => "-g",
40
- :long => "--shutdown",
41
- :description => "Guest OS shutdown"
42
-
43
- option :recursive,
44
- :short => "-r",
45
- :long => "--recursive",
46
- :description => "Search all folders"
47
-
48
- def run
49
-
50
- $stdout.sync = true
51
-
52
- vmname = @name_args[0]
53
- if vmname.nil?
54
- show_usage
55
- ui.fatal("You must specify a virtual machine name")
56
- exit 1
57
- end
58
-
59
- vim = get_vim_connection
60
-
61
- if get_config(:recursive)
62
- vms = get_vms(vmname)
63
- if vms.length > 1
64
- abort "More than one VM with name #{vmname} found:\n" + vms.map{ |vm| get_path_to_object(vm) }.join("\n")
65
- end
66
- if vms.length == 0
67
- abort "VM #{vmname} not found"
68
- end
69
- vm = vms[0]
70
- else
71
- baseFolder = find_folder(get_config(:folder));
72
-
73
- vm = find_in_folder(baseFolder, RbVmomi::VIM::VirtualMachine, vmname) or
74
- abort "VM #{vmname} not found"
75
- end
76
-
77
- state = vm.runtime.powerState
78
-
79
- if config[:state].nil?
80
- puts "VM #{vmname} is currently " + PowerStates[vm.runtime.powerState]
81
- else
82
-
83
- case config[:state]
84
- when 'on'
85
- if state == PsOn
86
- puts "Virtual machine #{vmname} was already powered on"
87
- else
88
- vm.PowerOnVM_Task.wait_for_completion
89
- puts "Powered on virtual machine #{vmname}"
90
- end
91
- when 'off'
92
- if state == PsOff
93
- puts "Virtual machine #{vmname} was already powered off"
94
- else
95
- if get_config(:shutdown)
96
- vm.ShutdownGuest
97
- print "Waiting for virtual machine #{vmname} to shut down..."
98
- until vm.runtime.powerState == PsOff do
99
- sleep 2
100
- print "."
101
- end
102
- puts "done"
103
- else
104
- vm.PowerOffVM_Task.wait_for_completion
105
- puts "Powered off virtual machine #{vmname}"
106
- end
107
- end
108
- when 'suspend'
109
- if state == PowerStates['suspended']
110
- puts "Virtual machine #{vmname} was already suspended"
111
- else
112
- vm.SuspendVM_Task.wait_for_completion
113
- puts "Suspended virtual machine #{vmname}"
114
- end
115
- when 'reset'
116
- vm.ResetVM_Task.wait_for_completion
117
- puts "Reset virtual machine #{vmname}"
118
- end
119
-
120
- if get_config(:wait_port)
121
- print "Waiting for port #{get_config(:wait_port)}..."
122
- print "." until tcp_test_port_vm(vm, get_config(:wait_port))
123
- puts "done"
124
- end
125
- end
126
- end
127
- end
1
+ #
2
+ # Author:: Ezra Pagel (<ezra@cpan.org>)
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+
6
+ require 'chef/knife'
7
+ require 'chef/knife/base_vsphere_command'
8
+ require 'rbvmomi'
9
+ require 'netaddr'
10
+
11
+ PS_ON = 'poweredOn'
12
+ PS_OFF = 'poweredOff'
13
+ PS_SUSPENDED = 'suspended'
14
+
15
+ POWER_STATES = {
16
+ PS_ON => 'powered on',
17
+ PS_OFF => 'powered off',
18
+ PS_SUSPENDED => 'suspended'
19
+ }
20
+
21
+ # Manage power state of a virtual machine
22
+ class Chef::Knife::VsphereVmState < Chef::Knife::BaseVsphereCommand
23
+ banner 'knife vsphere vm state VMNAME (options)'
24
+
25
+ common_options
26
+
27
+ option :state,
28
+ short: '-s STATE',
29
+ long: '--state STATE',
30
+ description: 'The power state to transition the VM into; one of on|off|suspended'
31
+
32
+ option :wait_port,
33
+ short: '-w PORT',
34
+ long: '--wait-port PORT',
35
+ description: 'Wait for VM to be accessible on a port'
36
+
37
+ option :shutdown,
38
+ short: '-g',
39
+ long: '--shutdown',
40
+ description: 'Guest OS shutdown'
41
+
42
+ option :recursive,
43
+ short: '-r',
44
+ long: '--recursive',
45
+ description: 'Search all folders'
46
+
47
+ def run
48
+ $stdout.sync = true
49
+
50
+ vmname = @name_args[0]
51
+ if vmname.nil?
52
+ show_usage
53
+ ui.fatal('You must specify a virtual machine name')
54
+ exit 1
55
+ end
56
+
57
+ vim_connection
58
+
59
+ if get_config(:recursive)
60
+ vms = get_vms(vmname)
61
+ if vms.length > 1
62
+ abort "More than one VM with name #{vmname} found:\n" + vms.map { |vm| get_path_to_object(vm) }.join("\n")
63
+ end
64
+ abort "VM #{vmname} not found" if vms.length == 0
65
+ vm = vms[0]
66
+ else
67
+ base_folder = find_folder(get_config(:folder))
68
+
69
+ vm = find_in_folder(base_folder, RbVmomi::VIM::VirtualMachine, vmname) || abort("VM #{vmname} not found")
70
+ end
71
+
72
+ state = vm.runtime.powerState
73
+
74
+ if config[:state].nil?
75
+ puts "VM #{vmname} is currently " + POWER_STATES[vm.runtime.powerState]
76
+ else
77
+
78
+ case config[:state]
79
+ when 'on'
80
+ if state == PS_ON
81
+ puts "Virtual machine #{vmname} was already powered on"
82
+ else
83
+ vm.PowerOnVM_Task.wait_for_completion
84
+ puts "Powered on virtual machine #{vmname}"
85
+ end
86
+ when 'off'
87
+ if state == PS_OFF
88
+ puts "Virtual machine #{vmname} was already powered off"
89
+ else
90
+ if get_config(:shutdown)
91
+ vm.ShutdownGuest
92
+ print "Waiting for virtual machine #{vmname} to shut down..."
93
+ until vm.runtime.powerState == PS_OFF
94
+ sleep 2
95
+ print '.'
96
+ end
97
+ puts 'done'
98
+ else
99
+ vm.PowerOffVM_Task.wait_for_completion
100
+ puts "Powered off virtual machine #{vmname}"
101
+ end
102
+ end
103
+ when 'suspend'
104
+ if state == POWER_STATES['suspended']
105
+ puts "Virtual machine #{vmname} was already suspended"
106
+ else
107
+ vm.SuspendVM_Task.wait_for_completion
108
+ puts "Suspended virtual machine #{vmname}"
109
+ end
110
+ when 'reset'
111
+ vm.ResetVM_Task.wait_for_completion
112
+ puts "Reset virtual machine #{vmname}"
113
+ end
114
+
115
+ if get_config(:wait_port)
116
+ print "Waiting for port #{get_config(:wait_port)}..."
117
+ print '.' until tcp_test_port_vm(vm, get_config(:wait_port))
118
+ puts 'done'
119
+ end
120
+ end
121
+ end
122
+ end