Files
one/src/cli/onevnet
T

341 lines
11 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# -------------------------------------------------------------------------- #
# Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
# #
# 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/onevnet_helper'
require 'one_helper/onecluster_helper'
cmd=CommandParser::CmdParser.new(ARGV) do
usage "`onevnet` <command> [<args>] [<options>]"
version OpenNebulaHelper::ONE_VERSION
helper = OneVNetHelper.new
before_proc do
helper.set_client(options)
end
########################################################################
# Global Options
########################################################################
set :option, CommandParser::OPTIONS+OpenNebulaHelper::CLIENT_OPTIONS
CREATE_OPTIONS = [OneClusterHelper::CLUSTER]
STD_OPTIONS = CommandParser::OPTIONS + OpenNebulaHelper::CLIENT_OPTIONS
########################################################################
# 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, :vnetid, OneVNetHelper.to_id_desc do |arg|
helper.to_id(arg)
end
set :format, :vnetid_list, OneVNetHelper.list_to_id_desc do |arg|
helper.list_to_id(arg)
end
set :format, :filterflag, OneVNetHelper.filterflag_to_i_desc do |arg|
helper.filterflag_to_i(arg)
end
set :format, :ar_id, "Integer" do |arg|
format_int(arg)
end
########################################################################
# Commands
########################################################################
create_desc = <<-EOT.unindent
Creates a new Virtual Network from the given template file
EOT
command :create, create_desc, :file, :options=>CREATE_OPTIONS do
cid = options[:cluster] || ClusterPool::NONE_CLUSTER_ID
helper.create_resource(options) do |vn|
begin
template=File.read(args[0])
vn.allocate(template, cid)
rescue => e
STDERR.puts e.message
exit -1
end
end
end
delete_desc = <<-EOT.unindent
Deletes the given Virtual Network
EOT
command :delete, delete_desc, [:range, :vnetid_list] do
helper.perform_actions(args[0],options,"deleted") do |vn|
vn.delete
end
end
addar_desc = <<-EOT.unindent
Adds an address range to the Virtual Network
EOT
command :addar, addar_desc, :vnetid, :options=>STD_OPTIONS + [OneVNetHelper::SIZE,
OneVNetHelper::MAC, OneVNetHelper::IP, OneVNetHelper::IP6_GLOBAL,
OneVNetHelper::IP6_ULA ] do
helper.perform_action(args[0],options,"lease added") do |vn|
ar = "AR = [ "
if options[:ip]
if options[:ip6_global] || options[:ip6_ula]
ar << "TYPE=\"IP4_6\""
else
ar << "TYPE=\"IP4\""
end
else
if options[:ip6_global] || options[:ip6_ula]
ar << "TYPE=\"IP6\""
else
ar << "TYPE=\"ETHER\""
end
end
if options[:size]
ar << ", SIZE = " << options[:size]
else
STDERR.puts "Address range needs to specify size (-s size)"
exit -1
end
ar << ", IP = " << options[:ip] if options[:ip]
ar << ", MAC = " << options[:mac] if options[:mac]
ar << ", GLOBAL_PREFIX = " << options[:ip6_global] if options[:ip6_global]
ar << ", ULA_PREFIX = " << options[:ip6_ula] if options[:ip6_ula]
ar << "]"
vn.add_ar(ar)
end
end
rmar_desc = <<-EOT.unindent
Removes an address range from the Virtual Network
EOT
command :rmar, rmar_desc, :vnetid, :ar_id do
helper.perform_action(args[0],options,"address range removed") do |vn|
vn.rm_ar(args[1])
end
end
free_desc = <<-EOT.unindent
Frees a reserved address range from the Virtual Network
EOT
command :free, free_desc, :vnetid, :ar_id do
helper.perform_action(args[0],options,"address range freed") do |vn|
vn.free(args[1])
end
end
hold_desc = <<-EOT.unindent
Holds a Virtual Network lease, marking it as used
EOT
command :hold, hold_desc, :vnetid, :ip,
:options=>STD_OPTIONS + [OneVNetHelper::AR] do
helper.perform_action(args[0],options,"lease on hold") do |vn|
ar = options[:ar_id] || -1
vn.hold(args[1], ar)
end
end
release_desc = <<-EOT.unindent
Releases a Virtual Network lease on hold
EOT
command :release, release_desc, :vnetid, :ip,
:options=>STD_OPTIONS + [OneVNetHelper::AR] do
helper.perform_action(args[0],options,"lease released") do |vn|
ar = options[:ar_id] || -1
vn.release(args[1], ar)
end
end
reserve_desc = <<-EOT.unindent
Reserve addresses from the Virtual Network. A new virtual network will
be created to hold the reservation. Optionally the reservation can be
put on an exisiting VNET, as long as it contains a valid reservation
from the same VNET
EOT
command :reserve, reserve_desc, :vnetid, [:vnetid, nil],
:options=>STD_OPTIONS + [OneVNetHelper::AR, OneVNetHelper::NAME,
OneVNetHelper::SIZE, OneVNetHelper::MAC, OneVNetHelper::IP] do
helper.perform_action(args[0],options,"reservation made") do |vn|
rsize = options[:rsize] || -1
rname = options[:rname] || -1
addr = nil
addr = options[:mac] if options[:mac]
addr = options[:ip] if options[:ip]
if rsize == -1
STDERR.puts "Specify a size (-s size) for the reservation"
exit -1
end
if rname == -1 && args[1].nil?
STDERR.puts "Specify a name (-n name) for the reservation"
exit -1
end
vn.reserve(rname, rsize, options[:ar_id], addr, args[1])
end
end
chgrp_desc = <<-EOT.unindent
Changes the Virtual Network group
EOT
command :chgrp, chgrp_desc,[:range, :vnetid_list], :groupid do
helper.perform_actions(args[0],options,"Group changed") do |vn|
vn.chown(-1, args[1].to_i)
end
end
chown_desc = <<-EOT.unindent
Changes the Virtual Network owner and group
EOT
command :chown, chown_desc, [:range, :vnetid_list], :userid,
[:groupid,nil] do
gid = args[2].nil? ? -1 : args[2].to_i
helper.perform_actions(args[0],options,"Owner/Group changed") do |vn|
vn.chown(args[1].to_i, gid)
end
end
chmod_desc = <<-EOT.unindent
Changes the Virtual Network permissions
EOT
command :chmod, chmod_desc, [:range, :vnetid_list], :octet do
helper.perform_actions(args[0],options, "Permissions changed") do |vn|
vn.chmod_octet(args[1])
end
end
list_desc = <<-EOT.unindent
Lists Virtual Networks in the pool
EOT
command :list, list_desc, [:filterflag, nil],
:options=>CLIHelper::OPTIONS+OpenNebulaHelper::OPTIONS+
[OpenNebulaHelper::DESCRIBE] do
helper.list_pool(options, false, args[0])
end
show_desc = <<-EOT.unindent
Shows information for the given Virtual Network
EOT
command :show, show_desc, :vnetid,
:options=>OpenNebulaHelper::XML do
helper.show_resource(args[0],options)
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, :vnetid, [: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
update_ar_desc = <<-EOT.unindent
Update Address Range variables. SIZE, IP, MAC and TYPE cannot be updated
EOT
command :updatear, update_ar_desc, :vnetid, :ar_id, [:file, nil] do
helper.perform_action(args[0],options,"modified") do |obj|
rc = obj.info
if OpenNebula.is_error?(rc)
puts rc.message
exit -1
end
obj.delete_element("AR_POOL/AR[AR_ID!=#{args[1]}]")
obj.delete_element("AR_POOL/AR/LEASES")
obj.delete_element("AR_POOL/AR/USED_LEASES")
if obj.template_like_str("AR_POOL").empty?
puts "Address Range #{args[1]} does not exit for "<<
"Virtual Network #{args[0]}"
exit -1
end
str = OpenNebulaHelper.update_template_helper(false, args[0], obj,
args[2], "AR_POOL", false)
obj.update_ar(str)
end
end
rename_desc = <<-EOT.unindent
Renames the Virtual Network
EOT
command :rename, rename_desc, :vnetid, :name do
helper.perform_action(args[0],options,"renamed") do |o|
o.rename(args[1])
end
end
end