fog 1.32.0 → 1.33.0

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 (204) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +59 -0
  3. data/Gemfile +1 -0
  4. data/Rakefile +4 -4
  5. data/fog.gemspec +3 -2
  6. data/lib/fog/linode/requests/compute/avail_datacenters.rb +8 -7
  7. data/lib/fog/openstack.rb +1 -0
  8. data/lib/fog/openstack/compute.rb +7 -1
  9. data/lib/fog/openstack/core.rb +28 -54
  10. data/lib/fog/openstack/identity.rb +1 -0
  11. data/lib/fog/openstack/identity_v3.rb +10 -9
  12. data/lib/fog/openstack/models/baremetal/chassis.rb +3 -14
  13. data/lib/fog/openstack/models/baremetal/chassis_collection.rb +5 -5
  14. data/lib/fog/openstack/models/baremetal/driver.rb +2 -8
  15. data/lib/fog/openstack/models/baremetal/drivers.rb +3 -5
  16. data/lib/fog/openstack/models/baremetal/node.rb +3 -14
  17. data/lib/fog/openstack/models/baremetal/nodes.rb +4 -4
  18. data/lib/fog/openstack/models/baremetal/port.rb +3 -14
  19. data/lib/fog/openstack/models/baremetal/ports.rb +4 -4
  20. data/lib/fog/openstack/models/collection.rb +45 -0
  21. data/lib/fog/openstack/models/compute/address.rb +2 -2
  22. data/lib/fog/openstack/models/compute/addresses.rb +3 -5
  23. data/lib/fog/openstack/models/compute/aggregate.rb +2 -8
  24. data/lib/fog/openstack/models/compute/aggregates.rb +3 -5
  25. data/lib/fog/openstack/models/compute/availability_zone.rb +14 -0
  26. data/lib/fog/openstack/models/compute/availability_zones.rb +22 -0
  27. data/lib/fog/openstack/models/compute/flavor.rb +2 -8
  28. data/lib/fog/openstack/models/compute/flavors.rb +6 -6
  29. data/lib/fog/openstack/models/compute/host.rb +1 -1
  30. data/lib/fog/openstack/models/compute/hosts.rb +4 -6
  31. data/lib/fog/openstack/models/compute/image.rb +2 -8
  32. data/lib/fog/openstack/models/compute/images.rb +4 -6
  33. data/lib/fog/openstack/models/compute/key_pair.rb +2 -2
  34. data/lib/fog/openstack/models/compute/key_pairs.rb +3 -4
  35. data/lib/fog/openstack/models/compute/metadata.rb +3 -2
  36. data/lib/fog/openstack/models/compute/metadatum.rb +2 -2
  37. data/lib/fog/openstack/models/compute/network.rb +2 -2
  38. data/lib/fog/openstack/models/compute/networks.rb +3 -2
  39. data/lib/fog/openstack/models/compute/security_group.rb +2 -2
  40. data/lib/fog/openstack/models/compute/security_group_rule.rb +2 -2
  41. data/lib/fog/openstack/models/compute/security_group_rules.rb +2 -2
  42. data/lib/fog/openstack/models/compute/security_groups.rb +3 -5
  43. data/lib/fog/openstack/models/compute/server.rb +20 -1
  44. data/lib/fog/openstack/models/compute/servers.rb +9 -5
  45. data/lib/fog/openstack/models/compute/service.rb +2 -8
  46. data/lib/fog/openstack/models/compute/services.rb +4 -4
  47. data/lib/fog/openstack/models/compute/snapshot.rb +2 -8
  48. data/lib/fog/openstack/models/compute/snapshots.rb +5 -5
  49. data/lib/fog/openstack/models/compute/tenant.rb +2 -2
  50. data/lib/fog/openstack/models/compute/tenants.rb +3 -4
  51. data/lib/fog/openstack/models/compute/volume.rb +2 -8
  52. data/lib/fog/openstack/models/compute/volumes.rb +5 -5
  53. data/lib/fog/openstack/models/identity_v2/ec2_credential.rb +3 -9
  54. data/lib/fog/openstack/models/identity_v2/ec2_credentials.rb +3 -5
  55. data/lib/fog/openstack/models/identity_v2/role.rb +3 -3
  56. data/lib/fog/openstack/models/identity_v2/roles.rb +3 -5
  57. data/lib/fog/openstack/models/identity_v2/tenant.rb +5 -9
  58. data/lib/fog/openstack/models/identity_v2/tenants.rb +3 -5
  59. data/lib/fog/openstack/models/identity_v2/user.rb +2 -8
  60. data/lib/fog/openstack/models/identity_v2/users.rb +3 -5
  61. data/lib/fog/openstack/models/identity_v3/domain.rb +5 -9
  62. data/lib/fog/openstack/models/identity_v3/domains.rb +3 -5
  63. data/lib/fog/openstack/models/identity_v3/endpoint.rb +5 -9
  64. data/lib/fog/openstack/models/identity_v3/endpoints.rb +3 -5
  65. data/lib/fog/openstack/models/identity_v3/group.rb +5 -9
  66. data/lib/fog/openstack/models/identity_v3/groups.rb +3 -5
  67. data/lib/fog/openstack/models/identity_v3/os_credential.rb +3 -3
  68. data/lib/fog/openstack/models/identity_v3/os_credentials.rb +3 -5
  69. data/lib/fog/openstack/models/identity_v3/policies.rb +3 -5
  70. data/lib/fog/openstack/models/identity_v3/policy.rb +5 -9
  71. data/lib/fog/openstack/models/identity_v3/project.rb +5 -8
  72. data/lib/fog/openstack/models/identity_v3/projects.rb +21 -10
  73. data/lib/fog/openstack/models/identity_v3/role.rb +3 -8
  74. data/lib/fog/openstack/models/identity_v3/role_assignment.rb +3 -3
  75. data/lib/fog/openstack/models/identity_v3/role_assignments.rb +3 -5
  76. data/lib/fog/openstack/models/identity_v3/roles.rb +3 -5
  77. data/lib/fog/openstack/models/identity_v3/service.rb +3 -3
  78. data/lib/fog/openstack/models/identity_v3/services.rb +3 -5
  79. data/lib/fog/openstack/models/identity_v3/token.rb +3 -3
  80. data/lib/fog/openstack/models/identity_v3/tokens.rb +3 -3
  81. data/lib/fog/openstack/models/identity_v3/user.rb +3 -9
  82. data/lib/fog/openstack/models/identity_v3/users.rb +3 -5
  83. data/lib/fog/openstack/models/image/image.rb +2 -13
  84. data/lib/fog/openstack/models/image/images.rb +5 -5
  85. data/lib/fog/openstack/models/metering/resource.rb +2 -7
  86. data/lib/fog/openstack/models/metering/resources.rb +3 -3
  87. data/lib/fog/openstack/models/model.rb +44 -0
  88. data/lib/fog/openstack/models/network/floating_ip.rb +2 -7
  89. data/lib/fog/openstack/models/network/floating_ips.rb +3 -5
  90. data/lib/fog/openstack/models/network/lb_health_monitor.rb +2 -12
  91. data/lib/fog/openstack/models/network/lb_health_monitors.rb +3 -5
  92. data/lib/fog/openstack/models/network/lb_member.rb +2 -12
  93. data/lib/fog/openstack/models/network/lb_members.rb +3 -5
  94. data/lib/fog/openstack/models/network/lb_pool.rb +2 -12
  95. data/lib/fog/openstack/models/network/lb_pools.rb +3 -5
  96. data/lib/fog/openstack/models/network/lb_vip.rb +2 -12
  97. data/lib/fog/openstack/models/network/lb_vips.rb +3 -5
  98. data/lib/fog/openstack/models/network/network.rb +2 -12
  99. data/lib/fog/openstack/models/network/networks.rb +3 -5
  100. data/lib/fog/openstack/models/network/port.rb +2 -13
  101. data/lib/fog/openstack/models/network/ports.rb +3 -5
  102. data/lib/fog/openstack/models/network/router.rb +2 -13
  103. data/lib/fog/openstack/models/network/routers.rb +3 -5
  104. data/lib/fog/openstack/models/network/security_group.rb +2 -2
  105. data/lib/fog/openstack/models/network/security_group_rule.rb +2 -2
  106. data/lib/fog/openstack/models/network/security_group_rules.rb +3 -5
  107. data/lib/fog/openstack/models/network/security_groups.rb +3 -5
  108. data/lib/fog/openstack/models/network/subnet.rb +3 -14
  109. data/lib/fog/openstack/models/network/subnets.rb +3 -5
  110. data/lib/fog/openstack/models/orchestration/event.rb +2 -2
  111. data/lib/fog/openstack/models/orchestration/events.rb +5 -7
  112. data/lib/fog/openstack/models/orchestration/resource.rb +2 -2
  113. data/lib/fog/openstack/models/orchestration/resource_schemas.rb +2 -2
  114. data/lib/fog/openstack/models/orchestration/resources.rb +3 -5
  115. data/lib/fog/openstack/models/orchestration/stack.rb +3 -7
  116. data/lib/fog/openstack/models/orchestration/stacks.rb +5 -5
  117. data/lib/fog/openstack/models/orchestration/template.rb +2 -2
  118. data/lib/fog/openstack/models/orchestration/templates.rb +1 -1
  119. data/lib/fog/openstack/models/planning/plan.rb +2 -13
  120. data/lib/fog/openstack/models/planning/plans.rb +3 -5
  121. data/lib/fog/openstack/models/planning/role.rb +2 -8
  122. data/lib/fog/openstack/models/planning/roles.rb +3 -6
  123. data/lib/fog/openstack/models/storage/directories.rb +4 -6
  124. data/lib/fog/openstack/models/storage/directory.rb +2 -2
  125. data/lib/fog/openstack/models/storage/file.rb +15 -2
  126. data/lib/fog/openstack/models/storage/files.rb +7 -8
  127. data/lib/fog/openstack/models/volume/availability_zone.rb +13 -0
  128. data/lib/fog/openstack/models/volume/availability_zones.rb +17 -0
  129. data/lib/fog/openstack/models/volume/transfer.rb +36 -0
  130. data/lib/fog/openstack/models/volume/transfers.rb +38 -0
  131. data/lib/fog/openstack/models/volume/volume.rb +9 -8
  132. data/lib/fog/openstack/models/volume/volume_type.rb +2 -8
  133. data/lib/fog/openstack/models/volume/volume_types.rb +3 -6
  134. data/lib/fog/openstack/models/volume/volumes.rb +5 -6
  135. data/lib/fog/openstack/requests/compute/list_servers.rb +8 -5
  136. data/lib/fog/openstack/requests/compute/list_servers_detail.rb +9 -6
  137. data/lib/fog/openstack/requests/compute/list_zones.rb +6 -5
  138. data/lib/fog/openstack/requests/compute/list_zones_detailed.rb +55 -0
  139. data/lib/fog/openstack/requests/compute/shelve_offload_server.rb +24 -0
  140. data/lib/fog/openstack/requests/compute/shelve_server.rb +24 -0
  141. data/lib/fog/openstack/requests/compute/unshelve_server.rb +24 -0
  142. data/lib/fog/openstack/requests/identity_v3/get_project.rb +2 -2
  143. data/lib/fog/openstack/requests/network/create_subnet.rb +1 -1
  144. data/lib/fog/openstack/requests/network/update_subnet.rb +8 -7
  145. data/lib/fog/openstack/requests/volume/accept_transfer.rb +24 -0
  146. data/lib/fog/openstack/requests/volume/create_transfer.rb +27 -0
  147. data/lib/fog/openstack/requests/volume/delete_transfer.rb +17 -0
  148. data/lib/fog/openstack/requests/volume/extend_volume.rb +25 -0
  149. data/lib/fog/openstack/requests/volume/get_transfer_details.rb +17 -0
  150. data/lib/fog/openstack/requests/volume/list_transfers.rb +18 -0
  151. data/lib/fog/openstack/requests/volume/list_transfers_detailed.rb +18 -0
  152. data/lib/fog/openstack/requests/volume/list_zones.rb +32 -0
  153. data/lib/fog/openstack/storage.rb +3 -1
  154. data/lib/fog/openstack/volume.rb +16 -0
  155. data/lib/fog/rackspace/examples/compute_v2/create_network.rb +1 -1
  156. data/lib/fog/vcloud_director/generators/compute/edge_gateway_service_configuration.rb +31 -30
  157. data/lib/fog/vcloud_director/models/compute/task.rb +2 -2
  158. data/lib/fog/version.rb +1 -1
  159. data/lib/fog/vsphere/compute.rb +1 -0
  160. data/lib/fog/vsphere/requests/compute/get_resource_pool.rb +1 -1
  161. data/lib/fog/vsphere/requests/compute/get_virtual_machine.rb +4 -3
  162. data/lib/fog/vsphere/requests/compute/list_clusters.rb +1 -1
  163. data/lib/fog/vsphere/requests/compute/list_vm_interfaces.rb +2 -2
  164. data/lib/fog/vsphere/requests/compute/vm_clone.rb +101 -30
  165. data/lib/fog/vsphere/requests/compute/vm_execute.rb +47 -0
  166. data/lib/tasks/changelog_task.rb +1 -0
  167. data/spec/fog/openstack/identity_v3/{idv3.yml → common_setup.yml} +0 -0
  168. data/spec/fog/openstack/identity_v3/idv3_project_hier_crud_list.yml +1394 -0
  169. data/spec/fog/openstack/identity_v3_spec.rb +255 -196
  170. data/spec/fog/openstack/network/common_setup.yml +131 -0
  171. data/spec/fog/openstack/network/subnets_crud.yml +140 -0
  172. data/spec/fog/openstack/network_spec.rb +43 -0
  173. data/spec/fog/openstack/shared_context.rb +98 -0
  174. data/spec/fog/openstack/volume/{volume_common_setup.yml → common_setup.yml} +0 -0
  175. data/spec/fog/openstack/volume/volume_extend.yml +762 -0
  176. data/spec/fog/openstack/volume/volume_transfer_and_accept.yml +1078 -0
  177. data/spec/fog/openstack/volume/volume_transfer_and_delete.yml +695 -0
  178. data/spec/fog/openstack/volume_spec.rb +232 -67
  179. data/tests/openstack/models/storage/file_tests.rb +26 -0
  180. data/tests/openstack/requests/compute/availability_zone_tests.rb +18 -0
  181. data/tests/openstack/requests/compute/server_tests.rb +12 -0
  182. data/tests/openstack/requests/network/subnet_tests.rb +2 -2
  183. data/tests/openstack/requests/volume/availability_zone_tests.rb +13 -0
  184. data/tests/vcloud_director/requests/compute/edge_gateway_tests.rb +2 -2
  185. metadata +61 -26
  186. data/lib/fog/dynect.rb +0 -1
  187. data/lib/fog/dynect/core.rb +0 -26
  188. data/lib/fog/dynect/dns.rb +0 -157
  189. data/lib/fog/dynect/models/dns/record.rb +0 -67
  190. data/lib/fog/dynect/models/dns/records.rb +0 -48
  191. data/lib/fog/dynect/models/dns/zone.rb +0 -56
  192. data/lib/fog/dynect/models/dns/zones.rb +0 -25
  193. data/lib/fog/dynect/requests/dns/delete_record.rb +0 -55
  194. data/lib/fog/dynect/requests/dns/delete_zone.rb +0 -41
  195. data/lib/fog/dynect/requests/dns/get_all_records.rb +0 -56
  196. data/lib/fog/dynect/requests/dns/get_node_list.rb +0 -55
  197. data/lib/fog/dynect/requests/dns/get_record.rb +0 -83
  198. data/lib/fog/dynect/requests/dns/get_zone.rb +0 -57
  199. data/lib/fog/dynect/requests/dns/post_record.rb +0 -71
  200. data/lib/fog/dynect/requests/dns/post_session.rb +0 -43
  201. data/lib/fog/dynect/requests/dns/post_zone.rb +0 -70
  202. data/lib/fog/dynect/requests/dns/put_record.rb +0 -76
  203. data/lib/fog/dynect/requests/dns/put_zone.rb +0 -76
  204. data/tests/dynect/requests/dns/dns_tests.rb +0 -258
