diff --git a/install.sh b/install.sh index b046b2da3b..84b0157313 100755 --- a/install.sh +++ b/install.sh @@ -1035,6 +1035,11 @@ ECO_BIN_FILES="src/cloud/ec2/bin/econe-server \ src/cloud/ec2/bin/econe-register \ src/cloud/ec2/bin/econe-run-instances \ src/cloud/ec2/bin/econe-terminate-instances \ + src/cloud/ec2/bin/econe-describe-addresses \ + src/cloud/ec2/bin/econe-allocate-address \ + src/cloud/ec2/bin/econe-release-address \ + src/cloud/ec2/bin/econe-associate-address \ + src/cloud/ec2/bin/econe-disassociate-address \ src/cloud/ec2/bin/econe-upload" ECO_BIN_CLIENT_FILES="src/cloud/ec2/bin/econe-describe-images \ @@ -1042,6 +1047,11 @@ ECO_BIN_CLIENT_FILES="src/cloud/ec2/bin/econe-describe-images \ src/cloud/ec2/bin/econe-register \ src/cloud/ec2/bin/econe-run-instances \ src/cloud/ec2/bin/econe-terminate-instances \ + src/cloud/ec2/bin/econe-describe-addresses \ + src/cloud/ec2/bin/econe-allocate-address \ + src/cloud/ec2/bin/econe-release-address \ + src/cloud/ec2/bin/econe-associate-address \ + src/cloud/ec2/bin/econe-disassociate-address \ src/cloud/ec2/bin/econe-upload" ECO_ETC_FILES="src/cloud/ec2/etc/econe.conf" diff --git a/src/cloud/ec2/bin/econe-allocate-address b/src/cloud/ec2/bin/econe-allocate-address new file mode 100755 index 0000000000..a42ac55a53 --- /dev/null +++ b/src/cloud/ec2/bin/econe-allocate-address @@ -0,0 +1,125 @@ +#!/usr/bin/env ruby +# -------------------------------------------------------------------------- # +# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) # +# # +# 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+"/cloud" + +COMMANDS_HELP=<<-EOT +econe-describe-images + +Allocate a new elastic IP address for the user + +Usage: + econe-allocate-address [OPTIONS] + +Options: + --help, -h + Show help + + --access-key , -K + The username of the user + + --secret-key , -S + The password of the user + + --url , -U + Set url as the web service url to use + + --headers, -H + Display column headers + +EOT + +require 'econe/EC2QueryClient' +require 'CloudClient' +require 'getoptlong' + +include CloudCLI + + +opts = GetoptLong.new( + ['--help', '-h',GetoptLong::NO_ARGUMENT], + ['--version', '-v',GetoptLong::NO_ARGUMENT], + ['--access-key', '-K',GetoptLong::REQUIRED_ARGUMENT], + ['--secret-key', '-S',GetoptLong::REQUIRED_ARGUMENT], + ['--url', '-U',GetoptLong::REQUIRED_ARGUMENT], + ['--headers', '-H',GetoptLong::NO_ARGUMENT] + ) + +headers = false +url = nil +access = nil +secret = nil +auth = nil + +begin + opts.each do |opt, arg| + case opt + when '--help' + puts COMMANDS_HELP + return + when '--version' + puts CloudCLI.version_text + exit 0 + when '--access-key' + access = arg + when '--secret-key' + secret = arg + when '--url' + url = arg + when '--headers' + headers = true + end + end +rescue Exception => e + exit -1 +end + +auth = "#{access}:#{secret}" if secret && access + +begin + ec2_client = EC2QueryClient::Client.new(auth,url) +rescue Exception => e + puts "#{cmd_name}: #{e.message}" + exit -1 +end + +addr = ec2_client.allocate_address + +if CloudClient::is_error?(addr) + puts "#{cmd_name}: #{addr.message}" + exit -1 +end + +if headers + puts "publicIP" + puts "------------------------------------------------------------------------------" +end + +puts addr['publicIP'] + +exit 0 + diff --git a/src/cloud/ec2/bin/econe-associate-address b/src/cloud/ec2/bin/econe-associate-address new file mode 100755 index 0000000000..14bbcb3271 --- /dev/null +++ b/src/cloud/ec2/bin/econe-associate-address @@ -0,0 +1,135 @@ +#!/usr/bin/env ruby +# -------------------------------------------------------------------------- # +# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) # +# # +# 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+"/cloud" + +COMMANDS_HELP=<<-EOT +econe-associate-address + +Associate a publicIP of the user with a given instance + +Usage: + econe-associate-address [OPTIONS] PUBLIC-IP INSTANCE-ID + +Options: + + --help, -h + Show help + + --access-key , -K + The username of the user + + --secret-key , -S + The password of the user + + --url , -U + Set url as the web service url to use + + --headers, -H + Display column headers + +PUBLIC-IP: ElasticIP owned by the user. To see the list of ips use econe-describe-addresses +INSTANCE-ID: Id of the instance to be associated with the ElasticIP + +EOT + +require 'econe/EC2QueryClient' +require 'CloudClient' +require 'getoptlong' + +include CloudCLI + +opts = GetoptLong.new( + ['--help', '-h',GetoptLong::NO_ARGUMENT], + ['--version', '-v',GetoptLong::NO_ARGUMENT], + ['--access-key', '-K',GetoptLong::REQUIRED_ARGUMENT], + ['--secret-key', '-S',GetoptLong::REQUIRED_ARGUMENT], + ['--url', '-U',GetoptLong::REQUIRED_ARGUMENT], + ['--type', '-t',GetoptLong::REQUIRED_ARGUMENT], + ['--user-data', '-d',GetoptLong::REQUIRED_ARGUMENT], + ['--headers', '-H',GetoptLong::NO_ARGUMENT] + ) + +headers = false +url = nil +access = nil +secret = nil +auth = nil + +begin + opts.each do |opt, arg| + case opt + when '--help' + puts COMMANDS_HELP + return + when '--version' + puts CloudCLI.version_text + exit 0 + when '--access-key' + access = arg + when '--secret-key' + secret = arg + when '--url' + url = arg + when '--headers' + headers = true + end + end +rescue Exception => e + exit -1 +end + +public_ip = ARGV.shift +instance_id = ARGV.shift + +if !public_ip + puts "#{cmd_name}: missing publicIP parameter" + exit -1 +end + +if !instance_id + puts "#{cmd_name}: missing instanceID parameter" + exit -1 +end + +auth = "#{access}:#{secret}" if secret && access + +begin + ec2_client = EC2QueryClient::Client.new(auth,url) +rescue Exception => e + puts "#{cmd_name}: #{e.message}" + exit -1 +end + +rc = ec2_client.associate_address(public_ip, instance_id) + +if CloudClient::is_error?(rc) + puts "#{cmd_name}: #{rc.message}" + exit -1 +end + +exit 0 diff --git a/src/cloud/ec2/bin/econe-describe-addresses b/src/cloud/ec2/bin/econe-describe-addresses new file mode 100755 index 0000000000..c74e0e584e --- /dev/null +++ b/src/cloud/ec2/bin/econe-describe-addresses @@ -0,0 +1,133 @@ +#!/usr/bin/env ruby +# -------------------------------------------------------------------------- # +# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) # +# # +# 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+"/cloud" + +COMMANDS_HELP=<<-EOT +econe-describe-images + +List elastic IP addresses + +Usage: + econe-describe-addresses [OPTIONS] + +Options: + --help, -h + Show help + + --access-key , -K + The username of the user + + --secret-key , -S + The password of the user + + --url , -U + Set url as the web service url to use + + --headers, -H + Display column headers + +EOT + +require 'econe/EC2QueryClient' +require 'CloudClient' +require 'getoptlong' + +include CloudCLI + + +opts = GetoptLong.new( + ['--help', '-h',GetoptLong::NO_ARGUMENT], + ['--version', '-v',GetoptLong::NO_ARGUMENT], + ['--access-key', '-K',GetoptLong::REQUIRED_ARGUMENT], + ['--secret-key', '-S',GetoptLong::REQUIRED_ARGUMENT], + ['--url', '-U',GetoptLong::REQUIRED_ARGUMENT], + ['--headers', '-H',GetoptLong::NO_ARGUMENT] + ) + +headers = false +url = nil +access = nil +secret = nil +auth = nil + +begin + opts.each do |opt, arg| + case opt + when '--help' + puts COMMANDS_HELP + return + when '--version' + puts CloudCLI.version_text + exit 0 + when '--access-key' + access = arg + when '--secret-key' + secret = arg + when '--url' + url = arg + when '--headers' + headers = true + end + end +rescue Exception => e + exit -1 +end + +auth = "#{access}:#{secret}" if secret && access + +begin + ec2_client = EC2QueryClient::Client.new(auth,url) +rescue Exception => e + puts "#{cmd_name}: #{e.message}" + exit -1 +end + +rc = ec2_client.describe_addresses + +if CloudClient::is_error?(rc) + puts "#{cmd_name}: #{rc.message}" + exit -1 +end + +addresses = rc['addressesSet']['item'] + +fmt = "%-12s %s" + +if headers + puts fmt % ["publicIP", "instanceId"] + puts "------------------------------------------------------------------------------" +end + +if addresses + addresses.each { |addr| + puts fmt % [addr['publicIP'],addr['instanceID']] + } +end + +exit 0 + diff --git a/src/cloud/ec2/bin/econe-disassociate-address b/src/cloud/ec2/bin/econe-disassociate-address new file mode 100755 index 0000000000..1bd0c66965 --- /dev/null +++ b/src/cloud/ec2/bin/econe-disassociate-address @@ -0,0 +1,128 @@ +#!/usr/bin/env ruby +# -------------------------------------------------------------------------- # +# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) # +# # +# 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+"/cloud" + +COMMANDS_HELP=<<-EOT +econe-disasociate-address + +Disasociate a publicIP of the user currently associated with an instance + +Usage: + econe-disasociate-address [OPTIONS] PUBLIC-IP + +Options: + + --help, -h + Show help + + --access-key , -K + The username of the user + + --secret-key , -S + The password of the user + + --url , -U + Set url as the web service url to use + + --headers, -H + Display column headers + +PUBLIC-IP: ElasticIP owned by the user. To see the list of ips use econe-describe-addresses + +EOT + +require 'econe/EC2QueryClient' +require 'CloudClient' +require 'getoptlong' + +include CloudCLI + +opts = GetoptLong.new( + ['--help', '-h',GetoptLong::NO_ARGUMENT], + ['--version', '-v',GetoptLong::NO_ARGUMENT], + ['--access-key', '-K',GetoptLong::REQUIRED_ARGUMENT], + ['--secret-key', '-S',GetoptLong::REQUIRED_ARGUMENT], + ['--url', '-U',GetoptLong::REQUIRED_ARGUMENT], + ['--type', '-t',GetoptLong::REQUIRED_ARGUMENT], + ['--user-data', '-d',GetoptLong::REQUIRED_ARGUMENT], + ['--headers', '-H',GetoptLong::NO_ARGUMENT] + ) + +headers = false +url = nil +access = nil +secret = nil +auth = nil + +begin + opts.each do |opt, arg| + case opt + when '--help' + puts COMMANDS_HELP + return + when '--version' + puts CloudCLI.version_text + exit 0 + when '--access-key' + access = arg + when '--secret-key' + secret = arg + when '--url' + url = arg + when '--headers' + headers = true + end + end +rescue Exception => e + exit -1 +end + +public_ip = ARGV.shift + +if !public_ip + puts "#{cmd_name}: missing publicIP parameter" + exit -1 +end + +auth = "#{access}:#{secret}" if secret && access + +begin + ec2_client = EC2QueryClient::Client.new(auth,url) +rescue Exception => e + puts "#{cmd_name}: #{e.message}" + exit -1 +end + +rc = ec2_client.disassociate_address(public_ip) + +if CloudClient::is_error?(rc) + puts "#{cmd_name}: #{rc.message}" + exit -1 +end + +exit 0 diff --git a/src/cloud/ec2/bin/econe-release-address b/src/cloud/ec2/bin/econe-release-address new file mode 100755 index 0000000000..c344db0135 --- /dev/null +++ b/src/cloud/ec2/bin/econe-release-address @@ -0,0 +1,128 @@ +#!/usr/bin/env ruby +# -------------------------------------------------------------------------- # +# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) # +# # +# 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+"/cloud" + +COMMANDS_HELP=<<-EOT +econe-release-address + +Release a publicIP of the user + +Usage: + econe-release-address [OPTIONS] PUBLIC-IP + +Options: + + --help, -h + Show help + + --access-key , -K + The username of the user + + --secret-key , -S + The password of the user + + --url , -U + Set url as the web service url to use + + --headers, -H + Display column headers + +PUBLIC-IP: ElasticIP owned by the user. To see the list of ips use econe-describe-addresses + +EOT + +require 'econe/EC2QueryClient' +require 'CloudClient' +require 'getoptlong' + +include CloudCLI + +opts = GetoptLong.new( + ['--help', '-h',GetoptLong::NO_ARGUMENT], + ['--version', '-v',GetoptLong::NO_ARGUMENT], + ['--access-key', '-K',GetoptLong::REQUIRED_ARGUMENT], + ['--secret-key', '-S',GetoptLong::REQUIRED_ARGUMENT], + ['--url', '-U',GetoptLong::REQUIRED_ARGUMENT], + ['--type', '-t',GetoptLong::REQUIRED_ARGUMENT], + ['--user-data', '-d',GetoptLong::REQUIRED_ARGUMENT], + ['--headers', '-H',GetoptLong::NO_ARGUMENT] + ) + +headers = false +url = nil +access = nil +secret = nil +auth = nil + +begin + opts.each do |opt, arg| + case opt + when '--help' + puts COMMANDS_HELP + return + when '--version' + puts CloudCLI.version_text + exit 0 + when '--access-key' + access = arg + when '--secret-key' + secret = arg + when '--url' + url = arg + when '--headers' + headers = true + end + end +rescue Exception => e + exit -1 +end + +public_ip = ARGV.shift + +if !public_ip + puts "#{cmd_name}: missing publicIP parameter" + exit -1 +end + +auth = "#{access}:#{secret}" if secret && access + +begin + ec2_client = EC2QueryClient::Client.new(auth,url) +rescue Exception => e + puts "#{cmd_name}: #{e.message}" + exit -1 +end + +rc = ec2_client.release_address(public_ip) + +if CloudClient::is_error?(rc) + puts "#{cmd_name}: #{rc.message}" + exit -1 +end + +exit 0 diff --git a/src/cloud/ec2/etc/econe.conf b/src/cloud/ec2/etc/econe.conf index 5bb0893ab9..35de897481 100644 --- a/src/cloud/ec2/etc/econe.conf +++ b/src/cloud/ec2/etc/econe.conf @@ -33,13 +33,13 @@ ############################################################# # Authentication driver for incomming requests -# ec2, default Acess key and Secret key scheme -# x509, for x509 certificates based authentication +# - ec2, default Acess key and Secret key scheme +# - x509, for x509 certificates based authentication :auth: ec2 # Authentication driver to communicate with OpenNebula core -# cipher, for symmetric cipher encryption of tokens -# x509, for x509 certificate encryption of tokens +# - cipher, for symmetric cipher encryption of tokens +# - x509, for x509 certificate encryption of tokens :core_auth: cipher ############################################################# @@ -57,9 +57,11 @@ # Cluster associated with the EC2 resources, by default no Cluster is defined #:cluster_id: -# Datastore in which the Images uploaded through EC2 will be allocated, by default 1 +# Datastore in which the Images uploaded through EC2 will be allocated, by +# default 1 #:datastore_id: + # VM types allowed and its template file (inside templates directory) :instance_types: :m1.small: @@ -70,13 +72,13 @@ ############################################################# # VirtualNetwork containing the elastic ips to be used with EC2. If no defined -# the Elastic IP functionality is disabled +# the Elastic IP functionality is disabled #:elasticips_vnet_id: # Script to associate a public IP with a private IP -# arguments: elastic_ip private_ip vnet_template(base64_encoded) +# - arguments: elastic_ip private_ip vnet_template(base64_encoded) :associate_script: /usr/bin/false # Script to disassociate a public IP -# arguments: elastic_ip +# - arguments: elastic_ip :disassociate_script: /usr/bin/false diff --git a/src/cloud/ec2/lib/EC2QueryClient.rb b/src/cloud/ec2/lib/EC2QueryClient.rb index b80c44ecd8..b2e3bcd875 100644 --- a/src/cloud/ec2/lib/EC2QueryClient.rb +++ b/src/cloud/ec2/lib/EC2QueryClient.rb @@ -237,5 +237,74 @@ module EC2QueryClient return response end + + ###################################################################### + ###################################################################### + def describe_addresses() + begin + response = @ec2_connection.describe_addresses + rescue Exception => e + error = CloudClient::Error.new(e.message) + return error + end + + return response + end + + ###################################################################### + ###################################################################### + def allocate_address() + begin + response = @ec2_connection.allocate_address + rescue Exception => e + error = CloudClient::Error.new(e.message) + return error + end + + return response + end + + ###################################################################### + ###################################################################### + def associate_address(public_ip, instance_id) + begin + response = @ec2_connection.associate_address( + :public_ip => public_ip, + :instance_id => instance_id) + rescue Exception => e + error = CloudClient::Error.new(e.message) + return error + end + + return response + end + + ###################################################################### + ###################################################################### + def disassociate_address(public_ip) + begin + response = @ec2_connection.disassociate_address( + :public_ip => public_ip) + rescue Exception => e + error = CloudClient::Error.new(e.message) + return error + end + + return response + end + + ###################################################################### + ###################################################################### + def release_address(public_ip) + begin + response = @ec2_connection.release_address( + :public_ip => public_ip) + rescue Exception => e + error = CloudClient::Error.new(e.message) + return error + end + + return response + end end end diff --git a/src/ozones/Server/lib/OZones/Zones.rb b/src/ozones/Server/lib/OZones/Zones.rb index 4ec6fac7bd..95300c0d0d 100644 --- a/src/ozones/Server/lib/OZones/Zones.rb +++ b/src/ozones/Server/lib/OZones/Zones.rb @@ -219,9 +219,9 @@ module OZones when "template","vmtemplate" then OZones::AggregatedTemplates.new when "cluster" then - OZones::AggregatedCluster.new + OZones::AggregatedClusters.new when "datastore" then - OZones::AggregatedDatastore.new + OZones::AggregatedDatastores.new else error = OZones::Error.new("Error: Pool #{pool_kind} not" \ " supported for aggregated zone view")