knife-vsphere 2.1.1 → 2.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +5 -5
  2. data/lib/chef/knife/base_vsphere_command.rb +69 -70
  3. data/lib/chef/knife/customization_helper.rb +4 -4
  4. data/lib/chef/knife/search_helper.rb +16 -7
  5. data/lib/chef/knife/vsphere_cluster_list.rb +8 -8
  6. data/lib/chef/knife/vsphere_cpu_ratio.rb +4 -4
  7. data/lib/chef/knife/vsphere_customization_list.rb +3 -3
  8. data/lib/chef/knife/vsphere_datastore_file.rb +17 -17
  9. data/lib/chef/knife/vsphere_datastore_list.rb +11 -11
  10. data/lib/chef/knife/vsphere_datastore_maxfree.rb +14 -14
  11. data/lib/chef/knife/vsphere_datastorecluster_list.rb +7 -7
  12. data/lib/chef/knife/vsphere_datastorecluster_maxfree.rb +10 -10
  13. data/lib/chef/knife/vsphere_folder_list.rb +4 -4
  14. data/lib/chef/knife/vsphere_hosts_list.rb +10 -10
  15. data/lib/chef/knife/vsphere_pool_list.rb +5 -5
  16. data/lib/chef/knife/vsphere_pool_query.rb +7 -7
  17. data/lib/chef/knife/vsphere_pool_show.rb +8 -8
  18. data/lib/chef/knife/vsphere_template_list.rb +7 -7
  19. data/lib/chef/knife/vsphere_vlan_create.rb +8 -8
  20. data/lib/chef/knife/vsphere_vlan_list.rb +3 -3
  21. data/lib/chef/knife/vsphere_vm_cdrom.rb +27 -27
  22. data/lib/chef/knife/vsphere_vm_clone.rb +224 -214
  23. data/lib/chef/knife/vsphere_vm_config.rb +6 -6
  24. data/lib/chef/knife/vsphere_vm_delete.rb +17 -17
  25. data/lib/chef/knife/vsphere_vm_disk_extend.rb +11 -11
  26. data/lib/chef/knife/vsphere_vm_disk_list.rb +6 -6
  27. data/lib/chef/knife/vsphere_vm_execute.rb +14 -14
  28. data/lib/chef/knife/vsphere_vm_find.rb +87 -87
  29. data/lib/chef/knife/vsphere_vm_list.rb +12 -12
  30. data/lib/chef/knife/vsphere_vm_markastemplate.rb +5 -5
  31. data/lib/chef/knife/vsphere_vm_migrate.rb +20 -25
  32. data/lib/chef/knife/vsphere_vm_move.rb +17 -17
  33. data/lib/chef/knife/vsphere_vm_net.rb +8 -8
  34. data/lib/chef/knife/vsphere_vm_network_add.rb +22 -24
  35. data/lib/chef/knife/vsphere_vm_network_delete.rb +8 -8
  36. data/lib/chef/knife/vsphere_vm_network_list.rb +5 -5
  37. data/lib/chef/knife/vsphere_vm_network_set.rb +10 -10
  38. data/lib/chef/knife/vsphere_vm_property_get.rb +7 -7
  39. data/lib/chef/knife/vsphere_vm_property_set.rb +16 -16
  40. data/lib/chef/knife/vsphere_vm_show.rb +8 -8
  41. data/lib/chef/knife/vsphere_vm_snapshot.rb +35 -35
  42. data/lib/chef/knife/vsphere_vm_state.rb +31 -31
  43. data/lib/chef/knife/vsphere_vm_toolsconfig.rb +11 -11
  44. data/lib/chef/knife/vsphere_vm_vmdk_add.rb +32 -32
  45. data/lib/chef/knife/vsphere_vm_vnc_set.rb +15 -15
  46. data/lib/chef/knife/vsphere_vm_wait_sysprep.rb +10 -11
  47. data/lib/knife-vsphere/version.rb +1 -1
  48. metadata +5 -89
@@ -3,15 +3,15 @@
3
3
  # License:: Apache License, Version 2.0
4
4
  #
5
5
 
6
- require 'chef/knife'
7
- require 'chef/knife/base_vsphere_command'
8
- require 'chef/knife/search_helper'
6
+ require "chef/knife"
7
+ require "chef/knife/base_vsphere_command"
8
+ require "chef/knife/search_helper"
9
9
 
10
10
  # Lists all known VM templates in the configured datacenter
11
11
  # VsphereTemplatelist extends the BaseVspherecommand
12
12
  class Chef::Knife::VsphereTemplateList < Chef::Knife::BaseVsphereCommand
13
13
  include SearchHelper
14
- banner 'knife vsphere template list'
14
+ banner "knife vsphere template list"
15
15
 
16
16
  common_options
17
17
 
@@ -25,11 +25,11 @@ class Chef::Knife::VsphereTemplateList < Chef::Knife::BaseVsphereCommand
25
25
 
26
26
  vms = get_all_vm_objects(
27
27
  folder: get_config(:folder),
28
- properties: ['name', 'config.template']
29
- ).select { |vm| vm['config.template'] == true }
28
+ properties: ["name", "config.template"]
29
+ ).select { |vm| vm["config.template"] == true }
30
30
 
31
31
  vm_list = vms.map do |vm|
32
- { 'Template Name' => vm['name'] }
32
+ { "Template Name" => vm["name"] }
33
33
  end
34
34
 
35
35
  ui.output(vm_list)
@@ -1,16 +1,16 @@
1
- require 'chef/knife'
2
- require 'chef/knife/base_vsphere_command'
1
+ require "chef/knife"
2
+ require "chef/knife/base_vsphere_command"
3
3
 
4
4
  # Lists all known data stores in datacenter with sizes
5
5
  # VsphereVlanCreate extends BaseVspherecommand
6
6
  class Chef::Knife::VsphereVlanCreate < Chef::Knife::BaseVsphereCommand
7
- banner 'knife vsphere vlan create NAME VID'
7
+ banner "knife vsphere vlan create NAME VID"
8
8
 
9
9
  common_options
10
10
 
11
11
  option :switch,
12
- long: '--switch DVSNAME',
13
- description: 'The DVSwitch that will hold this VLAN'
12
+ long: "--switch DVSNAME",
13
+ description: "The DVSwitch that will hold this VLAN"
14
14
 
15
15
  # The main run method for vlan_create
16
16
  #
@@ -24,11 +24,11 @@ class Chef::Knife::VsphereVlanCreate < Chef::Knife::BaseVsphereCommand
24
24
  switch = if config[:switch]
25
25
  switches.find { |s| s.name == config[:switch] }
26
26
  else
27
- ui.warn 'Multiple switches found. Choosing the first switch. Use --switch to select a switch.' if switches.count > 1
27
+ ui.warn "Multiple switches found. Choosing the first switch. Use --switch to select a switch." if switches.count > 1
28
28
  switches.first
29
29
  end
30
30
 
31
- fatal_exit 'No switches found.' if switch.nil?
31
+ fatal_exit "No switches found." if switch.nil?
32
32
 
33
33
  ui.info "Found #{switch.name}" if log_verbose?
34
34
  switch.AddDVPortgroup_Task(spec: [add_port_spec(@name_args[0], @name_args[1])])
