fog 0.0.14 → 0.0.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/Rakefile +17 -2
  2. data/VERSION +1 -1
  3. data/bin/fog +60 -31
  4. data/fog.gemspec +34 -2
  5. data/lib/fog.rb +1 -0
  6. data/lib/fog/aws/ec2.rb +1 -0
  7. data/lib/fog/aws/models/ec2/addresses.rb +1 -1
  8. data/lib/fog/aws/models/ec2/volume.rb +1 -1
  9. data/lib/fog/aws/models/ec2/volumes.rb +4 -2
  10. data/lib/fog/aws/s3.rb +1 -0
  11. data/lib/fog/collection.rb +1 -1
  12. data/lib/fog/connection.rb +8 -9
  13. data/lib/fog/rackspace.rb +31 -0
  14. data/lib/fog/rackspace/files.rb +62 -0
  15. data/lib/fog/rackspace/models/servers/server.rb +51 -0
  16. data/lib/fog/rackspace/models/servers/servers.rb +52 -0
  17. data/lib/fog/rackspace/requests/files/get_containers.rb +56 -0
  18. data/lib/fog/rackspace/requests/files/head_containers.rb +41 -0
  19. data/lib/fog/rackspace/requests/servers/create_server.rb +84 -0
  20. data/lib/fog/rackspace/requests/servers/delete_server.rb +37 -0
  21. data/lib/fog/rackspace/requests/servers/get_flavors.rb +41 -0
  22. data/lib/fog/rackspace/requests/servers/get_images.rb +42 -0
  23. data/lib/fog/rackspace/requests/servers/get_server_details.rb +49 -0
  24. data/lib/fog/rackspace/requests/servers/get_servers.rb +40 -0
  25. data/lib/fog/rackspace/requests/servers/get_servers_details.rb +49 -0
  26. data/lib/fog/rackspace/servers.rb +49 -0
  27. data/spec/aws/models/ec2/instance_spec.rb +38 -9
  28. data/spec/aws/models/ec2/volume_spec.rb +2 -2
  29. data/spec/rackspace/requests/files/get_containers_spec.rb +11 -0
  30. data/spec/rackspace/requests/files/head_containers_spec.rb +11 -0
  31. data/spec/rackspace/requests/servers/create_server_spec.rb +21 -0
  32. data/spec/rackspace/requests/servers/delete_server_spec.rb +11 -0
  33. data/spec/rackspace/requests/servers/get_flavors_spec.rb +11 -0
  34. data/spec/rackspace/requests/servers/get_images_spec.rb +11 -0
  35. data/spec/rackspace/requests/servers/get_server_details_spec.rb +11 -0
  36. data/spec/rackspace/requests/servers/get_servers_details_spec.rb +11 -0
  37. data/spec/rackspace/requests/servers/get_servers_spec.rb +11 -0
  38. data/spec/spec_helper.rb +23 -9
  39. metadata +34 -2
data/Rakefile CHANGED
@@ -39,12 +39,12 @@ end
39
39
  namespace :specs do
40
40
 
41
41
  task :with_mocking do
42
- Fog.mocking = true
42
+ Fog.mock!
43
43
  Rake::Task[:spec].invoke
44
44
  end
45
45
 
46
46
  task :without_mocking do
47
- Fog.mocking = true
47
+ Fog.mock!
48
48
  Rake::Task[:spec].invoke
49
49
  end
50
50
 
@@ -95,3 +95,18 @@ begin
95
95
  rescue LoadError
96
96
  puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
97
97
  end
98
+
99
+ namespace :fog do
100
+
101
+ desc 'Provide a sample yaml file for credentials'
102
+ task :yml do
103
+ puts('Copy the following sample to ~/.fog and fill in with your credentials as needed:')
104
+ print("\n")
105
+ print(":aws_access_key_id: INTENTIONALLY_LEFT_BLANK\n")
106
+ print(":aws_secret_access_key: INTENTIONALLY_LEFT_BLANK\n")
107
+ print(":rackspace_api_key: INTENTIONALLY_LEFT_BLANK\n")
108
+ print(":rackspace_username: INTENTIONALLY_LEFT_BLANK\n")
109
+ print("\n")
110
+ end
111
+
112
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.14
1
+ 0.0.15
data/bin/fog CHANGED
@@ -3,48 +3,77 @@ require File.join(File.dirname(__FILE__), '..', 'lib', 'fog')
3
3
  require 'irb'
