fog 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. data/Gemfile +8 -8
  2. data/Gemfile.lock +3 -3
  3. data/bin/fog +2 -10
  4. data/fog.gemspec +45 -20
  5. data/lib/fog.rb +2 -1
  6. data/lib/fog/attributes.rb +48 -8
  7. data/lib/fog/aws/ec2.rb +5 -2
  8. data/lib/fog/aws/elb.rb +5 -2
  9. data/lib/fog/aws/models/ec2/server.rb +1 -1
  10. data/lib/fog/aws/requests/simpledb/put_attributes.rb +43 -12
  11. data/lib/fog/aws/s3.rb +2 -2
  12. data/lib/fog/aws/simpledb.rb +15 -3
  13. data/lib/fog/bin.rb +11 -2
  14. data/lib/fog/bluebox.rb +5 -1
  15. data/lib/fog/connection.rb +9 -1
  16. data/lib/fog/credentials.rb +3 -0
  17. data/lib/fog/new_servers.rb +89 -0
  18. data/lib/fog/new_servers/bin.rb +30 -0
  19. data/lib/fog/new_servers/requests/add_server.rb +39 -0
  20. data/lib/fog/new_servers/requests/cancel_server.rb +36 -0
  21. data/lib/fog/new_servers/requests/get_server.rb +42 -0
  22. data/lib/fog/new_servers/requests/list_images.rb +33 -0
  23. data/lib/fog/new_servers/requests/list_plans.rb +36 -0
  24. data/lib/fog/new_servers/requests/list_servers.rb +43 -0
  25. data/lib/fog/new_servers/requests/reboot_server.rb +30 -0
  26. data/lib/fog/parser.rb +6 -0
  27. data/lib/fog/rackspace/files.rb +8 -2
  28. data/lib/fog/rackspace/models/servers/server.rb +5 -0
  29. data/lib/fog/rackspace/servers.rb +5 -1
  30. data/lib/fog/service.rb +6 -1
  31. data/lib/fog/slicehost.rb +5 -1
  32. data/lib/fog/terremark/ecloud.rb +1 -0
  33. data/lib/fog/terremark/shared.rb +4 -1
  34. data/lib/fog/terremark/vcloud.rb +1 -0
  35. data/lib/fog/vcloud.rb +150 -141
  36. data/lib/fog/vcloud/bin.rb +2 -2
  37. data/lib/fog/vcloud/collection.rb +3 -84
  38. data/lib/fog/vcloud/extension.rb +44 -0
  39. data/lib/fog/vcloud/generators.rb +33 -0
  40. data/lib/fog/vcloud/model.rb +5 -38
  41. data/lib/fog/vcloud/models/vdc.rb +14 -24
  42. data/lib/fog/vcloud/models/vdcs.rb +13 -8
  43. data/lib/fog/vcloud/requests/get_network.rb +4 -11
  44. data/lib/fog/vcloud/requests/get_organization.rb +4 -11
  45. data/lib/fog/vcloud/requests/get_vdc.rb +4 -12
  46. data/lib/fog/vcloud/requests/get_versions.rb +4 -13
  47. data/lib/fog/vcloud/requests/login.rb +4 -4
  48. data/lib/fog/vcloud/terremark/ecloud.rb +125 -54
  49. data/lib/fog/vcloud/terremark/ecloud/models/catalog.rb +30 -0
  50. data/lib/fog/vcloud/terremark/ecloud/models/catalog_item.rb +31 -0
  51. data/lib/fog/vcloud/terremark/ecloud/models/internet_service.rb +21 -22
  52. data/lib/fog/vcloud/terremark/ecloud/models/internet_services.rb +11 -25
  53. data/lib/fog/vcloud/terremark/ecloud/models/ip.rb +38 -5
  54. data/lib/fog/vcloud/terremark/ecloud/models/ips.rb +11 -15
  55. data/lib/fog/vcloud/terremark/ecloud/models/network.rb +52 -11
  56. data/lib/fog/vcloud/terremark/ecloud/models/networks.rb +14 -13
  57. data/lib/fog/vcloud/terremark/ecloud/models/node.rb +47 -0
  58. data/lib/fog/vcloud/terremark/ecloud/models/nodes.rb +30 -0
  59. data/lib/fog/vcloud/terremark/ecloud/models/public_ip.rb +6 -9
  60. data/lib/fog/vcloud/terremark/ecloud/models/public_ips.rb +19 -3
  61. data/lib/fog/vcloud/terremark/ecloud/models/server.rb +203 -0
  62. data/lib/fog/vcloud/terremark/ecloud/models/servers.rb +43 -0
  63. data/lib/fog/vcloud/terremark/ecloud/models/task.rb +22 -0
  64. data/lib/fog/vcloud/terremark/ecloud/models/tasks.rb +30 -0
  65. data/lib/fog/vcloud/terremark/ecloud/models/vdc.rb +32 -10
  66. data/lib/fog/vcloud/terremark/ecloud/models/vdcs.rb +5 -6
  67. data/lib/fog/vcloud/terremark/ecloud/requests/add_internet_service.rb +23 -10
  68. data/lib/fog/vcloud/terremark/ecloud/requests/add_node.rb +54 -0
  69. data/lib/fog/vcloud/terremark/ecloud/requests/configure_internet_service.rb +14 -12
  70. data/lib/fog/vcloud/terremark/ecloud/requests/configure_network.rb +53 -0
  71. data/lib/fog/vcloud/terremark/ecloud/requests/configure_network_ip.rb +52 -0
  72. data/lib/fog/vcloud/terremark/ecloud/requests/configure_node.rb +42 -0
  73. data/lib/fog/vcloud/terremark/ecloud/requests/configure_vapp.rb +115 -0
  74. data/lib/fog/vcloud/terremark/ecloud/requests/delete_internet_service.rb +4 -23
  75. data/lib/fog/vcloud/terremark/ecloud/requests/delete_node.rb +0 -0
  76. data/lib/fog/vcloud/terremark/ecloud/requests/delete_vapp.rb +19 -0
  77. data/lib/fog/vcloud/terremark/ecloud/requests/get_catalog.rb +18 -0
  78. data/lib/fog/vcloud/terremark/ecloud/requests/get_catalog_item.rb +18 -0
  79. data/lib/fog/vcloud/terremark/ecloud/requests/get_customization_options.rb +18 -0
  80. data/lib/fog/vcloud/terremark/ecloud/requests/get_internet_services.rb +9 -16
  81. data/lib/fog/vcloud/terremark/ecloud/requests/get_network.rb +8 -14
  82. data/lib/fog/vcloud/terremark/ecloud/requests/get_network_extensions.rb +36 -0
  83. data/lib/fog/vcloud/terremark/ecloud/requests/get_network_ip.rb +44 -0
  84. data/lib/fog/vcloud/terremark/ecloud/requests/get_network_ips.rb +11 -12
  85. data/lib/fog/vcloud/terremark/ecloud/requests/get_node.rb +18 -0
  86. data/lib/fog/vcloud/terremark/ecloud/requests/get_nodes.rb +18 -0
  87. data/lib/fog/vcloud/terremark/ecloud/requests/get_public_ip.rb +5 -19
  88. data/lib/fog/vcloud/terremark/ecloud/requests/get_public_ips.rb +5 -12
  89. data/lib/fog/vcloud/terremark/ecloud/requests/get_task.rb +18 -0
  90. data/lib/fog/vcloud/terremark/ecloud/requests/get_task_list.rb +19 -0
  91. data/lib/fog/vcloud/terremark/ecloud/requests/get_vapp.rb +18 -0
  92. data/lib/fog/vcloud/terremark/ecloud/requests/get_vdc.rb +7 -15
  93. data/lib/fog/vcloud/terremark/ecloud/requests/power_off.rb +18 -0
  94. data/lib/fog/vcloud/terremark/ecloud/requests/power_on.rb +18 -0
  95. data/lib/fog/vcloud/terremark/ecloud/requests/power_reset.rb +18 -0
  96. data/lib/fog/vcloud/terremark/ecloud/requests/power_shutdown.rb +18 -0
  97. data/lib/fog/vcloud/terremark/vcloud.rb +4 -18
  98. data/lib/fog/vcloud/terremark/vcloud/requests/get_vdc.rb +4 -12
  99. data/spec/aws/requests/simpledb/put_attributes_spec.rb +18 -0
  100. data/spec/vcloud/bin_spec.rb +2 -2
  101. data/spec/vcloud/models/vdc_spec.rb +35 -29
  102. data/spec/vcloud/requests/get_network_spec.rb +32 -43
  103. data/spec/vcloud/requests/get_organization_spec.rb +45 -38
  104. data/spec/vcloud/requests/get_vdc_spec.rb +42 -32
  105. data/spec/vcloud/requests/get_versions_spec.rb +17 -17
  106. data/spec/vcloud/requests/login_spec.rb +7 -4
  107. data/spec/vcloud/spec_helper.rb +137 -46
  108. data/spec/vcloud/terremark/ecloud/models/internet_service_spec.rb +53 -58
  109. data/spec/vcloud/terremark/ecloud/models/internet_services_spec.rb +20 -20
  110. data/spec/vcloud/terremark/ecloud/models/ip_spec.rb +22 -21
  111. data/spec/vcloud/terremark/ecloud/models/ips_spec.rb +18 -18
  112. data/spec/vcloud/terremark/ecloud/models/network_spec.rb +55 -51
  113. data/spec/vcloud/terremark/ecloud/models/networks_spec.rb +16 -15
  114. data/spec/vcloud/terremark/ecloud/models/public_ip_spec.rb +26 -27
  115. data/spec/vcloud/terremark/ecloud/models/public_ips_spec.rb +16 -15
  116. data/spec/vcloud/terremark/ecloud/models/vdc_spec.rb +52 -36
  117. data/spec/vcloud/terremark/ecloud/models/vdcs_spec.rb +18 -15
  118. data/spec/vcloud/terremark/ecloud/requests/add_internet_service_spec.rb +46 -43
  119. data/spec/vcloud/terremark/ecloud/requests/configure_internet_service_spec.rb +37 -32
  120. data/spec/vcloud/terremark/ecloud/requests/delete_internet_service_spec.rb +26 -23
  121. data/spec/vcloud/terremark/ecloud/requests/get_internet_services_spec.rb +57 -49
  122. data/spec/vcloud/terremark/ecloud/requests/get_network_ip_spec.rb +41 -0
  123. data/spec/vcloud/terremark/ecloud/requests/get_network_ips_spec.rb +39 -34
  124. data/spec/vcloud/terremark/ecloud/requests/get_network_spec.rb +26 -48
  125. data/spec/vcloud/terremark/ecloud/requests/get_public_ip_spec.rb +25 -26
  126. data/spec/vcloud/terremark/ecloud/requests/get_public_ips_spec.rb +35 -27
  127. data/spec/vcloud/terremark/ecloud/requests/get_vdc_spec.rb +85 -110
  128. data/spec/vcloud/terremark/ecloud/requests/login_spec.rb +7 -4
  129. data/spec/vcloud/vcloud_spec.rb +9 -8
  130. metadata +62 -26
  131. data/lib/fog/vcloud/parser.rb +0 -42
  132. data/lib/fog/vcloud/parsers/get_organization.rb +0 -37
  133. data/lib/fog/vcloud/parsers/get_vdc.rb +0 -62
  134. data/lib/fog/vcloud/parsers/get_versions.rb +0 -46
  135. data/lib/fog/vcloud/parsers/login.rb +0 -36
  136. data/lib/fog/vcloud/parsers/network.rb +0 -53
  137. data/lib/fog/vcloud/terremark/all.rb +0 -9
  138. data/lib/fog/vcloud/terremark/ecloud/parsers/get_internet_services.rb +0 -59
  139. data/lib/fog/vcloud/terremark/ecloud/parsers/get_public_ip.rb +0 -30
  140. data/lib/fog/vcloud/terremark/ecloud/parsers/get_public_ips.rb +0 -40
  141. data/lib/fog/vcloud/terremark/ecloud/parsers/get_vdc.rb +0 -59
  142. data/lib/fog/vcloud/terremark/ecloud/parsers/internet_service.rb +0 -58
  143. data/lib/fog/vcloud/terremark/ecloud/parsers/network.rb +0 -28
  144. data/lib/fog/vcloud/terremark/ecloud/parsers/network_ips.rb +0 -31
  145. data/lib/fog/vcloud/terremark/ecloud/requests/login.rb +0 -27
  146. data/lib/fog/vcloud/terremark/vcloud/parsers/get_vdc.rb +0 -34
  147. data/spec/vcloud/terremark/vcloud/requests/get_vdc_spec.rb +0 -74
