fog 0.0.31 → 0.0.32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. data/.document +0 -2
  2. data/Rakefile +12 -7
  3. data/VERSION +1 -1
  4. data/bin/fog +16 -18
  5. data/fog.gemspec +34 -8
  6. data/lib/fog.rb +11 -0
  7. data/lib/fog/aws/models/ec2/address.rb +4 -0
  8. data/lib/fog/aws/models/ec2/instance.rb +17 -0
  9. data/lib/fog/aws/models/ec2/key_pair.rb +4 -0
  10. data/lib/fog/aws/models/ec2/security_group.rb +8 -0
  11. data/lib/fog/aws/models/ec2/snapshot.rb +7 -1
  12. data/lib/fog/aws/models/ec2/volume.rb +9 -1
  13. data/lib/fog/aws/models/s3/bucket.rb +10 -0
  14. data/lib/fog/aws/models/s3/buckets.rb +10 -4
  15. data/lib/fog/aws/models/s3/object.rb +5 -0
  16. data/lib/fog/aws/requests/ec2/allocate_address.rb +1 -1
  17. data/lib/fog/aws/requests/ec2/associate_address.rb +2 -2
  18. data/lib/fog/aws/requests/ec2/attach_volume.rb +2 -2
  19. data/lib/fog/aws/requests/ec2/authorize_security_group_ingress.rb +1 -1
  20. data/lib/fog/aws/requests/ec2/create_key_pair.rb +2 -2
  21. data/lib/fog/aws/requests/ec2/create_security_group.rb +2 -2
  22. data/lib/fog/aws/requests/ec2/create_snapshot.rb +2 -2
  23. data/lib/fog/aws/requests/ec2/create_volume.rb +1 -1
  24. data/lib/fog/aws/requests/ec2/delete_key_pair.rb +1 -1
  25. data/lib/fog/aws/requests/ec2/delete_security_group.rb +2 -2
  26. data/lib/fog/aws/requests/ec2/delete_snapshot.rb +2 -2
  27. data/lib/fog/aws/requests/ec2/delete_volume.rb +2 -2
  28. data/lib/fog/aws/requests/ec2/describe_addresses.rb +2 -2
  29. data/lib/fog/aws/requests/ec2/describe_availability_zones.rb +1 -1
  30. data/lib/fog/aws/requests/ec2/describe_images.rb +1 -1
  31. data/lib/fog/aws/requests/ec2/describe_instances.rb +2 -2
  32. data/lib/fog/aws/requests/ec2/describe_key_pairs.rb +2 -2
  33. data/lib/fog/aws/requests/ec2/describe_regions.rb +1 -1
  34. data/lib/fog/aws/requests/ec2/describe_security_groups.rb +2 -2
  35. data/lib/fog/aws/requests/ec2/describe_snapshots.rb +2 -2
  36. data/lib/fog/aws/requests/ec2/describe_volumes.rb +2 -2
  37. data/lib/fog/aws/requests/ec2/detach_volume.rb +2 -2
  38. data/lib/fog/aws/requests/ec2/disassociate_address.rb +2 -2
  39. data/lib/fog/aws/requests/ec2/get_console_output.rb +2 -2
  40. data/lib/fog/aws/requests/ec2/reboot_instances.rb +2 -2
  41. data/lib/fog/aws/requests/ec2/release_address.rb +2 -2
  42. data/lib/fog/aws/requests/ec2/revoke_security_group_ingress.rb +1 -1
  43. data/lib/fog/aws/requests/ec2/run_instances.rb +1 -1
  44. data/lib/fog/aws/requests/ec2/terminate_instances.rb +2 -2
  45. data/lib/fog/aws/requests/s3/copy_object.rb +2 -2
  46. data/lib/fog/aws/requests/s3/delete_bucket.rb +3 -3
  47. data/lib/fog/aws/requests/s3/delete_object.rb +8 -7
  48. data/lib/fog/aws/requests/s3/get_bucket.rb +2 -2
  49. data/lib/fog/aws/requests/s3/get_bucket_location.rb +2 -2
  50. data/lib/fog/aws/requests/s3/get_object.rb +2 -2
  51. data/lib/fog/aws/requests/s3/get_request_payment.rb +2 -2
  52. data/lib/fog/aws/requests/s3/get_service.rb +1 -1
  53. data/lib/fog/aws/requests/s3/put_bucket.rb +8 -6
  54. data/lib/fog/aws/requests/s3/put_object.rb +9 -9
  55. data/lib/fog/aws/requests/s3/put_request_payment.rb +2 -2
  56. data/lib/fog/aws/requests/simpledb/batch_put_attributes.rb +2 -2
  57. data/lib/fog/aws/requests/simpledb/create_domain.rb +1 -1
  58. data/lib/fog/aws/requests/simpledb/delete_attributes.rb +2 -2
  59. data/lib/fog/aws/requests/simpledb/delete_domain.rb +1 -1
  60. data/lib/fog/aws/requests/simpledb/domain_metadata.rb +2 -2
  61. data/lib/fog/aws/requests/simpledb/get_attributes.rb +2 -2
  62. data/lib/fog/aws/requests/simpledb/list_domains.rb +1 -1
  63. data/lib/fog/aws/s3.rb +1 -12
  64. data/lib/fog/collection.rb +16 -8
  65. data/lib/fog/model.rb +36 -14
  66. data/lib/fog/rackspace/models/servers/image.rb +40 -0
  67. data/lib/fog/rackspace/models/servers/images.rb +50 -0
  68. data/lib/fog/rackspace/models/servers/server.rb +18 -2
  69. data/lib/fog/rackspace/requests/servers/create_image.rb +18 -1
  70. data/lib/fog/rackspace/requests/servers/create_server.rb +5 -5
  71. data/lib/fog/rackspace/requests/servers/delete_image.rb +16 -1
  72. data/lib/fog/rackspace/requests/servers/delete_server.rb +4 -4
  73. data/lib/fog/rackspace/requests/servers/get_server_details.rb +2 -2
  74. data/lib/fog/rackspace/requests/servers/list_addresses.rb +2 -2
  75. data/lib/fog/rackspace/requests/servers/list_images.rb +10 -0
  76. data/lib/fog/rackspace/requests/servers/list_images_detail.rb +16 -1
  77. data/lib/fog/rackspace/requests/servers/list_private_addresses.rb +2 -2
  78. data/lib/fog/rackspace/requests/servers/list_public_addresses.rb +2 -2
  79. data/lib/fog/rackspace/requests/servers/list_servers.rb +1 -1
  80. data/lib/fog/rackspace/requests/servers/list_servers_detail.rb +2 -2
  81. data/lib/fog/rackspace/requests/servers/update_server.rb +2 -2
  82. data/lib/fog/rackspace/servers.rb +8 -2
  83. data/lib/fog/slicehost.rb +66 -0
  84. data/lib/fog/slicehost/parsers/create_slice.rb +29 -0
  85. data/lib/fog/slicehost/parsers/get_backups.rb +30 -0
  86. data/lib/fog/slicehost/parsers/get_flavors.rb +28 -0
  87. data/lib/fog/slicehost/parsers/get_images.rb +28 -0
  88. data/lib/fog/slicehost/parsers/get_slices.rb +33 -0
  89. data/lib/fog/slicehost/requests/create_slice.rb +50 -0
  90. data/lib/fog/slicehost/requests/delete_slice.rb +48 -0
  91. data/lib/fog/slicehost/requests/get_backups.rb +38 -0
  92. data/lib/fog/slicehost/requests/get_flavors.rb +38 -0
  93. data/lib/fog/slicehost/requests/get_images.rb +36 -0
  94. data/lib/fog/slicehost/requests/get_slices.rb +44 -0
  95. data/spec/aws/requests/s3/put_object_spec.rb +8 -0
  96. data/spec/rackspace/requests/servers/create_image_spec.rb +1 -1
  97. data/spec/rackspace/requests/servers/create_server_spec.rb +1 -1
  98. data/spec/rackspace/requests/servers/delete_image_spec.rb +7 -5
  99. data/spec/rackspace/requests/servers/delete_server_spec.rb +1 -1
  100. data/spec/rackspace/requests/servers/get_server_details_spec.rb +1 -1
  101. data/spec/rackspace/requests/servers/list_addresses_spec.rb +1 -1
  102. data/spec/rackspace/requests/servers/list_private_addresses_spec.rb +1 -1
  103. data/spec/rackspace/requests/servers/list_public_addresses_spec.rb +1 -1
  104. data/spec/rackspace/requests/servers/list_servers_detail_spec.rb +1 -1
  105. data/spec/rackspace/requests/servers/list_servers_spec.rb +1 -1
  106. data/spec/rackspace/requests/servers/reboot_server_spec.rb +1 -1
  107. data/spec/rackspace/requests/servers/update_server_spec.rb +1 -1
  108. data/spec/slicehost/requests/create_slice_spec.rb +29 -0
  109. data/spec/slicehost/requests/delete_slice_spec.rb +18 -0
  110. data/spec/slicehost/requests/get_backups_spec.rb +17 -0
  111. data/spec/slicehost/requests/get_flavors_spec.rb +17 -0
  112. data/spec/slicehost/requests/get_images_spec.rb +15 -0
  113. data/spec/slicehost/requests/get_slices_spec.rb +23 -0
  114. data/spec/spec_helper.rb +20 -22
  115. metadata +29 -4
  116. data/lib/fog/aws/models/s3/owner.rb +0 -18