4
4
  require 'yaml'
5
5
 
6
- if ARGV[0] && File.exists?(File.expand_path(ARGV[0]))
7
- @credentials = YAML.load(File.open(File.expand_path(ARGV[0])).read)
8
- elsif File.exists?(File.expand_path('~/.fog'))
9
- @credentials = YAML.load(File.open(File.expand_path('~/.fog')).read)
6
+ def credentials
7
+ @credentials ||= begin
8
+ if ARGV[0] && File.exists?(File.expand_path(ARGV[0]))
9
+ YAML.load(File.open(File.expand_path(ARGV[0])).read)
10
+ elsif File.exists?(File.expand_path('~/.fog'))
11
+ YAML.load(File.open(File.expand_path('~/.fog')).read)
12
+ end
13
+ end
10
14
  end
11
15
 
12
- @ec2 = Fog::AWS::EC2.new(
13
- :aws_access_key_id => @credentials['aws_access_key_id'],
14
- :aws_secret_access_key => @credentials['aws_secret_access_key']
15
- )
16
+ module AWS
17
+ class << self
18
+ if credentials[:aws_access_key_id] && credentials[:aws_secret_access_key]
16
19
 
17
- @s3 = Fog::AWS::S3.new(
18
- :aws_access_key_id => @credentials['aws_access_key_id'],
19
- :aws_secret_access_key => @credentials['aws_secret_access_key']
20
- )
20
+ @@ec2 = Fog::AWS::EC2.new(
21
+ :aws_access_key_id => credentials[:aws_access_key_id],
22
+ :aws_secret_access_key => credentials[:aws_secret_access_key]
23
+ )
21
24
 
22
- def addresses
23
- @ec2.addresses
24
- end
25
+ @@s3 = Fog::AWS::S3.new(
26
+ :aws_access_key_id => credentials[:aws_access_key_id],
27
+ :aws_secret_access_key => credentials[:aws_secret_access_key]
28
+ )
25
29
 
26
- def buckets
27
- @s3.buckets
28
- end
30
+ def addresses
31
+ @@ec2.addresses
32
+ end
29
33
 
30
- def instances
31
- @ec2.instances
32
- end
34
+ def buckets
35
+ @@s3.buckets
36
+ end
33
37
 
34
- def key_pairs
35
- @ec2.key_pairs
36
- end
38
+ def instances
39
+ @@ec2.instances
40
+ end
37
41
 
38
- def security_groups
39
- @ec2.security_groups
40
- end
42
+ def key_pairs
43
+ @@ec2.key_pairs
44
+ end
41
45
 
42
- def snapshots
43
- @ec2.snapshots
46
+ def security_groups
47
+ @@ec2.security_groups
48
+ end
49
+
50
+ def snapshots
51
+ @@ec2.snapshots
52
+ end
53
+
54
+ def volumes
55
+ @@ec2.volumes
56
+ end
57
+
58
+ end
59
+ end
44
60
  end
45
61
 
46
- def volumes
47
- @ec2.volumes
62
+ module Rackspace
63
+ class << self
64
+ if credentials[:rackspace_api_key] && credentials[:rackspace_username]
65
+
66
+ @@servers = Fog::Rackspace::Servers.new(
67
+ :rackspace_api_key => credentials[:rackspace_api_key],
68
+ :rackspace_username => credentials[:rackspace_username]
69
+ )
70
+
71
+ def servers
72
+ @@servers.servers
73
+ end
74
+
75
+ end
76
+ end
48
77
  end
49
78
 
50
79
  ARGV.clear # Avoid passing args to IRB
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{fog}
8
- s.version = "0.0.14"
8
+ s.version = "0.0.15"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["geemus (Wesley Beary)"]
12
- s.date = %q{2009-10-09}
12
+ s.date = %q{2009-10-15}
13
13
  s.default_executable = %q{fog}
14
14
  s.description = %q{brings clouds to you}
