Files
one/src/cli/onehost
T

408 lines
12 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# -------------------------------------------------------------------------- #
# Copyright 2002-2023, OpenNebula Project, OpenNebula Systems #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
#--------------------------------------------------------------------------- #
ONE_LOCATION = ENV['ONE_LOCATION']
if !ONE_LOCATION
RUBY_LIB_LOCATION = '/usr/lib/one/ruby'
GEMS_LOCATION = '/usr/share/one/gems'
REMOTES_LOCATION = '/var/lib/one/remotes/'
else
RUBY_LIB_LOCATION = ONE_LOCATION + '/lib/ruby'
GEMS_LOCATION = ONE_LOCATION + '/share/gems'
REMOTES_LOCATION = ONE_LOCATION + '/var/remotes/'
end
# %%RUBYGEMS_SETUP_BEGIN%%
if File.directory?(GEMS_LOCATION)
real_gems_path = File.realpath(GEMS_LOCATION)
if !defined?(Gem) || Gem.path != [real_gems_path]
$LOAD_PATH.reject! {|l| l =~ /vendor_ruby/ }
# Suppress warnings from Rubygems
# https://github.com/OpenNebula/one/issues/5379
begin
verb = $VERBOSE
$VERBOSE = nil
require 'rubygems'
Gem.use_paths(real_gems_path)
ensure
$VERBOSE = verb
end
end
end
# %%RUBYGEMS_SETUP_END%%
$LOAD_PATH << RUBY_LIB_LOCATION
$LOAD_PATH << RUBY_LIB_LOCATION + '/cli'
require 'command_parser'
require 'one_helper/onehost_helper'
require 'one_helper/onecluster_helper'
CommandParser::CmdParser.new(ARGV) do
usage '`onehost` <command> [<args>] [<options>]'
version OpenNebulaHelper::ONE_VERSION
helper = OneHostHelper.new
before_proc do
helper.set_client(options)
end
########################################################################
# Global Options
########################################################################
cmd_options = CommandParser::OPTIONS - [CommandParser::VERBOSE]
set :option, cmd_options + OpenNebulaHelper::CLIENT_OPTIONS
IM = {
:name => 'im',
:short => '-i im_mad',
:large => '--im im_mad',
:description => 'Set the information driver for the host',
:format => String
}
VMM = {
:name => 'vm',
:short => '-v vmm_mad',
:large => '--vm vmm_mad',
:description => 'Set the virtualization driver for the host',
:format => String
}
FORCE = {
:name => 'force',
:large => '--force',
:description => 'Force probe upgrade in onehost sync'
}
SSH = {
:name => 'ssh',
:large => '--ssh',
:description => 'Use SSH to synchronize remotes. In case some '\
'probes are no longer in the fronted they will be '\
'deleted in the hosts.'
}
TYPE = {
:name => 'type',
:short => '-t remote_provider',
:large => '--type remote_provider',
:description => 'Use type to create a host using Cloud Bursting',
:format => String
}
IPV4 = {
:name => 'ipv4',
:large => '--ipv4 ip1,ip2',
:description => 'Comma separated IPV4 to set',
:format => Array
}
IPV6 = {
:name => 'ipv6',
:large => '--ipv6 ip1,ip2',
:description => 'Comma separated IPV6 to set',
:format => Array
}
CREAT_OPTIONS = [IM, VMM, OneClusterHelper::CLUSTER, TYPE]
SYNC_OPTIONS = [OneClusterHelper::CLUSTER, FORCE, SSH]
########################################################################
# Monitoring PLOT options
########################################################################
START_T = {
:name => 'start',
:large => '--start date',
:description => 'Start date to show data',
:format => String
}
END_T = {
:name => 'end',
:large => '--end date',
:description => 'End date to show data',
:format => String
}
UNIT = {
:name => 'unit',
:large => '--unit unit',
:description => 'Unit to format data',
:format => String
}
TABLE = {
:name => 'table',
:large => '--table',
:description => 'Show monitoring information in table format'
}
N_ELEMS = {
:name => 'n_elems',
:large => '--n elements',
:description => 'Number of records to show',
:format => Integer
}
CSV_WITH_SEP = {
:name => 'csv',
:large => '--csv separator',
:description => 'Show data in CSV format',
:format => String
}
PLOT_OPTS = [START_T, END_T, UNIT, TABLE, N_ELEMS, CSV_WITH_SEP]
########################################################################
# Formatters for arguments
########################################################################
set :format, :hostid, OneHostHelper.to_id_desc do |arg|
helper.to_id(arg)
end
set :format, :hostid_list, OneHostHelper.list_to_id_desc do |arg|
helper.list_to_id(arg)
end
########################################################################
# Commands
########################################################################
create_desc = <<-EOT.unindent
Creates a new Host
EOT
command :create, create_desc, :hostname,
[:file, nil], :options => CREAT_OPTIONS do
if options[:im].nil? || options[:vm].nil?
STDERR.puts 'Drivers are mandatory to create a host:'
STDERR.puts "\t -i information driver"
STDERR.puts "\t -v hypervisor driver"
exit(-1)
end
cid = options[:cluster] || ClusterPool::NONE_CLUSTER_ID
helper.create_resource(options) do |host|
if !options[:type].nil?
str = helper.set_hybrid(options[:type], args[1])
end
rc = host.allocate(args[0], options[:im], options[:vm], cid)
if !OpenNebula.is_error?(rc) && !options[:type].nil?
host.update(str, true)
end
rc
end
end
delete_desc = <<-EOT.unindent
Deletes the given Host
EOT
command :delete, delete_desc, [:range, :hostid_list] do
helper.perform_actions(args[0], options, 'deleted') do |host|
host.delete
end
end
enable_desc = <<-EOT.unindent
Enables the given host, fully operational
EOT
command :enable, enable_desc, [:range, :hostid_list] do
helper.perform_actions(args[0], options, 'enabled') do |host|
host.enable
end
end
disable_desc = <<-EOT.unindent
Disables the given host:
- monitor: enabled
- scheduler deployment: disabled
- manual deployment: enabled
EOT
command :disable, disable_desc, [:range, :hostid_list] do
helper.perform_actions(args[0], options, 'disabled') do |host|
host.disable
end
end
offline_desc = <<-EOT.unindent
Sets the host offline:
- monitor: disabled
- scheduler deployment: disabled
- manual deployment: disabled
EOT
command :offline, offline_desc, [:range, :hostid_list] do
helper.perform_actions(args[0], options, 'offline') do |host|
host.offline
end
end
update_desc = <<-EOT.unindent
Update the template contents. If a path is not provided the editor will
be launched to modify the current content.
EOT
command :update, update_desc, :hostid, [:file, nil],
:options => OpenNebulaHelper::APPEND do
helper.perform_action(args[0], options, 'updated') do |obj|
if options[:append]
str = OpenNebulaHelper.append_template(args[0], obj, args[1])
else
str = OpenNebulaHelper.update_template(args[0], obj, args[1])
end
helper.set_client(options)
obj = helper.retrieve_resource(obj.id)
obj.update(str, options[:append])
end
end
sync_desc = <<-EOT.unindent
Synchronizes probes in /var/lib/one/remotes ($ONE_LOCATION/var/remotes
in self-contained installations) with Hosts.
Examples:
onehost sync
onehost sync -c myCluster
onehost sync host01,host02,host03
EOT
command :sync, sync_desc, [:range, :hostid_list, nil],
:options => SYNC_OPTIONS do
helper.sync(args[0], options)
end
list_desc = <<-EOT.unindent
Lists Hosts in the pool. #{OneHostHelper.list_layout_help}
EOT
command :list, list_desc,
:options => CLIHelper::OPTIONS + OpenNebulaHelper::OPTIONS +
[OpenNebulaHelper::DESCRIBE] do
helper.list_pool(options)
end
show_desc = <<-EOT.unindent
Shows information for the given Host
EOT
command :show, show_desc, :hostid,
:options => [OpenNebulaHelper::FORMAT, OpenNebulaHelper::DECRYPT] do
helper.show_resource(args[0], options)
end
top_desc = <<-EOT.unindent
Lists Hosts continuously
EOT
command :top, top_desc,
:options => CLIHelper::OPTIONS + OpenNebulaHelper::OPTIONS do
helper.list_pool(options, true)
end
flush_desc = <<-EOT.unindent
Disables the host and reschedules all the running VMs in it.
EOT
command :flush, flush_desc, [:range, :hostid_list] do
begin
if !ONE_LOCATION
action = YAML.load_file('/etc/one/cli/onehost.yaml')
else
action = YAML.load_file("#{ONE_LOCATION}/etc/cli/onehost.yaml")
end
action = action[:default_actions][0][:flush]
rescue StandardError => e
STDERR.puts e
end
helper.perform_actions(args[0], options, 'flushing') do |host|
host.flush action
end
end
rename_desc = <<-EOT.unindent
Renames the Host
EOT
command :rename, rename_desc, :hostid, :name do
helper.perform_action(args[0], options, 'renamed') do |o|
o.rename(args[1])
end
end
importvm_desc = <<-EOT.unindent
Import VM to OpenNebula
EOT
command :importvm,
importvm_desc,
:hostid,
:name,
:options => [IPV4, IPV6] do
helper.perform_action(args[0], options, 'imported') do |o|
rc = o.info
next rc if OpenNebula.is_error?(rc)
o.import_wild(args[1], options[:ipv4], options[:ipv6])
end
end
forceupdate_desc = <<-EOT.unindent
Forces host monitoring update
Examples:
onehost forceupdate host01
onehost forceupdate host01,host02,host03
onehost forceupdate -c myCluster
EOT
command :forceupdate, forceupdate_desc, [:range, :hostid_list, nil],
:options => [OneClusterHelper::CLUSTER] do
helper.forceupdate(args[0], options)
end
monitoring_desc = <<-EOT.unindent
Show monitoring metrics in a graphic
EOT
command :monitoring,
monitoring_desc,
:hostid,
:attr,
:options => PLOT_OPTS do
helper.perform_action(args[0], options, 'monitoring') do |host|
rc = host.info
if OpenNebula.is_error?(rc)
STDERR.puts rc.message
exit(-1)
end
helper.monitoring(host, args[1], options)
end
end
end