@@ -46,7 +46,7 @@ class Chef::Knife::VsphereVlanCreate < Chef::Knife::BaseVsphereCommand
46
46
  ),
47
47
  name: name,
48
48
  numPorts: 128,
49
- type: 'earlyBinding'
49
+ type: "earlyBinding"
50
50
  )
51
51
  pp spec if log_verbose?
52
52
  spec
@@ -14,13 +14,13 @@
14
14
  # TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15
15
  # PERFORMANCE OF THIS SOFTWARE
16
16
 
17
- require 'chef/knife'
18
- require 'chef/knife/base_vsphere_command'
17
+ require "chef/knife"
18
+ require "chef/knife/base_vsphere_command"
19
19
 
20
20
  # Lists all known data stores in datacenter with sizes
21
21
  # VsphereVlanlist extends the BaseVspherecommand
22
22
  class Chef::Knife::VsphereVlanList < Chef::Knife::BaseVsphereCommand
23
- banner 'knife vsphere vlan list'
23
+ banner "knife vsphere vlan list"
24
24
 
25
25
  common_options
26
26
 
@@ -1,50 +1,50 @@
1
1
  # License:: Apache License, Version 2.0
2
2
 
3
- require 'chef/knife'
4
- require 'chef/knife/base_vsphere_command'
5
- require 'chef/knife/search_helper'
3
+ require "chef/knife"
4
+ require "chef/knife/base_vsphere_command"
5
+ require "chef/knife/search_helper"
6
6
 
7
7
  # VsphereVmCdrom extends the BaseVspherecommand
8
8
  class Chef::Knife::VsphereVmCdrom < Chef::Knife::BaseVsphereCommand
9
9
  include SearchHelper
10
- banner 'knife vsphere vm cdrom VMNAME (options)'
10
+ banner "knife vsphere vm cdrom VMNAME (options)"
11
11
 
12
12
  # The empty device name.
13
- EMPTY_DEVICE_NAME = ''.freeze
13
+ EMPTY_DEVICE_NAME = "".freeze
14
14
 
15
15
  common_options
16
16
 
17
17
  option :datastore,
18
- long: '--datastore STORE',
19
- description: 'The datastore for an iso source'
18
+ long: "--datastore STORE",
19
+ description: "The datastore for an iso source"
20
20
 
21
21
  option :iso,
22
- long: '--iso ISO',
23
- description: 'The name and path of the ISO to attach'
22
+ long: "--iso ISO",
23
+ description: "The name and path of the ISO to attach"
24
24
 
25
25
  option :attach,
26
- short: '-a',
27
- long: '--attach',
28
- description: 'Attach the virtual cdrom to the VM',
26
+ short: "-a",
27
+ long: "--attach",
28
+ description: "Attach the virtual cdrom to the VM",
29
29
  boolean: true
30
30
 
31
31
  option :disconnect,
32
- long: '--disconnect',
33
- description: 'Disconnect the virtual cdrom from the VM',
32
+ long: "--disconnect",
33
+ description: "Disconnect the virtual cdrom from the VM",
34
34
  boolean: true
35
35
 
36
36
  option :on_boot,
37
- long: '--on_boot ONBOOT',
38
- description: 'False for Detached on boot or True for Attached on boot'
37
+ long: "--on_boot ONBOOT",
38
+ description: "False for Detached on boot or True for Attached on boot"
39
39
 
40
40
  option :client_device,
41
- long: '--client_device',
42
- description: 'Set the backing store to client-device'
41
+ long: "--client_device",
42
+ description: "Set the backing store to client-device"
43
43
 
44
44
  option :recursive,
45
- short: '-r',
46
- long: '--recursive',
47
- description: 'Search all folders'
45
+ short: "-r",
46
+ long: "--recursive",
47
+ description: "Search all folders"
48
48
 
49
49
  # The main run method for vm_cdrom
50
50
  #
@@ -54,20 +54,20 @@ class Chef::Knife::VsphereVmCdrom < Chef::Knife::BaseVsphereCommand
54
54
  vmname = @name_args[0]
55
55
  if vmname.nil?
56
56
  show_usage
57
- fatal_exit('You must specify a virtual machine name')
57
+ fatal_exit("You must specify a virtual machine name")
58
58
  end
59
59
 
60
60
  unless get_config(:attach) ^ get_config(:disconnect)
61
- fatal_exit('You must specify one of --attach or --disconnect')
61
+ fatal_exit("You must specify one of --attach or --disconnect")
62
62
  end
63
63
 
64
- fatal_exit 'You must specify the name and path of an ISO with --iso' if get_config(:attach) && !get_config(:iso)
65
- fatal_exit 'You must specify the datastore containing the ISO with --datastore' if get_config(:attach) && !get_config(:datastore)
64
+ fatal_exit "You must specify the name and path of an ISO with --iso" if get_config(:attach) && !get_config(:iso)
65
+ fatal_exit "You must specify the datastore containing the ISO with --datastore" if get_config(:attach) && !get_config(:datastore)
66
66
 
67
67
  vm = get_vm_by_name(vmname, get_config(:folder)) || fatal_exit("Could not find #{vmname}")
68
68
 
69
69
  cdrom_obj = vm.config.hardware.device.find { |hw| hw.class == RbVmomi::VIM::VirtualCdrom }
70
- fatal_exit 'Could not find a cd drive' unless cdrom_obj
70
+ fatal_exit "Could not find a cd drive" unless cdrom_obj
71
71
 
72
72
  backing = if get_config(:attach)
73
73
  RbVmomi::VIM::VirtualCdromIsoBackingInfo(
@@ -97,7 +97,7 @@ class Chef::Knife::VsphereVmCdrom < Chef::Knife::BaseVsphereCommand
97
97
  connected: get_config(:attach) || false,
98
98
  allowGuestControl: true
99
99
  )
100
- )
100
+ ),
101
101
  }]
102
102
  )
103
103
  end
@@ -6,225 +6,225 @@
6
6
  # License:: Apache License, Version 2.0
7
7
  #
8
8
 
9
- require 'chef/knife'
10
- require 'chef/knife/base_vsphere_command'
11
- require 'chef/knife/customization_helper'
12
- require 'chef/knife/search_helper'
13
- require 'chef/knife/winrm_base'
14
- require 'ipaddr'
15
- require 'netaddr'
16
- require 'securerandom'
9
+ require "chef/knife"
10
+ require "chef/knife/base_vsphere_command"
11
+ require "chef/knife/customization_helper"
12
+ require "chef/knife/search_helper"
13
+ require "chef/knife/winrm_base"
14
+ require "ipaddr"
15
+ require "netaddr"
16
+ require "securerandom"
17
17
 
18
18
  # VsphereVmClone extends the BaseVspherecommand
19
19
  class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
20
- banner 'knife vsphere vm clone VMNAME (options)'
20
+ banner "knife vsphere vm clone VMNAME (options)"
21
21
 
22
22
  # A AUTO_MAC for NIC?
23
- AUTO_MAC = 'auto'
23
+ AUTO_MAC = "auto".freeze
24
24
  # A NO IP for you to use!
25
- NO_IPS = ''
25
+ NO_IPS = "".freeze
26
26
  # a linklayer origin is an actual nic