15
15
  s.email = %q{me@geemus.com}
@@ -136,6 +136,20 @@ Gem::Specification.new do |s|
136
136
  "lib/fog/errors.rb",
137
137
  "lib/fog/model.rb",
138
138
  "lib/fog/parser.rb",
139
+ "lib/fog/rackspace.rb",
140
+ "lib/fog/rackspace/files.rb",
141
+ "lib/fog/rackspace/models/servers/server.rb",
142
+ "lib/fog/rackspace/models/servers/servers.rb",
143
+ "lib/fog/rackspace/requests/files/get_containers.rb",
144
+ "lib/fog/rackspace/requests/files/head_containers.rb",
145
+ "lib/fog/rackspace/requests/servers/create_server.rb",
146
+ "lib/fog/rackspace/requests/servers/delete_server.rb",
147
+ "lib/fog/rackspace/requests/servers/get_flavors.rb",
148
+ "lib/fog/rackspace/requests/servers/get_images.rb",
149
+ "lib/fog/rackspace/requests/servers/get_server_details.rb",
150
+ "lib/fog/rackspace/requests/servers/get_servers.rb",
151
+ "lib/fog/rackspace/requests/servers/get_servers_details.rb",
152
+ "lib/fog/rackspace/servers.rb",
139
153
  "lib/fog/response.rb",
140
154
  "spec/aws/models/ec2/address_spec.rb",
141
155
  "spec/aws/models/ec2/addresses_spec.rb",
@@ -205,6 +219,15 @@ Gem::Specification.new do |s|
205
219
  "spec/aws/requests/simpledb/put_attributes_spec.rb",
206
220
  "spec/aws/requests/simpledb/select_spec.rb",
207
221
  "spec/lorem.txt",
222
+ "spec/rackspace/requests/files/get_containers_spec.rb",
223
+ "spec/rackspace/requests/files/head_containers_spec.rb",
224
+ "spec/rackspace/requests/servers/create_server_spec.rb",
225
+ "spec/rackspace/requests/servers/delete_server_spec.rb",
226
+ "spec/rackspace/requests/servers/get_flavors_spec.rb",
227
+ "spec/rackspace/requests/servers/get_images_spec.rb",
228
+ "spec/rackspace/requests/servers/get_server_details_spec.rb",
229
+ "spec/rackspace/requests/servers/get_servers_details_spec.rb",
230
+ "spec/rackspace/requests/servers/get_servers_spec.rb",
208
231
  "spec/spec.opts",
209
232
  "spec/spec_helper.rb"
210
233
  ]
@@ -282,6 +305,15 @@ Gem::Specification.new do |s|
282
305
  "spec/aws/requests/simpledb/list_domains_spec.rb",
283
306
  "spec/aws/requests/simpledb/put_attributes_spec.rb",
284
307
  "spec/aws/requests/simpledb/select_spec.rb",
308
+ "spec/rackspace/requests/files/get_containers_spec.rb",
309
+ "spec/rackspace/requests/files/head_containers_spec.rb",
310
+ "spec/rackspace/requests/servers/create_server_spec.rb",
311
+ "spec/rackspace/requests/servers/delete_server_spec.rb",
312
+ "spec/rackspace/requests/servers/get_flavors_spec.rb",
313
+ "spec/rackspace/requests/servers/get_images_spec.rb",
314
+ "spec/rackspace/requests/servers/get_server_details_spec.rb",
315
+ "spec/rackspace/requests/servers/get_servers_details_spec.rb",
316
+ "spec/rackspace/requests/servers/get_servers_spec.rb",
285
317
  "spec/spec_helper.rb"
286
318
  ]
287
319
 
data/lib/fog.rb CHANGED
@@ -17,6 +17,7 @@ module Fog
17
17
 
18
18
  def self.reload
19
19
  load "fog/aws.rb"
20
+ load "fog/rackspace.rb"
20
21
  end
21
22
 
22
23
  end
