chef-provisioning-vsphere 2.0.2 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 94f12572899fa323e4850f9dba56919e530f1286
4
- data.tar.gz: 49bd4bee75b043471c114250d93684333ab42651
3
+ metadata.gz: e921ec7be5d161723bdd1e333b4d1a93ec4a9e09
4
+ data.tar.gz: 2f3c474699229fdfa75df67513b7570e1ce86c15
5
5
  SHA512:
6
- metadata.gz: 45810258d60b403cddfd5bed2eda7ca8eec5332e0ad459d8e96bd6325b6200a55382f8bf686da79247c954978a282d375df47a17528533320d926ba3ebc46f7a
7
- data.tar.gz: 37d60704a8f35eab4354877ee8ebc43d9191ee56af75b1f05146563309ad1faa9f2b7bf7e4492d2b4ff7fccd347969237b28a1418e073d46c3d5285e8c1b01d1
6
+ metadata.gz: 2e773ae65c3cefceb7f46a0d3c2dbc1a7242d80c3b1c998b35485027fb1dac2a15d97bae89d57b1194a7a3d87c6ac327229370ed18514b8fb2bd7cea3ce727c7
7
+ data.tar.gz: c3dccf9cb837eb675865706276cb5a0d1239488dbd4c23e21d8b57fb4cd3b26a92a641c844eb82a885b535417d5791e89b11bbb5b91de65d231a30346a1caba8
@@ -0,0 +1,22 @@
1
+ ### Versions:
2
+ <!--- Version of the software where you are encountering the issue --->
3
+ <!-- You should probably update in this is not newest release.--->
4
+ * Version of Chef-Provisioning:
5
+ * Version of Chef-Provisioning-vSphere:
6
+
7
+ ### Platform Details
8
+ <!--- What version of vSphere/vCenter are you running? What version of ESXi are you using too?--->
9
+ * Version of vSphere/vCenter:
10
+ * Version of ESXi:
11
+
12
+ ### Scenario:
13
+ <!--- What you are trying to achieve and you can't?--->
14
+
15
+ ### Steps to Reproduce:
16
+ <!--- If you are filing an issue what are the things we need to do in order to repro your problem? How are you using this cookbook or any resources it includes?--->
17
+
18
+ ### Expected Result:
19
+ <!--- What are you expecting to happen as the consequence of above reproduction steps?--->
20
+
21
+ ### Actual Result:
22
+ <!--- What actually happens after the reproduction steps? Include the error output or a link to a gist if possible.--->
@@ -0,0 +1,14 @@
1
+ ### Description
2
+
3
+ <!--- Describe what this change achieves--->
4
+
5
+ ### Issues Resolved
6
+
7
+ <!--- List any existing issues this PR resolves--->
8
+
9
+ ### Check List
10
+
11
+ - [ ] All tests pass.
12
+ - [ ] All style checks pass.
13
+ - [ ] Functionality includes testing.
14
+ - [ ] Functionality has been documented in the README if applicable
data/.gitignore CHANGED
@@ -5,4 +5,6 @@ Gemfile.lock
5
5
  .envrc
6
6
  .ruby-version
7
7
  my_cookbook
8
- .DS_Store
8
+ .DS_Store
9
+ doc/
10
+ .yardoc/
@@ -5,6 +5,13 @@ branches:
5
5
  - master
6
6
  rvm:
7
7
  - 2.3.3
8
+ - 2.4.1
9
+
8
10
  script:
9
11
  - bundle exec rake style
10
12
  - bundle exec rake unit
13
+ - bundle exec rake yard
14
+
15
+ matrix:
16
+ allow_failures:
17
+ - rvm: 2.3.3
@@ -1,7 +1,22 @@
1
1
  # Change Log
2
2
 
