1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-02-28 17:57:22 +03:00

Feature #4215: Virtual Router pool in ruby oca and CLI

This commit is contained in:
Carlos Martín 2015-11-30 16:55:22 +01:00
parent c5b19f45df
commit 64ebcdd5c3
9 changed files with 614 additions and 6 deletions

View File

@ -584,6 +584,7 @@ BIN_FILES="src/nebula/oned \
src/cli/oneflow-template \
src/cli/onesecgroup \
src/cli/onevdc \
src/cli/onevrouter \
src/cli/onevcenter \
src/onedb/onedb \
src/mad/utils/tty_expect \
@ -1376,7 +1377,9 @@ RUBY_OPENNEBULA_LIB_FILES="src/oca/ruby/opennebula/acl_pool.rb \
src/oca/ruby/opennebula/xml_pool.rb \
src/oca/ruby/opennebula/xml_utils.rb \
src/oca/ruby/opennebula/zone_pool.rb \
src/oca/ruby/opennebula/zone.rb"
src/oca/ruby/opennebula/zone.rb \
src/oca/ruby/opennebula/virtual_router_pool.rb \
src/oca/ruby/opennebula/virtual_router.rb"
#-------------------------------------------------------------------------------
# Common Cloud Files
@ -1526,7 +1529,8 @@ ONE_CLI_LIB_FILES="src/cli/one_helper/onegroup_helper.rb \
src/cli/one_helper/onezone_helper.rb \
src/cli/one_helper/onevdc_helper.rb \
src/cli/one_helper/oneacct_helper.rb \
src/cli/one_helper/onesecgroup_helper.rb"
src/cli/one_helper/onesecgroup_helper.rb \
src/cli/one_helper/onevrouter_helper.rb"
CLI_BIN_FILES="src/cli/onevm \
src/cli/onehost \
@ -1544,7 +1548,8 @@ CLI_BIN_FILES="src/cli/onevm \
src/cli/oneacct \
src/cli/onesecgroup \
src/cli/oneshowback \
src/cli/onevdc"
src/cli/onevdc \
src/cli/onevrouter"
CLI_CONF_FILES="src/cli/etc/onegroup.yaml \
src/cli/etc/onehost.yaml \
@ -1560,7 +1565,8 @@ CLI_CONF_FILES="src/cli/etc/onegroup.yaml \
src/cli/etc/oneacct.yaml \
src/cli/etc/onesecgroup.yaml \
src/cli/etc/oneshowback.yaml \
src/cli/etc/onevdc.yaml"
src/cli/etc/onevdc.yaml \
src/cli/etc/onevrouter.yaml"
#-----------------------------------------------------------------------------
# Sunstone files
@ -1603,7 +1609,8 @@ SUNSTONE_MODELS_JSON_FILES="src/sunstone/models/OpenNebulaJSON/HostJSON.rb \
src/sunstone/models/OpenNebulaJSON/VirtualNetworkJSON.rb \
src/sunstone/models/OpenNebulaJSON/ZoneJSON.rb \
src/sunstone/models/OpenNebulaJSON/SecurityGroupJSON.rb \
src/sunstone/models/OpenNebulaJSON/VdcJSON.rb"
src/sunstone/models/OpenNebulaJSON/VdcJSON.rb \
src/sunstone/models/OpenNebulaJSON/VirtualRouterJSON.rb"
SUNSTONE_VIEWS_FILES="src/sunstone/views/index.erb \
src/sunstone/views/login.erb \
@ -1831,6 +1838,7 @@ MAN_FILES="share/man/oneacct.1.gz \
share/man/oneflow-template.1.gz \
share/man/onesecgroup.1.gz \
share/man/onevdc.1.gz \
share/man/onevrouter.1.gz \
share/man/econe-allocate-address.1.gz \
share/man/econe-associate-address.1.gz \
share/man/econe-attach-volume.1.gz \

View File

@ -64,6 +64,7 @@ env.Man('onezone')
env.Man('onevcenter')
env.Man('onesecgroup')
env.Man('onevdc')
env.Man('onevrouter')
env.Man('oneflow')
env.Man('oneflow-template')

View File

@ -0,0 +1,25 @@
---
:ID:
:desc: ONE identifier for the Virtual Router
:size: 4
:NAME:
:desc: Name of the Virtual Router
:size: 27
:left: true
:USER:
:desc: Username of the Virtual Router owner
:size: 15
:left: true
:GROUP:
:desc: Group of the Virtual Router
:size: 15
:left: true
:default:
- :ID
- :USER
- :GROUP
- :NAME

View File