27
- ORIGIN_IS_REAL_NIC = 'linklayer'.freeze
27
+ ORIGIN_IS_REAL_NIC = "linklayer".freeze
28
28
 
29
29
  include Chef::Knife::WinrmBase
30
30
  include CustomizationHelper
31
31
  include SearchHelper
32
32
  deps do
33
- require 'chef/json_compat'
34
- require 'chef/knife/bootstrap'
33
+ require "chef/json_compat"
34
+ require "chef/knife/bootstrap"
35
35
  Chef::Knife::Bootstrap.load_deps
36
36
  end
37
37
 
38
38
  common_options
39
39
 
40
40
  option :dest_folder,
41
- long: '--dest-folder FOLDER',
42
- description: 'The folder into which to put the cloned VM'
41
+ long: "--dest-folder FOLDER",
42
+ description: "The folder into which to put the cloned VM"
43
43
 
44
44
  option :datastore,
45
- long: '--datastore STORE',
46
- description: 'The datastore into which to put the cloned VM'
45
+ long: "--datastore STORE",
46
+ description: "The datastore into which to put the cloned VM"
47
47
 
48
48
  option :datastorecluster,
49
- long: '--datastorecluster STORE',
50
- description: 'The datastorecluster into which to put the cloned VM'
49
+ long: "--datastorecluster STORE",
50
+ description: "The datastorecluster into which to put the cloned VM"
51
51
 
52
52
  option :host,
53
- long: '--host HOST',
54
- description: 'The host into which to put the cloned VM'
53
+ long: "--host HOST",
54
+ description: "The host into which to put the cloned VM"
55
55
 
56
56
  option :resource_pool,
57
- long: '--resource-pool POOL',
58
- description: 'The resource pool or cluster into which to put the cloned VM'
57
+ long: "--resource-pool POOL",
58
+ description: "The resource pool or cluster into which to put the cloned VM"
59
59
 
60
60
  option :source_vm,
61
- long: '--template TEMPLATE',
62
- description: 'The source VM / Template to clone from'
61
+ long: "--template TEMPLATE",
62
+ description: "The source VM / Template to clone from"
63
63
 
64
64
  option :linked_clone,
65
- long: '--linked-clone',
66
- description: 'Indicates whether to use linked clones.',
65
+ long: "--linked-clone",
66
+ description: "Indicates whether to use linked clones.",
67
67
  boolean: false
68
68
 
69
69
  option :thin_provision,
70
- long: '--thin-provision',
71
- description: 'Indicates whether disk should be thin provisioned.',
70
+ long: "--thin-provision",
71
+ description: "Indicates whether disk should be thin provisioned.",
72
72
  boolean: true
73
73
 
74
74
  option :annotation,
75
- long: '--annotation TEXT',
76
- description: 'Add TEXT in Notes field from annotation'
75
+ long: "--annotation TEXT",
76
+ description: "Add TEXT in Notes field from annotation"
77
77
 
78
78
  option :customization_spec,
79
- long: '--cspec CUST_SPEC',
80
- description: 'The name of any customization specification to apply'
79
+ long: "--cspec CUST_SPEC",
80
+ description: "The name of any customization specification to apply"
81
81
 
82
82
  option :customization_plugin,
83
- long: '--cplugin CUST_PLUGIN_PATH',
84
- description: 'Path to plugin that implements KnifeVspherePlugin.customize_clone_spec and/or KnifeVspherePlugin.reconfig_vm'
83
+ long: "--cplugin CUST_PLUGIN_PATH",
84
+ description: "Path to plugin that implements KnifeVspherePlugin.customize_clone_spec and/or KnifeVspherePlugin.reconfig_vm"
85
85
 
86
86
  option :customization_plugin_data,
87
- long: '--cplugin-data CUST_PLUGIN_DATA',
88
- description: 'String of data to pass to the plugin. Use any format you wish.'
87
+ long: "--cplugin-data CUST_PLUGIN_DATA",
88
+ description: "String of data to pass to the plugin. Use any format you wish."
89
89
 
90
90
  option :customization_vlan,
91
- long: '--cvlan CUST_VLANS',
92
- description: 'Comma-delimited list of VLAN names for network adapters to join'
91
+ long: "--cvlan CUST_VLANS",
92
+ description: "Comma-delimited list of VLAN names for network adapters to join"
93
93
 
94
94
  option :customization_sw_uuid,
95
- long: '--sw-uuid SWITCH_UUIDS',
95
+ long: "--sw-uuid SWITCH_UUIDS",
96
96
  description: "Comma-delimited list of distributed virtual switch UUIDs for network adapter to connect, use 'auto' to automatically assign"
97
97
 
98
98
  option :customization_macs,
99
- long: '--cmacs CUST_MACS',
100
- description: 'Comma-delimited list of MAC addresses for network adapters',
99
+ long: "--cmacs CUST_MACS",
100
+ description: "Comma-delimited list of MAC addresses for network adapters",
101
101
  default: AUTO_MAC
102
102
 
103
103
  option :customization_ips,
104
- long: '--cips CUST_IPS',
105
- description: 'Comma-delimited list of CIDR IPs for customization',
104
+ long: "--cips CUST_IPS",
105
+ description: "Comma-delimited list of CIDR IPs for customization",
106
106
  default: NO_IPS
107
107
 
108
108
  option :customization_dns_ips,
109
- long: '--cdnsips CUST_DNS_IPS',
110
- description: 'Comma-delimited list of DNS IP addresses'
109
+ long: "--cdnsips CUST_DNS_IPS",
110
+ description: "Comma-delimited list of DNS IP addresses"
111
111
 
112
112
  option :customization_dns_suffixes,
113
- long: '--cdnssuffix CUST_DNS_SUFFIXES',
114
- description: 'Comma-delimited list of DNS search suffixes'
113
+ long: "--cdnssuffix CUST_DNS_SUFFIXES",
114
+ description: "Comma-delimited list of DNS search suffixes"
115
115
 
116
116
  option :customization_gw,
117
- long: '--cgw CUST_GW',
118
- description: 'CIDR IP of gateway for customization'
117
+ long: "--cgw CUST_GW",
118
+ description: "CIDR IP of gateway for customization"
119
119
 
120
120
  option :customization_hostname,
121
- long: '--chostname CUST_HOSTNAME',
122
- description: 'Unqualified hostname for customization'
121
+ long: "--chostname CUST_HOSTNAME",
122
+ description: "Unqualified hostname for customization"
123
123
 
124
124
  option :customization_domain,
125
- long: '--cdomain CUST_DOMAIN',
126
- description: 'Domain name for customization'
125
+ long: "--cdomain CUST_DOMAIN",
126
+ description: "Domain name for customization"
127
127
 
128
128
  option :customization_tz,
129
- long: '--ctz CUST_TIMEZONE',
129
+ long: "--ctz CUST_TIMEZONE",
130
130
  description: "Timezone invalid 'Area/Location' format"
131
131
 
132
132
  option :customization_cpucount,
133
- long: '--ccpu CUST_CPU_COUNT',
134
- description: 'Number of CPUs'
133
+ long: "--ccpu CUST_CPU_COUNT",
134
+ description: "Number of CPUs"
135
135
 
136
136
  option :customization_corespersocket,