@@ -1,6 +1,10 @@
1
1
  module Fog
2
2
  class Collection < Array
3
3
 
4
+ def self._load(marhsalled)
5
+ new(Marshal.load(marshalled))
6
+ end
7
+
4
8
  def self.attribute(name, other_names = [])
5
9
  class_eval <<-EOS, __FILE__, __LINE__
6
10
  attr_accessor :#{name}
@@ -24,6 +28,10 @@ module Fog
24
28
  @attributes ||= []
25
29
  end
26
30
 
31
+ def _dump
32
+ Marshal.dump(attributes)
33
+ end
34
+
27
35
  def attributes
28
36
  attributes = {}
29
37
  for attribute in self.class.attributes
@@ -32,6 +40,14 @@ module Fog
32
40
  attributes
33
41
  end
34
42
 
43
+ def connection=(new_connection)
44
+ @connection = new_connection
45
+ end
46
+
47
+ def connection
48
+ @connection
49
+ end
50
+
35
51
  def create(attributes = {})
36
52
  object = new(attributes)
37
53
  object.save
@@ -85,14 +101,6 @@ module Fog
85
101
 
86
102
  private
87
103
 
88
- def connection=(new_connection)
89
- @connection = new_connection
90
- end
91
-
92
- def connection
93
- @connection
94
- end
95
-
96
104
  def remap_attributes(attributes, mapping)
