From 3ebd5f3b90270706ccbf3190396e842ab0721ce0 Mon Sep 17 00:00:00 2001 From: Alejandro Huertas Herrero Date: Mon, 11 Feb 2019 12:04:56 +0100 Subject: [PATCH] F #2645 Made some code refactor in provision create function (#2920) Fix onehost linter issue due to rubocop update --- share/linters/.rubocop.yml | 7 - src/cli/one_helper/onehost_helper.rb | 4 +- src/cli/oneprovision | 4 +- src/oneprovision/lib/provision.rb | 299 +++++++++++++++------------ 4 files changed, 174 insertions(+), 140 deletions(-) diff --git a/share/linters/.rubocop.yml b/share/linters/.rubocop.yml index a88d22710d..7c5863f6e4 100644 --- a/share/linters/.rubocop.yml +++ b/share/linters/.rubocop.yml @@ -377,13 +377,6 @@ AllCops: - src/cli/one_helper/onecluster_helper.rb - src/cli/one_helper/onevntemplate_helper.rb - src/cli/one_helper/onevrouter_helper.rb - - src/cli/one_helper/oneprovision_helpers/host_helper.rb - - src/cli/one_helper/oneprovision_helpers/provision_helper.rb - - src/cli/one_helper/oneprovision_helpers/cluster_helper.rb - - src/cli/one_helper/oneprovision_helpers/common_helper.rb - - src/cli/one_helper/oneprovision_helpers/datastore_helper.rb - - src/cli/one_helper/oneprovision_helpers/vnet_helper.rb - - src/cli/one_helper/oneprovision_helpers/ansible_helper.rb - src/cli/one_helper/onevdc_helper.rb - src/cli/one_helper/onedatastore_helper.rb - src/oca/ruby/test/VirtualMachine_spec.rb diff --git a/src/cli/one_helper/onehost_helper.rb b/src/cli/one_helper/onehost_helper.rb index 4aeee3a274..4beae97990 100644 --- a/src/cli/one_helper/onehost_helper.rb +++ b/src/cli/one_helper/onehost_helper.rb @@ -24,7 +24,7 @@ class OneHostHelper < OpenNebulaHelper::OneHelper TEMPLATE_XPATH = '//HOST/TEMPLATE' HYBRID = { :ec2 => { - :help => <<-EOT.unindent, + :help => <<-EOT.unindent #----------------------------------------------------------------------- # Supported EC2 AUTH ATTRIBUTTES: # @@ -46,7 +46,7 @@ class OneHostHelper < OpenNebulaHelper::OneHelper EOT }, :az => { - :help => <<-EOT.unindent, + :help => <<-EOT.unindent #----------------------------------------------------------------------- # Supported AZURE AUTH ATTRIBUTTES: # diff --git a/src/cli/oneprovision b/src/cli/oneprovision index fe7449d795..9588af9071 100755 --- a/src/cli/oneprovision +++ b/src/cli/oneprovision @@ -225,7 +225,9 @@ CommandParser::CmdParser.new(ARGV) do EOT command :validate, validate_desc, [:config_file], :options => DUMP do - OneProvision::Utils.validate_configuration(args[0], (options.key? :dump)) + dump = options.key? :dump + + OneProvision::Utils.validate_configuration(args[0], dump) 0 end diff --git a/src/oneprovision/lib/provision.rb b/src/oneprovision/lib/provision.rb index 4f98a11ab0..162615bc44 100644 --- a/src/oneprovision/lib/provision.rb +++ b/src/oneprovision/lib/provision.rb @@ -38,7 +38,7 @@ module OneProvision # @return [Boolean] True if exists, false if not def exists resource = Cluster.new - pool = resource.pool + pool = resource.pool pool.info pool.each do |c| @@ -86,7 +86,7 @@ module OneProvision end if host.running_vms? - Utils.fail("Provision with running VMs can't be deleted") + Utils.fail('Provision with running VMs can\'t be deleted') end end @@ -164,77 +164,22 @@ module OneProvision # # @param config [String] Path to the configuration file def create(config) - Driver.retry_loop 'Failed to create provision' do - Ansible.check_ansible_version + Ansible.check_ansible_version + Driver.retry_loop 'Failed to create provision' do # read provision file cfg = Utils.create_config(Utils.read_config(config)) @name = cfg['name'] - cluster = nil - cid = nil - - cname = cfg['cluster']['name'] - OneProvisionLogger.info('Creating provision objects') - Driver.retry_loop 'Failed to create cluster' do - msg = "Creating OpenNebula cluster: #{cname}" - - OneProvisionLogger.debug(msg) - - # create new cluster - cluster = Cluster.new - cluster.create(cfg['cluster'], @id) - cluster = cluster.one - cid = cluster.id - - @clusters << cluster - - OneProvisionLogger.debug("cluster created with ID: #{cid}") - end + cluster = create_cluster(cfg) + cid = cluster.id Mode.new_cleanup(true) - %w[datastores networks].each do |r| - next if cfg[r].nil? - - cfg[r].each do |x| - begin - driver = cfg['defaults']['provision']['driver'] - msg = "#{r}: #{x['name']}" - - Driver.retry_loop "Failed to create #{msg}" do - OneProvisionLogger - .debug("Creating OpenNebula #{msg}") - - erb = Utils.evaluate_erb(self, x) - - if r == 'datastores' - datastore = Datastore.new - datastore.create(cid.to_i, erb, driver, @id) - @datastores << datastore.one - else - vnet = Vnet.new - vnet.create(cid.to_i, erb, driver, @id) - @vnets << vnet.one - end - - r = 'vnets' if r == 'networks' - rid = instance_variable_get("@#{r}").last['ID'] - - OneProvisionLogger - .debug("#{r} created with ID: #{rid}") - end - rescue OneProvisionCleanupException - refresh - delete - - exit - 1 - end - end - end + create_resources(cfg, cid) if cfg['hosts'].nil? puts "ID: #{@id}" @@ -243,18 +188,7 @@ module OneProvision end begin - cfg['hosts'].each do |h| - erb = Utils.evaluate_erb(self, h) - dfile = Utils .create_deployment_file(erb, @id) - playbook = cfg['playbook'] - - host = Host.new - host = host.create(dfile.to_xml, cid.to_i, playbook) - - @hosts << host - - host.offline - end + create_hosts(cfg, cid) # ask user to be patient, mandatory for now STDERR.puts 'WARNING: This operation can ' \ @@ -262,53 +196,7 @@ module OneProvision OneProvisionLogger.info('Deploying') - deploy_ids = [] - threads = [] - processed_hosts = 0 - - @hosts.each do |host| - processed_hosts += 1 - - host.info - - # deploy host - pm_mad = host['TEMPLATE/PM_MAD'] - id = host['ID'] - - OneProvisionLogger.debug("Deploying host: #{id}") - - deploy_file = Tempfile.new("xmlDeploy#{id}") - deploy_file.close - - Driver.write_file_log(deploy_file.path, host.to_xml) - - if Options.threads > 1 - threads << Thread.new do - Thread.current[:output] = - Driver.pm_driver_action(pm_mad, - 'deploy', - [deploy_file.path, - 'TODO']) - end - - if threads.size == Options.threads || - processed_hosts == @hosts.size - threads.map do |thread| - thread.join - deploy_ids << thread[:output] - deploy_file.unlink - end - - threads.clear - end - else - deploy_ids << Driver - .pm_driver_action(pm_mad, - 'deploy', - [deploy_file.path, - 'TODO']) - end - end + deploy_ids = deploy_hosts if deploy_ids.nil? || deploy_ids.empty? Utils.fail('Deployment failed, no ID got from driver') @@ -316,15 +204,7 @@ module OneProvision OneProvisionLogger.info('Monitoring hosts') - @hosts.each do |h| - h.add_element('//TEMPLATE/PROVISION', - 'DEPLOY_ID' => deploy_ids.shift.strip) - h.update(h.template_str) - - host = Host.new(h['ID']) - name = host.poll - h.rename(name) - end + update_hosts(deploy_ids) Ansible.configure(@hosts) @@ -345,6 +225,165 @@ module OneProvision Ansible.configure(@hosts, force) end + private + + # Creates a new cluster + # + # @param cfg [Key-Value Object] Configuration of the PROVISION + # + # @return [OpenNebula::Cluster] The new cluster + def create_cluster(cfg) + cluster = nil + + Driver.retry_loop 'Failed to create cluster' do + msg = "Creating OpenNebula cluster: #{cfg['cluster']['name']}" + + OneProvisionLogger.debug(msg) + + # create new cluster + cluster = Cluster.new + cluster.create(cfg['cluster'], @id) + cluster = cluster.one + cid = cluster.id + + @clusters << cluster + + OneProvisionLogger.debug("cluster created with ID: #{cid}") + end + + cluster + end + + # Creates PROVISION resources (datastores and networks) + # + # @param cfg [Key-Value Object] Configuration of the PROVISION + # @param cid [String] Cluster ID + def create_resources(cfg, cid) + %w[datastores networks].each do |r| + next if cfg[r].nil? + + cfg[r].each do |x| + begin + driver = cfg['defaults']['provision']['driver'] + r_name = "#{r}: #{x['name']}" + + Driver.retry_loop "Failed to create #{r_name}" do + msg = "Creating OpenNebula #{r_name}" + + OneProvisionLogger.debug(msg) + + erb = Utils.evaluate_erb(self, x) + + if r == 'datastores' + datastore = Datastore.new + datastore.create(cid.to_i, erb, driver, @id) + @datastores << datastore.one + else + vnet = Vnet.new + vnet.create(cid.to_i, erb, driver, @id) + @vnets << vnet.one + end + + r = 'vnets' if r == 'networks' + rid = instance_variable_get("@#{r}").last['ID'] + msg = "#{r} created with ID: #{rid}" + + OneProvisionLogger.debug(msg) + end + rescue OneProvisionCleanupException + refresh + delete + + exit - 1 + end + end + end + end + + # Creates PROVISION hosts + # + # @param cfg [Key-Value Object] Configuration of the PROVISION + # @param cid [String] Cluster ID + def create_hosts(cfg, cid) + cfg['hosts'].each do |h| + erb = Utils.evaluate_erb(self, h) + dfile = Utils .create_deployment_file(erb, @id) + playbook = cfg['playbook'] + + host = Host.new + host = host.create(dfile.to_xml, cid.to_i, playbook) + + @hosts << host + + host.offline + end + end + + # Deploy PROVISION hosts + # + # @return [Array] Provider deploy ids + def deploy_hosts + deploy_ids = [] + threads = [] + p_hosts = 0 + + @hosts.each do |host| + p_hosts += 1 + + host.info + + # deploy host + pm = host['TEMPLATE/PM_MAD'] + id = host['ID'] + + OneProvisionLogger.debug("Deploying host: #{id}") + + deploy_file = Tempfile.new("xmlDeploy#{id}") + deploy_file.close + + Driver.write_file_log(deploy_file.path, host.to_xml) + + params = [deploy_file.path, 'TODO'] + + if Options.threads > 1 + threads << Thread.new do + output = Driver.pm_driver_action(pm, 'deploy', params) + Thread.current[:output] = output + end + + if threads.size == Options.threads || p_hosts == @hosts.size + threads.map do |thread| + thread.join + deploy_ids << thread[:output] + deploy_file.unlink + end + + threads.clear + end + else + deploy_ids << Driver.pm_driver_action(pm, 'deploy', params) + end + end + + deploy_ids + end + + # Updates PROVISION hosts with deploy_id + # + # @param deploy_ids [Array] Array with all the deploy ids + def update_hosts(deploy_ids) + @hosts.each do |h| + deploy_id = deploy_ids.shift.strip + + h.add_element('//TEMPLATE/PROVISION', 'DEPLOY_ID' => deploy_id) + h.update(h.template_str) + + host = Host.new(h['ID']) + name = host.poll + h.rename(name) + end + end + end end