137
- long: '--ccorespersocket CUST_CPU_CORES_PER_SOCKET',
138
- description: 'Number of CPU Cores per Socket'
137
+ long: "--ccorespersocket CUST_CPU_CORES_PER_SOCKET",
138
+ description: "Number of CPU Cores per Socket"
139
139
 
140
140
  option :customization_memory,
141
- long: '--cram CUST_MEMORY_GB',
142
- description: 'Gigabytes of RAM'
141
+ long: "--cram CUST_MEMORY_GB",
142
+ description: "Gigabytes of RAM"
143
143
 
144
144
  option :customization_memory_reservation,
145
- long: '--cram_reservation CUST_MEMORY_RESERVATION_GB',
146
- description: 'Gigabytes of RAM'
145
+ long: "--cram_reservation CUST_MEMORY_RESERVATION_GB",
146
+ description: "Gigabytes of RAM"
147
147
 
148
148
  option :power,
149
- long: '--start',
150
- description: 'Indicates whether to start the VM after a successful clone',
149
+ long: "--start",
150
+ description: "Indicates whether to start the VM after a successful clone",
151
151
  boolean: false
152
152
 
153
153
  option :bootstrap,
154
- long: '--bootstrap',
155
- description: 'Indicates whether to bootstrap the VM',
154
+ long: "--bootstrap",
155
+ description: "Indicates whether to bootstrap the VM",
156
156
  boolean: false
157
157
 
158
158
  option :environment,
159
- long: '--environment ENVIRONMENT',
160
- description: 'Environment to add the node to for bootstrapping'
159
+ long: "--environment ENVIRONMENT",
160
+ description: "Environment to add the node to for bootstrapping"
161
161
 
162
162
  option :fqdn,
163
- long: '--fqdn SERVER_FQDN',
164
- description: 'Fully qualified hostname for bootstrapping'
163
+ long: "--fqdn SERVER_FQDN",
164
+ description: "Fully qualified hostname for bootstrapping"
165
165
 
166
166
  option :bootstrap_msi_url,
167
- long: '--bootstrap-msi-url URL',
168
- description: 'Location of the Chef Client MSI. The default templates will prefer to download from this location.'
167
+ long: "--bootstrap-msi-url URL",
168
+ description: "Location of the Chef Client MSI. The default templates will prefer to download from this location."
169
169
 
170
170
  option :bootstrap_protocol,
171
- long: '--bootstrap-protocol protocol',
172
- description: 'Protocol to bootstrap windows servers. options: winrm/ssh',
171
+ long: "--bootstrap-protocol protocol",
172
+ description: "Protocol to bootstrap windows servers. options: winrm/ssh",
173
173
  proc: proc { |key| Chef::Config[:knife][:bootstrap_protocol] = key },
174
174
  default: nil
175
175
 
176
176
  option :ssh_user,
177
- short: '-x USERNAME',
178
- long: '--ssh-user USERNAME',
179
- description: 'The ssh username',
180
- default: 'root'
177
+ short: "-x USERNAME",
178
+ long: "--ssh-user USERNAME",
179
+ description: "The ssh username",
180
+ default: "root"
181
181
 
182
182
  option :ssh_password,
183
- short: '-P PASSWORD',
184
- long: '--ssh-password PASSWORD',
185
- description: 'The ssh password'
183
+ short: "-P PASSWORD",
184
+ long: "--ssh-password PASSWORD",
185
+ description: "The ssh password"
186
186
 
187
187
  option :ssh_port,
188
- short: '-p PORT',
189
- long: '--ssh-port PORT',
190
- description: 'The ssh port',
191
- default: '22'
188
+ short: "-p PORT",
189
+ long: "--ssh-port PORT",
190
+ description: "The ssh port",
191
+ default: "22"
192
192
 
193
193
  option :identity_file,
194
- short: '-i IDENTITY_FILE',
195
- long: '--identity-file IDENTITY_FILE',
196
- description: 'The SSH identity file used for authentication'
194
+ short: "-i IDENTITY_FILE",
195
+ long: "--identity-file IDENTITY_FILE",
196
+ description: "The SSH identity file used for authentication"
197
197
 
198
198
  option :chef_node_name,
199
- short: '-N NAME',
200
- long: '--node-name NAME',
201
- description: 'The Chef node name for your new node'
199
+ short: "-N NAME",
200
+ long: "--node-name NAME",
201
+ description: "The Chef node name for your new node"
202
202
 
203
203
  option :prerelease,
204
- long: '--prerelease',
205
- description: 'Install the pre-release chef gems',
204
+ long: "--prerelease",
205
+ description: "Install the pre-release chef gems",
206
206
  boolean: false
207
207
 
208
208
  option :bootstrap_version,
209
- long: '--bootstrap-version VERSION',
210
- description: 'The version of Chef to install',
209
+ long: "--bootstrap-version VERSION",
210
+ description: "The version of Chef to install",
211
211
  proc: proc { |v| Chef::Config[:knife][:bootstrap_version] = v }
212
212
 
213
213
  option :bootstrap_proxy,
214
- long: '--bootstrap-proxy PROXY_URL',
215
- description: 'The proxy server for the node being bootstrapped',
214
+ long: "--bootstrap-proxy PROXY_URL",
215
+ description: "The proxy server for the node being bootstrapped",
216
216
  proc: proc { |p| Chef::Config[:knife][:bootstrap_proxy] = p }
217
217
 
218
218
  option :bootstrap_vault_file,
219
- long: '--bootstrap-vault-file VAULT_FILE',
220
- description: 'A JSON file with a list of vault(s) and item(s) to be updated'
219
+ long: "--bootstrap-vault-file VAULT_FILE",
220
+ description: "A JSON file with a list of vault(s) and item(s) to be updated"
221
221
 
222
222
  option :bootstrap_vault_json,
223
- long: '--bootstrap-vault-json VAULT_JSON',
224
- description: 'A JSON string with the vault(s) and item(s) to be updated'
223
+ long: "--bootstrap-vault-json VAULT_JSON",
224
+ description: "A JSON string with the vault(s) and item(s) to be updated"
225
225
 
226
226
  option :bootstrap_vault_item,
227
- long: '--bootstrap-vault-item VAULT_ITEM',
227
+ long: "--bootstrap-vault-item VAULT_ITEM",
228
228
  description: 'A single vault and item to update as "vault:item"',
229
229
  proc: proc { |i|
230
230
  (vault, item) = i.split(/:/)
@@ -235,102 +235,113 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
235
235
  }
236
236
 
237
237
  option :distro,
238
- short: '-d DISTRO',
239
- long: '--distro DISTRO',
240
- description: 'Bootstrap a distro using a template; default is "chef-full"',
241
- proc: proc { |d| Chef::Config[:knife][:distro] = d },
242
- default: 'chef-full'
238
+ short: "-d DISTRO",
239
+ long: "--distro DISTRO",
240
+ description: "Bootstrap a distro using a template. [DEPRECATED] Use -t / --bootstrap-template option instead.",
241
+ proc: Proc.new { |v|
242
+ Chef::Log.fatal("[DEPRECATED] -d / --distro option is deprecated. Use --bootstrap-template option instead.")
243
+ v
244
+ }
243
245
 
