mirror of
https://github.com/OpenNebula/one.git
synced 2026-11-08 13:08:21 +09:00
408 lines
12 KiB
Ruby
Executable File
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
|