97
105
  for key, value in mapping
98
106
  if attributes.key?(key)
data/lib/fog/model.rb CHANGED
@@ -1,6 +1,18 @@
1
1
  module Fog
2
2
  class Model
3
3
 
4
+ def self._load(marshalled)
5
+ new(Marshal.load(marshalled))
6
+ end
7
+
8
+ def self.aliases
9
+ @aliases ||= {}
10
+ end
11
+
12
+ def self.attributes
13
+ @attributes ||= []
14
+ end
15
+
4
16
  def self.attribute(name, other_names = [])
5
17
  class_eval <<-EOS, __FILE__, __LINE__
6
18
  attr_accessor :#{name}
@@ -17,12 +29,8 @@ module Fog
17
29
  self.attribute(name, other_names)
18
30
  end
19
31
 
20
- def self.aliases
21
- @aliases ||= {}
22
- end
23
-
24
- def self.attributes
25
- @attributes ||= []
32
+ def _dump
33
+ Marshal.dump(attributes)
26
34
  end
27
35
 
28
36
  def attributes
@@ -37,6 +45,14 @@ module Fog
37
45
  @collection
38
46
  end
39
47
 
48
+ def connection=(new_connection)
49
+ @connection = new_connection
50
+ end
51
+
52
+ def connection
53
+ @connection
54
+ end
55
+
40
56
  def identity