@@ -172,6 +172,7 @@ module Fog
172
172
  response = @connection.request({
173
173
  :body => body,
174
174
  :expects => 200,
175
+ :error_parser => Fog::Errors::Parser.new,
175
176
  :headers => { 'Content-Type' => 'application/x-www-form-urlencoded' },
176
177
  :host => @host,
177
178
  :method => 'POST',
@@ -24,7 +24,7 @@ module Fog
24
24
  }.merge!(attributes))
25
25
  data['addressesSet'].each do |address|
26
26
  addresses << Fog::AWS::EC2::Address.new({
27
- :addresses => self,
27
+ :addresses => addresses,
28
28
  :connection => connection
29
29
  }.merge!(address))
30
30
  end
@@ -4,7 +4,7 @@ module Fog
4
4
 
5
5
  class Volume < Fog::Model
6
6
 
7
- attribute :attachment_time, 'attachmentTime'
7
+ attribute :attach_time, 'attachTime'
8
8
  attribute :availability_zone, 'availabilityZone'
9
9
  attribute :create_time, 'createTime'
10
10
  attribute :device
@@ -2,8 +2,10 @@ module Fog
2
2
  module AWS
3
3
  class EC2
4
4
 
5
- def volumes
6
- Fog::AWS::EC2::Volumes.new(:connection => self)
5
+ def volumes(attributes = {})
6
+ Fog::AWS::EC2::Volumes.new({
7
+ :connection => self
8
+ }.merge!(attributes))
7
9
  end
8
10
 
9
11
  class Volumes < Fog::Collection