@@ -2,61 +2,69 @@ require 'fog/openstack/compute'
2
2
  require 'fog/openstack/identity'
3
3
  require 'fog/openstack/identity_v3'
4
4
  require 'fog/openstack/volume'
5
- require 'rspec/core'
6
- require 'rspec/expectations'
7
- require 'vcr'
5
+
6
+ if RUBY_VERSION =~ /1.8/
7
+ require File.expand_path('../shared_context', __FILE__)
8
+ else
9
+ require_relative './shared_context'
10
+ end
8
11
 
9
12
  RSpec.describe Fog::Volume::OpenStack do
10
13
 
14
+ include_context 'OpenStack specs with VCR'
11
15
  before :all do
12
- # FIXME code duplication with "before :all" of identity_v3_spec.rb
13
- @os_auth_url = ENV['OS_AUTH_URL']
14
-
15
- if @os_auth_url
16
- # if OS_AUTH_URL is set but FOG_MOCK is not, don't record anything and just pass through the requests
17
- VCR.configure do |c|
18
- c.ignore_request do |request|
19
- ENV['FOG_MOCK']!='true' && !ENV['OS_AUTH_URL'].nil?
20
- end
21
- end
22
- else
23
- # Fail-safe URL which matches the VCR recordings
24
- @os_auth_url = 'http://devstack.openstack.stack:5000/v2.0'
25
- # when using the cassettes, there is no need to sleep in wait_for()
26
- Fog.interval = 0
27
- end
16
+ setup_vcr_and_service(
17
+ :vcr_directory => 'spec/fog/openstack/volume',
18
+ :service_class => Fog::Volume::OpenStack
19
+ )
20
+ end
21
+
22
+ def setup_test_object(options)
23
+ type = options.delete(:type)
24
+ case type
25
+ when :volume
26
+ puts "Checking for leftovers..." if ENV['DEBUG_VERBOSE']
27
+ volume_name = options[:display_name]
28
+ # if this fails, cleanup this object (it was left over from a failed test run)
29
+ expect(@service.volumes.all(:display_name => volume_name).length).to be(0)
30
+
31
+ puts "Creating volume #{volume_name}..." if ENV['DEBUG_VERBOSE']
32
+ return @service.volumes.create(options)
28
33
 