@ -0,0 +1,116 @@
# -------------------------------------------------------------------------- #
# Copyright 2002-2015, 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. #
#--------------------------------------------------------------------------- #
require 'one_helper'
class OneVirtualRouterHelper < OpenNebulaHelper::OneHelper
def self.rname
"VROUTER"
end
def self.conf_file
"onevrouter.yaml"
end
def show_resource(id, options)
resource = retrieve_resource(id)
if !options[:extended].nil?
rc = resource.info(options[:extended])
else
rc = resource.info
end
return -1, rc.message if OpenNebula.is_error?(rc)
if options[:xml]
return 0, resource.to_xml(true)
else
format_resource(resource, options)
return 0
end
end
def format_pool(options)
config_file = self.class.table_conf
table = CLIHelper::ShowTable.new(config_file, self) do
column :ID, "ONE identifier for the Virtual Router", :size=>4 do |d|
d["ID"]
end
column :NAME, "Name of the Virtual Router", :left, :size=>27 do |d|
d["NAME"]
end
column :USER, "Username of the Virtual Router owner", :left,
:size=>15 do |d|
helper.user_name(d, options)
end
column :GROUP, "Group of the Virtual Router", :left, :size=>15 do |d|
helper.group_name(d, options)
end
default :ID, :USER, :GROUP, :NAME
end
table
end
private
def factory(id=nil)
if id
OpenNebula::VirtualRouter.new_with_id(id, @client)
else
xml=OpenNebula::VirtualRouter.build_xml
OpenNebula::VirtualRouter.new(xml, @client)
end
end
def factory_pool(user_flag=-2)
OpenNebula::VirtualRouterPool.new(@client, user_flag)
end
def format_resource(obj, options = {})
str="%-15s: %-20s"
str_h1="%-80s"
CLIHelper.print_header(
str_h1 % "VIRTUAL ROUTER #{obj['ID']} INFORMATION")
puts str % ["ID", obj.id.to_s]
puts str % ["NAME", obj.name]
puts str % ["USER", obj['UNAME']]
puts str % ["GROUP", obj['GNAME']]
puts
CLIHelper.print_header(str_h1 % "PERMISSIONS",false)
["OWNER", "GROUP", "OTHER"].each { |e|
mask = "---"
mask[0] = "u" if obj["PERMISSIONS/#{e}_U"] == "1"
mask[1] = "m" if obj["PERMISSIONS/#{e}_M"] == "1"
mask[2] = "a" if obj["PERMISSIONS/#{e}_A"] == "1"
puts str % [e, mask]
}
puts
CLIHelper.print_header(str_h1 % "TEMPLATE CONTENTS",false)
puts obj.template_str
end
end

View File

@ -160,7 +160,7 @@ cmd=CommandParser::CmdParser.new(ARGV) do
end
delete_desc = <<-EOT.unindent
Deletes the given Image
Deletes the given Template
EOT
command :delete, delete_desc, [:range, :templateid_list] do

210
src/cli/onevrouter Executable file
View File

