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

Feature #3264: New command oneacct showback to pretty-print showback data

This commit is contained in:
Carlos Martín 2014-11-05 18:41:46 +01:00
parent 3dc9a5043f
commit db29eb7587
3 changed files with 257 additions and 28 deletions

View File

@ -96,8 +96,8 @@ class AcctHelper < OpenNebulaHelper::OneHelper
:description => "Split the output in a table for each VM"
}
ACCT_OPTIONS = [START_TIME, END_TIME, USERFILTER, GROUP, HOST, XPATH, XML, JSON, SPLIT]
ACCT_OPTIONS = [START_TIME, END_TIME, USERFILTER, GROUP, HOST, XPATH, XML, JSON, SPLIT]
SHOWBACK_OPTIONS = [START_TIME, END_TIME, USERFILTER, GROUP, XML, JSON]
ACCT_TABLE = CLIHelper::ShowTable.new("oneacct.yaml", nil) do
column :UID, "User ID", :size=>4 do |d|
@ -153,6 +153,51 @@ class AcctHelper < OpenNebulaHelper::OneHelper
default :VID, :HOSTNAME, :ACTION, :REASON, :START_TIME, :END_TIME, :MEMORY, :CPU, :NET_RX, :NET_TX
end
# TODO: oneacct.yaml
SHOWBACK_TABLE = CLIHelper::ShowTable.new("nofile.yaml", nil) do
column :UID, "User ID", :size=>4 do |d|
d["UID"]
end
column :USER_NAME, "User name", :left, :size=>12 do |d|
d["UNAME"]
end
column :GID, "Group ID", :size=>4 do |d|
d["GID"]
end
column :GROUP_NAME, "Group name", :left, :size=>12 do |d|
d["GNAME"]
end
column :VM_ID, "Virtual Machine ID", :size=>6 do |d|
d["VMID"]
end
column :VM_NAME, "Virtual Machine name", :left, :size=>12 do |d|
d["VMNAME"]
end
column :MONTH, "Month", :size=>5 do |d|
d["MONTH"]
end
column :YEAR, "Year", :size=>5 do |d|
d["YEAR"]
end
column :HOURS, "Hours", :size=>5 do |d|
d["HOURS"]
end
column :COST, "Cost", :size=>15 do |d|
d["COST"]
end
default :USER_NAME, :GROUP_NAME, :VM_ID, :VM_NAME, :MONTH, :YEAR, :HOURS, :COST
end
def self.print_start_end_time_header(start_time, end_time)
print "Showing active history records from "
@ -185,4 +230,12 @@ class AcctHelper < OpenNebulaHelper::OneHelper
CLIHelper.scr_restore
puts
end
def self.print_month_header(year, month)
CLIHelper.scr_bold
CLIHelper.scr_underline
puts "# Showback for #{month}/#{year}".ljust(80)
CLIHelper.scr_restore
puts
end
end

View File

@ -43,11 +43,11 @@ cmd = CommandParser::CmdParser.new(ARGV) do
helper.set_client(options)
end
option AcctHelper::ACCT_OPTIONS + CommandParser::OPTIONS +
command :acct, "Returns the accounting records", :options =>
AcctHelper::ACCT_OPTIONS + CommandParser::OPTIONS +
[OpenNebulaHelper::DESCRIBE, CLIHelper::LIST, CLIHelper::CSV_OPT] +
OpenNebulaHelper::CLIENT_OPTIONS
OpenNebulaHelper::CLIENT_OPTIONS do
main do
if options[:describe]
AcctHelper::ACCT_TABLE.describe_columns
exit(0)
@ -70,7 +70,7 @@ cmd = CommandParser::CmdParser.new(ARGV) do
if options[:json] || options[:xml]
xml_str = pool.accounting_xml(filter_flag, common_opts)
if OpenNebula.is_error?(xml_str)
puts acct_hash.message
puts xml_str.message
exit -1
end
@ -140,4 +140,94 @@ cmd = CommandParser::CmdParser.new(ARGV) do
exit_code 0
end
end
command :showback, "Returns the showback records", :options =>
AcctHelper::SHOWBACK_OPTIONS + CommandParser::OPTIONS +
[OpenNebulaHelper::DESCRIBE, CLIHelper::LIST, CLIHelper::CSV_OPT] +
OpenNebulaHelper::CLIENT_OPTIONS do
if options[:describe]
AcctHelper::SHOWBACK_TABLE.describe_columns
exit(0)
end
filter_flag = (options[:userfilter] || VirtualMachinePool::INFO_ALL)
start_time = options[:start_time] ? options[:start_time].to_i : -1
end_time = options[:end_time] ? options[:end_time].to_i : -1
common_opts = {
:start_time => start_time,
:end_time => end_time,
:group => options[:group],
:xpath => options[:xpath]
}
pool = OpenNebula::VirtualMachinePool.new(helper.client)
if options[:json] || options[:xml]
xml_str = pool.showback_xml(filter_flag, common_opts)
if OpenNebula.is_error?(xml_str)
puts xml_str.message
exit -1
end
if options[:json]
xmldoc = XMLElement.new
xmldoc.initialize_xml(xml_str, 'SHOWBACK_RECORDS')
puts JSON.pretty_generate(xmldoc.to_hash)
elsif options[:xml]
puts xml_str
end
exit_code 0
else
order_by = Hash.new
order_by[:order_by_1] = 'YEAR'
order_by[:order_by_2] = 'MONTH'
data_hash = pool.showback(filter_flag,
common_opts.merge(order_by))
if OpenNebula.is_error?(data_hash)
puts data_hash.message
exit -1
end
if options[:csv]
a = Array.new
data_hash.each do |user_id, value|
value['SHOWBACK_RECORDS']['SHOWBACK'].each do |l|
l['UID']=user_id
a << l
end
end
cols = AcctHelper::SHOWBACK_TABLE.default_columns
AcctHelper::SHOWBACK_TABLE.default(:UID, *cols)
AcctHelper::SHOWBACK_TABLE.show(a, options)
exit(0)
end
if ( start_time != -1 or end_time != -1 )
AcctHelper.print_start_end_time_header(start_time, end_time)
end
data_hash.each { |year, value|
value.each { |month, showback_array|
AcctHelper.print_month_header(year, month)
array = showback_array['SHOWBACK_RECORDS']['SHOWBACK']
AcctHelper::SHOWBACK_TABLE.show(array, options)
puts
}
}
exit_code 0
end
end
end