41
57
  send(self.class.instance_variable_get('@identity'))
42
58
  end
@@ -73,20 +89,26 @@ module Fog
73
89
  merge_attributes(new_attributes)
74
90
  end
75
91
 
92
+ def requires(*args)
93
+ missing = []
94
+ for arg in [:connection] | args
95
+ missing << arg unless send("#{arg}")
96
+ end
97
+ unless missing.empty?
98
+ if missing.length == 1
99
+ raise(ArgumentError, "#{missing.first} is required for this operation")
100
+ else
101
+ raise(ArgumentError, "#{missing[0...-1].join(", ")} and #{missing[-1]} are required for this operation")
102
+ end
103
+ end
104
+ end
105
+
76
106
  private
77
107
 
78
108
  def collection=(new_collection)
79
109
  @collection = new_collection
80
110
  end
81
111
 
82
- def connection=(new_connection)
83
- @connection = new_connection
84
- end
85
-
86
- def connection
87
- @connection
88
- end
89
-
90
112
  def remap_attributes(attributes, mapping)
91
113
  for key, value in mapping
92
114
  if attributes.key?(key)
@@ -0,0 +1,40 @@
1
+ module Fog
2
+ module Rackspace
3
+ class Servers
4
+
5
+ class Image < Fog::Model
6
+
7
+ identity :id
8
+
9
+ attribute :name
10
+ attribute :created
11
+ attribute :updated
12
+ attribute :status
13
+ attribute :server_id, 'serverId'
14
+
15
+ def server=(new_server)
16
+ requires :id
17
+
18
+ @server_id = new_server.id
19
+ end
20
+
21
+ def destroy
22
+ requires :id
23
+
24
+ connection.delete_image(@id)
25
+ true
26
+ end
27
+
28
+ def save
29
+ requires :server_id
30
+
31
+ data = connection.create_server(@server_id)
32
+ merge_attributes(data.body['image'])
33
+ true
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,50 @@
1
+ module Fog
2
+ module Rackspace
3
+ class Servers
4
+
5
+ def addresses(attributes = {})
6
+ Fog::AWS::EC2::Addresses.new({
7
+ :connection => self
8
+ }.merge!(attributes))
9
+ end
10
+
11
+ def images(attributes = {})
12
+ Fog::Rackspace::Servers::Images.new({
13
+ :connection => self
14
+ }.merge!(attributes))
15
+ end
16
+
17
+ class Images < Fog::Collection
18
+
19
+ model Fog::Rackspace::Servers::Image
20
+
21
+ attribute :server
22
+
23
+ def all
24
+ data = connection.list_images_detail.body
25
+ servers = Fog::Rackspace::Servers::Images.new({
26
+ :connection => connection
27
+ })
28
+ for image in data['images']
29
+ servers << Fog::Rackspace::Servers::Image.new({
30
+ :collection => images,
31
+ :connection => connection
32
+ }.merge!(image))
33
+ end
34
+ if server
35
+ images = images.select {|image| image.server_id == server.id}
36
+ end
37
+ images
38
+ end
39
+
40
+ def get(image_id)
41
+ connection.get_image_details(image_id)
42
+ rescue Excon::Errors::NotFound
43
+ nil
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -18,14 +18,30 @@ module Fog
18
18
  attribute :metadata
19
19
 
20
20
  def destroy
21
+ requires :id
22
+
21
23
  connection.delete_server(@id)
22
24
  true
23
25
  end
24
26
 