@ -0,0 +1,210 @@
#!/usr/bin/env ruby
# -------------------------------------------------------------------------- #
# Copyright 2002-2015, 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"
else
RUBY_LIB_LOCATION=ONE_LOCATION+"/lib/ruby"
end
$: << RUBY_LIB_LOCATION
$: << RUBY_LIB_LOCATION+"/cli"
require 'command_parser'
require 'one_helper/onevrouter_helper'
require 'one_helper/onevm_helper'
cmd=CommandParser::CmdParser.new(ARGV) do
usage "`onevrouter` <command> [<args>] [<options>]"
version OpenNebulaHelper::ONE_VERSION
helper = OneVirtualRouterHelper.new
before_proc do
helper.set_client(options)
end
########################################################################
# Global Options
########################################################################
set :option, CommandParser::OPTIONS+OpenNebulaHelper::CLIENT_OPTIONS
list_options = CLIHelper::OPTIONS
list_options << OpenNebulaHelper::XML
list_options << OpenNebulaHelper::NUMERIC
list_options << OpenNebulaHelper::DESCRIBE
########################################################################
# Formatters for arguments
########################################################################
set :format, :groupid, OpenNebulaHelper.rname_to_id_desc("GROUP") do |arg|
OpenNebulaHelper.rname_to_id(arg, "GROUP")
end
set :format, :userid, OpenNebulaHelper.rname_to_id_desc("USER") do |arg|
OpenNebulaHelper.rname_to_id(arg, "USER")
end
set :format, :vrouterid, OneVirtualRouterHelper.to_id_desc do |arg|
helper.to_id(arg)
end
set :format, :vrouterid_list, OneVirtualRouterHelper.list_to_id_desc do |arg|
helper.list_to_id(arg)
end
set :format, :filterflag, OneVirtualRouterHelper.filterflag_to_i_desc do |arg|
helper.filterflag_to_i(arg)
end
########################################################################
# Commands
########################################################################
create_desc = <<-EOT.unindent
Creates a new Virtual Router from the given description
EOT
command :create, create_desc, :file do
helper.create_resource(options) do |obj|
begin
template = File.read(args[0])
obj.allocate(template)
rescue => e
STDERR.puts e.messsage
exit -1
end
end
end
# TODO: implement or remove
=begin
clone_desc = <<-EOT.unindent
Creates a new Virtual Router from an existing one
EOT
command :clone, clone_desc, :vrouterid, :name do
helper.perform_action(args[0],options,"cloned") do |t|
res = t.clone(args[1])
if !OpenNebula.is_error?(res)
puts "ID: #{res}"
else
puts res.message
end
end
end
=end
delete_desc = <<-EOT.unindent
Deletes the given Virtual Router
EOT
command :delete, delete_desc, [:range, :vrouterid_list] do
helper.perform_actions(args[0],options,"deleted") do |obj|
obj.delete
end
end
chgrp_desc = <<-EOT.unindent
Changes the Virtual Router group
EOT
command :chgrp, chgrp_desc,[:range, :vrouterid_list], :groupid do
helper.perform_actions(args[0],options,"Group changed") do |obj|
obj.chown(-1, args[1].to_i)
end
end
chown_desc = <<-EOT.unindent
Changes the Virtual Router owner and group
EOT
command :chown, chown_desc, [:range, :vrouterid_list], :userid,
[:groupid,nil] do
gid = args[2].nil? ? -1 : args[2].to_i
helper.perform_actions(args[0],options,"Owner/Group changed") do |obj|
obj.chown(args[1].to_i, gid)
end
end
chmod_desc = <<-EOT.unindent
Changes the Virtual Router permissions
EOT
command :chmod, chmod_desc, [:range, :vrouterid_list], :octet do
helper.perform_actions(args[0],options, "Permissions changed") do |obj|
obj.chmod_octet(args[1])
end
end
update_desc = <<-EOT.unindent
Update the Virtual Router contents. If a path is not provided the editor
will be launched to modify the current content.
EOT
command :update, update_desc, :vrouterid, [:file, nil],
:options=>OpenNebulaHelper::APPEND do
helper.perform_action(args[0],options,"modified") 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
obj.update(str, options[:append])
end
end
rename_desc = <<-EOT.unindent
Renames the Virtual Router
EOT
command :rename, rename_desc, :vrouterid, :name do
helper.perform_action(args[0],options,"renamed") do |obj|
obj.rename(args[1])
end
end
list_desc = <<-EOT.unindent
Lists the Virtual Routers in the pool
EOT
command :list, list_desc, [:filterflag, nil], :options=>list_options do
helper.list_pool(options, false, args[0])
end
show_desc = <<-EOT.unindent
Shows information for the given Virtual Router
EOT
command :show, show_desc, :secgroupid, :options=>OpenNebulaHelper::XML do
helper.show_resource(args[0],options)
end
top_desc = <<-EOT.unindent
Lists Virtual Routers continuously
EOT
command :top, top_desc, [:filterflag, nil], :options=>list_options do
helper.list_pool(options, true, args[0])
end
end

View File

@ -56,6 +56,8 @@ require 'opennebula/security_group_pool'
require 'opennebula/vdc'
require 'opennebula/vdc_pool'
require 'opennebula/system'
require 'opennebula/virtual_router'
require 'opennebula/virtual_router_pool'
module OpenNebula

View File

