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