27
+ def images
28
+ requires :id
29
+
30
+ connection.images(:server => self)
31
+ end
32
+
33
+ def reboot(type = 'SOFT')
34
+ requires :id
35
+
36
+ connection.reboot_server(@id, type)
37
+ true
38
+ end
39
+
25
40
  def save
26
- options = { 'metadata' => @metadata, 'name' => @name, 'personality' => @personality }
41
+ requires :flavor_id, :image_id, :name
42
+ options = { 'metadata' => @metadata, 'personality' => @personality }
27
43
  options = options.reject {|key, value| value.nil?}
28
- data = connection.create_server(@flavor_id, @image_id, options)
44
+ data = connection.create_server(@flavor_id, @image_id, @name, options)
29
45
  merge_attributes(data.body['server'])
30
46
  true
31
47
  end
@@ -43,7 +43,24 @@ else
43
43
  module Rackspace
44
44
  class Servers
45
45
 
46
- def create_image
46
+ def create_image(server_id, options = {})
47
+ response = Excon::Response.new
48
+ response.status = 202
49
+
50
+ now = Time.now
51
+ data = {
52
+ 'created' => now,
53
+ 'id' => 123456,
54
+ 'name' => options['name'] || '',
55
+ 'serverId' => server_id,
56
+ 'status' => 'SAVING',
57
+ 'updated' => now,
58
+ }
59
+
60
+ Fog::Rackspace::Servers.data[:last_modified][:images][data['id']] = now
61
+ Fog::Rackspace::Servers.data[:images][data['id']] = data
62
+ response.body = { 'image' => data.reject {|key, value| !['id', 'name', 'serverId'].include?(key)} }
63
+ response
47
64
  end
48
65
 
49
66
  end
@@ -34,7 +34,7 @@ unless Fog.mocking?
34
34
  # * 'name<~String> - Name of server
35
35
  # * 'progress'<~Integer> - Progress through current status
36
36
  # * 'status'<~String> - Current server status
