You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltacloud.apache.org by ma...@apache.org on 2013/02/08 18:22:58 UTC
[1/3] git commit: Rename aruba driver to arubacloud driver -
DTACLOUD-444
Rename aruba driver to arubacloud driver - DTACLOUD-444
https://issues.apache.org/jira/browse/DTACLOUD-444
Project: http://git-wip-us.apache.org/repos/asf/deltacloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltacloud/commit/cd746e6b
Tree: http://git-wip-us.apache.org/repos/asf/deltacloud/tree/cd746e6b
Diff: http://git-wip-us.apache.org/repos/asf/deltacloud/diff/cd746e6b
Branch: refs/heads/master
Commit: cd746e6bac89db42ece3fad98e03bbda637f07ee
Parents: f67a2a7
Author: marios <ma...@redhat.com>
Authored: Tue Feb 5 12:54:23 2013 +0200
Committer: marios <ma...@redhat.com>
Committed: Fri Feb 8 18:20:34 2013 +0200
----------------------------------------------------------------------
server/config/drivers/aruba.yaml | 8 -
server/config/drivers/arubacloud.yaml | 8 +
.../lib/deltacloud/drivers/aruba/aruba_driver.rb | 460 ---------------
.../drivers/arubacloud/arubacloud_driver.rb | 460 +++++++++++++++
4 files changed, 468 insertions(+), 468 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/cd746e6b/server/config/drivers/aruba.yaml
----------------------------------------------------------------------
diff --git a/server/config/drivers/aruba.yaml b/server/config/drivers/aruba.yaml
deleted file mode 100644
index 31c188b..0000000
--- a/server/config/drivers/aruba.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-:aruba:
- :entrypoints:
- compute:
- dc1: https://api.dc1.computing.cloud.it/WsEndUser/v2.0/WsEndUser.svc?wsdl
- dc2: https://api.dc2.computing.cloud.it/WsEndUser/v2.0/WsEndUser.svc?wsdl
- dc3: https://api.dc3.computing.cloud.it/WsEndUser/v2.0/WsEndUser.svc?wsdl
- :name: Aruba
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/cd746e6b/server/config/drivers/arubacloud.yaml
----------------------------------------------------------------------
diff --git a/server/config/drivers/arubacloud.yaml b/server/config/drivers/arubacloud.yaml
new file mode 100644
index 0000000..b2fa24b
--- /dev/null
+++ b/server/config/drivers/arubacloud.yaml
@@ -0,0 +1,8 @@
+---
+:arubacloud:
+ :entrypoints:
+ compute:
+ dc1: https://api.dc1.computing.cloud.it/WsEndUser/v2.0/WsEndUser.svc?wsdl
+ dc2: https://api.dc2.computing.cloud.it/WsEndUser/v2.0/WsEndUser.svc?wsdl
+ dc3: https://api.dc3.computing.cloud.it/WsEndUser/v2.0/WsEndUser.svc?wsdl
+ :name: Arubacloud
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/cd746e6b/server/lib/deltacloud/drivers/aruba/aruba_driver.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/drivers/aruba/aruba_driver.rb b/server/lib/deltacloud/drivers/aruba/aruba_driver.rb
deleted file mode 100644
index 6281751..0000000
--- a/server/lib/deltacloud/drivers/aruba/aruba_driver.rb
+++ /dev/null
@@ -1,460 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you 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 "savon"
-
-Savon.configure do |config|
- config.log = false
-end
-HTTPI.log = false
-
-
-module Deltacloud
- module Drivers
- module Aruba
-
-class ArubaDriver < Deltacloud::BaseDriver
-
- DEFAULT_DC = 'dc1'
- feature :instances, :authentication_password
- feature :instances, :user_name
-
- define_instance_states do
- start.to( :pending ) .automatically
- pending.to( :running ) .automatically
- running.to( :running ) .on( :reboot)
- running.to( :stopping ) .on( :stop )
- stopping.to( :stopped ) .automatically
- stopped.to( :pending ) .on( :start )
- stopped.to( :finish ) .on( :destroy )
- end
-
- define_hardware_profile 'VMWare' do
- cpu ( 1..8 )
- memory ( 1024 .. 32*1024 )
- storage ( 10 .. 500)
- architecture ['x86_64', 'i386']
- end
-
- define_hardware_profile 'HyperV' do
- cpu ( 1..4 )
- memory ( 1024 .. 16*1024 )
- storage ( 10 .. 500 )
- architecture ['x86_64', 'i386']
- end
-
- define_hardware_profile 'HyperVLowCost' do
- cpu ( 1..4 )
- memory ( 1024 .. 16*1024 )
- storage ( 10 .. 500)
- architecture ['x86_64', 'i386']
- end
-
- def valid_credentials?(credentials)
- begin
- new_client(credentials)
- rescue
- return false
- end
- true
- end
-
- def realms(credentials, opts=nil)
- client = new_client(credentials)
- safely do
- datacenters = get_all(client,
- :datacenter_configurations,
- :datacenter_config).inject([]) do |res, dc|
- res << Realm.new(
- :id => dc[:datacenter_id],
- :name => dc[:name],
- :limit => :unlimited,
- :state => dc[:status]
- )
- res
- end
- datacenters
- end
- end
-
- def images(credentials, opts = {})
- client = new_client(credentials)
- safely do
- hvs = get_all client, :hypervisors
- images = []
- hvs.each do |hv|
- hv[:templates][:template_details].each do |tpl|
- if opts[:id] and opts[:id] != tpl[:id]
- next
- end
- arch = tpl[:description] !~ /64bit/ ? "i386" : "x86_64"
- images << Image.new(
- :id => tpl[:id],
- :name => tpl[:name],
- :description => tpl[:description],
- :architecture => arch,
- :owner_id => 0,
- :state => "AVAILABLE",
- :hardware_profiles => [InstanceProfile.new(hv[:hypervisor_type])]
- )
- end
- end
- images = filter_on( images, :architecture, opts )
- images = filter_on( images, :owner_id, opts )
- images = filter_on( images, :id, opts )
- images.sort_by{|e| [e.owner_id, e.architecture, e.name, e.description]}
- end
- end
-
- def instances(credentials, opts={})
- client = new_client(credentials)
-
- safely do
- if opts[:id]
- instances = [convert_instance(client, opts[:id])]
- else
- instances = get_all(client, :servers).collect do |srv|
- convert_instance(client, srv[:server_id])
- end
- end
- filter_on(instances, :state, opts)
- end
- end
-
- def create_instance(credentials, image_id, opts={})
- client = new_client(credentials, opts[:realm_id])
- safely do
- ram = opts[:hwp_memory].to_i / 1024
- if not opts[:password] or opts[:password] == ''
- raise "Missing Parameter 'password'"
- end
- params = {
- :server => {
- "arub:AdministratorPassword" => opts[:password].to_s,
- "arub:CPUQuantity" => opts[:hwp_cpu].to_s,
- "arub:Name" => opts[:name],
- "arub:OSTemplateId" => opts[:image_id].to_s,
- "arub:RAMQuantity" => ram.to_s,
- "arub:VirtualDisks" => {
- "arub:VirtualDiskDetails" => {
- "arub:Size" => opts[:hwp_storage]
- }
- }
- }
- }
- # since Aruba API does not return the new server id when calling
- # set_enqueue_server_creation, get the server_id from the job list
- prev_jobs = get_jobs(client, "AddVirtualMachine")
- request(client, :enqueue_server_creation, params, "set")
- jobs = get_jobs(client, "AddVirtualMachine") - prev_jobs
- convert_instance(client, jobs.sort_by {|j| j[:job_id].to_i}.reverse.first[:server_id])
- end
- end
-
- def start_instance(credentials, id)
- client = new_client(credentials)
- safely do
- request(client, :enqueue_server_start, {:serverId => id}, "set")
- convert_instance client, id
- end
- end
-
- def stop_instance(credentials, id)
- client = new_client(credentials)
- safely do
- request(client, :enqueue_server_stop, {:serverId => id}, "set")
- convert_instance client, id
- end
- end
-
- def reboot_instance(credentials, id)
- client = new_client(credentials)
- safely do
- request(client, :enqueue_server_restart, {:serverId => id}, "set")
- convert_instance client, id
- end
- end
-
- def destroy_instance(credentials, id)
- client = new_client(credentials)
- safely do
- request(client, :enqueue_server_deletion, {:serverId => id}, "set")
- convert_instance client, id
- end
- end
-
- def configured_providers
- Deltacloud::Drivers::driver_config[:aruba][:entrypoints]["compute"].keys
- end
-
- def storage_volumes(credentials, opts={})
- client = new_client(credentials)
- safely do
- servers = get_all client, :servers
- volumes = servers.inject([]) do |result, srv|
- instance = convert_instance(client, srv[:server_id])
- details = request client, :server_details, {:serverId => instance.id}
- vdisks = details[:virtual_disks][:virtual_disk]
- vdisks = vdisks.kind_of?(Array) ? vdisks : [vdisks]
- vdisks.each do |vd|
- if instance.state == "STOPPED"
- actions = vd[:resource_type] == "HardDrive0" ? [:snapshot] : [:snapshot, :detach]
- else
- actions = []
- end
- result << StorageVolume.new(
- :id => vd[:resource_id],
- :name => "#{instance.name}-#{vd[:resource_type]}",
- :capacity => vd[:size],
- :instance_id => instance.id,
- :realm_id => instance.realm_id,
- :state => "IN-USE",
- :created => vd[:creation_date],
- :kind => 'data',
- :actions => actions,
- :device => nil
- ) if opts[:id].nil? or opts[:id] == vd[:resource_id]
- end
- result
- end
- volumes
- end
- end
-
- def addresses(credentials, opts={})
- client = new_client(credentials)
- safely do
- get_all(client, :purchased_ip_addresses, :ip_address).collect do |ip|
- Address.new(:id => ip[:value], :instance_id => ip[:server_id])
- end
- end
- end
-
- def create_address(credentials, opts={})
- client = new_client(credentials)
- safely do
- ip = request(client, :purchase_ip_address, {}, "set")
- address = Address.new(:id => ip[:value], :instance_id => nil)
- end
- end
-
- def destroy_address(credentials, opts={})
- client = new_client(credentials)
- safely do
- get_all(client, :purchased_ip_addresses, :ip_address).collect do |ip|
- if ip[:value] == opts[:id]
- request client, :remove_ip_address, {:ipAddressResourceId => ip[:resource_id]}, "set"
- return
- end
- end
- raise "Could not find ip #{opts[:id]}"
- end
- end
-
- def associate_address(credentials, opts={})
- client = new_client(credentials)
- safely do
-
- get_all(client, :purchased_ip_addresses, :ip_address).collect do |ip|
- if ip[:value] == opts[:id]
- details = request client, :server_details, {:serverId => opts[:instance_id]}
- params = {
- :ipAddressResourceIds => {"arr:int" => ip[:resource_id]},
- :networkAdapterId => details[:network_adapters][:network_adapter].first[:id]
- }
- request client, :enqueue_associate_ip_address, params, "set"
- return
- end
- end
- raise "Could not find ip #{opts[:id]}"
- end
- end
-
- def disassociate_address(credentials, opts={})
- client = new_client(credentials)
- safely do
- get_all(client, :purchased_ip_addresses, :ip_address).collect do |ip|
- if ip[:value] == opts[:id]
- details = request client, :server_details, {:serverId => ip[:server_id]}
- params = {
- :ipAddressResourceIds => {"arr:int" => ip[:resource_id]},
- :networkAdapterId => details[:network_adapters][:network_adapter].first[:id]
- }
- request client, :enqueue_deassociate_ip_address, params, "set"
- return
- end
- end
- raise "Could not find ip #{opts[:id]}"
- end
- end
-
- private
-
- def new_client(credentials, realm_id=nil)
- safely do
- wsdl = realm_id ? Deltacloud::Drivers::driver_config[:aruba][:entrypoints]["compute"]["dc#{realm_id}"] : endpoint
- client = Savon.client(wsdl)
- client.wsse.credentials credentials.user, credentials.password
- client.request :get_user_authentication_token
- client
- end
- end
-
- def get_all(client, entity, field = nil)
- method = "get_#{entity}".to_sym
- field = field ? field : entity.to_s.chomp("s").to_sym
- response = client.request method
- result = response.body["#{method}_response".to_sym]["#{method}_result".to_sym][:value][field]
- result = result.nil? ? [] : result.kind_of?(Array) ? result : [result]
- result
- end
-
- def request(client, entity, params, verb="get")
- meth = verb ? "#{verb}_#{entity}".to_sym : entity.to_sym
- opts = {}
- params.map{ |k, v| opts["tns:#{k}"] = v }
- response = client.request meth do
- soap.namespaces["xmlns:arub"] = "http://schemas.datacontract.org/2004/07/Aruba.Cloud.Provisioning.Entities"
- soap.namespaces["xmlns:arr"] = "http://schemas.microsoft.com/2003/10/Serialization/Arrays"
- soap.body = opts
- end
- data = response.body["#{meth}_response".to_sym]["#{meth}_result".to_sym]
- if not data[:success]
- raise data[:result_message]
- end
-
- data [:value]
- end
-
- def get_jobs(client, type)
- get_all(client, :jobs).inject([]) do |res, j|
- if j[:operation_name] == type
- res << j
- end
- res
- end
- end
-
- def convert_state(state)
- case state
- when "Stopped"
- "STOPPED"
- when "Running"
- "RUNNING"
- when "Creating"
- "PENDING"
- end
- end
-
- def convert_instance(client, id)
- safely do
- details = request client, :server_details, {:serverId => id}
- ip_addresses = details[:network_adapters][:network_adapter].inject([]) do |result, adp|
- if adp[:ip_addresses]
- if adp[:ip_addresses][:ip_address].kind_of? Array
- result += adp[:ip_addresses][:ip_address].map{ |x|
- InstanceAddress.new(x[:value], :type => :ipv4)
- }
- else
- result << InstanceAddress.new(
- adp[:ip_addresses][:ip_address][:value],
- :type => :ipv4
- )
- end
- end
- result
- end
-
- storage = details[:virtual_disks][:virtual_disk].kind_of?(Array) ?
- details[:virtual_disks][:virtual_disk].first[:size] :
- details[:virtual_disks][:virtual_disk][:size]
- profile = InstanceProfile.new(details[:hypervisor_type],
- :hwp_memory => details[:ram_quantity][:quantity].to_i * 1024,
- :hwp_cpu => details[:cpu_quantity][:quantity],
- :hwp_storage => storage)
-
- state = convert_state(details[:server_status])
- key_pairs = details[:parameters][:key_value_pair]
- key_pairs = key_pairs.kind_of?(Array) ? key_pairs : [key_pairs]
- private_addresses = key_pairs.inject([]) do |result, kp|
- result << InstanceAddress.new(kp[:value], :type=> :ipv4) if kp[:key] == "HostIp"
- result
- end
-
- vdisks = details[:virtual_disks][:virtual_disk]
- vdisks = vdisks.kind_of?(Array) ? vdisks : [vdisks]
-
- actions = instance_actions_for(state)
-
- Instance.new(
- :id => id,
- :name => details[:name],
- :state => state,
- :image_id => details[:os_template][:id],
- :owner_id => details[:user_id],
- :actions => actions,
- :launch_time => details[:creation_date],
- :realm_id => details[:datacenter_id],
- :create_image => true,
- :public_addresses => ip_addresses,
- :private_addresses => private_addresses,
- :instance_profile => profile,
- :storage_volumes => vdisks.collect {|vd| {vd[:resource_id] => nil} }
- )
- end
- end
-
- def endpoint
- endpoint = (api_provider || DEFAULT_DC)
- Deltacloud::Drivers::driver_config[:aruba][:entrypoints]["compute"][endpoint] || endpoint
- end
-
- exceptions do
- on /InvalidSecurity/ do
- status 401
- end
-
- on /Could not find/ do
- status 404
- end
-
- on /SocketError|ProviderError/ do
- status 502
- end
-
- on /ActionNotSupported|DeserializationFailed|Unknown|Missing Parameter/ do
- status 400
- end
-
- on /Operation already enqueued/ do
- status 412
- end
-
- on /Too many Public IP/ do
- status 502
- end
-
- on /IP address.*is associated/ do
- status 400
- end
-
- end
-end
-
- end #module Aruba
- end #module Drivers
-end #module Deltacloud
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/cd746e6b/server/lib/deltacloud/drivers/arubacloud/arubacloud_driver.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/drivers/arubacloud/arubacloud_driver.rb b/server/lib/deltacloud/drivers/arubacloud/arubacloud_driver.rb
new file mode 100644
index 0000000..0fd8bee
--- /dev/null
+++ b/server/lib/deltacloud/drivers/arubacloud/arubacloud_driver.rb
@@ -0,0 +1,460 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you 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 "savon"
+
+Savon.configure do |config|
+ config.log = false
+end
+HTTPI.log = false
+
+
+module Deltacloud
+ module Drivers
+ module Arubacloud
+
+class ArubacloudDriver < Deltacloud::BaseDriver
+
+ DEFAULT_DC = 'dc1'
+ feature :instances, :authentication_password
+ feature :instances, :user_name
+
+ define_instance_states do
+ start.to( :pending ) .automatically
+ pending.to( :running ) .automatically
+ running.to( :running ) .on( :reboot)
+ running.to( :stopping ) .on( :stop )
+ stopping.to( :stopped ) .automatically
+ stopped.to( :pending ) .on( :start )
+ stopped.to( :finish ) .on( :destroy )
+ end
+
+ define_hardware_profile 'VMWare' do
+ cpu ( 1..8 )
+ memory ( 1024 .. 32*1024 )
+ storage ( 10 .. 500)
+ architecture ['x86_64', 'i386']
+ end
+
+ define_hardware_profile 'HyperV' do
+ cpu ( 1..4 )
+ memory ( 1024 .. 16*1024 )
+ storage ( 10 .. 500 )
+ architecture ['x86_64', 'i386']
+ end
+
+ define_hardware_profile 'HyperVLowCost' do
+ cpu ( 1..4 )
+ memory ( 1024 .. 16*1024 )
+ storage ( 10 .. 500)
+ architecture ['x86_64', 'i386']
+ end
+
+ def valid_credentials?(credentials)
+ begin
+ new_client(credentials)
+ rescue
+ return false
+ end
+ true
+ end
+
+ def realms(credentials, opts=nil)
+ client = new_client(credentials)
+ safely do
+ datacenters = get_all(client,
+ :datacenter_configurations,
+ :datacenter_config).inject([]) do |res, dc|
+ res << Realm.new(
+ :id => dc[:datacenter_id],
+ :name => dc[:name],
+ :limit => :unlimited,
+ :state => dc[:status]
+ )
+ res
+ end
+ datacenters
+ end
+ end
+
+ def images(credentials, opts = {})
+ client = new_client(credentials)
+ safely do
+ hvs = get_all client, :hypervisors
+ images = []
+ hvs.each do |hv|
+ hv[:templates][:template_details].each do |tpl|
+ if opts[:id] and opts[:id] != tpl[:id]
+ next
+ end
+ arch = tpl[:description] !~ /64bit/ ? "i386" : "x86_64"
+ images << Image.new(
+ :id => tpl[:id],
+ :name => tpl[:name],
+ :description => tpl[:description],
+ :architecture => arch,
+ :owner_id => 0,
+ :state => "AVAILABLE",
+ :hardware_profiles => [InstanceProfile.new(hv[:hypervisor_type])]
+ )
+ end
+ end
+ images = filter_on( images, :architecture, opts )
+ images = filter_on( images, :owner_id, opts )
+ images = filter_on( images, :id, opts )
+ images.sort_by{|e| [e.owner_id, e.architecture, e.name, e.description]}
+ end
+ end
+
+ def instances(credentials, opts={})
+ client = new_client(credentials)
+
+ safely do
+ if opts[:id]
+ instances = [convert_instance(client, opts[:id])]
+ else
+ instances = get_all(client, :servers).collect do |srv|
+ convert_instance(client, srv[:server_id])
+ end
+ end
+ filter_on(instances, :state, opts)
+ end
+ end
+
+ def create_instance(credentials, image_id, opts={})
+ client = new_client(credentials, opts[:realm_id])
+ safely do
+ ram = opts[:hwp_memory].to_i / 1024
+ if not opts[:password] or opts[:password] == ''
+ raise "Missing Parameter 'password'"
+ end
+ params = {
+ :server => {
+ "arub:AdministratorPassword" => opts[:password].to_s,
+ "arub:CPUQuantity" => opts[:hwp_cpu].to_s,
+ "arub:Name" => opts[:name],
+ "arub:OSTemplateId" => opts[:image_id].to_s,
+ "arub:RAMQuantity" => ram.to_s,
+ "arub:VirtualDisks" => {
+ "arub:VirtualDiskDetails" => {
+ "arub:Size" => opts[:hwp_storage]
+ }
+ }
+ }
+ }
+ # since Aruba API does not return the new server id when calling
+ # set_enqueue_server_creation, get the server_id from the job list
+ prev_jobs = get_jobs(client, "AddVirtualMachine")
+ request(client, :enqueue_server_creation, params, "set")
+ jobs = get_jobs(client, "AddVirtualMachine") - prev_jobs
+ convert_instance(client, jobs.sort_by {|j| j[:job_id].to_i}.reverse.first[:server_id])
+ end
+ end
+
+ def start_instance(credentials, id)
+ client = new_client(credentials)
+ safely do
+ request(client, :enqueue_server_start, {:serverId => id}, "set")
+ convert_instance client, id
+ end
+ end
+
+ def stop_instance(credentials, id)
+ client = new_client(credentials)
+ safely do
+ request(client, :enqueue_server_stop, {:serverId => id}, "set")
+ convert_instance client, id
+ end
+ end
+
+ def reboot_instance(credentials, id)
+ client = new_client(credentials)
+ safely do
+ request(client, :enqueue_server_restart, {:serverId => id}, "set")
+ convert_instance client, id
+ end
+ end
+
+ def destroy_instance(credentials, id)
+ client = new_client(credentials)
+ safely do
+ request(client, :enqueue_server_deletion, {:serverId => id}, "set")
+ convert_instance client, id
+ end
+ end
+
+ def configured_providers
+ Deltacloud::Drivers::driver_config[:aruba][:entrypoints]["compute"].keys
+ end
+
+ def storage_volumes(credentials, opts={})
+ client = new_client(credentials)
+ safely do
+ servers = get_all client, :servers
+ volumes = servers.inject([]) do |result, srv|
+ instance = convert_instance(client, srv[:server_id])
+ details = request client, :server_details, {:serverId => instance.id}
+ vdisks = details[:virtual_disks][:virtual_disk]
+ vdisks = vdisks.kind_of?(Array) ? vdisks : [vdisks]
+ vdisks.each do |vd|
+ if instance.state == "STOPPED"
+ actions = vd[:resource_type] == "HardDrive0" ? [:snapshot] : [:snapshot, :detach]
+ else
+ actions = []
+ end
+ result << StorageVolume.new(
+ :id => vd[:resource_id],
+ :name => "#{instance.name}-#{vd[:resource_type]}",
+ :capacity => vd[:size],
+ :instance_id => instance.id,
+ :realm_id => instance.realm_id,
+ :state => "IN-USE",
+ :created => vd[:creation_date],
+ :kind => 'data',
+ :actions => actions,
+ :device => nil
+ ) if opts[:id].nil? or opts[:id] == vd[:resource_id]
+ end
+ result
+ end
+ volumes
+ end
+ end
+
+ def addresses(credentials, opts={})
+ client = new_client(credentials)
+ safely do
+ get_all(client, :purchased_ip_addresses, :ip_address).collect do |ip|
+ Address.new(:id => ip[:value], :instance_id => ip[:server_id])
+ end
+ end
+ end
+
+ def create_address(credentials, opts={})
+ client = new_client(credentials)
+ safely do
+ ip = request(client, :purchase_ip_address, {}, "set")
+ address = Address.new(:id => ip[:value], :instance_id => nil)
+ end
+ end
+
+ def destroy_address(credentials, opts={})
+ client = new_client(credentials)
+ safely do
+ get_all(client, :purchased_ip_addresses, :ip_address).collect do |ip|
+ if ip[:value] == opts[:id]
+ request client, :remove_ip_address, {:ipAddressResourceId => ip[:resource_id]}, "set"
+ return
+ end
+ end
+ raise "Could not find ip #{opts[:id]}"
+ end
+ end
+
+ def associate_address(credentials, opts={})
+ client = new_client(credentials)
+ safely do
+
+ get_all(client, :purchased_ip_addresses, :ip_address).collect do |ip|
+ if ip[:value] == opts[:id]
+ details = request client, :server_details, {:serverId => opts[:instance_id]}
+ params = {
+ :ipAddressResourceIds => {"arr:int" => ip[:resource_id]},
+ :networkAdapterId => details[:network_adapters][:network_adapter].first[:id]
+ }
+ request client, :enqueue_associate_ip_address, params, "set"
+ return
+ end
+ end
+ raise "Could not find ip #{opts[:id]}"
+ end
+ end
+
+ def disassociate_address(credentials, opts={})
+ client = new_client(credentials)
+ safely do
+ get_all(client, :purchased_ip_addresses, :ip_address).collect do |ip|
+ if ip[:value] == opts[:id]
+ details = request client, :server_details, {:serverId => ip[:server_id]}
+ params = {
+ :ipAddressResourceIds => {"arr:int" => ip[:resource_id]},
+ :networkAdapterId => details[:network_adapters][:network_adapter].first[:id]
+ }
+ request client, :enqueue_deassociate_ip_address, params, "set"
+ return
+ end
+ end
+ raise "Could not find ip #{opts[:id]}"
+ end
+ end
+
+ private
+
+ def new_client(credentials, realm_id=nil)
+ safely do
+ wsdl = realm_id ? Deltacloud::Drivers::driver_config[:aruba][:entrypoints]["compute"]["dc#{realm_id}"] : endpoint
+ client = Savon.client(wsdl)
+ client.wsse.credentials credentials.user, credentials.password
+ client.request :get_user_authentication_token
+ client
+ end
+ end
+
+ def get_all(client, entity, field = nil)
+ method = "get_#{entity}".to_sym
+ field = field ? field : entity.to_s.chomp("s").to_sym
+ response = client.request method
+ result = response.body["#{method}_response".to_sym]["#{method}_result".to_sym][:value][field]
+ result = result.nil? ? [] : result.kind_of?(Array) ? result : [result]
+ result
+ end
+
+ def request(client, entity, params, verb="get")
+ meth = verb ? "#{verb}_#{entity}".to_sym : entity.to_sym
+ opts = {}
+ params.map{ |k, v| opts["tns:#{k}"] = v }
+ response = client.request meth do
+ soap.namespaces["xmlns:arub"] = "http://schemas.datacontract.org/2004/07/Aruba.Cloud.Provisioning.Entities"
+ soap.namespaces["xmlns:arr"] = "http://schemas.microsoft.com/2003/10/Serialization/Arrays"
+ soap.body = opts
+ end
+ data = response.body["#{meth}_response".to_sym]["#{meth}_result".to_sym]
+ if not data[:success]
+ raise data[:result_message]
+ end
+
+ data [:value]
+ end
+
+ def get_jobs(client, type)
+ get_all(client, :jobs).inject([]) do |res, j|
+ if j[:operation_name] == type
+ res << j
+ end
+ res
+ end
+ end
+
+ def convert_state(state)
+ case state
+ when "Stopped"
+ "STOPPED"
+ when "Running"
+ "RUNNING"
+ when "Creating"
+ "PENDING"
+ end
+ end
+
+ def convert_instance(client, id)
+ safely do
+ details = request client, :server_details, {:serverId => id}
+ ip_addresses = details[:network_adapters][:network_adapter].inject([]) do |result, adp|
+ if adp[:ip_addresses]
+ if adp[:ip_addresses][:ip_address].kind_of? Array
+ result += adp[:ip_addresses][:ip_address].map{ |x|
+ InstanceAddress.new(x[:value], :type => :ipv4)
+ }
+ else
+ result << InstanceAddress.new(
+ adp[:ip_addresses][:ip_address][:value],
+ :type => :ipv4
+ )
+ end
+ end
+ result
+ end
+
+ storage = details[:virtual_disks][:virtual_disk].kind_of?(Array) ?
+ details[:virtual_disks][:virtual_disk].first[:size] :
+ details[:virtual_disks][:virtual_disk][:size]
+ profile = InstanceProfile.new(details[:hypervisor_type],
+ :hwp_memory => details[:ram_quantity][:quantity].to_i * 1024,
+ :hwp_cpu => details[:cpu_quantity][:quantity],
+ :hwp_storage => storage)
+
+ state = convert_state(details[:server_status])
+ key_pairs = details[:parameters][:key_value_pair]
+ key_pairs = key_pairs.kind_of?(Array) ? key_pairs : [key_pairs]
+ private_addresses = key_pairs.inject([]) do |result, kp|
+ result << InstanceAddress.new(kp[:value], :type=> :ipv4) if kp[:key] == "HostIp"
+ result
+ end
+
+ vdisks = details[:virtual_disks][:virtual_disk]
+ vdisks = vdisks.kind_of?(Array) ? vdisks : [vdisks]
+
+ actions = instance_actions_for(state)
+
+ Instance.new(
+ :id => id,
+ :name => details[:name],
+ :state => state,
+ :image_id => details[:os_template][:id],
+ :owner_id => details[:user_id],
+ :actions => actions,
+ :launch_time => details[:creation_date],
+ :realm_id => details[:datacenter_id],
+ :create_image => true,
+ :public_addresses => ip_addresses,
+ :private_addresses => private_addresses,
+ :instance_profile => profile,
+ :storage_volumes => vdisks.collect {|vd| {vd[:resource_id] => nil} }
+ )
+ end
+ end
+
+ def endpoint
+ endpoint = (api_provider || DEFAULT_DC)
+ Deltacloud::Drivers::driver_config[:aruba][:entrypoints]["compute"][endpoint] || endpoint
+ end
+
+ exceptions do
+ on /InvalidSecurity/ do
+ status 401
+ end
+
+ on /Could not find/ do
+ status 404
+ end
+
+ on /SocketError|ProviderError/ do
+ status 502
+ end
+
+ on /ActionNotSupported|DeserializationFailed|Unknown|Missing Parameter/ do
+ status 400
+ end
+
+ on /Operation already enqueued/ do
+ status 412
+ end
+
+ on /Too many Public IP/ do
+ status 502
+ end
+
+ on /IP address.*is associated/ do
+ status 400
+ end
+
+ end
+end
+
+ end #module Aruba
+ end #module Drivers
+end #module Deltacloud