@ -0,0 +1,167 @@
# -------------------------------------------------------------------------- #
# Copyright 2002-2015, 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. #
#--------------------------------------------------------------------------- #
require 'opennebula/pool_element'
module OpenNebula
class VirtualRouter < PoolElement
#######################################################################
# Constants and Class Methods
#######################################################################
VIRTUAL_ROUTER_METHODS = {
:allocate => "vrouter.allocate",
:info => "vrouter.info",
:update => "vrouter.update",
:delete => "vrouter.delete",
:chown => "vrouter.chown",
:chmod => "vrouter.chmod",
# TODO: remove or implement
# :clone => "vrouter.clone",
:rename => "vrouter.rename"
}
# Creates a VirtualRouter description with just its identifier
# this method should be used to create plain VirtualRouter objects.
# +id+ the id of the user
#
# Example:
# vrouter = VirtualRouter.new(VirtualRouter.build_xml(3),rpc_client)
#
def VirtualRouter.build_xml(pe_id=nil)
if pe_id
obj_xml = "<VROUTER><ID>#{pe_id}</ID></VROUTER>"
else
obj_xml = "<VROUTER></VROUTER>"
end
XMLElement.build_xml(obj_xml,'VROUTER')
end
# Class constructor
def initialize(xml, client)
super(xml,client)
@client = client
end
#######################################################################
# XML-RPC Methods for the VirtualRouter Object
#######################################################################
# Retrieves the information of the given Virtual Router
def info()
super(VIRTUAL_ROUTER_METHODS[:info], 'VROUTER')
end
alias_method :info!, :info
# Allocates a new VirtualRouter in OpenNebula
#
# @param description [String] The contents of the VirtualRouter.
#
# @return [nil, OpenNebula::Error] nil in case of success, Error
# otherwise
def allocate(description)
super(VIRTUAL_ROUTER_METHODS[:allocate], description)
end
# Deletes the VirtualRouter
def delete()
super(VIRTUAL_ROUTER_METHODS[:delete])
end
# Replaces the template contents
#
# @param new_template [String] New template contents
# @param append [true, false] True to append new attributes instead of
# replace the whole template
#
# @return [nil, OpenNebula::Error] nil in case of success, Error
# otherwise
def update(new_template, append=false)
super(VIRTUAL_ROUTER_METHODS[:update], new_template, append ? 1 : 0)
end
# Changes the owner/group
# @param uid [Integer] the new owner id. Set to -1 to leave the current one
# @param gid [Integer] the new group id. Set to -1 to leave the current one
# @return [nil, OpenNebula::Error] nil in case of success, Error
# otherwise
def chown(uid, gid)
super(VIRTUAL_ROUTER_METHODS[:chown], uid, gid)
end
# Changes the VirtualRouter permissions.
#
# @param octet [String] Permissions octed , e.g. 640
# @return [nil, OpenNebula::Error] nil in case of success, Error
# otherwise
def chmod_octet(octet)
super(VIRTUAL_ROUTER_METHODS[:chmod], octet)
end
# Changes the VirtualRouter permissions.
# Each [Integer] argument must be 1 to allow, 0 deny, -1 do not change
#
# @return [nil, OpenNebula::Error] nil in case of success, Error
# otherwise
def chmod(owner_u, owner_m, owner_a, group_u, group_m, group_a, other_u,
other_m, other_a)
super(VIRTUAL_ROUTER_METHODS[:chmod], owner_u, owner_m, owner_a, group_u,
group_m, group_a, other_u, other_m, other_a)
end
=begin
# Clones this VirtualRouter into a new one
#
# @param [String] name for the new VirtualRouter.
#
# @return [Integer, OpenNebula::Error] The new VirtualRouter ID in case
# of success, Error otherwise
def clone(name)
return Error.new('ID not defined') if !@pe_id
rc = @client.call(VIRTUAL_ROUTER_METHODS[:clone], @pe_id, name)
return rc
end
=end
# Renames this VirtualRouter
#
# @param name [String] New name for the VirtualRouter.
#
# @return [nil, OpenNebula::Error] nil in case of success, Error
# otherwise
def rename(name)
return call(VIRTUAL_ROUTER_METHODS[:rename], @pe_id, name)
end
#######################################################################
# Helpers to get VirtualRouter information
#######################################################################
# Returns the group identifier
# @return [Integer] the element's group ID
def gid
self['GID'].to_i
end
def owner_id
self['UID'].to_i
end
end
end

View File

@ -0,0 +1,79 @@
# -------------------------------------------------------------------------- #
# Copyright 2002-2015, 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. #
#--------------------------------------------------------------------------- #
require 'opennebula/pool'
module OpenNebula
class VirtualRouterPool < Pool
#######################################################################
# Constants and Class attribute accessors
#######################################################################
VIRTUAL_ROUTER_POOL_METHODS = {
:info => "vrouterpool.info"
}
#######################################################################
# Class constructor & Pool Methods
#######################################################################
# +client+ a Client object that represents an XML-RPC connection
# +user_id+ used to refer to a Pool with Virtual Routers from that user
def initialize(client, user_id=-1)
super('VROUTER_POOL','VROUTER',client)
@user_id = user_id
end
# Factory method to create Virtual Router objects
def factory(element_xml)
OpenNebula::VirtualRouter.new(element_xml,@client)
end
#######################################################################
# XML-RPC Methods for the Virtual Router Object
#######################################################################
# Retrieves all or part of the Virtual Routers in the pool.
def info(*args)
case args.size
when 0
info_filter(VIRTUAL_ROUTER_POOL_METHODS[:info],@user_id,-1,-1)
when 3
info_filter(VIRTUAL_ROUTER_POOL_METHODS[:info],args[0],args[1],args[2])
end
end
def info_all()
return super(VIRTUAL_ROUTER_POOL_METHODS[:info])
end
def info_mine()
return super(VIRTUAL_ROUTER_POOL_METHODS[:info])
end
def info_group()
return super(VIRTUAL_ROUTER_POOL_METHODS[:info])
end
alias_method :info!, :info
alias_method :info_all!, :info_all
alias_method :info_mine!, :info_mine
alias_method :info_group!, :info_group
end
end