1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-22 18:50:08 +03:00

F #5631: Add host list and cluster select (#1802)

to onevcenter command

(cherry picked from commit fac6e572b2c3101366dc4df0d2fd409100d5c09f)
This commit is contained in:
Alejandro Huertas Herrero 2022-02-22 16:01:52 +01:00 committed by Tino Vazquez
parent 7fda588067
commit 10260bb65c
No known key found for this signature in database
GPG Key ID: 14201E424D02047E
3 changed files with 189 additions and 99 deletions

View File

@ -27,9 +27,10 @@ class OneVcenterHelper < OpenNebulaHelper::OneHelper
module VOBJECT
DATASTORE = 1
TEMPLATE = 2
NETWORK = 3
IMAGE = 4
TEMPLATE = 2
NETWORK = 3
IMAGE = 4
HOST = 5
end
@ -85,6 +86,12 @@ class OneVcenterHelper < OpenNebulaHelper::OneHelper
:columns => { :IMID => 5, :REF => 35, :PATH => 60 },
:cli => [:host, :datastore],
:dialogue => ->(arg) {}
},
VOBJECT::HOST => {
:struct => %w[HOST_LIST HOST],
:columns => { :DATACENTER => 10, :NAME => 30, :REF => 35 },
:cli => [],
:dialogue => ->(arg) {}
}
}
@ -143,6 +150,8 @@ class OneVcenterHelper < OpenNebulaHelper::OneHelper
@vobject = VOBJECT::NETWORK
when 'images'
@vobject = VOBJECT::IMAGE
when 'hosts'
@vobject = VOBJECT::HOST
else
puts "unknown #{type} type option"
puts ' -o options:'
@ -150,6 +159,7 @@ class OneVcenterHelper < OpenNebulaHelper::OneHelper
puts ' templates'
puts ' networks'
puts ' images'
puts ' hosts'
exit 0
end
@ -186,6 +196,28 @@ class OneVcenterHelper < OpenNebulaHelper::OneHelper
}
end
# General method to list vCenter objects
#
# @param options [Hash] User CLI options
# @param args [Hash] Search arguments
def list(options, args)
if !options[:host]
# This case is to list available hosts, instead other object
list_hosts(options)
else
vi_client = VCenterDriver::VIClient.new_from_host(
options[:host]
)
importer = VCenterDriver::VcImporter.new_child(
@client,
vi_client,
options[:object]
)
list_object(options, importer.retrieve_resources(args))
end
end
# This method will print a list for a vcenter_resource.
#
def list_object(options, list)
@ -198,6 +230,31 @@ class OneVcenterHelper < OpenNebulaHelper::OneHelper
table.show(list, options)
end
# List unimported hosts
#
# @param options [Hash] User CLI options
def list_hosts(options)
con_ops = connection_options('hosts', options)
vi_client = VCenterDriver::VIClient.new(con_ops)
dc_folder = VCenterDriver::DatacenterFolder.new(vi_client)
hpool = VCenterDriver::VIHelper.one_pool(OpenNebula::HostPool,
false)
VCenterDriver::VIHelper.set_client(nil, @client)
list = []
hosts = dc_folder.get_unimported_hosts(hpool, vi_client.vim.host)
hosts.each do |key, value|
value.each do |v|
v[:datacenter] = key
list << v
end
end
format_list.show(hosts, options)
end
# handles :cli section of TABLE
# used for executing the dialogue in some VOBJECTS
#
@ -252,12 +309,18 @@ class OneVcenterHelper < OpenNebulaHelper::OneHelper
def format_list
config = TABLE[@vobject][:columns]
CLIHelper::ShowTable.new do
column :DATACENTER,
'Object datacenter',
:size => config[:DATACENTER] || 15 do |d|
d[:datacenter]
end
column :IMID, 'identifier for ...', :size=>config[:IMID] || 4 do |d|
d[:import_id]
end
column :REF, 'ref', :left, :adjust, :size=>config[:REF] || 15 do |d|
d[:ref]
d[:ref] || d[:cluster_ref]
end
column :NAME, 'Name', :left, :expand,

View File