29
- VCR.configure do |config|
30
- config.allow_http_connections_when_no_cassette = true
31
- config.hook_into :webmock
34
+ when :transfer
35
+ puts "Checking for leftovers..." if ENV['DEBUG_VERBOSE']
36
+ transfer_name = options[:name]
37
+ # if this fails, cleanup this object (it was left over from a failed test run)
38
+ expect(@service.transfers.all(:name => transfer_name).length).to be(0)
39
+
40
+ puts "Creating transfer #{transfer_name}..." if ENV['DEBUG_VERBOSE']
41
+ return @service.transfers.create(options)
32
42
 
33
- if ENV['DEBUG']
34
- config.ignore_request do |request|
35
- false && !ENV['OS_AUTH_URL'].nil?
36
- end
37
- config.cassette_library_dir = "spec/debug"
38
- config.default_cassette_options.merge! :record => :all
39
43
  else
40
- config.cassette_library_dir = "spec/fog/openstack/volume"
41
- config.default_cassette_options = {:record => :none}
42
- config.default_cassette_options.merge! :match_requests_on => [:method, :uri, :body] unless RUBY_VERSION =~ /1.8/ # Ruby 1.8.7 encodes JSON differently, which screws up request matching
43
- end
44
+ raise ArgumentError, "don't know how to setup a test object of type #{type.inspect}"
44
45
  end
