fog 1.32.0 → 1.33.0

Sign up to get free protection for your applications and to get access to all the features.
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