@@ -41,6 +41,8 @@ module Fog
41
41
  last = @stack.pop
42
42
  if last.empty? && @value.empty?
43
43
  @stack.last[name.to_sym] = ''
44
+ elsif last == {:i_nil=>"true"}
45
+ @stack.last[name.to_sym] = nil
44
46
  elsif !@value.empty?
45
47
  @stack.last[name.to_sym] = @value
46
48
  end
@@ -51,6 +53,10 @@ module Fog
51
53
  @stack.first
52
54
  end
53
55
 
56
+ def response
57
+ body
58
+ end
59
+
54
60
  def start_element(name, attributes = [])
55
61
  @value = ''
56
62
  parsed_attributes = {}
@@ -78,20 +78,27 @@ module Fog
78
78
  def initialize(options={})
79
79
  credentials = Fog::Rackspace.authenticate(options)
80
80
  @auth_token = credentials['X-Auth-Token']
81
+
81
82
  cdn_uri = URI.parse(credentials['X-CDN-Management-Url'])
82
83
  @cdn_host = cdn_uri.host
83
84
  @cdn_path = cdn_uri.path
84
85
  @cdn_port = cdn_uri.port
85
86
  @cdn_scheme = cdn_uri.scheme
87
+ @cdn_connection = Fog::Connection.new("#{@cdn_scheme}://#{@cdn_host}:#{@cdn_port}", options[:persistent])
88
+
86
89
  storage_uri = URI.parse(credentials['X-Storage-Url'])