46
+ end
45
47
 
46
- # Allow us to ignore dev certificates on servers
47
- Excon.defaults[:ssl_verify_peer] = false if ENV['SSL_VERIFY_PEER'] == 'false'
48
+ def cleanup_test_object(collection, id)
49
+ # has the object already been deleted?
50
+ begin
51
+ object = collection.get(id)
52
+ rescue Fog::Compute::OpenStack::NotFound # "Compute", not "Volume"; see issue #3618
53
+ true
54
+ end
48
55
 
49
- VCR.use_cassette('volume_common_setup') do
50
- @service = Fog::Volume::OpenStack.new(
51
- :openstack_auth_url => "#{@os_auth_url}/tokens",
52
- :openstack_region => ENV['OS_REGION_NAME'] || 'RegionOne',
53
- :openstack_api_key => ENV['OS_PASSWORD'] || 'devstack',
54
- :openstack_username => ENV['OS_USERNAME'] || 'admin',
55
- :openstack_tenant => ENV['OS_PROJECT_NAME'] || 'admin'
56
- # FIXME: Identity V3 not properly supported by this call yet
57
- # :openstack_user_domain => ENV['OS_USER_DOMAIN_NAME'] || 'Default',
58
- # :openstack_project_domain => ENV['OS_PROJECT_DOMAIN_NAME'] || 'Default',
59
- ) unless @service
56
+ puts "Deleting object #{object.class} #{id}..." if ENV['DEBUG_VERBOSE']
57
+ object.destroy
58
+
59
+ # wait for the object to be deleted
60
+ Fog.wait_for do
61
+ begin
62
+ object = collection.get(id)
63
+ puts "Current status: #{object ? object.status : 'deleted'}" if ENV['DEBUG_VERBOSE']
64
+ false
65
+ rescue Fog::Compute::OpenStack::NotFound # "Compute", not "Volume"; see issue #3618
66
+ true
67
+ end
60
68
  end