@ -66,17 +66,56 @@ CommandParser::CmdParser.new(ARGV) do
helper.set_client(options)
end
############################################################################
# Authentication Options
############################################################################
VCENTER = {
:name => 'vcenter',
:large => '--vcenter vCenter',
:description => 'The vCenter hostname',
:format => String
}
USER = {
:name => 'vuser',
:large => '--vuser username',
:description => 'The username to interact with vCenter',
:format => String
}
PASS = {
:name => 'vpass',
:large => '--vpass password',
:description => 'The password for the user',
:format => String
}
PORT = {
:name => 'port',
:short => '-p port',
:large => '--port port',
:format => String,
:description => 'vCenter API port, defaults to 443 (SSL) or 80'
}
AUTH_OPTS = [VCENTER, USER, PASS, PORT]
############################################################################
# List & Import
############################################################################
OBJECT = {
:name => 'object',
:name => 'object',
:short => '-o object',
:large => '--object object ',
:format => String,
:description => 'vCenter object: [datastores, templates,'\
'networks, datastores, images]'
'networks, datastores, images, hosts]'
}
HOST = {
:name => 'host',
:name => 'host',
:short => '-h host_id',
:large => '--host host_id',
:format => String,
@ -84,7 +123,7 @@ CommandParser::CmdParser.new(ARGV) do
}
DATASTORE = {
:name => 'datastore',
:name => 'datastore',
:short => '-d datastore_id',
:large => '--datastore datastore_id',
:format => String,
@ -92,83 +131,63 @@ CommandParser::CmdParser.new(ARGV) do
}
CONFIG = {
:name => 'configuration',
:name => 'configuration',
:large => '--config file',
:format => String,
:description => 'Configuration file for custom options'
}
LINKED_CLONE = {
:name => 'linked_clone',
:name => 'linked_clone',
:large => '--linked_clone linked_clone',
:format => String,
:description => 'Import template as linked clone, 0/1'
}
COPY = {
:name => 'copy',
:name => 'copy',
:large => '--copy copy',
:format => String,
:description => 'Import template as copy, 0/1'
}
NAME = {
:name => 'name',
:name => 'name',
:large => '--name name',
:format => String,
:description => 'Import template copy with name'
}
FOLDER = {
:name => 'folder',
:name => 'folder',
:large => '--folder folder',
:format => String,
:description => 'Import template in folder'
}
VCENTER = {
:name => 'vcenter',
:large => '--vcenter vCenter',
:description => 'The vCenter hostname',
:format => String
}
USER = {
:name => 'vuser',
:large => '--vuser username',
:description => 'The username to interact with vCenter',
:format => String
}
PASS = {
:name => 'vpass',
:large => '--vpass password',
:description => 'The password for the user',
:format => String
}
PORT = {
:name => 'port',
:short => '-p port',
:large => '--port port',
:format => String,
:description => 'vCenter API port, defaults to 443 (SSL) or 80'
}
USE_DEFAULTS = {
:name => 'defaults',
:name => 'defaults',
:large => '--use-defaults',
:description => 'Use defaults for answers to questions',
:format => String
}
ALL = {
:name => 'all',
:name => 'all',
:large => '--all',
:description => 'Import all list',
:format => String
}
CLUSTER_REF = {
:name => 'cluster_ref',
:large => '--cluster-ref cluster_ref',
:format => String,
:description => 'Cluster ref to import'
}
LIST_OPTS = [OBJECT, HOST, DATASTORE, CLIHelper::CSV_OPT] + AUTH_OPTS
############################################################################
# Global Options
############################################################################
@ -189,29 +208,26 @@ CommandParser::CmdParser.new(ARGV) do
- listing available images:
onevcenter list -o datastores -h <host_id> -d <ds-img_id>
- listing available clusters:
onevcenter list -o hosts --vcenter <IP> --vuser <U> --vpass <P>
EOT
command :list,
list_desc,
:options => [OBJECT, HOST, DATASTORE, VCENTER, USER, PASS,
CLIHelper::CSV_OPT] do
command :list, list_desc, :options => LIST_OPTS do
begin
args = helper.parse_opts(options)
args[:filter] = true
args[:short] = true
vi_client = VCenterDriver::VIClient.new_from_host(options[:host])
importer = VCenterDriver::VcImporter
.new_child(helper.client, vi_client, options[:object])
args[:short] = true
list = importer.retrieve_resources(args)
helper.list_object(options, list)
helper.list(options, args)
rescue StandardError => e
STDERR.puts e.message
exit 1
end
exit 0
0
end
list_desc = <<-EOT.unindent
@ -221,30 +237,22 @@ CommandParser::CmdParser.new(ARGV) do
- listing networks including uplinks:
onevcenter list_all -o networks -h <host_id>
EOT
command :list_all,
list_desc,
:options => [OBJECT, HOST, DATASTORE, VCENTER, USER, PASS,
CLIHelper::CSV_OPT] do
command :list_all, list_desc, :options => LIST_OPTS do
begin
args = helper.parse_opts(options)
args[:filter] = false
args[:short] = true
vi_client = VCenterDriver::VIClient.new_from_host(options[:host])
importer = VCenterDriver::VcImporter
.new_child(helper.client, vi_client, options[:object])
args[:short] = true
list = importer.retrieve_resources(args)
helper.list_object(options, list)
helper.list(options, args)
rescue StandardError => e
STDERR.puts e.message
exit 1
end
exit 0
0
end
import_desc = <<-EOT.unindent
@ -265,21 +273,22 @@ CommandParser::CmdParser.new(ARGV) do
EOT
command :import,
import_desc, [:oid, nil],
import_desc,
[:oid, nil],
:options => [OBJECT, HOST, DATASTORE] do
begin
vi_client = VCenterDriver::VIClient.new_from_host(options[:host])
importer = VCenterDriver::VcImporter.new_child(helper.client,
vi_client,
options[:object])
importer = VCenterDriver::VcImporter.new_child(helper.client,
vi_client,
options[:object])
importer.retrieve_resources(helper.parse_opts(options))
indexes = importer.get_indexes(args.first)
if indexes.nil?
raise "Could not get any unimported #{options[:object]}"\
" resources info in host: #{options[:host]} with"\
" this input: #{args.first}"
" resources info in host: #{options[:host]} with"\
" this input: #{args.first}"
end
importer.process_import(indexes, options) do |object_info|
@ -292,21 +301,25 @@ CommandParser::CmdParser.new(ARGV) do
exit 1
end
exit 0
0
end
command :import_defaults,
import_desc,
[:oid, nil],
:options => [
OBJECT, HOST, DATASTORE, CONFIG,
FOLDER, LINKED_CLONE, COPY, NAME
] do
:options => [OBJECT,
HOST,
DATASTORE,
CONFIG,
FOLDER,
LINKED_CLONE,
COPY,
NAME] do
begin
vi_client = VCenterDriver::VIClient.new_from_host(options[:host])
importer = VCenterDriver::VcImporter.new_child(helper.client,
vi_client,
options[:object])
importer = VCenterDriver::VcImporter.new_child(helper.client,
vi_client,
options[:object])
if options[:object] == 'networks' && !args.first.nil?
indexes = args.first
@ -316,34 +329,35 @@ CommandParser::CmdParser.new(ARGV) do
end
if options[:object] == 'templates' &&
indexes &&
indexes.split(',').length == 1
indexes &&
indexes.split(',').length == 1
opts = {
:type => 'default',
:type => 'default',
:linked_clone => '0',
:copy => '0',
:name => '',
:folder => ''
:copy => '0',
:name => '',
:folder => ''
}
if options[:linked_clone]
opts[:linked_clone] = options[:linked_clone]
end
opts[:copy] = options[:copy] if options[:copy]
opts[:name] = options[:name] if options[:name]
opts[:copy] = options[:copy] if options[:copy]
opts[:name] = options[:name] if options[:name]
opts[:folder] = options[:folder] if options[:folder]
options[indexes] = opts
end
importer.process_import(indexes, options)
importer.stdout
rescue StandardError => e
STDERR.puts e.message
exit 1
end
exit 0
0
end
############################################################################
@ -355,11 +369,12 @@ CommandParser::CmdParser.new(ARGV) do
Example:
- Get available clusters:
onevcenter hosts --vcenter <vcenter> --vuser <vcenter_user> --vpass <password>
onevcenter hosts --vcenter <vcenter> --vuser <user> --vpass <pass>
EOT
command :hosts,
host_desc,
:options => [VCENTER, USER, PASS, USE_DEFAULTS, PORT] do
:options => [CLUSTER_REF, USE_DEFAULTS] + AUTH_OPTS do
con_ops = helper.connection_options('Hosts', options)
begin
@ -368,7 +383,7 @@ CommandParser::CmdParser.new(ARGV) do
exit 1
end
exit 0
0
end
############################################################################
@ -383,8 +398,9 @@ CommandParser::CmdParser.new(ARGV) do
onevcenter cleargs 15
EOT
command :cleartags, cleartags_desc, :vmid do
vmid = args[0]
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.'
@ -401,8 +417,8 @@ CommandParser::CmdParser.new(ARGV) do
puts remove_str
exit 0
end
puts '.'
puts '.'
puts 'The following keys will be removed:'
keys.each {|key| puts "\t- #{key}" }
@ -411,8 +427,10 @@ CommandParser::CmdParser.new(ARGV) do
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
0
end
end

View File

@ -279,6 +279,15 @@ module VCenterDriver
rs = dc_folder.get_unimported_hosts(hpool,
vcenter_instance_name)
# Select just cluster with this reference
if options[:cluster_ref]
rs.each do |_, clusters|
clusters.select! do |c|
c[:cluster_ref] == options[:cluster_ref]
end
end
end
STDOUT.print "done!\n\n"
rs.each do |dc, clusters|