fog 0.0.31 → 0.0.32

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 (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