mirror of
https://github.com/fog/fog.git
synced 2022-11-09 13:51:43 -05:00
285 lines
10 KiB
Ruby
285 lines
10 KiB
Ruby
module Fog
|
|
module Terremark
|
|
module Shared
|
|
|
|
# Commond methods shared by Real and Mock
|
|
module Common
|
|
|
|
# TODO: bust cache on organization creation?
|
|
def default_organization_id
|
|
@default_organization_id ||= begin
|
|
org_list = get_organizations.body['OrgList']
|
|
if org_list.length == 1
|
|
org_list.first['href'].split('/').last.to_i
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
module Parser
|
|
|
|
def parse(data)
|
|
case data['type']
|
|
when 'application/vnd.vmware.vcloud.vApp+xml'
|
|
servers.new(data.merge!(:connection => self))
|
|
else
|
|
data
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
module Real
|
|
include Common
|
|
|
|
private
|
|
|
|
def auth_token
|
|
response = @connection.request({
|
|
:expects => 200,
|
|
:headers => {
|
|
'Authorization' => "Basic #{Base64.encode64("#{@terremark_username}:#{@terremark_password}").chomp!}",
|
|
'Content-Type' => "application/vnd.vmware.vcloud.orgList+xml"
|
|
},
|
|
:host => @host,
|
|
:method => 'POST',
|
|
:parser => Fog::Parsers::Terremark::Shared::GetOrganizations.new,
|
|
:path => "#{@path}/login"
|
|
})
|
|
response.headers['Set-Cookie']
|
|
end
|
|
|
|
def request(params)
|
|
@connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}")
|
|
unless @cookie
|
|
@cookie = auth_token
|
|
end
|
|
begin
|
|
do_request(params)
|
|
rescue Excon::Errors::Unauthorized => e
|
|
@cookie = auth_token
|
|
do_request(params)
|
|
end
|
|
end
|
|
|
|
def do_request(params)
|
|
headers = {}
|
|
if @cookie
|
|
headers.merge!('Cookie' => @cookie)
|
|
end
|
|
@connection.request({
|
|
:body => params[:body],
|
|
:expects => params[:expects],
|
|
:headers => headers.merge!(params[:headers] || {}),
|
|
:host => @host,
|
|
:method => params[:method],
|
|
:parser => params[:parser],
|
|
:path => "#{@path}/#{params[:path]}"
|
|
})
|
|
end
|
|
|
|
end
|
|
|
|
module Mock
|
|
include Common
|
|
|
|
DATA = {
|
|
:organizations =>
|
|
[
|
|
{
|
|
:info => {
|
|
:name => "Boom Inc.",
|
|
:id => 1
|
|
},
|
|
:vdcs => [
|
|
{ :id => 21,
|
|
:name => "Boomstick",
|
|
:storage => { :used => 105, :allocated => 200 },
|
|
:cpu => { :allocated => 10000 },
|
|
:memory => { :allocated => 20480 },
|
|
:networks => [
|
|
{ :id => 31,
|
|
:name => "1.2.3.0/24",
|
|
:subnet => "1.2.3.0/24",
|
|
:gateway => "1.2.3.1",
|
|
:netmask => "255.255.255.0",
|
|
:fencemode => "isolated"
|
|
},
|
|
{ :id => 32,
|
|
:name => "4.5.6.0/24",
|
|
:subnet => "4.5.6.0/24",
|
|
:gateway => "4.5.6.1",
|
|
:netmask => "255.255.255.0",
|
|
:fencemode => "isolated"
|
|
},
|
|
],
|
|
:vms => [
|
|
{ :id => 41,
|
|
:name => "Broom 1"
|
|
},
|
|
{ :id => 42,
|
|
:name => "Broom 2"
|
|
},
|
|
{ :id => 43,
|
|
:name => "Email!"
|
|
}
|
|
],
|
|
:public_ips => [
|
|
{ :id => 51,
|
|
:name => "99.1.2.3"
|
|
},
|
|
{ :id => 52,
|
|
:name => "99.1.2.4"
|
|
},
|
|
{ :id => 53,
|
|
:name => "99.1.9.7"
|
|
}
|
|
]
|
|
},
|
|
{ :id => 22,
|
|
:storage => { :used => 40, :allocated => 150 },
|
|
:cpu => { :allocated => 1000 },
|
|
:memory => { :allocated => 2048 },
|
|
:name => "Rock-n-Roll",
|
|
:networks => [
|
|
{ :id => 33,
|
|
:name => "7.8.9.0/24",
|
|
:subnet => "7.8.9.0/24",
|
|
:gateway => "7.8.9.1",
|
|
:netmask => "255.255.255.0",
|
|
:fencemode => "isolated"
|
|
}
|
|
],
|
|
:vms => [
|
|
{ :id => 44,
|
|
:name => "Master Blaster"
|
|
}
|
|
],
|
|
:public_ips => [
|
|
{ :id => 54,
|
|
:name => "99.99.99.99"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
|
|
def self.error_headers
|
|
{"X-Powered-By"=>"ASP.NET",
|
|
"Date"=> Time.now.to_s,
|
|
"Content-Type"=>"text/html",
|
|
"Content-Length"=>"0",
|
|
"Server"=>"Microsoft-IIS/7.0",
|
|
"Cache-Control"=>"private"}
|
|
end
|
|
|
|
def self.unathorized_status
|
|
401
|
|
end
|
|
|
|
def self.headers(body, content_type)
|
|
{"X-Powered-By"=>"ASP.NET",
|
|
"Date"=> Time.now.to_s,
|
|
"Content-Type"=> content_type,
|
|
"Content-Length"=> body.to_s.length,
|
|
"Server"=>"Microsoft-IIS/7.0",
|
|
"Set-Cookie"=>"vcloud-token=ecb37bfc-56f0-421d-97e5-bf2gdf789457; path=/",
|
|
"Cache-Control"=>"private"}
|
|
end
|
|
|
|
def self.status
|
|
200
|
|
end
|
|
|
|
def initialize(options={})
|
|
self.class.instance_eval '
|
|
def self.data
|
|
@data ||= Hash.new do |hash, key|
|
|
hash[key] = Fog::Terremark::Shared::Mock::DATA
|
|
end
|
|
end'
|
|
self.class.instance_eval '
|
|
def self.reset_data(keys=data.keys)
|
|
for key in [*keys]
|
|
data.delete(key)
|
|
end
|
|
end'
|
|
end
|
|
end
|
|
|
|
def check_shared_options(options)
|
|
%w{ecloud vcloud}.each do |cloud|
|
|
cloud_option_keys = options.keys.select { |key| key.to_s =~ /^terremark_#{cloud}_.*/ }
|
|
unless cloud_option_keys.length == 0 || cloud_option_keys.length == 2
|
|
raise ArgumentError.new("terremark_#{cloud}_username and terremark_#{cloud}_password required to access teremark")
|
|
end
|
|
end
|
|
end
|
|
|
|
def shared_requires
|
|
require 'fog/terremark/models/shared/address'
|
|
require 'fog/terremark/models/shared/addresses'
|
|
require 'fog/terremark/models/shared/network'
|
|
require 'fog/terremark/models/shared/networks'
|
|
require 'fog/terremark/models/shared/server'
|
|
require 'fog/terremark/models/shared/servers'
|
|
require 'fog/terremark/models/shared/task'
|
|
require 'fog/terremark/models/shared/tasks'
|
|
require 'fog/terremark/models/shared/vdc'
|
|
require 'fog/terremark/models/shared/vdcs'
|
|
require 'fog/terremark/parsers/shared/get_catalog'
|
|
require 'fog/terremark/parsers/shared/get_catalog_item'
|
|
require 'fog/terremark/parsers/shared/get_internet_services'
|
|
require 'fog/terremark/parsers/shared/get_network_ips'
|
|
require 'fog/terremark/parsers/shared/get_node_services'
|
|
require 'fog/terremark/parsers/shared/get_organization'
|
|
require 'fog/terremark/parsers/shared/get_organizations'
|
|
require 'fog/terremark/parsers/shared/get_public_ips'
|
|
require 'fog/terremark/parsers/shared/get_tasks_list'
|
|
require 'fog/terremark/parsers/shared/get_vapp_template'
|
|
require 'fog/terremark/parsers/shared/get_vdc'
|
|
require 'fog/terremark/parsers/shared/instantiate_vapp_template'
|
|
require 'fog/terremark/parsers/shared/internet_service'
|
|
require 'fog/terremark/parsers/shared/network'
|
|
require 'fog/terremark/parsers/shared/node_service'
|
|
require 'fog/terremark/parsers/shared/public_ip'
|
|
require 'fog/terremark/parsers/shared/task'
|
|
require 'fog/terremark/parsers/shared/vapp'
|
|
require 'fog/terremark/requests/shared/add_internet_service'
|
|
require 'fog/terremark/requests/shared/add_node_service'
|
|
require 'fog/terremark/requests/shared/create_internet_service'
|
|
require 'fog/terremark/requests/shared/delete_internet_service'
|
|
require 'fog/terremark/requests/shared/delete_public_ip'
|
|
require 'fog/terremark/requests/shared/delete_node_service'
|
|
require 'fog/terremark/requests/shared/delete_vapp'
|
|
require 'fog/terremark/requests/shared/deploy_vapp'
|
|
require 'fog/terremark/requests/shared/get_catalog'
|
|
require 'fog/terremark/requests/shared/get_catalog_item'
|
|
require 'fog/terremark/requests/shared/get_internet_services'
|
|
require 'fog/terremark/requests/shared/get_network'
|
|
require 'fog/terremark/requests/shared/get_network_ips'
|
|
require 'fog/terremark/requests/shared/get_node_services'
|
|
require 'fog/terremark/requests/shared/get_organization'
|
|
require 'fog/terremark/requests/shared/get_organizations'
|
|
require 'fog/terremark/requests/shared/get_public_ip'
|
|
require 'fog/terremark/requests/shared/get_public_ips'
|
|
require 'fog/terremark/requests/shared/get_task'
|
|
require 'fog/terremark/requests/shared/get_tasks_list'
|
|
require 'fog/terremark/requests/shared/get_vapp'
|
|
require 'fog/terremark/requests/shared/get_vapp_template'
|
|
require 'fog/terremark/requests/shared/get_vdc'
|
|
require 'fog/terremark/requests/shared/instantiate_vapp_template'
|
|
require 'fog/terremark/requests/shared/power_off'
|
|
require 'fog/terremark/requests/shared/power_on'
|
|
require 'fog/terremark/requests/shared/power_reset'
|
|
require 'fog/terremark/requests/shared/power_shutdown'
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|