61
69
  end
62
70
 
@@ -67,18 +75,13 @@ RSpec.describe Fog::Volume::OpenStack do
67
75
  volume_description = 'This is the volume description.'
68
76
  volume_size = 1 # in GB
69
77
 
70
- # if any of these expectations fail, that means you have left-over
71
- # objects from your previous failed test run
72
- puts "Checking for leftovers..." if ENV['DEBUG_VERBOSE']
73
- expect(@service.volumes.all(:display_name => volume_name).length).to be 0
74
-
75
78
  # create volume
76
- puts "Creating volume..." if ENV['DEBUG_VERBOSE']
77
- volume_id = @service.volumes.create(
79
+ volume_id = setup_test_object(:type => :volume,
78
80
  :display_name => volume_name,
79
81
  :display_description => volume_description,
80
82
  :size => volume_size
81
83
  ).id
84
+
82
85
  expect(@service.volumes.all(:display_name => volume_name).length).to be 1
83
86
 
84
87
  # check retrieval of volume by ID
@@ -99,8 +102,9 @@ RSpec.describe Fog::Volume::OpenStack do
99
102
  puts "Retrieving volume by name..." if ENV['DEBUG_VERBOSE']
100
103
 
101
104
  volumes = @service.volumes.all(:display_name => volume_name)
102
- expect(volumes).to contain_exactly(an_instance_of(Fog::Volume::OpenStack::Volume))
105
+ expect(volumes.length).to be 1
103
106
  volume = volumes[0]
107
+ expect(volume).to be_a(Fog::Volume::OpenStack::Volume)
104
108
 
105
109
  expect(volume.id).to eq(volume_id)
106
110
  expect(volume.display_name).to eq(volume_name)
@@ -108,20 +112,7 @@ RSpec.describe Fog::Volume::OpenStack do
108
112
  expect(volume.size).to eq(volume_size)
109
113
 
110
114
  # delete volume
111
- puts "Deleting volume..." if ENV['DEBUG_VERBOSE']
112
-
113
- @service.delete_volume(volume_id)
114
-
115
- Fog.wait_for do # wait for the volume to be deleted
116
- begin
117
- volume = @service.volumes.get(volume_id)
118
- puts "Current volume status: #{volume ? volume.status : 'deleted'}" if ENV['DEBUG_VERBOSE']
119
- false
120
- rescue Fog::Compute::OpenStack::NotFound # FIXME: Why is this "Compute", not "Volume"? Copy-paste error?
121
- true
122
- end
123
- end
124
-
115
+ cleanup_test_object(@service.volumes, volume_id)
125
116
  end
126
117
  end
127
118
 
@@ -159,6 +150,180 @@ RSpec.describe Fog::Volume::OpenStack do
159
150
  end
160
151
  end
161
152
 
153
+ it 'can extend volumes' do
154
+ VCR.use_cassette('volume_extend') do
155
+
156
+ volume_size_small = 1 # in GB
157
+ volume_size_large = 2 # in GB
158
+
159
+ volume = setup_test_object(:type => :volume,
160
+ :display_name => 'fog-testvolume-1',
161
+ :size => volume_size_small
162
+ )
163
+ volume.wait_for { ready? and size == volume_size_small }
164
+
165
+ # extend volume
166
+ puts "Extending volume..." if ENV['DEBUG_VERBOSE']
167
+ volume.extend(volume_size_large)
168
+ volume.wait_for { ready? and size == volume_size_large }
169
+
170
+ # shrinking is not allowed in OpenStack
171
+ puts "Shrinking volume should fail..." if ENV['DEBUG_VERBOSE']
172
+ expect { volume.extend(volume_size_small) }.to raise_error(Excon::Errors::BadRequest, /Invalid input received: New size for extend must be greater than current size./)
173
+
174
+ # delete volume
175
+ cleanup_test_object(@service.volumes, volume.id)
176
+
177
+ # check that extending a non-existing volume fails
178
+ puts "Extending deleted volume should fail..." if ENV['DEBUG_VERBOSE']
179
+ expect { @service.extend_volume(volume.id, volume_size_small) }.to raise_error(Fog::Compute::OpenStack::NotFound)
180
+ end
181
+ end
182
+
183
+ it 'can create and accept volume transfers' do
184
+ VCR.use_cassette('volume_transfer_and_accept') do
185
+
186
+ transfer_name = 'fog-testtransfer-1'
187
+
188
+ # create volume object
189
+ volume = setup_test_object(:type => :volume,
190
+ :display_name => 'fog-testvolume-1',
191
+ :size => 1
192
+ )
193
+ volume.wait_for { ready? }
194
+
195
+ # create transfer object
196
+ transfer = setup_test_object(:type => :transfer,
197
+ :name => transfer_name,
198
+ :volume_id => volume.id
199
+ )
200
+ # we need to save the auth_key NOW, it's only present in the response
201
+ # from the create_transfer request
202
+ auth_key = transfer.auth_key
203
+ transfer_id = transfer.id
204
+
205
+ # check retrieval of transfer by ID
206
+ puts 'Retrieving transfer by ID...' if ENV['DEBUG_VERBOSE']
207
+
208
+ transfer = @service.transfers.get(transfer_id)
209
+ expect(transfer).to be_a(Fog::Volume::OpenStack::Transfer)
210
+
211
+ expect(transfer.id).to eq(transfer_id)
212
+ expect(transfer.name).to eq(transfer_name)
213
+ expect(transfer.volume_id).to eq(volume.id)
214
+
215
+ # check retrieval of transfer by name
216
+ puts 'Retrieving transfer by name...' if ENV['DEBUG_VERBOSE']
217
+
218
+ transfers = @service.transfers.all(:name => transfer_name)
219
+ expect(transfers.length).to be(1)
220
+ transfer = transfers[0]
221
+ expect(transfer).to be_a(Fog::Volume::OpenStack::Transfer)
222
+
223
+ expect(transfer.id).to eq(transfer_id)
224
+ expect(transfer.name).to eq(transfer_name)
225
+ expect(transfer.volume_id).to eq(volume.id)
226
+
227
+ # to accept the transfer, we need a second connection to a different project
228
+ puts 'Checking object visibility from different projects...' if ENV['DEBUG_VERBOSE']
229
+ other_service = Fog::Volume::OpenStack.new(
230
+ :openstack_auth_url => "#{@os_auth_url}/tokens",
231
+ :openstack_region => ENV['OS_REGION_NAME'] || 'RegionOne',
232
+ :openstack_api_key => ENV['OS_PASSWORD_OTHER'] || 'devstack',
233
+ :openstack_username => ENV['OS_USERNAME_OTHER'] || 'demo',
234
+ :openstack_tenant => ENV['OS_PROJECT_NAME_OTHER'] || 'demo'
235
+ )
236
+
237
+ # check that recipient cannot see the transfer object
238
+ expect { other_service.transfers.get(transfer.id) }.to raise_error(Fog::Compute::OpenStack::NotFound)
239
+ expect(other_service.transfers.all(:name => transfer_name).length).to be(0)
240
+
241
+ # # check that recipient cannot see the volume before transfer
242
+ # expect { other_service.volumes.get(volume.id) }.to raise_error(Fog::Compute::OpenStack::NotFound)
243
+ # expect(other_service.volumes.all(:display_name => volume_name).length).to be(0)
244
+
245
+ # The recipient can inexplicably see the volume even before the
246
+ # transfer, so to confirm that the transfer happens, we record its tenant ID.
247
+ expect(volume.tenant_id).to match(/^[0-9a-f-]+$/) # should look like a UUID
248
+ source_tenant_id = volume.tenant_id
249
+
250
+ # check that accept_transfer fails without valid transfer ID and auth key
251
+ bogus_uuid = 'ec8ff7e8-81e2-4e12-b9fb-3e8890612c2d' # generated by Fog::UUID.uuid, but fixed to play nice with VCR
252
+ expect { other_service.transfers.accept(bogus_uuid, auth_key) }.to raise_error(Fog::Compute::OpenStack::NotFound)
253
+ expect { other_service.transfers.accept(transfer_id, 'invalidauthkey') }.to raise_error(Excon::Errors::BadRequest)
254
+
255
+ # accept transfer
256
+ puts 'Accepting transfer...' if ENV['DEBUG_VERBOSE']
257
+ transfer = other_service.transfers.accept(transfer.id, auth_key)
258
+ expect(transfer).to be_a(Fog::Volume::OpenStack::Transfer)
259
+
260
+ expect(transfer.id).to eq(transfer_id)
261
+ expect(transfer.name).to eq(transfer_name)
262
+
263
+ # check that recipient can see the volume
264
+ volume = other_service.volumes.get(volume.id)
265
+ expect(volume).to be_a(Fog::Volume::OpenStack::Volume)
266
+
267
+ # # check that sender cannot see the volume anymore
268
+ # expect { @service.volumes.get(volume.id) }.to raise_error(Fog::Compute::OpenStack::NotFound)
269
+ # expect(@service.volumes.all(:display_name => volume_name).length).to be(0)
270
+
271
+ # As noted above, both users seem to be able to see the volume at all times.
272
+ # Check change of ownership by looking at the tenant_id, instead.
273
+ expect(volume.tenant_id).to match(/^[0-9a-f-]+$/) # should look like a UUID
274
+ expect(volume.tenant_id).not_to eq(source_tenant_id)
275
+
276
+ # check that the transfer object is gone on both sides
277
+ [ @service, other_service ].each do |service|
278
+ expect { service.transfers.get(transfer.id) }.to raise_error(Fog::Compute::OpenStack::NotFound)
279
+ expect(service.transfers.all(:name => transfer_name).length).to be(0)
280
+ end
281
+
282
+ # cleanup volume
283
+ cleanup_test_object(other_service.volumes, volume.id)
284
+ end
285
+ end
286
+
287
+ it 'can create and delete volume transfers' do
288
+ VCR.use_cassette('volume_transfer_and_delete') do
289
+ # create volume object
290
+ volume = setup_test_object(:type => :volume,
291
+ :display_name => 'fog-testvolume-1',
292
+ :size => 1
293
+ )
294
+ volume.wait_for { ready? }
295
+
296
+ # create transfer object
297
+ transfer = setup_test_object(:type => :transfer,
298
+ :name => 'fog-testtransfer-1',
299
+ :volume_id => volume.id
300
+ )
301
+ # we need to save the auth_key NOW, it's only present in the response
302
+ # from the create_transfer request
303
+ auth_key = transfer.auth_key
304
+ transfer_id = transfer.id
305
+
306
+ # to try to accept the transfer, we need a second connection to a different project
307
+ other_service = Fog::Volume::OpenStack.new(
308
+ :openstack_auth_url => "#{@os_auth_url}/tokens",
309
+ :openstack_region => ENV['OS_REGION_NAME'] || 'RegionOne',
310
+ :openstack_api_key => ENV['OS_PASSWORD_OTHER'] || 'devstack',
311
+ :openstack_username => ENV['OS_USERNAME_OTHER'] || 'demo',
312
+ :openstack_tenant => ENV['OS_PROJECT_NAME_OTHER'] || 'demo'
313
+ )
314
+
315
+ # delete transfer again
316
+ transfer.destroy
317
+
318
+ # check that transfer cannot be accepted when it has been deleted
319
+ puts 'Checking that accepting a deleted transfer fails...' if ENV['DEBUG_VERBOSE']
320
+ expect { other_service.transfers.accept(transfer_id, auth_key) }.to raise_error(Fog::Compute::OpenStack::NotFound)
321
+
322
+ # cleanup volume
323
+ cleanup_test_object(@service.volumes, volume.id)
324
+ end
325
+ end
326
+
162
327
  # TODO: tests for snapshots
163
328
  # TODO: tests for quotas
164
329
 
@@ -156,6 +156,32 @@ Shindo.tests('Fog::OpenStack::Storage | file', ['openstack']) do
156
156
 
157
157
  end
158
158
 
159
+ tests("#delete_at") do
160
+ @delete_at_time = (Time.now + 300).to_i
161
+
162
+ tests("#delete_at should default to nil").returns(nil) do
163
+ @instance.delete_at
164
+ end
165
+
166
+ @instance.delete_at = @delete_at_time
167
+ @instance.save
168
+ tests("#delete_at should return delete_at attribute").returns(@delete_at_time) do
169
+ @instance.delete_at
170
+ end
171
+
172
+ @instance.delete_at = @delete_at_time
173
+ @instance.save
174
+ tests("#delete_at= should update delete_at").returns(@delete_at_time + 100) do
175
+ @instance.delete_at = @delete_at_time + 100
176
+ @instance.save
177
+ @instance.delete_at
178
+ end
179
+
180
+ tests("#delete_at= should not blow up on nil") do
181
+ @instance.delete_at = nil
182
+ @instance.save
183
+ end
184
+ end
159
185
  end
160
186
 
161
187
  model_tests(@directory.files, file_attributes, Fog.mocking?) do
@@ -0,0 +1,18 @@
1
+ Shindo.tests('Fog::Compute[:openstack] | availability zone requests', ['openstack']) do
2
+
3
+ @flavor_format = {
4
+ 'zoneName' => String,
5
+ 'hosts' => Fog::Nullable::Hash,
6
+ 'zoneState' => Hash,
7
+ }
8
+
9
+ tests('success') do
10
+ tests('#list_zones').data_matches_schema({'availabilityZoneInfo' => [@flavor_format]}) do
11
+ Fog::Compute[:openstack].list_zones.body
12
+ end
13
+
14
+ tests('#list_zones_detailed').data_matches_schema({'availabilityZoneInfo' => [@flavor_format]}) do
15
+ Fog::Compute[:openstack].list_zones_detailed.body
16
+ end
17
+ end
18
+ end
@@ -232,6 +232,18 @@ Shindo.tests('Fog::Compute[:openstack] | server requests', ['openstack']) do
232
232
 
233
233
  Fog::Compute[:openstack].servers.get(@server_id).wait_for { ready? } if not Fog.mocking?
234
234
 
235
+ tests("#shelve_server(#{@server_id})").succeeds do
236
+ Fog::Compute[:openstack].shelve_server(@server_id)
237
+ end
238
+
239
+ Fog::Compute[:openstack].servers.get(@server_id).wait_for { ready? } if not Fog.mocking?
240
+
241
+ tests("#unshelve_server(#{@server_id})").succeeds do
242
+ Fog::Compute[:openstack].unshelve_server(@server_id)
243
+ end
244
+
245
+ Fog::Compute[:openstack].servers.get(@server_id).wait_for { ready? } if not Fog.mocking?
246
+
235
247
  #DELETE
236
248
  tests("#delete_server(#{@server_id})").succeeds do
237
249
  Fog::Compute[:openstack].delete_server(@server_id)
@@ -38,8 +38,8 @@ Shindo.tests('Fog::Network[:openstack] | subnet requests', ['openstack']) do
38
38
  tests('#update_subnet').formats({'subnet' => @subnet_format}) do
39
39
  subnet_id = Fog::Network[:openstack].subnets.all.first.id
40
40
  attributes = {:name => 'subnet_name', :gateway_ip => '10.2.2.1',
41
- :dns_nameservers => [], :host_routes => [],
42
- :enable_dhcp => true}
41
+ :allocation_pools => [], :dns_nameservers => [],
42
+ :host_routes => [], :enable_dhcp => true}
43
43
  Fog::Network[:openstack].update_subnet(subnet_id, attributes).body