3
- ## [2.0.2](https://github.com/chef-partners/chef-provisioning-vsphere/tree/2.0.2) (2017-05-13)
4
- [Full Changelog](https://github.com/chef-partners/chef-provisioning-vsphere/compare/v2.0.0...2.0.2)
3
+ ## [2.0.3](https://github.com/chef-partners/chef-provisioning-vsphere/tree/2.0.3) (2017-05-22)
4
+ [Full Changelog](https://github.com/chef-partners/chef-provisioning-vsphere/compare/v2.0.2...2.0.3)
5
+
6
+ **Closed issues:**
7
+
8
+ - Patch on transport\_respond? [\#31](https://github.com/chef-partners/chef-provisioning-vsphere/issues/31)
9
+ - Github Templates [\#28](https://github.com/chef-partners/chef-provisioning-vsphere/issues/28)
10
+
11
+ **Merged pull requests:**
12
+
13
+ - Patch on transport\_respond? [\#32](https://github.com/chef-partners/chef-provisioning-vsphere/pull/32) ([jcalonsoh](https://github.com/jcalonsoh))
14
+ - Added github templates [\#30](https://github.com/chef-partners/chef-provisioning-vsphere/pull/30) ([jjasghar](https://github.com/jjasghar))
15
+ - waffle.io Badge [\#29](https://github.com/chef-partners/chef-provisioning-vsphere/pull/29) ([waffle-iron](https://github.com/waffle-iron))
16
+ - Time to do doc all the things! [\#27](https://github.com/chef-partners/chef-provisioning-vsphere/pull/27) ([jjasghar](https://github.com/jjasghar))
17
+
18
+ ## [v2.0.2](https://github.com/chef-partners/chef-provisioning-vsphere/tree/v2.0.2) (2017-05-13)
19
+ [Full Changelog](https://github.com/chef-partners/chef-provisioning-vsphere/compare/v2.0.0...v2.0.2)
5
20
 
6
21
  **Closed issues:**
7
22
 
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  # frozen_string_literal: true
3
- source 'https://rubygems.org'
3
+ source "https://rubygems.org"
4
4
  gemspec
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  [![Gem Version](https://img.shields.io/gem/v/chef-provisioning-vsphere.svg)][gem]
4
4
  [![Build Status](https://travis-ci.org/chef-partners/chef-provisioning-vsphere.svg?branch=master)][travis]
5
+ [![Inline docs](http://inch-ci.org/github/chef-partners/chef-provisioning-vsphere.svg?branch=master)](http://inch-ci.org/github/chef-partners/chef-provisioning-vsphere)
6
+ [![Stories in Ready](https://badge.waffle.io/chef-partners/chef-provisioning-vsphere.png?label=ready&title=Ready)](https://waffle.io/chef-partners/chef-provisioning-vsphere?utm_source=badge)
5
7
 
6
8
  This is a [chef-provisioning](https://github.com/chef/chef-provisioning) provisioner for [VMware vSphere](http://www.vmware.com/products/vsphere).
7
9
 
@@ -321,7 +323,7 @@ platforms:
321
323
  - 10
322
324
  - 10
323
325
  - 10
324
-
326
+
325
327
  suites:
326
328
  - name: default
327
329
  runlist:
@@ -346,5 +348,7 @@ You can run then `kitchen diagnose` to verify the nodes and settings that will b
346
348
  4. Push to the branch (`git push origin my-new-feature`)
347
349
  5. Create a new Pull Request
348
350
 
351
+ We have attempted to `TODO` markings. If you find one, whether it's documentation or a feature, it's a great place to start helping out. `$ grep -r "TODO" lib/`
352
+
349
353
  [gem]: https://rubygems.org/gems/chef-provisioning-vsphere
350
354
  [travis]: https://travis-ci.org/chef-partners/chef-provisioning-vsphere
data/Rakefile CHANGED
@@ -1,34 +1,41 @@
1
1
  # frozen_string_literal: true
2
- require 'bundler/gem_tasks'
3
- require 'chef/provisioning/vsphere_driver/version'
4
- require 'rspec/core/rake_task'
5
- require 'rubocop/rake_task'
2
+ require "bundler/gem_tasks"
3
+ require "chef/provisioning/vsphere_driver/version"
4
+ require "rspec/core/rake_task"
5
+ require "chefstyle"
6
+ require "rubocop/rake_task"
7
+ require "yard"
6
8
 
7
- $LOAD_PATH.unshift(File.dirname(__FILE__) + '/lib')
9
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + "/lib")
8
10
 
9
11
  RuboCop::RakeTask.new(:style) do |task|
10
- task.options << '--display-cop-names'
12
+ task.options << "--display-cop-names"
11
13
  end
12
14
 
13
15
  RSpec::Core::RakeTask.new(:unit) do |task|
14
- task.pattern = 'spec/unit_tests/*_spec.rb'
15
- task.rspec_opts = ['--color', '-f documentation']
16
+ task.pattern = "spec/unit_tests/*_spec.rb"
17
+ task.rspec_opts = ["--color", "-f documentation"]
16
18
  end
17
19
 
18
20
  RSpec::Core::RakeTask.new(:integration) do |task|
19
- task.pattern = 'spec/integration_tests/*_spec.rb'
20
- task.rspec_opts = ['--color', '-f documentation', '--out rspec.txt']
21
+ task.pattern = "spec/integration_tests/*_spec.rb"
22
+ task.rspec_opts = ["--color", "-f documentation", "--out rspec.txt"]
21
23
  end
22
24
 
23
25
  begin
24
- require 'github_changelog_generator/task'
26
+ require "github_changelog_generator/task"
25
27
 
26
28
  GitHubChangelogGenerator::RakeTask.new :changelog do |config|
27
29
  config.future_release = ChefProvisioningVsphere::VERSION
28
30
  config.issues = true
29
31
  end
30
32
  rescue LoadError
31
- puts 'github_changelog_generator is not available. gem install github_changelog_generator to generate changelogs'
33
+ puts "github_changelog_generator is not available. gem install github_changelog_generator to generate changelogs"
32
34
  end
33
35
 
34
- task default: [:unit]
36
+ YARD::Rake::YardocTask.new do |t|
37
+ t.files = ["lib/**/*.rb"] # optional
38
+ t.stats_options = ["--list-undoc"] # optional
39
+ end
40
+
41
+ task default: [:style, :unit]
@@ -1,37 +1,37 @@
1
1
  # frozen_string_literal: true
2
- $LOAD_PATH.unshift(File.dirname(__FILE__) + '/lib')
3
- require 'chef/provisioning/vsphere_driver/version'
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + "/lib")
3
+ require "chef/provisioning/vsphere_driver/version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = 'chef-provisioning-vsphere'
6
+ s.name = "chef-provisioning-vsphere"
7
7
  s.version = ChefProvisioningVsphere::VERSION
8
8
  s.platform = Gem::Platform::RUBY
9
- s.extra_rdoc_files = ['README.md']
10
- s.summary = 'Provisioner for creating vSphere VM instances in Chef Provisioning.'
9
+ s.extra_rdoc_files = ["README.md"]
10
+ s.summary = "Provisioner for creating vSphere VM instances in Chef Provisioning."
11
11
  s.description = s.summary
12
- s.authors = ['CenturyLink Cloud', 'JJ Asghar']
13
- s.email = 'jj@chef.io'
14
- s.homepage = 'https://github.com/chef-partners/chef-provisioning-vsphere'
15
- s.license = 'MIT'
16
-
17
- s.bindir = 'bin'
18
- s.executables = %w()
19
-
20
- s.require_path = 'lib'
12
+ s.authors = ["CenturyLink Cloud", "JJ Asghar"]
13
+ s.email = "jj@chef.io"
14
+ s.homepage = "https://github.com/chef-partners/chef-provisioning-vsphere"
15
+ s.license = "MIT"
16
+ s.bindir = "bin"
17
+ s.executables = %w{}
18
+ s.require_path = "lib"
21
19
  s.files = `git ls-files -z`.split("\x0")
22
20
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
23
21
 
24
- s.add_dependency 'rbvmomi', '~> 1.10'
25
- s.add_dependency 'chef-provisioning', '~> 2.0'
26
- s.add_dependency 'github_changelog_generator'
27
- s.add_dependency 'cheffish', '>= 4.0', '< 14.0'
28
- s.add_dependency 'chef', '>= 12.0', '< 14.0'
22
+ s.add_dependency "rbvmomi", "~> 1.10"
23
+ s.add_dependency "chef-provisioning", "~> 2.0"
24
+ s.add_dependency "github_changelog_generator"
25
+ s.add_dependency "cheffish", ">= 4.0", "< 14.0"
26
+ s.add_dependency "chef", ">= 12.0", "< 14.0"
29
27
 
30
- s.add_development_dependency 'rspec'
31
- s.add_development_dependency 'rake'
32
- s.add_development_dependency 'chefstyle'
33
- s.add_development_dependency 'pry'
34
- s.add_development_dependency 'pry-byebug'
35
- s.add_development_dependency 'pry-stack_explorer'
36
- s.add_development_dependency 'rb-readline'
28
+ s.add_development_dependency "rspec"
29
+ s.add_development_dependency "rake"
30
+ s.add_development_dependency "chefstyle"
31
+ s.add_development_dependency "pry"
32
+ s.add_development_dependency "pry-byebug"
33
+ s.add_development_dependency "pry-stack_explorer"
34
+ s.add_development_dependency "rb-readline"
35
+ s.add_development_dependency "simplecov"
36
+ s.add_development_dependency "yard"
37
37
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
- require 'chef/provisioning/vsphere_driver'
2
+ require "chef/provisioning/vsphere_driver"
3
3
 
4
- Chef::Provisioning.register_driver_class('vsphere', ChefProvisioningVsphere::VsphereDriver)
4
+ Chef::Provisioning.register_driver_class("vsphere", ChefProvisioningVsphere::VsphereDriver)
@@ -1,10 +1,17 @@
1
1
  # frozen_string_literal: true
2
- require 'chef/provisioning'
3
- require 'chef/provisioning/vsphere_driver/driver'
2
+ require "chef/provisioning"
3
+ require "chef/provisioning/vsphere_driver/driver"
4
4
 
5
+ # The main Chef class for all the Chef code!
5
6
  class Chef
7
+ # The main Chef module for the Domain Specialized Language
6
8
  module DSL
9
+ # The main Chef module for the the Recipe in side of Chef's DSL
7
10
  module Recipe
11
+ # Creates the url object for Chef-Provisioning to leverage.
12
+ #
13
+ # @param [Object] driver_options Used from the Chef Provisioning to connect
14
+ # @param [Object] block TODO
8
15
  def with_vsphere_driver(driver_options, &block)
9
16
  url = ChefProvisioningVsphere::VsphereDriver.canonicalize_url(
10
17
  nil, driver_options
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
+
3
+ # Provisions machines in vSphere.
2
4
  module ChefProvisioningVsphere
5
+ # Creates a cspec for VMware
3
6
  class CloneSpecBuilder
4
7
  def initialize(vsphere_helper, action_handler)
5
8
  @vsphere_helper = vsphere_helper
@@ -9,6 +12,11 @@ module ChefProvisioningVsphere
9
12
  attr_reader :vsphere_helper
10
13
  attr_reader :action_handler
11
14
 
15
+ # The main build method.
16
+ #
17
+ # @param [String] options Options set from Chef-Provisioning.
18
+ # @param [String] vm_template The VM template to clone from.
19
+ # @param [String] vm_name The VM name to create.
12
20
  def build(vm_template, vm_name, options)
13
21
  clone_spec = RbVmomi::VIM.VirtualMachineCloneSpec(
14
22
  location: relocate_spec_for(vm_template, options),
@@ -52,6 +60,10 @@ module ChefProvisioningVsphere
52
60
  clone_spec
53
61
  end
54
62
 
63
+ # Figure out or declare where you need to bootstrap the vm
64
+ #
65
+ # @param [String] options Options set from Chef-Provisioning.
66
+ # @param [String] vm_template The VM template to clone from.
55
67
  def relocate_spec_for(vm_template, options)
56
68
  rspec = RbVmomi::VIM.VirtualMachineRelocateSpec
57
69
  host = nil
@@ -66,12 +78,12 @@ module ChefProvisioningVsphere
66
78
  elsif vm_template.config.template && !host.nil?
67
79
  rspec.pool = host.parent.resourcePool # assign to the "invisible" pool root
68
80
  elsif vm_template.config.template
69
- raise 'either :host or :resource_pool must be specified when cloning from a VM Template'
81
+ raise "either :host or :resource_pool must be specified when cloning from a VM Template"
70
82
  end
71
83
 
72
84
  if options[:use_linked_clone]
73
85
  if vm_template.config.template
74
- Chef::Log.warn('Using a VM Template, ignoring use_linked_clone.')
86
+ Chef::Log.warn("Using a VM Template, ignoring use_linked_clone.")
75
87
  else
76
88
  vsphere_helper.create_delta_disk(vm_template)
77
89
  rspec.diskMoveType = :moveChildMostDiskBacking
@@ -85,19 +97,24 @@ module ChefProvisioningVsphere
85
97
  rspec
86
98
  end
87
99
 
100
+ # Verify and create all the options needed for Customization Specs
101
+ #
102
+ # @param [String] options Options set from Chef-Provisioning.
103
+ # @param [String] vm_name The VM name that is set.
104
+ # @param [String] vm_template The VM template to clone from.
88
105
  def customization_options_from(vm_template, vm_name, options)
89
106
  if options.key?(:customization_spec)
90
107
  if options[:customization_spec].is_a?(Hash) ||
91
- options[:customization_spec].is_a?(Cheffish::MergedConfig)
108
+ options[:customization_spec].is_a?(Cheffish::MergedConfig)
92
109
  cust_options = options[:customization_spec]
93
110
  ip_settings = cust_options[:ipsettings]
94
111
  cust_domain = cust_options[:domain]
95
112
 
96
- raise ArgumentError, 'domain is required' unless cust_domain
113
+ raise ArgumentError, "domain is required" unless cust_domain
97
114
  cust_ip_settings = nil
98
115
  if ip_settings && ip_settings.key?(:ip)
99
116
  unless cust_options[:ipsettings].key?(:subnetMask)
100
- raise ArgumentError, 'subnetMask is required for static ip'
117
+ raise ArgumentError, "subnetMask is required for static ip"
101
118
  end
102
119
  cust_ip_settings = RbVmomi::VIM::CustomizationIPSettings.new(
103
120
  ip_settings
@@ -128,7 +145,7 @@ module ChefProvisioningVsphere
128
145
  cust_hwclockutc = cust_options[:hw_clock_utc]
129
146
  cust_timezone = cust_options[:time_zone]
130
147
 
131
- cust_prep = if vm_template.config.guestId.start_with?('win')
148
+ cust_prep = if vm_template.config.guestId.start_with?("win")
132
149
  windows_prep_for(options, vm_name)
133
150
  else
134
151
  RbVmomi::VIM::CustomizationLinuxPrep.new(
@@ -141,7 +158,7 @@ module ChefProvisioningVsphere
141
158
  cust_adapter_mapping = [
142
159
  RbVmomi::VIM::CustomizationAdapterMapping.new(
143
160
  adapter: cust_ip_settings
144
- )
161
+ ),
145
162
  ]
146
163
  RbVmomi::VIM::CustomizationSpec.new(
147
164
  identity: cust_prep,
@@ -154,15 +171,23 @@ module ChefProvisioningVsphere
154
171
  end
155
172
  end
156
173
 
174
+ # Creates a hostname, and verifies that it fulfills the requirements
175
+ #
176
+ # @param [String] options Options set from Chef-Provisioning.
177
+ # @param [String] vm_name The VM name that is set.
157
178
  def hostname_from(options, vm_name)
158
179
  hostname = options[:hostname] || vm_name
159
180
  test = /^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])$/
160
- unless hostname.match(test) # rubocop:disable Performance/RegexpMatch
161
- raise 'Only letters, numbers or hyphens in hostnames allowed'
181
+ unless hostname =~ test
182
+ raise "Only letters, numbers or hyphens in hostnames allowed"
162
183
  end
163
184
  RbVmomi::VIM::CustomizationFixedName.new(name: hostname)
164
185
  end
165
186
 
187
+ # Preparation work for windows, sysprep and the like.
188
+ #
189
+ # @param [String] options Options set from Chef-Provisioning.
190
+ # @param [String] vm_name The VM name that is set.
166
191
  def windows_prep_for(options, vm_name)
167
192
  cust_options = options[:customization_spec]
168
193
  unless cust_options[:run_once].nil?
@@ -175,22 +200,21 @@ module ChefProvisioningVsphere
175
200
  plainText: true,
176
201
  value: options[:ssh][:password]
177
202
  )
178
- if cust_options.key?(:domain) && (cust_options[:domain] != 'local')
203
+ if cust_options.key?(:domain) && (cust_options[:domain] != "local")
179
204
  cust_domain_password = RbVmomi::VIM::CustomizationPassword(
180
205
  plainText: true,
181
- value: ENV['domainAdminPassword'] || cust_options[:domainAdminPassword]
206
+ value: ENV["domainAdminPassword"] || cust_options[:domainAdminPassword]
182
207
  )
183
208
  cust_id = RbVmomi::VIM::CustomizationIdentification.new(
184
209
  joinDomain: cust_options[:domain],
185
210
  domainAdmin: cust_options[:domainAdmin],
186
211
  domainAdminPassword: cust_domain_password
187
212
  )
188
- # puts "my env passwd is: #{ENV['domainAdminPassword']}"
189
213
  action_handler.report_progress "joining domain #{cust_options[:domain]} /
190
214
  with user: #{cust_options[:domainAdmin]}"
191
215
  else
192
216
  cust_id = RbVmomi::VIM::CustomizationIdentification.new(
193
- joinWorkgroup: 'WORKGROUP'
217
+ joinWorkgroup: "WORKGROUP"
194
218
  )
195
219
  end
196
220
  cust_gui_unattended = RbVmomi::VIM::CustomizationGuiUnattended.new(
@@ -1,20 +1,25 @@
1
1
  # frozen_string_literal: true
2
- require 'chef'
3
- require 'cheffish/merged_config'
4
- require 'chef/provisioning/driver'
5
- require 'chef/provisioning/machine/windows_machine'
6
- require 'chef/provisioning/machine/unix_machine'
7
- require 'chef/provisioning/vsphere_driver/clone_spec_builder'
8
- require 'chef/provisioning/vsphere_driver/version'
9
- require 'chef/provisioning/vsphere_driver/vsphere_helpers'
10
- require 'chef/provisioning/vsphere_driver/vsphere_url'
11
- require 'chef/provisioning/vsphere_driver/vm_helper'
12
-
2
+ require "chef"
3
+ require "cheffish/merged_config"
4
+ require "chef/provisioning/driver"
5
+ require "chef/provisioning/machine/windows_machine"
6
+ require "chef/provisioning/machine/unix_machine"
7
+ require "chef/provisioning/vsphere_driver/clone_spec_builder"
8
+ require "chef/provisioning/vsphere_driver/version"
9
+ require "chef/provisioning/vsphere_driver/vsphere_helpers"
10
+ require "chef/provisioning/vsphere_driver/vsphere_url"
11
+ require "chef/provisioning/vsphere_driver/vm_helper"
12
+
13
+ # Provisions machines in vSphere.
13
14
  module ChefProvisioningVsphere
14
- # Provisions machines in vSphere.
15
+ # Inherits the Chef::Provisioning::Driver attirbutes
15
16
  class VsphereDriver < Chef::Provisioning::Driver
16
17
  include Chef::Mixin::ShellOut
17
18
 
19
+ # Creates the new object via the URL
20
+ #
21
+ # @param [String] driver_url The driver url to connect via.
22
+ # @param [Object] config The config to get to the machine you are creating.
18
23
  def self.from_url(driver_url, config)
19
24
  VsphereDriver.new(driver_url, config)
20
25
  end
@@ -34,6 +39,9 @@ module ChefProvisioningVsphere
34
39
  [driver_url || URI::VsphereUrl.from_config(config).to_s, config]
35
40
  end
36
41
 
42
+ # Converts the keys from strings to symbols
43
+ #
44
+ # @param [Object] h converts to key:value
37
45
  def self.symbolize_keys(h)
38
46
  Hash === h ?
39
47
  Hash[
@@ -43,6 +51,9 @@ module ChefProvisioningVsphere
43
51
  ] : h
44
52
  end
45
53
 
54
+ # Converts the keys from strings to symbols
55
+ #
56
+ # @param [Object] hash_like converts to key:value
46
57
  def deep_symbolize(hash_like)
47
58
  return {} if hash_like.nil? || hash_like.empty?
48
59
  r = {}
@@ -53,17 +64,21 @@ module ChefProvisioningVsphere
53
64
  r
54
65
  end
55
66
 
67
+ # Initialize method for this class
68
+ #
69
+ # @param [String] driver_url Location of where the driver needs to connect to.
70
+ # @param [Object] config The complete config of the machine options.
56
71
  def initialize(driver_url, config)
57
72
  super(driver_url, config)
58
73
 
59
74
  uri = URI(driver_url)
60
75
  @connect_options = {
61
- provider: 'vsphere',
76
+ provider: "vsphere",
62
77
  host: uri.host,
63
78
  port: uri.port,
64
79
  use_ssl: uri.use_ssl,
65
80
  insecure: uri.insecure,
66
- path: uri.path
81
+ path: uri.path,
67
82
  }
68
83
 
69
84
  if driver_options
@@ -74,6 +89,8 @@ module ChefProvisioningVsphere
74
89
 
75
90
  attr_reader :connect_options, :vm_helper
76
91
 
92
+ # Creates a new vm_helper if not already there
93
+ #
77
94
  def vm_helper
78
95
  @vm_helper ||= ChefProvisioningVsphere::VmHelper.new
79
96
  end
@@ -132,13 +149,13 @@ module ChefProvisioningVsphere
132
149
  )
133
150
  vm = vm_for(machine_spec)
134
151
  if vm
135
- Chef::Log.warn 'returning existing machine'
152
+ Chef::Log.warn "returning existing machine"
136
153
  return vm
137
154
  else
138
155
  Chef::Log.warn machine_msg(
139
156
  machine_spec.name,
140
- machine_spec.location['server_id'],
141
- 'no longer exists. Recreating ...'
157
+ machine_spec.location["server_id"],
158
+ "no longer exists. Recreating ..."
142
159
  )
143
160
  end
144
161
  end
@@ -155,11 +172,14 @@ module ChefProvisioningVsphere
155
172
  action_handler.performed_action(machine_msg(
156
173
  machine_spec.name,
157
174
  vm.config.instanceUuid,
158
- 'created'
175
+ "created"
159
176
  ))
160
177
  vm
161
178
  end
162
179
 
180
+ # Squishes the options to one large hash
181
+ #
182
+ # @param [Object] machine_options taken from Chef provisioning for all the `machine_options`
163
183
  def merge_options!(machine_options)
164
184
  @config = Cheffish::MergedConfig.new(
165
185
  { machine_options: machine_options },
@@ -168,17 +188,26 @@ module ChefProvisioningVsphere
168
188
  @config = deep_symbolize(@config.to_h)
169
189
  end
170
190
 
191
+ # Adds machine spec location from other options.
192
+ #
193
+ # @param [Object] machine_spec taken from Chef provisioning for all the `machine_spec`.
194
+ # @param [Object] vm taken from Chef provisioning for all the vm state.
171
195
  def add_machine_spec_location(vm, machine_spec)
172
196
  machine_spec.location = {
173
- 'driver_url' => driver_url,
174
- 'driver_version' => VERSION,
175
- 'server_id' => vm.config.instanceUuid,
176
- 'is_windows' => is_windows?(vm),
177
- 'allocated_at' => Time.now.utc.to_s,
178
- 'ipaddress' => vm.guest.ipAddress
197
+ "driver_url" => driver_url,
198
+ "driver_version" => VERSION,
199
+ "server_id" => vm.config.instanceUuid,
200
+ "is_windows" => is_windows?(vm),
201
+ "allocated_at" => Time.now.utc.to_s,
202
+ "ipaddress" => vm.guest.ipAddress,
179
203
  }
180
204
  end
181
205
 
206
+ # Verify if machine is there or create it.
207
+ #
208
+ # @param [Object] bootstrap_options taken from Chef provisioning for all the bootstrap options.
209
+ # @param [Object] machine_spec taken from Chef provisioning for all the `machine_spec`.
210
+ # @param [Object] action_handler taken from Chef provisioning for TODO.
182
211
  def find_or_create_vm(bootstrap_options, machine_spec, action_handler)
183
212
  vm = vsphere_helper.find_vm(
184
213
  bootstrap_options[:vm_folder],
@@ -188,7 +217,7 @@ module ChefProvisioningVsphere
188
217
  Chef::Log.info machine_msg(
189
218
  machine_spec.name,
190
219
  vm.config.instanceUuid,
191
- 'already created'
220
+ "already created"
192
221
  )
193
222
  else
194
223
  vm = clone_vm(
@@ -200,12 +229,16 @@ module ChefProvisioningVsphere
200
229
  vm
201
230
  end
202
231
 
232
+ # Creates a full description of the machine.
233
+ #
234
+ # @param [Object] bootstrap_options taken from Chef provisioning for all the bootstrap options.
235
+ # @param [Object] machine_spec taken from Chef provisioning for all the `machine_spec`.
203
236
  def full_description(machine_spec, bootstrap_options)
204
237
  description = ["creating machine #{machine_spec.name} on #{driver_url}"]
205
238
  bootstrap_options.to_hash.each_pair do |key, value|
206
239
  if value.is_a?(Hash)
207
240
  temp_value = value.clone
208
- temp_value[:password] = '*********' if value.key?(:password)
241
+ temp_value[:password] = "*********" if value.key?(:password)
209
242
  else
210
243
  temp_value = value
211
244
  end
@@ -214,10 +247,21 @@ module ChefProvisioningVsphere
214
247
  description
215
248
  end
216
249
 
250
+ # Creates a string of specific Machine information
251
+ #
252
+ # @param [String] name The name of the machine
253
+ # @param [String] id The ID of the machine
254
+ # @param [Object] action TODO
255
+ # @return [String] "Machine - ACTION - NAME (UUID on URL)"
217
256
  def machine_msg(name, id, action)
218
257
  "Machine - #{action} - #{name} (#{id} on #{driver_url})"
219
258
  end
220
259
 
260
+ # Sets the machine to ready state. (Creates the machine but does not bootstrap Chef into it.)
261
+ #
262
+ # @param [Object] action_handler TODO
263
+ # @param [Object] machine_options taken from Chef provisioning for all the bootstrap options.
264
+ # @param [Object] machine_spec taken from Chef provisioning for all the `machine_spec`.
221
265
  def ready_machine(action_handler, machine_spec, machine_options)
222
266
  machine_options = deep_symbolize(machine_options)
223
267
  merge_options! machine_options
@@ -225,7 +269,7 @@ module ChefProvisioningVsphere
225
269
  vm = start_machine(action_handler, machine_spec, machine_options)
226
270
  if vm.nil?
227
271
  raise "Machine #{machine_spec.name} does not have a server "\
228
- 'associated with it, or server does not exist.'
272
+ "associated with it, or server does not exist."
229
273
  end
230
274
 
231
275
  bootstrap_options = machine_options[:bootstrap_options]
@@ -250,6 +294,12 @@ module ChefProvisioningVsphere
250
294
  machine
251
295
  end
252
296
 
297
+ # Creates new NICs for the machine
298
+ #
299
+ # @param [Object] action_handler TODO
300
+ # @param [Object] bootstrap_options taken from Chef provisioning for all the bootstrap options.
301
+ # @param [Object] vm The VM object.
302
+ # @param [Object] machine The machine object.
253
303
  def setup_extra_nics(action_handler, bootstrap_options, vm, machine)
254
304
  networks = bootstrap_options[:network_name]
255
305
  networks = [networks] if networks.is_a?(String)
@@ -271,6 +321,12 @@ module ChefProvisioningVsphere
271
321
  end
272
322
  end
273
323
 
324
+ # Is the transport layer ready?
325
+ #
326
+ # @param [Object] action_handler TODO
327
+ # @param [Object] machine_spec taken from Chef provisioning for all the bootstrap options.
328
+ # @param [Object] vm The VM object.
329
+ # @param [Object] machine_options The options required to talk to the VM.
274
330
  def transport_respond?(
275
331
  machine_options,
276
332
  vm,
@@ -284,7 +340,7 @@ module ChefProvisioningVsphere
284
340
  # Customization below may change this to a valid ip
285
341
  wait_until_ready(action_handler, machine_spec, machine_options, vm)
286
342
 
287
- if !machine_spec.location['ipaddress'] || !has_ip?(machine_spec.location['ipaddress'], vm)
343
+ if !machine_spec.location["ipaddress"] || !has_ip?(machine_spec.location["ipaddress"], vm)
288
344
  # find the ip we actually want
289
345
  # this will be the static ip to assign
290
346
  # or the ip reported back by the vm if using dhcp
@@ -298,7 +354,7 @@ module ChefProvisioningVsphere
298
354
  unless !transport.nil? && transport.available? && has_ip?(vm_ip, vm)
299
355
  attempt_ip(machine_options, action_handler, vm, machine_spec)
300
356
  end
301
- machine_spec.location['ipaddress'] = vm.guest.ipAddress
357
+ machine_spec.location["ipaddress"] = vm_ip # vm.guest.ipAddress vmWare ip_address here can be 0.0.0.0
302
358
  action_handler.report_progress(
303
359
  "IP address obtained: #{machine_spec.location['ipaddress']}"
304
360
  )
@@ -310,14 +366,14 @@ module ChefProvisioningVsphere
310
366
  wait_for_transport(action_handler, machine_spec, machine_options, vm)
311
367
  rescue Timeout::Error
312
368
  # Only ever reboot once, and only if it's been less than 10 minutes since we stopped waiting
313
- if machine_spec.location['started_at'] ||
314
- remaining_wait_time(machine_spec, machine_options) < -(10 * 60)
369
+ if machine_spec.location["started_at"] ||
370
+ remaining_wait_time(machine_spec, machine_options) < -(10 * 60)
315
371
  raise
316
372
  else
317
373
  Chef::Log.warn(machine_msg(
318
374
  machine_spec.name,
319
375
  vm.config.instanceUuid,
320
- 'started but SSH did not come up. Rebooting...'
376
+ "started but SSH did not come up. Rebooting..."
321
377
  ))
322
378
  restart_server(action_handler, machine_spec, machine_options)
323
379
  wait_until_ready(action_handler, machine_spec, machine_options, vm)
@@ -326,19 +382,25 @@ module ChefProvisioningVsphere
326
382
  end
327
383
  end
328
384
 
385
+ # Test out the IP to connect to.
386
+ #
387
+ # @param [Object] action_handler TODO
388
+ # @param [Object] machine_options taken from Chef provisioning for all the bootstrap options.
389
+ # @param [Object] vm The VM object.
390
+ # @param [Object] machine_spec The spec required to talk to the VM.
329
391
  def attempt_ip(machine_options, action_handler, vm, machine_spec)
330
392
  vm_ip = ip_to_bootstrap(machine_options[:bootstrap_options], vm)
331
393
 
332
394
  wait_for_ip(vm, machine_options, machine_spec, action_handler)
333
395
 
334
396
  unless has_ip?(vm_ip, vm)
335
- action_handler.report_progress 'rebooting...'
336
- if vm.guest.toolsRunningStatus != 'guestToolsRunning'
337
- msg = 'tools have stopped. current power state is '
397
+ action_handler.report_progress "rebooting..."
398
+ if vm.guest.toolsRunningStatus != "guestToolsRunning"
399
+ msg = "tools have stopped. current power state is "
338
400
  msg << vm.runtime.powerState
339
- msg << ' and tools state is '
401
+ msg << " and tools state is "
340
402
  msg << vm.guest.toolsRunningStatus
341
- msg << '. powering up server...'
403
+ msg << ". powering up server..."
342
404
  action_handler.report_progress(msg)
343
405
  vsphere_helper.start_vm(vm)
344
406
  else
@@ -348,6 +410,12 @@ module ChefProvisioningVsphere
348
410
  end
349
411
  end
350
412
 
413
+ # Wait for the Windows Domain.
414
+ #
415
+ # @param [Object] action_handler TODO
416
+ # @param [Object] bootstrap_options taken from Chef provisioning for all the bootstrap options.
417
+ # @param [Object] vm The VM object.
418
+ # @param [Object] machine_spec The specs to connect to bootstrap machine
351
419
  def wait_for_domain(bootstrap_options, vm, machine_spec, action_handler)
352
420
  return unless bootstrap_options[:customization_spec]
353
421
 
@@ -363,7 +431,7 @@ module ChefProvisioningVsphere
363
431
 
364
432
  return unless domain
365
433
 
366
- if is_windows?(vm) && domain != 'local'
434
+ if is_windows?(vm) && domain != "local"
367
435
  start = Time.now.utc
368
436
  trimmed_name = machine_spec.name.byteslice(0, 15)
369
437
  expected_name = "#{trimmed_name}.#{domain}"
@@ -371,13 +439,19 @@ module ChefProvisioningVsphere
371
439
  "waiting to domain join and be named #{expected_name}"
372
440
  )
373
441
  until (Time.now.utc - start) > 30 ||
374
- (vm.guest.hostName == expected_name)
375
- print '.'
442
+ (vm.guest.hostName == expected_name)
443
+ print "."
376
444
  sleep 5
377
445
  end
378
446
  end
379
447
  end
380
448
 
449
+ # Wait for another IP allocation.
450
+ #
451
+ # @param [Object] action_handler TODO
452
+ # @param [Object] vm The VM object.
453
+ # @param [Object] machine_options The machine options required to start the VM.
454
+ # @param [Object] machine_spec The machine spec required to start the VM.
381
455
  def wait_for_ip(vm, machine_options, machine_spec, action_handler)
382
456
  bootstrap_options = machine_options[:bootstrap_options]
383
457
  ip_to_bootstrap(bootstrap_options, vm)
@@ -387,7 +461,7 @@ module ChefProvisioningVsphere
387
461
  msg = [msg1, msg2].join
388
462
  action_handler.report_progress msg
389
463
 
390
- vm_ip ||= ip_to_bootstrap(bootstrap_options, vm)
464
+ vm_ip = @vm_helper.ip || ip_to_bootstrap(bootstrap_options, vm)
391
465
  until transport_for(
392
466
  machine_spec,
393
467
  machine_options[:bootstrap_options][:ssh],
@@ -396,7 +470,7 @@ module ChefProvisioningVsphere
396
470
  action_handler.report_progress(
397
471
  "IP addresses found: #{all_ips_for(vm)}"
398
472
  )
399
- vm_ip ||= ip_to_bootstrap(bootstrap_options, vm)
473
+ vm_ip = @vm_helper.ip || ip_to_bootstrap(bootstrap_options, vm)
400
474
  if has_ip?(vm_ip, vm)
401
475
  transport_for(
402
476
  machine_spec,
@@ -408,21 +482,36 @@ module ChefProvisioningVsphere
408
482
  end
409
483
  end
410
484
 
485
+ # Flatten all IPs for a VM
486
+ #
487
+ # @param [Object] vm The VM object.
411
488
  def all_ips_for(vm)
412
489
  vm.guest.net.map(&:ipAddress).flatten
413
490
  end
414
491
 
492
+ # Does the VM have this IP?
493
+ #
494
+ # @param [Object] vm The VM object.
495
+ # @param [String] ip IP to see if it's in the map.
415
496
  def has_ip?(ip, vm)
416
497
  all_ips_for(vm).include?(ip)
417
498
  end
418
499
 
419
500
  # Connect to machine without acquiring it
501
+ #
502
+ # @param [Object] machine_options The machine options required to start the VM.
503
+ # @param [Object] machine_spec The machine spec required to start the VM.
420
504
  def connect_to_machine(machine_spec, machine_options)
421
505
  machine_options = deep_symbolize(machine_options)
422
506
  merge_options! machine_options
423
507
  machine_for(machine_spec, machine_options)
424
508
  end
425
509
 
510
+ # Destroy the Machine
511
+ #
512
+ # @param [Object] machine_options The machine options required to start the VM.
513
+ # @param [Object] machine_spec The machine spec required to start the VM.
514
+ # @param [Object] action_handler TODO
426
515
  def destroy_machine(action_handler, machine_spec, machine_options)
427
516
  machine_options = deep_symbolize(machine_options)
428
517
  merge_options! machine_options
@@ -433,7 +522,7 @@ module ChefProvisioningVsphere
433
522
  vsphere_helper.stop_vm(vm, machine_options[:stop_timeout])
434
523
  vm.Destroy_Task.wait_for_completion
435
524
  rescue RbVmomi::Fault => fault
436
- raise fault unless fault.fault.class.wsdl_name == 'ManagedObjectNotFound'
525
+ raise fault unless fault.fault.class.wsdl_name == "ManagedObjectNotFound"
437
526
  ensure
438
527
  machine_spec.location = nil
439
528
  end
@@ -443,6 +532,11 @@ module ChefProvisioningVsphere
443
532
  strategy.cleanup_convergence(action_handler, machine_spec)
444
533
  end
445
534
 
535
+ # Stop the Machine
536
+ #
537
+ # @param [Object] machine_options The machine options required to start the VM.
538
+ # @param [Object] machine_spec The machine spec required to start the VM.
539
+ # @param [Object] action_handler TODO
446
540
  def stop_machine(action_handler, machine_spec, machine_options)
447
541
  machine_options = deep_symbolize(machine_options)
448
542
  merge_options! machine_options
@@ -454,6 +548,11 @@ module ChefProvisioningVsphere
454
548
  end
455
549
  end
456
550
 
551
+ # Start the Machine
552
+ #
553
+ # @param [Object] machine_options The machine options required to start the VM.
554
+ # @param [Object] machine_spec The machine spec required to start the VM.
555
+ # @param [Object] action_handler TODO
457
556
  def start_machine(action_handler, machine_spec, machine_options)
458
557
  machine_options = deep_symbolize(machine_options)
459
558
  merge_options! machine_options
@@ -466,40 +565,53 @@ module ChefProvisioningVsphere
466
565
  vm
467
566
  end
468
567
 
568
+ # Restart the Machine
569
+ #
570
+ # @param [Object] machine_options The machine options required to start the VM.
571
+ # @param [Object] machine_spec The machine spec required to start the VM.
572
+ # @param [Object] action_handler TODO
469
573
  def restart_server(action_handler, machine_spec, machine_options)
470
574
  action_handler.perform_action "restart machine #{machine_spec.name} (#{driver_url})" do
471
575
  stop_machine(action_handler, machine_spec, machine_options)
472
576
  start_machine(action_handler, machine_spec, machine_options)
473
- machine_spec.location['started_at'] = Time.now.utc.to_s
577
+ machine_spec.location["started_at"] = Time.now.utc.to_s
474
578
  end
475
579
  end
476
580
 
477
581
  protected
478
582
 
583
+ # Ubuntu requires some...hacking to get DNS to work.
584
+ #
585
+ # @param [Object] bootstrap_options The bootstarp options required to start the VM.
586
+ # @param [Object] _machine_spec The machine spec required to start the VM.
587
+ # @param [Object] machine Machine object to connect to.
479
588
  def setup_ubuntu_dns(machine, bootstrap_options, _machine_spec)
480
- host_lookup = machine.execute_always('host google.com')
589
+ host_lookup = machine.execute_always("host google.com")
481
590
  if host_lookup.exitstatus != 0
482
- if host_lookup.stdout.include?('setlocale: LC_ALL')
483
- machine.execute_always('locale-gen en_US && update-locale LANG=en_US')
591
+ if host_lookup.stdout.include?("setlocale: LC_ALL")
592
+ machine.execute_always("locale-gen en_US && update-locale LANG=en_US")
484
593
  end
485
594
  distro = machine.execute_always("lsb_release -i | sed -e 's/Distributor ID://g'").stdout.strip
486
595
  Chef::Log.info "Found distro:#{distro}"
487
- if distro == 'Ubuntu'
488
- distro_version = machine.execute_always('lsb_release -r | sed -e s/[^0-9.]//g').stdout.strip.to_f
596
+ if distro == "Ubuntu"
597
+ distro_version = machine.execute_always("lsb_release -r | sed -e s/[^0-9.]//g").stdout.strip.to_f
489
598
  Chef::Log.info "Found distro version:#{distro_version}"
490
599
  if distro_version >= 12.04
491
- Chef::Log.info 'Ubuntu version 12.04 or greater. Need to patch DNS.'
492
- interfaces_file = '/etc/network/interfaces'
493
- nameservers = bootstrap_options[:customization_spec][:ipsettings][:dnsServerList].join(' ')
600
+ Chef::Log.info "Ubuntu version 12.04 or greater. Need to patch DNS."
601
+ interfaces_file = "/etc/network/interfaces"
602
+ nameservers = bootstrap_options[:customization_spec][:ipsettings][:dnsServerList].join(" ")
494
603
  machine.execute_always("if ! cat #{interfaces_file} | grep -q dns-search ; then echo 'dns-search #{bootstrap_options[:customization_spec][:domain]}' >> #{interfaces_file} ; fi")
495
604
  machine.execute_always("if ! cat #{interfaces_file} | grep -q dns-nameservers ; then echo 'dns-nameservers #{nameservers}' >> #{interfaces_file} ; fi")
496
- machine.execute_always('/etc/init.d/networking restart')
497
- machine.execute_always('apt-get -qq update')
605
+ machine.execute_always("/etc/init.d/networking restart")
606
+ machine.execute_always("apt-get -qq update")
498
607
  end
499
608
  end
500
609
  end
501
610
  end
502
611
 
612
+ # Verify static IP.
613
+ #
614
+ # @param [Object] bootstrap_options The bootstarp options required to start the VM.
503
615
  def has_static_ip(bootstrap_options)
504
616
  if bootstrap_options.key?(:customization_spec)
505
617
  bootstrap_options = bootstrap_options[:customization_spec]
@@ -516,22 +628,22 @@ module ChefProvisioningVsphere
516
628
  end
517
629
 
518
630
  def remaining_wait_time(machine_spec, machine_options)
519
- if machine_spec.location['started_at']
631
+ if machine_spec.location["started_at"]
520
632
  (machine_options[:start_timeout] || 600) -
521
- (Time.now.utc - Time.parse(machine_spec.location['started_at']))
633
+ (Time.now.utc - Time.parse(machine_spec.location["started_at"]))
522
634
  else
523
635
  (machine_options[:create_timeout] || 600) -
524
- (Time.now.utc - Time.parse(machine_spec.location['allocated_at']))
636
+ (Time.now.utc - Time.parse(machine_spec.location["allocated_at"]))
525
637
  end
526
638
  end
527
639
 
528
640
  def wait_until_ready(action_handler, machine_spec, machine_options, vm)
529
- if vm.guest.toolsRunningStatus != 'guestToolsRunning'
641
+ if vm.guest.toolsRunningStatus != "guestToolsRunning"
530
642
  if action_handler.should_perform_actions
531
643
  action_handler.report_progress "waiting for #{machine_spec.name} (#{vm.config.instanceUuid} on #{driver_url}) to be ready ..."
532
644
  until remaining_wait_time(machine_spec, machine_options) < 0 ||
533
- (vm.guest.toolsRunningStatus == 'guestToolsRunning' && vm.guest.ipAddress && !vm.guest.ipAddress.empty?)
534
- print '.'
645
+ (vm.guest.toolsRunningStatus == "guestToolsRunning" && vm.guest.ipAddress && !vm.guest.ipAddress.empty?)
646
+ print "."
535
647
  sleep 5
536
648
  end
537
649
  action_handler.report_progress "#{machine_spec.name} is now ready"
@@ -541,7 +653,7 @@ module ChefProvisioningVsphere
541
653
 
542
654
  def vm_for(machine_spec)
543
655
  if machine_spec.location
544
- vsphere_helper.find_vm_by_id(machine_spec.location['server_id'])
656
+ vsphere_helper.find_vm_by_id(machine_spec.location["server_id"])
545
657
  end
546
658
  end
547
659
 
@@ -570,7 +682,7 @@ module ChefProvisioningVsphere
570
682
  size = size.to_i
571
683
  next if size == 0
572
684
  if bootstrap_options[:datastore].to_s.empty?
573
- raise ':datastore must be specified when adding a disk to a cloned vm'
685
+ raise ":datastore must be specified when adding a disk to a cloned vm"
574
686
  end
575
687
  task = vm.ReconfigVM_Task(
576
688
  spec: RbVmomi::VIM.VirtualMachineConfigSpec(
@@ -579,7 +691,7 @@ module ChefProvisioningVsphere
579
691
  vm,
580
692
  bootstrap_options[:datastore],
581
693
  size
582
- )
694
+ ),
583
695
  ]
584
696
  )
585
697
  )
@@ -614,7 +726,7 @@ module ChefProvisioningVsphere
614
726
  )
615
727
  strategy = convergence_strategy_for(machine_spec, machine_options)
616
728
 
617
- if machine_spec.location['is_windows']
729
+ if machine_spec.location["is_windows"]
618
730
  Chef::Provisioning::Machine::WindowsMachine.new(
619
731
  machine_spec, transport, strategy
620
732
  )
@@ -627,13 +739,13 @@ module ChefProvisioningVsphere
627
739
 
628
740
  def is_windows?(vm)
629
741
  return false if vm.nil?
630
- vm.config.guestId.start_with?('win')
742
+ vm.config.guestId.start_with?("win")
631
743
  end
632
744
 
633
745
  def convergence_strategy_for(machine_spec, machine_options)
634
- require 'chef/provisioning/convergence_strategy/install_msi'
635
- require 'chef/provisioning/convergence_strategy/install_cached'
636
- require 'chef/provisioning/convergence_strategy/no_converge'
746
+ require "chef/provisioning/convergence_strategy/install_msi"
747
+ require "chef/provisioning/convergence_strategy/install_cached"
748
+ require "chef/provisioning/convergence_strategy/no_converge"
637
749
 
638
750
  mopts = machine_options[:convergence_options].to_hash.dup
639
751
  if mopts[:chef_server]
@@ -647,7 +759,7 @@ module ChefProvisioningVsphere
647
759
  )
648
760
  end
649
761
 
650
- if machine_spec.location['is_windows']
762
+ if machine_spec.location["is_windows"]
651
763
  Chef::Provisioning::ConvergenceStrategy::InstallMsi.new(
652
764
  mopts, config
653
765
  )
@@ -658,6 +770,12 @@ module ChefProvisioningVsphere
658
770
  end
659
771
  end
660
772
 
773
+ # Wait for the transport connection to happen
774
+ #
775
+ # @param [Object] machine_spec The machine_spec from Chef-Provisioning
776
+ # @param [Object] machine_options Options for remote connections
777
+ # @param [Object] vm The VM object from Chef-Provisioning
778
+ # @param [Object] action_handler taken from Chef provisioning for TODO.
661
779
  def wait_for_transport(action_handler, machine_spec, machine_options, vm)
662
780
  @vm_helper.find_port?(vm, machine_options[:bootstrap_options]) if vm_helper.port.nil?
663
781
  transport = transport_for(
@@ -669,7 +787,7 @@ module ChefProvisioningVsphere
669
787
  action_handler.report_progress "waiting for #{machine_spec.name} (#{vm.config.instanceUuid} on #{driver_url}) to be connectable (transport up and running) ..."
670
788
 
671
789
  until remaining_wait_time(machine_spec, machine_options) < 0 || transport.available?
672
- print '.'
790
+ print "."
673
791
  sleep 5
674
792
  end
675
793
 
@@ -678,29 +796,38 @@ module ChefProvisioningVsphere
678
796
  end
679
797
  end
680
798
 
799
+ # Figure out the transport system to send to the VM
800
+ #
801
+ # @param [Object] machine_spec The machine_spec from Chef-Provisioning
802
+ # @param [Object] remoting_options Options for remote connections
803
+ # @param [String] ip The IP to connect to.
681
804
  def transport_for(
682
805
  machine_spec,
683
806
  remoting_options,
684
- ip = machine_spec.location['ipaddress']
807
+ ip = machine_spec.location["ipaddress"]
685
808
  )
686
- if machine_spec.location['is_windows']
809
+ if machine_spec.location["is_windows"]
687
810
  create_winrm_transport(ip, remoting_options)
688
811
  else
689
812
  create_ssh_transport(ip, remoting_options)
690
813
  end
691
814
  end
692
815
 
816
+ # Create a robust WinRM transport connect, so so many options to make a simple connection
817
+ #
818
+ # @param [String] host The host the VM is connecting to
819
+ # @param [Object] options Options that are required to connect to the host from Chef-Provisioning
693
820
  def create_winrm_transport(host, options)
694
- require 'chef/provisioning/transport/winrm'
821
+ require "chef/provisioning/transport/winrm"
695
822
  winrm_transport = if options[:port] == 5986
696
823
  :ssl
697
824
  else
698
825
  options[:winrm_transport].nil? ? :negotiate : options[:winrm_transport].to_sym
699
826
  end
700
- port = options[:port] || @vm_helper.port # winrm_transport == :ssl ? '5986' : '5985'
827
+ port = options[:port] || @vm_helper.port
701
828
  winrm_options = {
702
829
  user: (options[:user]).to_s,
703
- pass: options[:password]
830
+ pass: options[:password],
704
831
  }
705
832
  if options[:winrm_opts].nil?
706
833
  opt = options[:user].include?('\\') ? :disable_sspi : :basic_auth_only
@@ -719,30 +846,37 @@ module ChefProvisioningVsphere
719
846
  )
720
847
  end
721
848
 
849
+ # Find the IP to bootstrap against
850
+ #
851
+ # @param [String] host The host the VM is connecting to
852
+ # @param [Object] options Options that are required to connect to the host from Chef-Provisioning
722
853
  def create_ssh_transport(host, options)
723
- require 'chef/provisioning/transport/ssh'
854
+ require "chef/provisioning/transport/ssh"
724
855
  ssh_user = options[:user]
725
856
  options = options.each_with_object({}) { |(k, v), memo| memo[k.to_sym] = v; }
726
857
  Chef::Provisioning::Transport::SSH.new(
727
858
  host,
728
859
  ssh_user,
729
860
  options.to_hash,
730
- @config[:machine_options][:sudo] ? { prefix: 'sudo ' } : {},
861
+ @config[:machine_options][:sudo] ? { prefix: "sudo " } : {},
731
862
  config
732
863
  )
733
864
  end
734
865
 
866
+ # Find the IP to bootstrap against
867
+ #
868
+ # @param [Object] bootstrap_options The bootstrap options from Chef-Provisioning
869
+ # @param [Object] vm The VM object from Chef-Provisioning
735
870
  def ip_to_bootstrap(bootstrap_options, vm)
736
871
  @vm_helper.find_port?(vm, bootstrap_options) unless vm_helper.port?
737
872
  if has_static_ip(bootstrap_options)
738
873
  if bootstrap_options[:customization_spec].is_a?(String)
739
874
  spec = vsphere_helper.find_customization_spec(bootstrap_options[:customization_spec])
740
- spec.nicSettingMap[0].adapter.ip.ipAddress
875
+ @vm_helper.ip = spec.nicSettingMap[0].adapter.ip.ipAddress
741
876
  else
742
877
  ## Check if true available
743
878
  @vm_helper.ip = bootstrap_options[:customization_spec][:ipsettings][:ip] unless vm_helper.ip?
744
- print '.' until @vm_helper.open_port?(@vm_helper.ip, @vm_helper.port, 1)
745
- @vm_helper.ip.to_s
879
+ print "." until @vm_helper.open_port?(@vm_helper.ip, @vm_helper.port, 1)
746
880
  end
747
881
  else
748
882
  if use_ipv4_during_bootstrap?(bootstrap_options)
@@ -751,10 +885,13 @@ module ChefProvisioningVsphere
751
885
  end
752
886
  end
753
887
  @vm_helper.ip = vm.guest.ipAddress until vm_guest_ip?(vm) && @vm_helper.open_port?(@vm_helper.ip, @vm_helper.port, 1) # Don't set empty ip
754
- @vm_helper.ip
755
888
  end
889
+ @vm_helper.ip.to_s
756
890
  end
757
891
 
892
+ # Force IPv4 a bootstrap, default: false
893
+ #
894
+ # @param [Object] bootstrap_options The bootstrap options from Chef-Provisioning
758
895
  def use_ipv4_during_bootstrap?(bootstrap_options)
759
896
  if bootstrap_options.key?(:bootstrap_ipv4)
760
897
  return bootstrap_options[:bootstrap_ipv4] == true
@@ -762,6 +899,9 @@ module ChefProvisioningVsphere
762
899
  false
763
900
  end
764
901
 
902
+ # Setting a bootstrap ip timeout, default: 30
903
+ #
904
+ # @param [Object] bootstrap_options The bootstrap options from Chef-Provisioning
765
905
  def bootstrap_ip_timeout(bootstrap_options)
766
906
  if bootstrap_options.key?(:ipv4_timeout)
767
907
  return bootstrap_options[:ipv4_timeout].to_i
@@ -769,25 +909,32 @@ module ChefProvisioningVsphere
769
909
  30
770
910
  end
771
911
 
912
+ # What for IPv4 address
913
+ #
914
+ # @param [String] timeout Declared a timeout
915
+ # @param [Object] vm The VM object from Chef-Provisioning
772
916
  def wait_for_ipv4(timeout, vm)
773
917
  sleep_time = 5
774
- print 'Waiting for ipv4 address.'
918
+ print "Waiting for ipv4 address."
775
919
  tries = 0
776
920
  start_search_ip = true
777
921
  max_tries = timeout > sleep_time ? timeout / sleep_time : 1
778
922
  while start_search_ip && (tries += 1) <= max_tries
779
- print '.'
923
+ print "."
780
924
  sleep sleep_time
781
925
  @vm_helper.ip = vm.guest.ipAddress if vm_guest_ip?(vm)
782
926
  start_search_ip = false if @vm_helper.open_port?(@vm_helper.ip, @vm_helper.port, 1)
783
927
  end
784
- raise 'Timed out waiting for ipv4 address!' if tries > max_tries && !IPAddr.new(vm.guest.ipAddress).ipv4?
785
- puts 'Found ipv4 address!'
928
+ raise "Timed out waiting for ipv4 address!" if tries > max_tries && !IPAddr.new(vm.guest.ipAddress).ipv4?
929
+ puts "Found ipv4 address!"
786
930
  true
787
931
  end
788
932
 
933
+ # What is the VM guest IP
934
+ #
935
+ # @param [Object] vm The VM object from Chef-Provisioning
789
936
  def vm_guest_ip?(vm)
790
- vm.guest.guestState == 'running' && vm.guest.toolsRunningStatus == 'guestToolsRunning' && !vm.guest.ipAddress.nil? && IPAddr.new(vm.guest.ipAddress).ipv4?
937
+ vm.guest.guestState == "running" && vm.guest.toolsRunningStatus == "guestToolsRunning" && !vm.guest.ipAddress.nil? && IPAddr.new(vm.guest.ipAddress).ipv4?
791
938
  end
792
939
  end
793
940
  end