244
246
  option :tags,
245
- long: '--tags TAGS',
246
- description: 'Comma separated list of tags to apply to the node',
247
+ long: "--tags TAGS",
248
+ description: "Comma separated list of tags to apply to the node",
247
249
  proc: ->(tags) { tags.split(/[\s,]+/) },
248
250
  default: []
249
251
 
252
+ option :bootstrap_template,
253
+ short: "-t TEMPLATE",
254
+ long: "--bootstrap-template TEMPLATE",
255
+ description: "Bootstrap Chef using a built-in or custom template. Set to the full path of an erb template or use one of the built-in templates."
256
+
250
257
  option :template_file,
251
- long: '--template-file TEMPLATE',
252
- description: 'Full path to location of template to use'
258
+ long: "--template-file TEMPLATE",
259
+ description: "Full path to location of template to use. [DEPRECATED] Use -t / --bootstrap-template option",
260
+ proc: Proc.new { |v|
261
+ Chef::Log.fatal("[DEPRECATED] --template-file option is deprecated. Use --bootstrap-template option instead.")
262
+ v
263
+ }
253
264
 
254
265
  option :run_list,
255
- short: '-r RUN_LIST',
256
- long: '--run-list RUN_LIST',
257
- description: 'Comma separated list of roles/recipes to apply',
258
- proc: -> (o) { o.split(/[\s,]+/) },
266
+ short: "-r RUN_LIST",
267
+ long: "--run-list RUN_LIST",
268
+ description: "Comma separated list of roles/recipes to apply",
269
+ proc: ->(o) { o.split(/[\s,]+/) },
259
270
  default: []
260
271
 
261
272
  option :secret_file,
262
- long: '--secret-file SECRET_FILE',
263
- description: 'A file containing the secret key to use to encrypt data bag item values',
273
+ long: "--secret-file SECRET_FILE",
274
+ description: "A file containing the secret key to use to encrypt data bag item values",
264
275
  proc: ->(secret_file) { Chef::Config[:knife][:secret_file] = secret_file }
265
276
 
266
277
  # rubocop:disable Style/Blocks
267
278
  option :hint,
268
- long: '--hint HINT_NAME[=HINT_FILE]',
269
- description: 'Specify Ohai Hint to be set on the bootstrap target. Use multiple --hint options to specify multiple hints.',
279
+ long: "--hint HINT_NAME[=HINT_FILE]",
280
+ description: "Specify Ohai Hint to be set on the bootstrap target. Use multiple --hint options to specify multiple hints.",
270
281
  proc: proc { |h|
271
282
  Chef::Config[:knife][:hints] ||= {}
272
- name, path = h.split('=')
283
+ name, path = h.split("=")
273
284
  Chef::Config[:knife][:hints][name] = path ? JSON.parse(::File.read(path)) : {}
274
285
  },
275
- default: ''
286
+ default: ""
276
287
  # rubocop:enable Style/Blocks
277
288
 
278
289
  option :no_host_key_verify,
279
- long: '--no-host-key-verify',
280
- description: 'Disable host key verification',
290
+ long: "--no-host-key-verify",
291
+ description: "Disable host key verification",
281
292
  boolean: true
282
293
 
283
294
  option :node_ssl_verify_mode,
284
- long: '--node-ssl-verify-mode [peer|none]',
285
- description: 'Whether or not to verify the SSL cert for all HTTPS requests when bootstrapping'
295
+ long: "--node-ssl-verify-mode [peer|none]",
296
+ description: "Whether or not to verify the SSL cert for all HTTPS requests when bootstrapping"
286
297
 
287
298
  option :first_boot_attributes,
288
- short: '-j JSON_ATTRIBS',
289
- long: '--json-attributes',
290
- description: 'A JSON string to be added to the first run of chef-client',
299
+ short: "-j JSON_ATTRIBS",
300
+ long: "--json-attributes",
301
+ description: "A JSON string to be added to the first run of chef-client",
291
302
  proc: ->(o) { JSON.parse(o) },
292
303
  default: {}
293
304
 
294
305
  option :disable_customization,
295
- long: '--disable-customization',
296
- description: 'Disable default customization',
306
+ long: "--disable-customization",
307
+ description: "Disable default customization",
297
308
  boolean: true,
298
309
  default: false
299
310
 
300
311
  option :log_level,
301
- short: '-l LEVEL',
302
- long: '--log_level',
303
- description: 'Set the log level (debug, info, warn, error, fatal) for chef-client',
312
+ short: "-l LEVEL",
313
+ long: "--log_level",
314
+ description: "Set the log level (debug, info, warn, error, fatal) for chef-client",
304
315
  proc: ->(l) { l.to_sym }
305
316
 
306
317
  option :mark_as_template,
307
- long: '--mark_as_template',
308
- description: 'Indicates whether to mark the new vm as a template',
318
+ long: "--mark_as_template",
319
+ description: "Indicates whether to mark the new vm as a template",
309
320
  boolean: false
310
321
 
311
322
  option :random_vmname,
312
- long: '--random-vmname',
313
- description: 'Creates a random VMNAME starts with vm-XXXXXXXX',
323
+ long: "--random-vmname",
324
+ description: "Creates a random VMNAME starts with vm-XXXXXXXX",
314
325
  boolean: false
315
326
 
316
327
  option :random_vmname_prefix,
317
- long: '--random-vmname-prefix PREFIX',
318
- description: 'Change the VMNAME prefix',
319
- default: 'vm-'
328
+ long: "--random-vmname-prefix PREFIX",
329
+ description: "Change the VMNAME prefix",
330
+ default: "vm-"
320
331
 
321
332
  option :sysprep_timeout,
322
- long: '--sysprep_timeout TIMEOUT',
323
- description: 'Wait TIMEOUT seconds for sysprep event before continuing with bootstrap',
333
+ long: "--sysprep_timeout TIMEOUT",
334
+ description: "Wait TIMEOUT seconds for sysprep event before continuing with bootstrap",
324
335
  default: 600
325
336
 
326
337
  option :bootstrap_nic,
327
- long: '--bootstrap-nic INTEGER',
328
- description: 'Network interface to use when multiple NICs are defined on a template.',
338
+ long: "--bootstrap-nic INTEGER",
339
+ description: "Network interface to use when multiple NICs are defined on a template.",
329
340
  default: 0
330
341
 
331
342
  option :bootstrap_ipv4,
332
- long: '--bootstrap-ipv4',
333
- description: 'Force using an IPv4 address when a NIC has both IPv4 and IPv6 addresses.',
343
+ long: "--bootstrap-ipv4",
344
+ description: "Force using an IPv4 address when a NIC has both IPv4 and IPv6 addresses.",
334
345
  default: false
335
346
 
336
347
  def run
@@ -338,13 +349,13 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
338
349
 
339
350
  unless using_supplied_hostname? ^ using_random_hostname?
340
351
  show_usage
341
- fatal_exit('You must specify a virtual machine name OR use --random-vmname')
352
+ fatal_exit("You must specify a virtual machine name OR use --random-vmname")
342
353
  end
343
354
 
344
- abort '--template or knife[:source_vm] must be specified' unless config[:source_vm]
355
+ abort "--template or knife[:source_vm] must be specified" unless config[:source_vm]
345
356
 