44
44
  end
45
45
 
@@ -0,0 +1,13 @@
1
+ Shindo.tests('Fog::Volume[:openstack] | availability zone requests', ['openstack']) do
2
+
3
+ @flavor_format = {
4
+ 'zoneName' => String,
5
+ 'zoneState' => Hash,
6
+ }
7
+
8
+ tests('success') do
9
+ tests('#list_zones').data_matches_schema({'availabilityZoneInfo' => [@flavor_format]}) do
10
+ Fog::Volume[:openstack].list_zones.body
11
+ end
12
+ end
13
+ end
@@ -20,7 +20,7 @@ Shindo.tests('Compute::VcloudDirector | edge gateway requests', ['vclouddirector
20
20
  :GatewayIpsecVpnService =>
21
21
  {
22
22
  :IsEnabled => "true",
23
- :Tunnel => {
23
+ :Tunnel => [{
24
24
  :Name => "test vpn",
25
25
  :PeerIpAddress => "110.110.110.110",
26
26
  :PeerId => "1223-123UDH-12321",
@@ -41,7 +41,7 @@ Shindo.tests('Compute::VcloudDirector | edge gateway requests', ['vclouddirector
41
41
  :Gateway => "192.168.90.254",
42
42
  :Netmask => "255.255.255.0"
43
43
  }]
44
- }
44
+ }]
45
45
  }
46
46
  }
47
47