lib/kitchen/driver/vsphere.rb in chef-provisioning-vsphere-2.0.2 vs lib/kitchen/driver/vsphere.rb in chef-provisioning-vsphere-2.0.3

- old
+ new

@@ -1,13 +1,16 @@ # frozen_string_literal: true -require 'json' -require 'kitchen' -require 'chef/provisioning/vsphere_driver' -require 'chef/provisioning/machine_spec' +require "json" +require "kitchen" +require "chef/provisioning/vsphere_driver" +require "chef/provisioning/machine_spec" +# Main Kitchen Module module Kitchen + # Main Kitchen::Driver Module module Driver + # vSphere kitchen class extends the Kitchen::Driver::Base class Vsphere < Kitchen::Driver::Base @@chef_zero_server = false default_config :machine_options, start_timeout: 600, @@ -15,53 +18,62 @@ stop_timeout: 600, ready_timeout: 90, bootstrap_options: { use_linked_clone: true, ssh: { - user: 'root', + user: "root", paranoid: false, - port: 22 + port: 22, }, convergence_options: {}, customization_spec: { - domain: 'local' - } + domain: "local", + }, } default_config(:vsphere_name) do |driver| "#{driver.instance.name}-#{SecureRandom.hex(4)}" end + # Creates VM on the vSphere cluster + # + # @param [Object] state Uses state of the machine from Chef provisioning. def create(state) state[:vsphere_name] = config[:vsphere_name] state[:username] = config[:machine_options][:bootstrap_options][:ssh][:user] state[:password] = config[:machine_options][:bootstrap_options][:ssh][:password] config[:server_name] = state[:vsphere_name] machine = with_provisioning_driver(state) do |action_handler, driver, machine_spec| driver.allocate_machine(action_handler, machine_spec, config[:machine_options]) driver.ready_machine(action_handler, machine_spec, config[:machine_options]) - state[:server_id] = machine_spec.location['server_id'] - state[:hostname] = machine_spec.location['ipaddress'] + state[:server_id] = machine_spec.location["server_id"] + state[:hostname] = machine_spec.location["ipaddress"] machine_spec.save(action_handler) end end + # Destroys VM on the vSphere cluster + # + # @param [Object] state Uses state of the machine from Chef provisioning. def destroy(state) return if state[:server_id].nil? with_provisioning_driver(state) do |action_handler, driver, machine_spec| - machine_spec.location = { 'driver_url' => driver.driver_url, - 'server_id' => state[:server_id] } + machine_spec.location = { "driver_url" => driver.driver_url, + "server_id" => state[:server_id] } driver.destroy_machine(action_handler, machine_spec, config[:machine_options]) end state.delete(:server_id) state.delete(:hostname) state.delete(:vsphere_name) end + # Leverages the chef provisioning driver options + # + # @param [Object] state Uses state of the machine from Chef provisioning. def with_provisioning_driver(state) config[:machine_options][:convergence_options] = { chef_server: chef_server } machine_spec = Chef::Provisioning.chef_managed_entry_store(chef_server).get(:machine, state[:vsphere_name]) if machine_spec.nil? machine_spec = Chef::Provisioning.chef_managed_entry_store(chef_server) @@ -71,25 +83,29 @@ driver = Chef::Provisioning.driver_for_url(url, config) action_handler = Chef::Provisioning::ActionHandler.new yield(action_handler, driver, machine_spec) end + # Uses either a remote Chef server or Chef Zero + # def chef_server unless @@chef_zero_server vsphere_mutex.synchronize do unless @@chef_zero_server Chef::Config.local_mode = true Chef::Config.chef_repo_path = Chef::Config.find_chef_repo_path(Dir.pwd) - require 'chef/local_mode' + require "chef/local_mode" Chef::LocalMode.setup_server_connectivity @@chef_zero_server = true end end end Cheffish.default_chef_server end + # Creates a new mutex object for Kitchen + # def vsphere_mutex @@vsphere_mutex ||= begin Kitchen.mutex.synchronize do instance.class.mutexes ||= {} instance.class.mutexes[self.class] = Mutex.new