diff --git a/src/cli/one_helper/onevcenter_helper.rb b/src/cli/one_helper/onevcenter_helper.rb index 972c9bb589..63df620c4f 100644 --- a/src/cli/one_helper/onevcenter_helper.rb +++ b/src/cli/one_helper/onevcenter_helper.rb @@ -425,4 +425,59 @@ class OneVcenterHelper < OpenNebulaHelper::OneHelper return opts end + + def clear_tags(vmid) + client = Client.new + + vm_pool = VirtualMachinePool.new(client, -1) + host_pool = HostPool.new(client) + deploy_id = -1 + host_id = -1 + hostname = '' + + rc = vm_pool.info + raise rc.message if OpenNebula.is_error?(rc) + + rc = host_pool.info + raise rc.message if OpenNebula.is_error?(rc) + + vm_pool.each do |vm| + next if vm.id.to_s != vmid + + deploy_id = vm.deploy_id + vm_history = vm.to_hash['VM']['HISTORY_RECORDS']['HISTORY'] + hostname = vm_history['HOSTNAME'] + break + end + + host_pool.each do |host| + if host.name == hostname + host_id = host.id + end + end + + vi_client = VCenterDriver::VIClient.new_from_host(host_id) + vm = VCenterDriver::VirtualMachine + .new(vi_client, deploy_id, vmid) + + keys_to_remove = [] + vm['config.extraConfig'].each do |extraconfig| + if extraconfig.key.include?('opennebula.disk') || + extraconfig.key.include?('opennebula.vm') + keys_to_remove << extraconfig.key + end + end + + return vm, keys_to_remove + end + + def remove_keys(vm, keys_to_remove) + spec_hash = keys_to_remove.map {|key| { :key => key, :value => '' } } + + spec = RbVmomi::VIM.VirtualMachineConfigSpec( + :extraConfig => spec_hash + ) + vm.item.ReconfigVM_Task(:spec => spec).wait_for_completion + end + end diff --git a/src/cli/onevcenter b/src/cli/onevcenter index aa591284fc..bd9e215d0a 100755 --- a/src/cli/onevcenter +++ b/src/cli/onevcenter @@ -286,4 +286,49 @@ CommandParser::CmdParser.new(ARGV) do exit 0 end + + ############################################################################ + # Clear VM tags + ############################################################################ + cleartags_desc = <<-EOT.unindent + Clear extraconfig tags from a vCenter VM, useful when a VM has been + launched by OpenNebula and needs to be reimported + + Example: + - Clean VM 15: + + onevcenter cleargs 15 + EOT + command :cleartags, cleartags_desc, :vmid do + vmid = args[0] + remove_str = "\n onevm recover --delete-db #{vmid}" \ + "\n\nAfter a monitoring cycle, the VM will appear "\ + 'as a Wild VM for reimport.' + + print 'Extracting information from VM ' + vmid + + begin + print '.' + vm, keys = helper.clear_tags(vmid) + print '.' + + if keys.empty? + puts "\n\nNo OpenNebula keys present, is safe to remove the VM." + puts remove_str + exit 0 + end + puts '.' + + puts 'The following keys will be removed:' + keys.each {|key| puts "\t- #{key}" } + + helper.remove_keys(vm, keys) + rescue StandardError => e + STDERR.puts "Couldn't clear VM tags. Reason: #{e.message}" + exit 1 + end + puts "\nKeys removed from VM. Is safe to remove it" + puts remove_str + exit 0 + end end