View File

@ -164,28 +164,6 @@ module OpenNebula
return @client.call(VM_POOL_METHODS[:monitoring], filter_flag)
end
# Retrieves the showback data for all the VMs in the pool, in XML
#
# @param [Integer] filter_flag Optional filter flag to retrieve all or
# part of the Pool. Possible values: INFO_ALL, INFO_GROUP, INFO_MINE
# or user_id
# @param [Hash] options
# @option params [Integer] :start_time Start date and time to take into account,
# if no start_time is required use -1
# @option params [Integer] :end_time End date and time to take into account,
# if no end_time is required use -1
def showback_xml(filter_flag=INFO_ALL, options={})
filter_flag ||= INFO_ALL
options[:start_time] ||= -1
options[:end_time] ||= -1
return @client.call(VM_POOL_METHODS[:showback],
filter_flag,
options[:start_time],
options[:end_time])
end
# Processes all the history records, and stores the monthly cost for
# each VM
#
@ -324,6 +302,84 @@ module OpenNebula
xml_str
end
# Retrieves the showback data for all the VMs in the pool
#
# @param [Integer] filter_flag Optional filter flag to retrieve all or
# part of the Pool. Possible values: INFO_ALL, INFO_GROUP, INFO_MINE
# or user_id
# @param [Hash] options
# @option params [Integer] :start_time Start date and time to take into account,
# if no start_time is required use -1
# @option params [Integer] :end_time End date and time to take into account,
# if no end_time is required use -1
# @option params [Integer] :group Group id to filter the results
# @option params [String] :xpath Xpath expression to filter the results.
# For example: SHOWBACK[COST>0]
# @option params [String] :order_by_1 Xpath expression to group the
# @option params [String] :order_by_2 Xpath expression to group the
# returned hash. This will be the second level of the hash
#
# @return [Hash, OpenNebula::Error]
# The first level hash uses the :order_by_1 values as keys, and
# as value a Hash with the :order_by_2 values and the SHOWBACK_RECORDS
def showback(filter_flag=INFO_ALL, options={})
data_hash = Hash.new
rc = build_showback(filter_flag, options) do |record|
hash = data_hash
if options[:order_by_1]
id_1 = record[options[:order_by_1]]
data_hash[id_1] ||= Hash.new
if options[:order_by_2]
id_2 = record[options[:order_by_2]]
data_hash[id_1][id_2] ||= Hash.new
hash = data_hash[id_1][id_2]
else
hash = data_hash[id_1]
end
end
hash["SHOWBACK_RECORDS"] ||= Hash.new
hash["SHOWBACK_RECORDS"]["SHOWBACK"] ||= Array.new
hash["SHOWBACK_RECORDS"]["SHOWBACK"] << record.to_hash['SHOWBACK']
end
return rc if OpenNebula.is_error?(rc)
data_hash
end
# Retrieves the showback data for all the VMs in the pool, in xml
#
# @param [Integer] filter_flag Optional filter flag to retrieve all or
# part of the Pool. Possible values: INFO_ALL, INFO_GROUP, INFO_MINE
# or user_id
# @param [Hash] options
# @option params [Integer] :start_time Start date and time to take into account,
# if no start_time is required use -1
# @option params [Integer] :end_time End date and time to take into account,
# if no end_time is required use -1
# @option params [Integer] :group Group id to filter the results
# @option params [String] :xpath Xpath expression to filter the results.
# For example: SHOWBACK[COST>10]
#
# @return [String] the xml representing the showback data
def showback_xml(filter_flag=INFO_ALL, options={})
xml_str = "<SHOWBACK_RECORDS>\n"
rc = build_showback(filter_flag, options) do |showback|
xml_str << showback.to_xml
end
return rc if OpenNebula.is_error?(rc)
xml_str << "\n</SHOWBACK_RECORDS>"
xml_str
end
private
def build_accounting(filter_flag, options, &block)
@ -357,6 +413,36 @@ module OpenNebula
acct_hash
end
def build_showback(filter_flag, options, &block)
xml_str = @client.call(VM_POOL_METHODS[:showback],
filter_flag,
options[:start_time],
options[:end_time])
return xml_str if OpenNebula.is_error?(xml_str)
xmldoc = XMLElement.new
xmldoc.initialize_xml(xml_str, 'SHOWBACK_RECORDS')
xpath_array = Array.new
xpath_array << "SHOWBACK[GID=#{options[:group]}]" if options[:group]
xpath_array << options[:xpath] if options[:xpath]
if xpath_array.empty?
xpath_str = "SHOWBACK"
else
xpath_str = xpath_array.join(' | ')
end
data_hash = Hash.new
xmldoc.each(xpath_str) do |showback|
block.call(showback)
end
data_hash
end
def info_filter(xml_method, who, start_id, end_id, state)
return xmlrpc_info(xml_method, who, start_id, end_id, state)
end