37
- def create_server(flavor_id, image_id, options = {})
37
+ def create_server(flavor_id, image_id, name, options = {})
38
38
  data = {
39
39
  'server' => {
40
40
  'flavorId' => flavor_id,
@@ -74,8 +74,8 @@ else
74
74
  module Rackspace
75
75
  class Servers
76
76
 
77
- def create_server(flavor_id, image_id, options = {})
78
- response = Fog::Response.new
77
+ def create_server(flavor_id, image_id, name, options = {})
78
+ response = Excon::Response.new
79
79
  response.status = 202
80
80
 
81
81
  data = {
@@ -85,12 +85,12 @@ else
85
85
  'imageId' => image_id,
86
86
  'hostId' => "123456789ABCDEF01234567890ABCDEF",
87
87
  'metadata' => options[:metadata] || {},
88
+ 'name' => name,
88
89
  'progress' => 0,
89
90
  'status' => 'BUILD'
90
91
  }
91
- data['name'] = "slice#{data[:id]}"
92
92
  data['adminPass'] = "#{data['name']}password"
93
- Fog::Rackspace::Servers.data[:last_modified][data['id']] = Time.now
93
+ Fog::Rackspace::Servers.data[:last_modified][:servers][data['id']] = Time.now
94
94
  Fog::Rackspace::Servers.data[:servers][data['id']] = data
95
95
  response.body = { 'server' => data }
96
96
  response
@@ -27,7 +27,22 @@ else
27
27
  module Rackspace
28
28
  class Servers
29
29
 
30
- def delete_image
30
+ def delete_image(image_id)
31
+ response = Excon::Response.new
32
+ if image = list_images_detail.body['images'].detect {|image| image['id'] == image_id}
33
+ if image['status'] == 'SAVING'
34
+ response.status = 409
35
+ raise(Excon::Errors.status_error({:expects => 202}, response))
36
+ else
37
+ Fog::Rackspace::Servers.data[:last_modified][:images].delete(image_id)
38
+ Fog::Rackspace::Servers.data[:images].delete(image_id)
39
+ response.status = 202
40
+ end
41
+ else
42
+ response.status = 400
43
+ raise(Excon::Errors.status_error({:expects => 202}, response))
44
+ end
45
+ response
31
46
  end
32
47
 
33
48
  end
@@ -28,19 +28,19 @@ else
28
28
  class Servers
29
29
 
30
30
  def delete_server(server_id)
31
- response = Fog::Response.new
31
+ response = Excon::Response.new
32
32
  if server = list_servers_detail.body['servers'].detect { |server| server['id'] == server_id }
33
33
  if server['status'] == 'BUILD'
34
34
  response.status = 409
35
- raise(Excon::Errors.status_error(202, 409, response))
35
+ raise(Excon::Errors.status_error({:expects => 202}, response))
36
36
  else
37
- Fog::Rackspace::Servers.data[:last_modified].delete(server_id)
37
+ Fog::Rackspace::Servers.data[:last_modified][:servers].delete(server_id)
38
38
  Fog::Rackspace::Servers.data[:servers].delete(server_id)
39
39
  response.status = 202
40
40
  end
41
41
  else
42
42
  response.status = 404
43
- raise(Excon::Errors.status_error(202, 404, response))
43
+ raise(Excon::Errors.status_error({:expects => 202}, response))
44
44
  end
45
45
  response
46
46
  end
@@ -43,13 +43,13 @@ else
43
43
  class Servers
44
44
 
45
45
  def get_server_details(server_id)
46
- response = Fog::Response.new
46
+ response = Excon::Response.new
47
47
  if server = list_servers_detail.body['servers'].detect { |server| server['id'] == server_id }
48
48
  response.status = [200, 203][rand(1)]
49
49
  response.body = { 'server' => server }
50
50
  else
51
51
  response.status = 404
52
- raise(Excon::Errors.status_error(202, 404, response))
52
+ raise(Excon::Errors.status_error({:expects => 202}, response))
53
53
  end
54
54
  response
55
55
  end
@@ -34,13 +34,13 @@ else
34
34
  class Servers
35
35
 
36
36
  def list_addresses(server_id)
37
- response = Fog::Response.new
37
+ response = Excon::Response.new
38
38
  if server = list_servers_detail.body['servers'].detect { |server| server['id'] == server_id }
39
39
  response.status = [200, 203][rand(1)]
40
40
  response.body = { 'addresses' => server['addresses'] }
41
41
  else
42
42
  response.status = 404
43
- raise(Excon::Errors.status_error(202, 404, response))
43
+ raise(Excon::Errors.status_error({:expects => 202}, response))
44
44
  end
45
45
  response
46
46
  end
@@ -30,6 +30,16 @@ else
30
30
  class Servers
31
31
 
32
32
  def list_images
33
+ response = Excon::Response.new
34
+ data = list_images_detail.body['images']
35
+ images = []
36
+ for image in data
37
+ images << image.reject { |key, value| !['id', 'name'].include?(key) }
38
+ end
39
+ response.status = [200, 203][rand(1)]
40
+ response.body = { 'images' => images }
41
+ response
42
+
33
43
  end
34
44
 
35
45
  end
@@ -32,7 +32,22 @@ else
32
32
  module Rackspace
33
33
  class Servers
34
34
 
35
- def list_images
35
+ def list_images_detail
36
+ response = Excon::Response.new
37
+
38
+ images = Fog::Rackspace::Servers.data[:images].values
39
+ for image in images
40
+ case image['status']
41
+ when 'SAVING'
42
+ if Time.now - Fog::Rackspace::Servers.data[:last_modified][:images][image['id']] > 2
43
+ image['status'] = 'ACTIVE'
44
+ end
45
+ end
46
+ end
47
+
48
+ response.status = [200, 203][rand(1)]
49
+ response.body = { 'images' => images }
50
+ response
36
51
  end
37
52
 
38
53
  end