@@ -105,6 +105,7 @@ module Fog
105
105
  response = @connection.request({
106
106
  :block => params[:block],
107
107
  :body => params[:body],
108
+ :error_parser => Fog::Errors::Parser.new,
108
109
  :expects => params[:expects],
109
110
  :headers => params[:headers],
110
111
  :host => params[:host],
@@ -32,7 +32,7 @@ module Fog
32
32
  for member in self
33
33
  data << "#{member.inspect},"
34
34
  end
35
- data.chop!
35
+ data.chop! unless self.empty?
36
36
  data << "]>"
37
37
  end
38
38
 
@@ -36,7 +36,7 @@ unless Fog.mocking?
36
36
 
37
37
  def request(params)
38
38
  params[:path] ||= ''
39
- unless params[:path][0] == '/'
39
+ unless params[:path][0..0] == '/'
40
40
  params[:path] = '/' + params[:path].to_s
41
41
  end
42
42
  if params[:query] && !params[:query].empty?
@@ -56,19 +56,18 @@ unless Fog.mocking?
56
56
 
57
57
  if params[:body]
58
58
  if params[:body].is_a?(String)
59
- body = StringIO.new(params[:body])
59
+ connection.write(params[:body])
60
60
  else
61
- body = params[:body]
62
- end
63
- while chunk = body.read(CHUNK_SIZE)
64
- connection.write(chunk)
61
+ while chunk = params[:body].read(CHUNK_SIZE)
62
+ connection.write(chunk)
63
+ end
65
64
  end
66
65
  end
67
66
 
68
67
  response = Fog::Response.new
69
68
  response.request = params
70
69
  response.status = connection.readline[9..11].to_i
71
- if params[:expects] && params[:expects] != response.status
70
+ if params[:expects] && ![*params[:expects]].include?(response.status)
72
71
  error = true
73
72
  end
74
73
  while true
@@ -81,9 +80,9 @@ unless Fog.mocking?
81
80
  end
82
81
 
83
82
  unless params[:method] == 'HEAD'
84
- if error || params[:parser]
83
+ if (error && params[:error_parser]) || params[:parser]
85
84
  if error
86
- parser = Fog::Errors::Parser.new
85
+ parser = params[:error_parser]
87
86
  elsif params[:parser]
88
87
  parser = params[:parser]
89
88
  end
@@ -0,0 +1,31 @@
1
+ require 'rubygems'
2
+ require 'json'
3
+
4
+ module Fog
5
+ module Rackspace
6
+
7
+ def self.reload
8
+ load 'fog/rackspace/files.rb'
9
+ load 'fog/rackspace/servers.rb'
10
+ end
11
+
12
+ def self.authenticate(options)
13
+ connection = Fog::Connection.new("https://auth.api.rackspacecloud.com")
14
+ response = connection.request({
15
+ :expects => 204,
16
+ :headers => {
17
+ 'X-Auth-Key' => options[:rackspace_api_key],
18
+ 'X-Auth-User' => options[:rackspace_username]
19
+ },
20
+ :host => 'auth.api.rackspacecloud.com',
21
+ :method => 'GET',
22
+ :path => 'v1.0'
23
+ })
24
+ response.headers.reject do |key, value|
25
+ !['X-Server-Management-Url', 'X-Storage-Url', 'X-CDN-Management-Url', 'X-Auth-Token'].include?(key)
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ Fog::Rackspace.reload
@@ -0,0 +1,62 @@
1
+ module Fog
2
+ module Rackspace
3
+ class Files
4
+
5
+ def self.reload
6
+ load "fog/rackspace/requests/files/get_containers.rb"
7
+ end
8
+
9
+ def initialize(options={})
10
+ credentials = Fog::Rackspace.authenticate(options)
11
+ @auth_token = credentials['X-Auth-Token']
12
+ cdn_uri = URI.parse(credentials['X-CDN-Management-Url'])
13
+ @cdn_host = cdn_uri.host
14
+ @cdn_path = cdn_uri.path
15
+ @cdn_port = cdn_uri.port
16
+ @cdn_scheme = cdn_uri.scheme
17
+ storage_uri = URI.parse(credentials['X-Storage-Url'])
18
+ @storage_host = storage_uri.host
19
+ @storage_path = storage_uri.path
20
+ @storage_port = storage_uri.port
21
+ @storage_scheme = storage_uri.scheme
22
+ @connection = Fog::Connection.new("#{@storage_scheme}://#{@storage_host}:#{@storage_port}")
23
+ end
24
+
25
+ def cdn_request(params)
26
+ response = @connection.request({
27
+ :body => params[:body],
28
+ :expects => params[:expects],
29
+ :headers => {
30
+ 'X-Auth-Token' => @auth_token
31
+ },
32
+ :host => @cdn_host,
33
+ :method => params[:method],
34
+ :path => "#{@cdn_path}/#{params[:path]}"
35
+ })
36
+ unless response.status == 204
37
+ response.body = JSON.parse(response.body)
38
+ end
39
+ response
40
+ end
41
+
42
+ def storage_request(params)
43
+ response = @connection.request({
44
+ :body => params[:body],
45
+ :expects => params[:expects],
46
+ :headers => {
47
+ 'X-Auth-Token' => @auth_token
48
+ },
49
+ :host => @storage_host,
50
+ :method => params[:method],
51
+ :path => "#{@storage_path}/#{params[:path]}"
52
+ })
53
+ unless response.status == 204
54
+ response.body = JSON.parse(response.body)
55
+ end
56
+ response
57
+ end
58
+
59
+ end
60
+ end
61
+ end
62
+ Fog::Rackspace::Files.reload
@@ -0,0 +1,51 @@
1
+ module Fog
2
+ module Rackspace
3
+ class Server
4
+
5
+ class Server < Fog::Model
6
+
7
+ attribute :admin_pass, 'adminPass'
8
+ attribute :id
9
+ attribute :name
10
+ attribute :image_id, 'imageId'
11
+ attribute :flavor_id, 'flavorId'
12
+ attribute :host_id, 'hostId'
13
+ attribute :status
14
+ attribute :personality
15
+ attribute :progress
16
+ attribute :addresses
17
+ attribute :metadata
18
+
19
+ def destroy
20
+ connection.delete_server(@id)
21
+ true
22
+ end
23
+
24
+ def reload
25
+ new_attributes = servers.get(@id).attributes
26
+ merge_attributes(new_attributes)
27
+ end
28
+
29
+ def save
30
+ options = { :metadata => @metadata, :name => @name, :personality => @personality }
31
+ options = options.reject {|key, value| value.nil?}
32
+ data = connection.create_server(@flavor_id, @image_id, options)
33
+ merge_attributes(data.body['server'])
34
+ true
35
+ end
36
+
37
+ def servers
38
+ @servers
39
+ end
40
+
41
+ private
42
+
43
+ def servers=(new_servers)
44
+ @servers = new_servers
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+ end
51
+ end