346
357
  if get_config(:datastore) && get_config(:datastorecluster)
347
- abort 'Please select either datastore or datastorecluster'
358
+ abort "Please select either datastore or datastorecluster"
348
359
  end
349
360
 
350
361
  if get_config(:customization_macs) != AUTO_MAC && get_config(:customization_ips) == NO_IPS
@@ -358,7 +369,7 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
358
369
 
359
370
  dc = datacenter
360
371
 
361
- src_vm = get_vm_by_name(get_config(:source_vm), get_config(:folder)) || fatal_exit("Could not find template #{vmname}")
372
+ src_vm = get_vm_by_name(get_config(:source_vm), get_config(:folder)) || fatal_exit("Could not find template #{get_config(:source_vm)}")
362
373
 
363
374
  create_delta_disk(src_vm) if get_config(:linked_clone)
364
375
 
@@ -380,7 +391,7 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
380
391
  if fault.class == RbVmomi::VIM::NicSettingMismatch
381
392
  abort "There is a mismatch in the number of NICs on the template (#{fault.numberOfNicsInVM}) and what you've passed on the command line with --cips (#{fault.numberOfNicsInSpec}). The VM has been cloned but not customized."
382
393
  elsif fault.class == RbVmomi::VIM::DuplicateName
383
- ui.info 'VM already exists, proceeding to bootstrap'
394
+ ui.info "VM already exists, proceeding to bootstrap"
384
395
  else
385
396
  raise e
386
397
  end
@@ -409,14 +420,12 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
409
420
  connect_port = get_config(:ssh_port)
410
421
  protocol = get_config(:bootstrap_protocol)
411
422
  if windows?(src_vm.config)
412
- protocol ||= 'winrm'
413
- # Set distro to windows-chef-client-msi
414
- config[:distro] = 'windows-chef-client-msi' if config[:distro].nil? || config[:distro] == 'chef-full'
423
+ protocol ||= "winrm"
415
424
  unless config[:disable_customization]
416
425
  # Wait for customization to complete
417
- puts 'Waiting for customization to complete...'
426
+ puts "Waiting for customization to complete..."
418
427
  CustomizationHelper.wait_for_sysprep(vm, vim, Integer(get_config(:sysprep_timeout)), 10)
419
- puts 'Customization Complete'
428
+ puts "Customization Complete"
420
429
  end
421
430
  connect_host = guest_address(vm)
422
431
  Chef::Log.debug("Connect Host for winrm Bootstrap: #{connect_host}")
@@ -426,7 +435,7 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
426
435
  else
427
436
  connect_host = guest_address(vm)
428
437
  Chef::Log.debug("Connect Host for SSH Bootstrap: #{connect_host}")
429
- protocol ||= 'ssh'
438
+ protocol ||= "ssh"
430
439
  wait_for_access(connect_host, connect_port, protocol)
431
440
  ssh_override_winrm
432
441
  bootstrap_for_node.run
@@ -434,7 +443,7 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
434
443
  end
435
444
 
436
445
  def ipv4_address(vm)
437
- puts 'Waiting for a valid IPv4 address...'
446
+ puts "Waiting for a valid IPv4 address..."
438
447
  # Multiple reboots occur during guest customization in which a link-local
439
448
  # address is assigned. As such, we need to wait until a routable IP address
440
449
  # becomes available. This is most commonly an issue with Windows instances.
@@ -448,7 +457,7 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
448
457
  end
449
458
 
450
459
  def guest_address(vm)
451
- puts 'Waiting for network interfaces to become available...'
460
+ puts "Waiting for network interfaces to become available..."
452
461
  sleep 2 while vm.guest.net.empty? || !vm.guest.ipAddress
453
462
  ui.info "Found address #{vm.guest.ipAddress}" if log_verbose?
454
463
  config[:fqdn] = if config[:bootstrap_ipv4]
@@ -460,28 +469,28 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
460
469
  # This is the closest thing to vm.guest.ipAddress but
461
470
  # allows specifying a NIC.
462
471
  vm.guest.net[bootstrap_nic_index].ipConfig.ipAddress.detect do |addr|
463
- addr.origin != 'linklayer'
472
+ addr.origin != "linklayer"
464
473
  end.ipAddress
465
474
  end
466
475
  end
467
476
 
468
477
  def wait_for_access(connect_host, connect_port, protocol)
469
- if protocol == 'winrm'
478
+ if protocol == "winrm"
470
479
  load_winrm_deps
471
- if get_config(:winrm_transport) == 'ssl' && get_config(:winrm_port) == '5985'
472
- config[:winrm_port] = '5986'
480
+ if get_config(:winrm_transport) == "ssl" && get_config(:winrm_port) == "5985"
481
+ config[:winrm_port] = "5986"
473
482
  end
474
483
  connect_port = get_config(:winrm_port)
475
484
  print "\n#{ui.color("Waiting for winrm access to become available on #{connect_host}:#{connect_port}", :magenta)}"
476
- print('.') until tcp_test_winrm(connect_host, connect_port) do
485
+ print(".") until tcp_test_winrm(connect_host, connect_port) do
477
486
  sleep 10
478
- puts('done')
487
+ puts("done")
479
488
  end
480
489
  else
481
490
  print "\n#{ui.color("Waiting for sshd access to become available on #{connect_host}:#{connect_port}", :magenta)}"
482
- print('.') until tcp_test_ssh(connect_host, connect_port) do
491
+ print(".") until tcp_test_ssh(connect_host, connect_port) do
483
492
  sleep 10
484
- puts('done')
493
+ puts("done")
485
494
  end
486
495
  end
487
496
  connect_port
@@ -494,7 +503,7 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
494
503
  deviceChange: [
495
504
  {
496
505
  operation: :remove,
497
- device: disk
506
+ device: disk,
498
507
  },
499
508
  {
500
509
  operation: :add,
@@ -503,9 +512,9 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
503
512
  new_disk.backing = new_disk.backing.dup
504
513
  new_disk.backing.fileName = "[#{disk.backing.datastore.name}]"
505
514
  new_disk.backing.parent = disk.backing
506
- end
515
+ end,
507
516
  }
508
- ]
517
+ ],
509
518
  }
510
519
  src_vm.ReconfigVM_Task(spec: spec).wait_for_completion
511
520
  end
@@ -513,10 +522,10 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
513
522
 
514
523
  def find_available_hosts
515
524
  hosts = traverse_folders_for_computeresources(datacenter.hostFolder)
516
- fatal_exit('No ComputeResource found - Use --resource-pool to specify a resource pool or a cluster') if hosts.empty?
525
+ fatal_exit("No ComputeResource found - Use --resource-pool to specify a resource pool or a cluster") if hosts.empty?
517
526
  hosts.reject!(&:nil?)
518
527
  hosts.reject! { |host| host.host.all? { |h| h.runtime.inMaintenanceMode } }
519
- fatal_exit 'All hosts in maintenance mode!' if hosts.empty?
528
+ fatal_exit "All hosts in maintenance mode!" if hosts.empty?
520
529
  if get_config(:datastore)
521
530
  hosts.reject! { |host| !host.datastore.include?(find_datastore(get_config(:datastore))) }
522
531
  end