87
90
  @storage_host = storage_uri.host
88
91
  @storage_path = storage_uri.path
89
92
  @storage_port = storage_uri.port
90
93
  @storage_scheme = storage_uri.scheme
94
+ @storage_connection = Fog::Connection.new("#{@storage_scheme}://#{@storage_host}:#{@storage_port}", options[:persistent])
95
+ end
96
+
97
+ def reload
98
+ @connection.reset
91
99
  end
92
100
 
93
101
  def cdn_request(params)
94
- @cdn_connection = Fog::Connection.new("#{@cdn_scheme}://#{@cdn_host}:#{@cdn_port}")
95
102
  response = @cdn_connection.request(params.merge!({
96
103
  :headers => {
97
104
  'Content-Type' => 'application/json',
@@ -107,7 +114,6 @@ module Fog
107
114
  end
108
115
 
109
116
  def storage_request(params, parse_json = true, &block)
110
- @storage_connection = Fog::Connection.new("#{@storage_scheme}://#{@storage_host}:#{@storage_port}")
111
117
  response = @storage_connection.request(params.merge!({
112
118
  :headers => {
113
119
  'Content-Type' => 'application/json',
@@ -20,6 +20,11 @@ module Fog
20
20
 
21
21
  attr_accessor :password, :private_key_path, :public_key_path
22
22
 
23
+ def initialize(attributes={})
24
+ @flavor_id ||= 1
25
+ super
26
+ end
27
+
23
28
  def destroy
24
29
  requires :id
25
30
  connection.delete_server(@id)
@@ -73,10 +73,14 @@ module Fog
73
73
  @path = uri.path
74
74
  @port = uri.port
75
75
  @scheme = uri.scheme
76
+ @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}", options[:persistent])
77
+ end
78
+
79
+ def reload
80
+ @connection.reset
76
81
  end
77
82
 
78
83
  def request(params)
79
- @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}")
80
84
  begin
81
85
  response = @connection.request(params.merge!({
82
86
  :headers => {
@@ -32,11 +32,16 @@ module Fog
32
32
  @required = true
33
33
  end
34
34
 
35
- if Fog.mocking?
35
+ instance = if Fog.mocking?
36
36
  Mock.new(options)
37
37
  else
38
38
  Real.new(options)
39
39
  end
40
+
41
+ if self.respond_to?(:after_new)
42
+ instance = self.after_new(instance, options)
43
+ end
44
+ instance
40
45
  end
41
46
  EOS
42
47
  end
@@ -54,10 +54,14 @@ module Fog
54
54
  @host = options[:host] || "api.slicehost.com"
55
55
  @port = options[:port] || 443
56
56
  @scheme = options[:scheme] || 'https'
57
+ @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}", options[:persistent])
58
+ end
59
+
60
+ def reload
61
+ @connection.reset
57
62
  end
58
63
 
59
64
  def request(params)
60
- @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}")
61
65
  params[:headers] ||= {}
62
66
  params[:headers].merge!({
63
67
  'Authorization' => "Basic #{Base64.encode64(@slicehost_password).delete("\r\n")}"
@@ -42,6 +42,7 @@ module Fog
42
42
  @path = options[:path] || Fog::Terremark::Ecloud::Defaults::PATH
43
43
  @port = options[:port] || Fog::Terremark::Ecloud::Defaults::PORT
44
44
  @scheme = options[:scheme] || Fog::Terremark::Ecloud::Defaults::SCHEME
45
+ @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}", options[:persistent])
45
46
  end
46
47
 
47
48
  end
@@ -51,8 +51,11 @@ module Fog
51
51
  response.headers['Set-Cookie']
52
52
  end
53
53
 
54
+ def reload
55
+ @connection.reset
56
+ end
57
+
54
58
  def request(params)
55
- @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}")
56
59
  unless @cookie
57
60
  @cookie = auth_token
58
61
  end
@@ -42,6 +42,7 @@ module Fog
42
42
  @path = options[:path] || Fog::Terremark::Vcloud::Defaults::PATH
43
43
  @port = options[:port] || Fog::Terremark::Vcloud::Defaults::PORT
44
44
  @scheme = options[:scheme] || Fog::Terremark::Vcloud::Defaults::SCHEME
45
+ @connection = Fog::Connection.new("#{@scheme}://#{@host}:#{@port}", options[:persistent])
45
46
  end
46
47
 
47
48
  def default_vdc_id
@@ -1,3 +1,11 @@
1
+ require 'builder'
2
+ require 'fog/vcloud/model'
3
+ require 'fog/vcloud/collection'
4
+ require 'fog/vcloud/generators'
5
+ require 'fog/vcloud/extension'
6
+ require 'fog/vcloud/terremark/vcloud'
7
+ require 'fog/vcloud/terremark/ecloud'
8
+
1
9
  module URI
2
10
  class Generic
3
11
  def host_url
@@ -8,19 +16,35 @@ end
8
16
 
9
17
  module Fog
10
18
  module Vcloud
19
+ extend Fog::Service
20
+
21
+ requires :username, :password, :versions_uri
22
+
23
+ model_path 'fog/vcloud/models'
24
+ model 'vdc'
25
+ model 'vdcs'
26
+
27
+ request_path 'fog/vcloud/requests'
28
+ request :login
29
+ request :get_versions
30
+ request :get_vdc
31
+ request :get_organization
32
+ request :get_network
33
+
34
+ def self.after_new(instance, options={})
35
+ if mod = options[:module]
36
+ instance.extend eval("#{mod}")
37
+ end
38
+ instance
39
+ end
11
40
 
12
41
  class UnsupportedVersion < Exception ; end
13
42
 
14
- module Options
15
- REQUIRED = [:versions_uri, :username, :password]
16
- OPTIONAL = [:module, :version]
17
- ALL = REQUIRED + OPTIONAL
18
- end
19
-
20
43
  class Real
44
+ extend Fog::Vcloud::Generators
21
45
 
22
46
  attr_accessor :login_uri
23
- attr_reader :supported_versions
47
+ attr_reader :supported_versions, :versions_uri
24
48
 
25
49
  def initialize(options = {})
26
50
  @connections = {}
@@ -30,6 +54,7 @@ module Fog
30
54
  @username = options[:username]
31
55
  @password = options[:password]
32
56
  @login_uri = get_login_uri
57
+ @persistent = options[:persistent]
33
58
  end
34
59
 
35
60
  def default_organization_uri
@@ -37,39 +62,86 @@ module Fog
37
62
  unless @login_results
38
63
  do_login
39
64
  end
40
- org_list = @login_results.body.organizations
41
- if organization = @login_results.body.organizations.first
42
- organization[:href]
65
+ case @login_results.body[:Org]
66
+ when Array
67
+ @login_results.body[:Org].first[:href]
68
+ when Hash
69
+ @login_results.body[:Org][:href]
43
70
  else
44
71
  nil
45
72
  end
46
73
  end
47
74
  end
48
75
 
76
+ def reload
77
+ @connections.each_value { |k,v| v.reset if v }
78
+ end
79
+
80
+ # If the cookie isn't set, do a get_organizations call to set it
81
+ # and try the request.
82
+ # If we get an Unauthorized error, we assume the token expired, re-auth and try again
83
+ def request(params)
84
+ unless @cookie
85
+ do_login
86
+ end
87
+ begin
88
+ do_request(params)
89
+ rescue Excon::Errors::Unauthorized => e
90
+ do_login
91
+ do_request(params)
92
+ end
93
+ end
94
+
95
+
49
96
  private
50
97
 
51
- def supported_version_ids
52
- @supported_versions.map { |version| version.version }
98
+ def ensure_parsed(uri)
99
+ if uri.is_a?(String)
100
+ URI.parse(uri)
101
+ else
102
+ uri
103
+ end
104
+ end
105
+
106
+ def ensure_unparsed(uri)
107
+ if uri.is_a?(String)
108
+ uri
109
+ else
110
+ uri.to_s
111
+ end
112
+ end
113
+
114
+ def supported_version_numbers
115
+ case @supported_versions
116
+ when Array
117
+ @supported_versions.map { |version| version[:Version] }
118
+ when Hash
119
+ @supported_versions[:Version]
120
+ end
53
121
  end
54
122
 
55
123
  def get_login_uri
56
124
  check_versions
57
- URI.parse(@supported_versions.detect {|version| version.version == @version }.login_url)
125
+ URI.parse case @supported_versions
126
+ when Array
127
+ @supported_versions.detect {|version| version[:Version] == @version }[:LoginUrl]
128
+ when Hash
129
+ @supported_versions[:LoginUrl]
130
+ end
58
131
  end
59
132
 
60
133
  # Load up @all_versions and @supported_versions from the provided :versions_uri
61
134
  # If there are no supported versions raise an error
62
135
  # And choose a default version is none is specified
63
136
  def check_versions
64
- @all_versions = get_versions.body
65
- @supported_versions = @all_versions.select { |version| version.supported == true }
137
+ @supported_versions = get_versions(@versions_uri).body[:VersionInfo]
66
138
 
67
139
  if @supported_versions.empty?
68
140
  raise UnsupportedVersion.new("No supported versions found @ #{@version_uri}")
69
141
  end
70
142
 
71
143
  unless @version
72
- @version = supported_version_ids.sort.first
144
+ @version = supported_version_numbers.first
73
145
  end
74
146
  end
75
147
 
@@ -90,39 +162,48 @@ module Fog
90
162
  @cookie = @login_results.headers['Set-Cookie']
91
163
  end
92
164
 
93
- # If the cookie isn't set, do a get_organizations call to set it
94
- # and try the request.
95
- # If we get an Unauthoried error, we assume the token expired, re-auth and try again
96
- def request(params)
97
- unless @cookie
98
- do_login
99
- end
100
- begin
101
- do_request(params)
102
- rescue Excon::Errors::Unauthorized => e
103
- do_login
104
- do_request(params)
105
- end
106
- end
107
-
108
165
  # Actually do the request
109
166
  def do_request(params)
167
+ # Convert the uri to a URI if it's a string.
110
168
  if params[:uri].is_a?(String)
111
169
  params[:uri] = URI.parse(params[:uri])
112
170
  end
113
- @connections[params[:uri].host_url] ||= Fog::Connection.new(params[:uri].host_url)
171
+
172
+ # Hash connections on the host_url ... There's nothing to say we won't get URI's that go to
173
+ # different hosts.
174
+ @connections[params[:uri].host_url] ||= Fog::Connection.new(params[:uri].host_url, @persistent)
175
+
176
+ # Set headers to an empty hash if none are set.
114
177
  headers = params[:headers] || {}
178
+
179
+ # Add our auth cookie to the headers
115
180
  if @cookie
116
181
  headers.merge!('Cookie' => @cookie)
117
182
  end
118
- @connections[params[:uri].host_url].request({
119
- :body => params[:body],
120
- :expects => params[:expects],
183
+
184
+ # Make the request
185
+ response = @connections[params[:uri].host_url].request({
186
+ :body => params[:body] || '',
187
+ :expects => params[:expects] || 200,
121
188
  :headers => headers,
122
- :method => params[:method],
123
- :parser => params[:parser],
189
+ :method => params[:method] || 'GET',
124
190
  :path => params[:uri].path
125
191
  })
192
+
193
+ # Parse the response body into a hash
194
+ #puts response.body
195
+ unless response.body.empty?
196
+ if params[:parse]
197
+ document = Fog::ToHashDocument.new
198
+ parser = Nokogiri::XML::SAX::PushParser.new(document)
199
+ parser << response.body
200
+ parser.finish
201
+
202
+ response.body = document.body
203
+ end
204
+ end
205
+
206
+ response
126
207
  end
127
208
  end
128
209
 
@@ -135,7 +216,7 @@ module Fog
135
216
  @mock_data = nil
136
217
  end
137
218
 
138
- def self.data
219
+ def self.data( base_url = self.base_url )
139
220
  @mock_data ||=
140
221
  {
141
222
  :versions => [
@@ -166,32 +247,35 @@ module Fog
166
247
  :name => "Boom Inc.",
167
248
  },
168
249
  :vdcs => [
250
+
169
251
  { :href => "#{base_url}/vdc/21",
170
- :id => 21,
252
+ :id => "21",
171
253
  :name => "Boomstick",
172
- :storage => { :used => 105, :allocated => 200 },
173
- :cpu => { :allocated => 10000 },
174
- :memory => { :allocated => 20480 },
254
+ :storage => { :used => "105", :allocated => "200" },
255
+ :cpu => { :allocated => "10000" },
256
+ :memory => { :allocated => "20480" },
175
257
  :networks => [
176
- { :href => "#{base_url}/network/31",
258
+ { :id => "31",
259
+ :href => "#{base_url}/network/31",
177
260
  :name => "1.2.3.0/24",
178
261
  :subnet => "1.2.3.0/24",
179
262
  :gateway => "1.2.3.1",
180
263
  :netmask => "255.255.255.0",
181
264
  :dns => "8.8.8.8",
182
265
  :features => [
183
- { :type => :fencemode, :value => "isolated" }
266
+ { :type => :FenceMode, :value => "isolated" }
184
267
  ],
185
268
  :ips => { "1.2.3.3" => "Broom 1", "1.2.3.4" => "Broom 2", "1.2.3.10" => "Email" }
186
269
  },
187
- { :href => "#{base_url}/network/32",
270
+ { :id => "32",
271
+ :href => "#{base_url}/network/32",
188
272
  :name => "4.5.6.0/24",
189
273
  :subnet => "4.5.6.0/24",
190
274
  :gateway => "4.5.6.1",
191
275
  :netmask => "255.255.255.0",
192
276
  :dns => "8.8.8.8",
193
277
  :features => [
194
- { :type => :fencemode, :value => "isolated" }
278
+ { :type => :FenceMode, :value => "isolated" }
195
279
  ],
196
280
  :ips => { }
197
281
  },
@@ -206,43 +290,24 @@ module Fog
206
290
  { :href => "#{base_url}/vap/43",
207
291
  :name => "Email!"
208
292
  }
209
- ],
210
- :public_ips => [
211
- { :id => 51,
212
- :name => "99.1.2.3",
213
- :services => [
214
- { :id => 71, :port => 80, :protocol => 'HTTP', :enabled => true, :timeout => 2, :name => 'Web Site', :description => 'Web Servers' },
215
- { :id => 72, :port => 7000, :protocol => 'HTTP', :enabled => true, :timeout => 2, :name => 'An SSH Map', :description => 'SSH 1' }
216
- ]
217
- },
218
- { :id => 52,
219
- :name => "99.1.2.4",
220
- :services => [
221
- { :id => 73, :port => 80, :protocol => 'HTTP', :enabled => true, :timeout => 2, :name => 'Web Site', :description => 'Web Servers' },
222
- { :id => 74, :port => 7000, :protocol => 'HTTP', :enabled => true, :timeout => 2, :name => 'An SSH Map', :description => 'SSH 2' }
223
- ]
224
- },
225
- { :id => 53,
226
- :name => "99.1.9.7",
227
- :services => []
228
- }
229
293
  ]
230
294
  },
231
295
  { :href => "#{base_url}/vdc/22",
232
- :id => 22,
233
- :storage => { :used => 40, :allocated => 150 },
234
- :cpu => { :allocated => 1000 },
235
- :memory => { :allocated => 2048 },
296
+ :id => "22",
297
+ :storage => { :used => "40", :allocated => "150" },
298
+ :cpu => { :allocated => "1000" },
299
+ :memory => { :allocated => "2048" },
236
300
  :name => "Rock-n-Roll",
237
301
  :networks => [
238
- { :href => "#{base_url}/network/33",
302
+ { :id => "33",
303
+ :href => "#{base_url}/network/33",
239
304
  :name => "7.8.9.0/24",
240
305
  :subnet => "7.8.9.0/24",
241
306
  :gateway => "7.8.9.1",
242
307
  :dns => "8.8.8.8",
243
308
  :netmask => "255.255.255.0",
244
309
  :features => [
245
- { :type => :fencemode, :value => "isolated" }
310
+ { :type => :FenceMode, :value => "isolated" }
246
311
  ],
247
312
  :ips => { "7.8.9.10" => "Master Blaster" }
248
313
  }
@@ -251,12 +316,6 @@ module Fog
251
316
  { :href => "#{base_url}/vap/44",
252
317
  :name => "Master Blaster"
253
318
  }
254
- ],
255
- :public_ips => [
256
- { :id => 54,
257
- :name => "99.99.99.99",
258
- :services => []
259
- }
260
319
  ]
261
320
  }
262
321
  ]
@@ -265,17 +324,17 @@ module Fog
265
324
  }
266
325
  end
267
326
 
268
- def self.vdc_from_uri(uri)
327
+ def vdc_from_uri(uri)
269
328
  match = Regexp.new(%r:.*/vdc/(\d+):).match(uri.to_s)
270
329
  if match
271
- Fog::Vcloud::Mock.data[:organizations].map { |org| org[:vdcs] }.flatten.detect { |vdc| vdc[:id] == match[1].to_i }
330
+ mock_data[:organizations].map { |org| org[:vdcs] }.flatten.detect { |vdc| vdc[:id] == match[1] }
272
331
  end
273
332
  end
274
333
 
275
- def self.ip_from_uri(uri)
334
+ def ip_from_uri(uri)
276
335
  match = Regexp.new(%r:.*/publicIp/(\d+):).match(uri.to_s)
277
336
  if match
278
- Fog::Vcloud::Mock.data[:organizations].map { |org| org[:vdcs] }.flatten.map { |vdc| vdc[:public_ips] }.flatten.compact.detect { |public_ip| public_ip[:id] == match[1].to_i }
337
+ mock_data[:organizations].map { |org| org[:vdcs] }.flatten.map { |vdc| vdc[:public_ips] }.flatten.compact.detect { |public_ip| public_ip[:id] == match[1] }
279
338
  end
280
339
  end
281
340
 
@@ -290,16 +349,16 @@ module Fog
290
349
  "xmlns:xsd" => "http://www.w3.org/2001/XMLSchema" }
291
350
  end
292
351
 
293
- def mock_it(parser, status, mock_data, mock_headers = {})
352
+ def mock_it(status, mock_data, mock_headers = {})
294
353
  response = Excon::Response.new
295
- if parser
296
- body = Nokogiri::XML::SAX::PushParser.new(parser)
297
- body << mock_data
298
- body.finish
299
- response.body = parser.response
300
- else
301
- response.body = mock_data
302
- end
354
+
355
+ #Parse the response body into a hash
356
+ document = Fog::ToHashDocument.new
357
+ parser = Nokogiri::XML::SAX::PushParser.new(document)
358
+ parser << mock_data
359
+ parser.finish
360
+ response.body = document.body
361
+
303
362
  response.status = status
304
363
  response.headers = mock_headers
305
364
  response
@@ -314,55 +373,5 @@ module Fog
314
373
  end
315
374
 
316
375
  end
317
-
318
- class <<self
319
- def new(credentials = {})
320
- unless @required
321
- require 'fog/vcloud/model'
322
- require 'fog/vcloud/collection'
323
- require 'fog/vcloud/parser'
324
- require 'fog/vcloud/models/vdc'
325
- require 'fog/vcloud/models/vdcs'
326
- require 'fog/vcloud/terremark/vcloud'
327
- require 'fog/vcloud/terremark/ecloud'
328
- require 'fog/vcloud/requests/get_network'
329
- require 'fog/vcloud/requests/get_organization'
330
- require 'fog/vcloud/requests/get_vdc'
331
- require 'fog/vcloud/requests/get_versions'
332
- require 'fog/vcloud/requests/login'
333
- require 'fog/vcloud/parsers/get_organization'
334
- require 'fog/vcloud/parsers/get_vdc'
335
- require 'fog/vcloud/parsers/get_versions'
336
- require 'fog/vcloud/parsers/login'
337
- require 'fog/vcloud/parsers/network'
338
-
339
- require 'builder'
340
-
341
- Struct.new("VcloudLink", :rel, :href, :type, :name)
342
- Struct.new("VcloudVdc", :links, :resource_entities, :networks, :cpu_capacity, :storage_capacity, :memory_capacity, :href, :type, :name, :xmlns,
343
- :allocation_model, :network_quota, :nic_quota, :vm_quota, :enabled, :description)
344
- Struct.new("VcloudOrganization", :links, :name, :href, :type, :xmlns, :description)
345
- Struct.new("VcloudVersion", :version, :login_url, :supported)
346
- Struct.new("VcloudOrgList", :organizations, :xmlns)
347
- Struct.new("VcloudXCapacity", :units, :allocated, :used, :limit)
348
- Struct.new("VcloudNetwork", :features, :configuration, :href, :type, :name, :xmlns, :description)
349
- Struct.new("VcloudNetworkConfiguration", :gateway, :netmask, :dns)
350
- Struct.new("VcloudNetworkFenceMode", :mode)
351
- @required = true
352
- end
353
-
354
- instance = if Fog.mocking?
355
- Fog::Vcloud::Mock.new(credentials)
356
- else
357
- Fog::Vcloud::Real.new(credentials)
358
- end
359
-
360
- if mod = credentials[:module]
361
- instance.extend eval("#{mod}")
362
- end
363
-
364
- instance
365
- end
366
- end
367
376
  end
368
377
  end