@@ -530,7 +539,7 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
530
539
  fatal_exit "No hosts have the requested DatastoreCluster available! #{get_config(:datastorecluster)}" if hosts.empty?
531
540
 
532
541
  if get_config(:customization_vlan)
533
- vlan_list = get_config(:customization_vlan).split(',')
542
+ vlan_list = get_config(:customization_vlan).split(",")
534
543
  vlan_list.each do |network|
535
544
  hosts.reject! { |host| !host.network.include?(find_network(network)) }
536
545
  end
@@ -619,24 +628,24 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
619
628
  end
620
629
 
621
630
  mac_list = if get_config(:customization_macs) == AUTO_MAC
622
- [AUTO_MAC] * get_config(:customization_ips).split(',').length
631
+ [AUTO_MAC] * get_config(:customization_ips).split(",").length
623
632
  else
624
- get_config(:customization_macs).split(',')
633
+ get_config(:customization_macs).split(",")
625
634
  end
626
635
 
627
636
  if get_config(:customization_sw_uuid)
628
637
  unless get_config(:customization_vlan)
629
- abort('Must specify VLANs with --cvlan when specifying switch UUIDs with --sw-uuids')
638
+ abort("Must specify VLANs with --cvlan when specifying switch UUIDs with --sw-uuids")
630
639
  end
631
- swuuid_list = if get_config(:customization_sw_uuid) == 'auto'
632
- ['auto'] * get_config(:customization_ips).split(',').length
640
+ swuuid_list = if get_config(:customization_sw_uuid) == "auto"
641
+ ["auto"] * get_config(:customization_ips).split(",").length
633
642
  else
634
- get_config(:customization_sw_uuid).split(',').map { |swuuid| swuuid.gsub(/((\w+\s+){7})(\w+)\s+(.+)/, '\1\3-\4') }
643
+ get_config(:customization_sw_uuid).split(",").map { |swuuid| swuuid.gsub(/((\w+\s+){7})(\w+)\s+(.+)/, '\1\3-\4') }
635
644
  end
636
645
  end
637
646
 
638
647
  if get_config(:customization_vlan)
639
- vlan_list = get_config(:customization_vlan).split(',')
648
+ vlan_list = get_config(:customization_vlan).split(",")
640
649
  sw_uuid = get_config(:customization_sw_uuid)
641
650
  networks = vlan_list.map { |vlan| find_network(vlan, sw_uuid) }
642
651
 
@@ -645,7 +654,7 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
645
654
  networks.each_with_index do |network, index|
646
655
  card = cards[index] || abort("Can't find source network card to customize for vlan #{vlan_list[index]}")
647
656
  begin
648
- if get_config(:customization_sw_uuid) && (swuuid_list[index] != 'auto')
657
+ if get_config(:customization_sw_uuid) && (swuuid_list[index] != "auto")
649
658
  switch_port = RbVmomi::VIM.DistributedVirtualSwitchPortConnection(
650
659
  switchUuid: swuuid_list[index], portgroupKey: network.key
651
660
  )
@@ -660,7 +669,7 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
660
669
  card.backing = RbVmomi::VIM::VirtualEthernetCardNetworkBackingInfo(network: network, deviceName: network.name)
661
670
  end
662
671
  card.macAddress = mac_list[index] if get_config(:customization_macs) && mac_list[index] != AUTO_MAC
663
- dev_spec = RbVmomi::VIM.VirtualDeviceConfigSpec(device: card, operation: 'edit')
672
+ dev_spec = RbVmomi::VIM.VirtualDeviceConfigSpec(device: card, operation: "edit")
664
673
  clone_spec.config.deviceChange.push dev_spec
665
674
  end
666
675
  end
@@ -682,15 +691,15 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
682
691
  end
683
692
 
684
693
  if get_config(:customization_dns_ips)
685
- cust_spec.globalIPSettings.dnsServerList = get_config(:customization_dns_ips).split(',')
694
+ cust_spec.globalIPSettings.dnsServerList = get_config(:customization_dns_ips).split(",")
686
695
  end
687
696
 
688
697
  if get_config(:customization_dns_suffixes)
689
- cust_spec.globalIPSettings.dnsSuffixList = get_config(:customization_dns_suffixes).split(',')
698
+ cust_spec.globalIPSettings.dnsSuffixList = get_config(:customization_dns_suffixes).split(",")
690
699
  end
691
700
 
692
701
  if config[:customization_ips] != NO_IPS
693
- cust_spec.nicSettingMap = config[:customization_ips].split(',').map.with_index { |cust_ip, index|
702
+ cust_spec.nicSettingMap = config[:customization_ips].split(",").map.with_index { |cust_ip, index|
694
703
  generate_adapter_map(cust_ip, get_config(:customization_gw), mac_list[index])
695
704
  }
696
705
  end
@@ -704,13 +713,15 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
704
713
 
705
714
  if windows?(src_config)
706
715
  # We should get here with the customizations set, either by a plugin or a --cspec
707
- fatal_exit 'Windows clones need a customization identity. Try passing a --cspec or making a --cplugin' if cust_spec.identity.props.empty?
716
+ fatal_exit "Windows clones need a customization identity. Try passing a --cspec or making a --cplugin" if cust_spec.identity.props.empty?
708
717
 
709
718
  identification = identification_for_spec(cust_spec)
710
719
 
711
- license_file_print_data = RbVmomi::VIM.CustomizationLicenseFilePrintData(
712
- autoMode: cust_spec.identity.licenseFilePrintData.autoMode
713
- ) if cust_spec.identity.licenseFilePrintData # optional param
720
+ if cust_spec.identity.licenseFilePrintData
721
+ license_file_print_data = RbVmomi::VIM.CustomizationLicenseFilePrintData(
722
+ autoMode: cust_spec.identity.licenseFilePrintData.autoMode
723
+ )
724
+ end # optional param
714
725
 
715
726
  user_data = RbVmomi::VIM.CustomizationUserData(
716
727
  fullName: cust_spec.identity.userData.fullName,
@@ -729,7 +740,7 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
729
740
  timeZone: cust_spec.identity.guiUnattended.timeZone
730
741
  )
731
742
  runonce = RbVmomi::VIM.CustomizationGuiRunOnce(
732
- commandList: ['cust_spec.identity.guiUnattended.commandList']
743
+ commandList: ["cust_spec.identity.guiUnattended.commandList"]
733
744
  )
734
745
  ident = RbVmomi::VIM.CustomizationSysprep
735
746
  ident.guiRunOnce = runonce
@@ -745,11 +756,11 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
745
756
  ident.domain = if get_config(:customization_domain)
746
757
  get_config(:customization_domain)
747
758
  else
748
- ''
759
+ ""
749
760
  end
750
761
  cust_spec.identity = ident
751
762
  else
752
- ui.error('Customization only supports Linux and Windows currently.')
763
+ ui.error("Customization only supports Linux and Windows currently.")
753
764
  exit 1
754
765
  end
755
766
  end
@@ -773,14 +784,14 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
773
784
  abort "Customization plugin could not be found at #{cplugin_path}"
774
785
  end
775
786
 
776
- if Object.const_defined? 'KnifeVspherePlugin'
777
- @customization_plugin = Object.const_get('KnifeVspherePlugin').new
787
+ if Object.const_defined? "KnifeVspherePlugin"
788
+ @customization_plugin = Object.const_get("KnifeVspherePlugin").new
778
789
  cplugin_data = get_config(:customization_plugin_data)
779
790
  if cplugin_data
780
791
  if @customization_plugin.respond_to?(:data=)
781
792
  @customization_plugin.data = cplugin_data
782
793
  else
783
- abort 'Customization plugin has no :data= accessor to receive the --cplugin-data argument. Define both or neither.'
794
+ abort "Customization plugin has no :data= accessor to receive the --cplugin-data argument. Define both or neither."
784
795
  end
785
796
  end
786
797
  else
@@ -807,7 +818,7 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
807
818
  def generate_adapter_map(ip = nil, gw = nil, mac = nil)
808
819
  settings = RbVmomi::VIM.CustomizationIPSettings
809
820
 
810
- if ip.nil? || ip.downcase == 'dhcp'
821
+ if ip.nil? || ip.casecmp("dhcp") == 0
811
822
  settings.ip = RbVmomi::VIM::CustomizationDhcpIpGenerator.new
812
823
  else
813
824
  cidr_ip = NetAddr::CIDR.create(ip)
@@ -816,7 +827,7 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
816
827
 
817
828
  # TODO: want to confirm gw/ip are in same subnet?
818
829
  # Only set gateway on first IP.
819
- if config[:customization_ips].split(',').first == ip
830
+ if config[:customization_ips].split(",").first == ip
820
831
  if gw.nil?
821
832
  settings.gateway = [cidr_ip.network(Objectify: true).next_ip]
822
833
  else
@@ -835,8 +846,6 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
835
846
  def bootstrap_common_params(bootstrap)
836
847
  bootstrap.config[:run_list] = config[:run_list]
837
848
  bootstrap.config[:bootstrap_version] = get_config(:bootstrap_version)
838
- bootstrap.config[:distro] = get_config(:distro)
839
- bootstrap.config[:template_file] = get_config(:template_file)
840
849
  bootstrap.config[:environment] = get_config(:environment)
841
850
  bootstrap.config[:prerelease] = get_config(:prerelease)
842
851
  bootstrap.config[:first_boot_attributes] = get_config(:first_boot_attributes)
@@ -854,20 +863,20 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
854
863
 
855
864
  def bootstrap_for_windows_node
856
865
  Chef::Knife::Bootstrap.load_deps
857
- if get_config(:bootstrap_protocol) == 'winrm' || get_config(:bootstrap_protocol).nil?
866
+ if get_config(:bootstrap_protocol) == "winrm" || get_config(:bootstrap_protocol).nil?
858
867
  bootstrap = Chef::Knife::BootstrapWindowsWinrm.new
859
868
  bootstrap.name_args = [config[:fqdn]]
860
869
  bootstrap.config[:winrm_user] = get_config(:winrm_user)
861
870
  bootstrap.config[:winrm_password] = get_config(:winrm_password)
862
871
  bootstrap.config[:winrm_transport] = get_config(:winrm_transport)
863
872
  bootstrap.config[:winrm_port] = get_config(:winrm_port)
864
- elsif get_config(:bootstrap_protocol) == 'ssh'
873
+ elsif get_config(:bootstrap_protocol) == "ssh"
865
874
  bootstrap = Chef::Knife::BootstrapWindowsSsh.new
866
875
  bootstrap.config[:ssh_user] = get_config(:ssh_user)
867
876
  bootstrap.config[:ssh_password] = get_config(:ssh_password)
868
877
  bootstrap.config[:ssh_port] = get_config(:ssh_port)
869
878
  else
870
- ui.error('Unsupported Bootstrapping Protocol. Supports : winrm, ssh')
879
+ ui.error("Unsupported Bootstrapping Protocol. Supports : winrm, ssh")
871
880
  exit 1
872
881
  end
873
882
  bootstrap.config[:msi_url] = get_config(:bootstrap_msi_url)
@@ -878,13 +887,14 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
878
887
  Chef::Knife::Bootstrap.load_deps
879
888
  bootstrap = Chef::Knife::Bootstrap.new
880
889
  bootstrap.name_args = [config[:fqdn]]
890
+ bootstrap.config[:bootstrap_template] = get_config(:bootstrap_template)
881
891
  bootstrap.config[:secret_file] = get_config(:secret_file)
882
892
  bootstrap.config[:ssh_user] = get_config(:ssh_user)
883
893
  bootstrap.config[:ssh_password] = get_config(:ssh_password)
884
894
  bootstrap.config[:ssh_port] = get_config(:ssh_port)
885
895
  bootstrap.config[:identity_file] = get_config(:identity_file)
886
- bootstrap.config[:use_sudo] = true unless get_config(:ssh_user) == 'root'
887
- bootstrap.config[:use_sudo_password] = true unless get_config(:ssh_user) == 'root'
896
+ bootstrap.config[:use_sudo] = true unless get_config(:ssh_user) == "root"
897
+ bootstrap.config[:use_sudo_password] = true unless get_config(:ssh_user) == "root"
888
898
  bootstrap.config[:log_level] = get_config(:log_level)
889
899
  bootstrap_common_params(bootstrap)
890
900
  end
@@ -892,19 +902,19 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
892
902
  def ssh_override_winrm
893
903
  # unchanged ssh_user and changed winrm_user, override ssh_user
894
904
  if get_config(:ssh_user).eql?(options[:ssh_user][:default]) &&
895
- !get_config(:winrm_user).eql?(options[:winrm_user][:default])
905
+ !get_config(:winrm_user).eql?(options[:winrm_user][:default])
896
906
  config[:ssh_user] = get_config(:winrm_user)
897
907
  end
898
908
 
899
909
  # unchanged ssh_port and changed winrm_port, override ssh_port
900
910
  if get_config(:ssh_port).eql?(options[:ssh_port][:default]) &&
901
- !get_config(:winrm_port).eql?(options[:winrm_port][:default])
911
+ !get_config(:winrm_port).eql?(options[:winrm_port][:default])
902
912
  config[:ssh_port] = get_config(:winrm_port)
903
913
  end
904
914
 
905
915
  # unset ssh_password and set winrm_password, override ssh_password
906
916
  if get_config(:ssh_password).nil? &&
907
- !get_config(:winrm_password).nil?
917
+ !get_config(:winrm_password).nil?
908
918
  config[:ssh_password] = get_config(:winrm_password)
909
919
  end
910
920
 
@@ -969,11 +979,11 @@ class Chef::Knife::VsphereVmClone < Chef::Knife::BaseVsphereCommand
969
979
  end
970
980
 
971
981
  def load_winrm_deps
972
- require 'winrm'
973
- require 'chef/knife/winrm'
974
- require 'chef/knife/bootstrap_windows_winrm'
975
- require 'chef/knife/bootstrap_windows_ssh'
976
- require 'chef/knife/core/windows_bootstrap_context'
982
+ require "winrm"
983
+ require "chef/knife/winrm"
984
+ require "chef/knife/bootstrap_windows_winrm"
985
+ require "chef/knife/bootstrap_windows_ssh"
986
+ require "chef/knife/core/windows_bootstrap_context"
977
987
  end
978
988
 
979
989
  private