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
@@ -1,54 +1,20 @@
1
1
  require 'fog/openstack/identity'
2
2
  require 'fog/openstack/identity_v3'
3
- require 'rspec/core'
4
- require 'rspec/expectations'
5
- require 'vcr'
6
3
 
7
- RSpec.describe Fog::Identity::OpenStack::V3 do
8
-
9
- before :all do |example|
10
- @os_auth_url = ENV['OS_AUTH_URL']
11
-
12
- # if OS_AUTH_URL is set but FOG_MOCK is not, don't record anything and just pass through the requests
13
- VCR.configure do |c|
14
- c.ignore_request do |request|
15
- ENV['FOG_MOCK']!='true' && !ENV['OS_AUTH_URL'].nil?
16
- end
17
- end if @os_auth_url
18
-
19
- # Fail-safe URL which matches the VCR recordings
20
- @os_auth_url ||= 'http://devstack.openstack.stack:5000/v3'
21
-
22
- VCR.configure do |config|
23
- config.allow_http_connections_when_no_cassette = true
24
- config.hook_into :webmock
25
- config.cassette_library_dir = "spec/fog/openstack/identity_v3"
26
- config.default_cassette_options = {:record => :none}
27
- 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
28
- end
29
-
30
- if ENV['DEBUG']
31
- VCR.configure do |config|
32
- config.ignore_request do |request|
33
- false && !ENV['OS_AUTH_URL'].nil?
34
- end
35
- config.cassette_library_dir = "spec/debug"
36
- config.default_cassette_options.merge! :record => :all
37
- end
38
- end
4
+ if RUBY_VERSION =~ /1.8/
5
+ require File.expand_path('../shared_context', __FILE__)
6
+ else
7
+ require_relative './shared_context'
8
+ end
39
9
 
40
- # Allow us to ignore dev certificates on servers
41
- Excon.defaults[:ssl_verify_peer] = false if ENV['SSL_VERIFY_PEER'] == 'false'
10
+ RSpec.describe Fog::Identity::OpenStack::V3 do
42
11
 
43
- VCR.use_cassette('idv3') do
44
- @id_v3 = Fog::Identity::OpenStack::V3.new(
45
- :openstack_project_name => ENV['OS_PROJECT_NAME'] || 'admin',
46
- :openstack_domain_name => ENV['OS_USER_DOMAIN_NAME'] || 'Default',
47
- :openstack_api_key => ENV['OS_PASSWORD'] || 'password',
48
- :openstack_username => ENV['OS_USERNAME'] || 'admin',
49
- :openstack_region => ENV['OS_REGION_NAME'] || 'RegionOne',
50
- :openstack_auth_url => "#{@os_auth_url}/auth/tokens") unless @id_v3
51
- end
12
+ include_context 'OpenStack specs with VCR'
13
+ before :all do
14
+ setup_vcr_and_service(
15
+ :vcr_directory => 'spec/fog/openstack/identity_v3',
16
+ :service_class => Fog::Identity::OpenStack::V3
17
+ )
52
18
  end
53
19
 
54
20
  it 'authenticates with password, userid and domain_id' do
@@ -86,7 +52,7 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
86
52
 
87
53
  it 'authenticates in another region' do
88
54
  VCR.use_cassette('idv3_endpoint') do
89
- @endpoints_all = @id_v3.endpoints.all
55
+ @endpoints_all = @service.endpoints.all
90
56
  end
91
57
  endpoints_in_region = @endpoints_all.select { |endpoint| endpoint.region == (ENV['OS_REGION_OTHER']||'europe') }
92
58
 
@@ -104,14 +70,14 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
104
70
  it 'get an unscoped token, then reauthenticate with it' do
105
71
  VCR.use_cassette('authv3_unscoped_reauth') do
106
72
 
107
- @id_v3 = Fog::Identity::OpenStack::V3.new(
73
+ id_v3 = Fog::Identity::OpenStack::V3.new(
108
74
  :openstack_api_key => ENV['OS_PASSWORD'] || 'password',
109
75
  :openstack_userid => ENV['OS_USER_ID'] || 'aa9f25defa6d4cafb48466df83106065',
110
76
  :openstack_region => ENV['OS_REGION_NAME'] || 'RegionOne',
111
77
  :openstack_auth_url => "#{@os_auth_url}/auth/tokens")
112
78
 
113
79
  auth_params = {:provider => "openstack",
114
- :openstack_auth_token => @id_v3.credentials[:openstack_auth_token],
80
+ :openstack_auth_token => id_v3.credentials[:openstack_auth_token],
115
81
  :openstack_auth_url => "#{@os_auth_url}/auth/tokens",
116
82
  :openstack_region => ENV['OS_REGION_NAME'] || 'RegionOne'}
117
83
  @fog2 = Fog::Identity::OpenStack::V3.new(auth_params)
@@ -167,23 +133,23 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
167
133
  it "find specific user, lists users" do
168
134
  VCR.use_cassette('idv3_users') do
169
135
 
170
- expect { nonexistent_user = @id_v3.users.find_by_id 'u-random-blah' }.to raise_error(Fog::Identity::OpenStack::NotFound)
136
+ expect { nonexistent_user = @service.users.find_by_id 'u-random-blah' }.to raise_error(Fog::Identity::OpenStack::NotFound)
171
137
 
172
- admin_user = @id_v3.users.find_by_name ENV['OS_USERNAME'] || 'admin'
138
+ admin_user = @service.users.find_by_name ENV['OS_USERNAME'] || 'admin'
173
139
  expect(admin_user.length).to be 1
174
140
 
175
- users = @id_v3.users
141
+ users = @service.users
176
142
  expect(users).to_not be_nil
177
143
  expect(users.length).to_not be 0
178
144
 
179
- users_all = @id_v3.users.all
145
+ users_all = @service.users.all
180
146
  expect(users_all).to_not be_nil
181
147
  expect(users_all.length).to_not be 0
182
148
 
183
- admin_by_id = @id_v3.users.find_by_id admin_user.first.id
149
+ admin_by_id = @service.users.find_by_id admin_user.first.id
184
150
  expect(admin_by_id).to_not be_nil
185
151
 
186
- expect(@id_v3.users.find_by_name('pimpernel').length).to be 0
152
+ expect(@service.users.find_by_name('pimpernel').length).to be 0
187
153
  end
188
154
  end
189
155
 
@@ -192,44 +158,44 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
192
158
 
193
159
  # Make sure there are no existing users called foobar or baz
194
160
  ['foobar', 'baz'].each do |username|
195
- user = @id_v3.users.find_by_name(username).first
161
+ user = @service.users.find_by_name(username).first
196
162
  user.update(:enabled => false) if user
197
163
  user.destroy if user
198
164
  end
199
- expect(@id_v3.users.find_by_name('foobar').length).to be 0
200
- expect(@id_v3.users.find_by_name('baz').length).to be 0
165
+ expect(@service.users.find_by_name('foobar').length).to be 0
166
+ expect(@service.users.find_by_name('baz').length).to be 0
201
167
 
202
168
  # Create a user called foobar
203
- foobar_user = @id_v3.users.create(:name => 'foobar',
169
+ foobar_user = @service.users.create(:name => 'foobar',
204
170
  :email => 'foobar@example.com',
205
171
  :password => 's3cret!')
206
172
  foobar_id = foobar_user.id
207
- expect(@id_v3.users.find_by_name('foobar').length).to be 1
173
+ expect(@service.users.find_by_name('foobar').length).to be 1
208
174
 
209
175
  # Rename it to baz and disable it (required so we can delete it)
210
176
  foobar_user.update(:name => 'baz', :enabled => false)
211
177
  expect(foobar_user.name).to eq 'baz'
212
178
 
213
179
  # Read the user freshly and check the name & enabled state
214
- expect(@id_v3.users.find_by_name('baz').length).to be 1
215
- baz_user = @id_v3.users.find_by_id foobar_id
180
+ expect(@service.users.find_by_name('baz').length).to be 1
181
+ baz_user = @service.users.find_by_id foobar_id
216
182
  expect(baz_user).to_not be_nil
217
183
  expect(baz_user.name).to eq 'baz'
218
184
  expect(baz_user.email).to eq 'foobar@example.com'
219
185
  expect(baz_user.enabled).to be false
220
186
 
221
187
  # Try to create the user again
222
- expect { @id_v3.users.create(:name => 'baz',
188
+ expect { @service.users.create(:name => 'baz',
223
189
  :email => 'foobar@example.com',
224
190
  :password => 's3cret!') }.to raise_error(Excon::Errors::Conflict)
225
191
 
226
192
  # Delete the user
227
193
  baz_user.destroy
228
194
  # Check that the deletion worked
229
- expect { @id_v3.users.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound)
230
- expect(@id_v3.users.all.select { |user| ['foobar', 'baz'].include? user.name }.length).to be 0
231
- expect(@id_v3.users.find_by_name('foobar').length).to be 0
232
- expect(@id_v3.users.find_by_name('baz').length).to be 0
195
+ expect { @service.users.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound)
196
+ expect(@service.users.all.select { |user| ['foobar', 'baz'].include? user.name }.length).to be 0
197
+ expect(@service.users.find_by_name('foobar').length).to be 0
198
+ expect(@service.users.find_by_name('baz').length).to be 0
233
199
  end
234
200
  end
235
201
 
@@ -237,35 +203,35 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
237
203
  VCR.use_cassette('idv3_group_crud_mutation') do
238
204
 
239
205
  # Make sure there are no existing groups called foobar or baz
240
- @id_v3.groups.all.select { |group| ['foobar', 'baz'].include? group.name }.each do |group|
206
+ @service.groups.all.select { |group| ['foobar', 'baz'].include? group.name }.each do |group|
241
207
  group.destroy
242
208
  end
243
- expect(@id_v3.groups.all.select { |group| ['foobar', 'baz'].include? group.name }.length).to be 0
209
+ expect(@service.groups.all.select { |group| ['foobar', 'baz'].include? group.name }.length).to be 0
244
210
 
245
211
  # Create a group called foobar
246
- foobar_group = @id_v3.groups.create(:name => 'foobar', :description => "Group of Foobar users")
212
+ foobar_group = @service.groups.create(:name => 'foobar', :description => "Group of Foobar users")
247
213
  foobar_id = foobar_group.id
248
- expect(@id_v3.groups.all.select { |group| group.name == 'foobar' }.length).to be 1
214
+ expect(@service.groups.all.select { |group| group.name == 'foobar' }.length).to be 1
249
215
 
250
216
  # Rename it to baz
251
217
  foobar_group.update(:name => 'baz', :description => "Group of Baz users")
252
218
  expect(foobar_group.name).to eq 'baz'
253
219
 
254
220
  # Read the group freshly and check the name
255
- expect(@id_v3.groups.all.select { |group| group.name == 'baz' }.length).to be 1
256
- baz_group = @id_v3.groups.find_by_id foobar_id
221
+ expect(@service.groups.all.select { |group| group.name == 'baz' }.length).to be 1
222
+ baz_group = @service.groups.find_by_id foobar_id
257
223
  expect(baz_group).to_not be_nil
258
224
  expect(baz_group.name).to eq 'baz'
259
225
 
260
226
  # Add users to the group
261
- #foobar_user1 = @id_v3.users.find_by_name('foobar1').first
227
+ #foobar_user1 = @service.users.find_by_name('foobar1').first
262
228
  #foobar_user1.destroy if foobar_user1
263
- foobar_user1 = @id_v3.users.create(:name => 'foobar1',
229
+ foobar_user1 = @service.users.create(:name => 'foobar1',
264
230
  :email => 'foobar1@example.com',
265
231
  :password => 's3cret!1')
266
- #foobar_user2 = @id_v3.users.find_by_name('foobar2').first
232
+ #foobar_user2 = @service.users.find_by_name('foobar2').first
267
233
  #foobar_user2.destroy if foobar_user2
268
- foobar_user2 = @id_v3.users.create(:name => 'foobar2',
234
+ foobar_user2 = @service.users.create(:name => 'foobar2',
269
235
  :email => 'foobar2@example.com',
270
236
  :password => 's3cret!2')
271
237
 
@@ -297,8 +263,8 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
297
263
 
298
264
  # Delete the group
299
265
  baz_group.destroy
300
- expect { @id_v3.groups.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound)
301
- expect(@id_v3.groups.all.select { |group| ['foobar', 'baz'].include? group.name }.length).to be 0
266
+ expect { @service.groups.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound)
267
+ expect(@service.groups.all.select { |group| ['foobar', 'baz'].include? group.name }.length).to be 0
302
268
  end
303
269
  end
304
270
 
@@ -310,16 +276,16 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
310
276
  :scope => {:project => {:domain => {:name => ENV['OS_USER_DOMAIN_NAME']||'Default'},
311
277
  :name => ENV['OS_PROJECT_NAME']||'admin'}}}}
312
278
 
313
- token = @id_v3.tokens.authenticate(auth)
279
+ token = @service.tokens.authenticate(auth)
314
280
  expect(token).to_not be_nil
315
281
 
316
- validated_token = @id_v3.tokens.validate token.value
282
+ validated_token = @service.tokens.validate token.value
317
283
  expect(validated_token).to_not be_nil
318
284
 
319
- @id_v3.tokens.check(token.value)
320
- @id_v3.tokens.revoke(token.value)
285
+ @service.tokens.check(token.value)
286
+ @service.tokens.revoke(token.value)
321
287
 
322
- expect { @id_v3.tokens.check(token.value) }.to raise_error(Fog::Identity::OpenStack::NotFound)
288
+ expect { @service.tokens.check(token.value) }.to raise_error(Fog::Identity::OpenStack::NotFound)
323
289
  end
324
290
  end
325
291
 
@@ -330,12 +296,12 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
330
296
 
331
297
  begin
332
298
 
333
- foobar_user = @id_v3.users.create(:name => 'foobar_385',
299
+ foobar_user = @service.users.create(:name => 'foobar_385',
334
300
  :email => 'foobar_demo@example.com',
335
301
  :domain_id => ENV['OS_USER_DOMAIN_ID'] || 'default',
336
302
  :password => 's3cret!')
337
303
 
338
- foobar_role = @id_v3.roles.create(:name => 'foobar_role390')
304
+ foobar_role = @service.roles.create(:name => 'foobar_role390')
339
305
  foobar_user.grant_role(foobar_role.id)
340
306
 
341
307
  nonadmin_v3 = Fog::Identity::OpenStack::V3.new(
@@ -359,9 +325,9 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
359
325
  :openstack_auth_url => auth_url) }.to raise_error(Excon::Errors::NotFound)
360
326
  ensure
361
327
  # Clean up
362
- foobar_user = @id_v3.users.find_by_name('foobar_385').first unless foobar_user
328
+ foobar_user = @service.users.find_by_name('foobar_385').first unless foobar_user
363
329
  foobar_user.destroy if foobar_user
364
- foobar_role = @id_v3.roles.all.select { |role| role.name == 'foobar_role390' }.first unless foobar_role
330
+ foobar_role = @service.roles.all.select { |role| role.name == 'foobar_role390' }.first unless foobar_role
365
331
  foobar_role.destroy if foobar_role
366
332
  end
367
333
 
@@ -371,18 +337,18 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
371
337
  it "lists domains" do
372
338
  VCR.use_cassette('idv3_domain') do
373
339
 
374
- domains = @id_v3.domains
340
+ domains = @service.domains
375
341
  expect(domains).to_not be_nil
376
342
  expect(domains.length).to_not be 0
377
343
 
378
- domains_all = @id_v3.domains.all
344
+ domains_all = @service.domains.all
379
345
  expect(domains_all).to_not be_nil
380
346
  expect(domains_all.length).to_not be 0
381
347
 
382
- default_domain = @id_v3.domains.find_by_id ENV['OS_USER_DOMAIN_ID']||'default'
348
+ default_domain = @service.domains.find_by_id ENV['OS_USER_DOMAIN_ID']||'default'
383
349
  expect(default_domain).to_not be_nil
384
350
 
385
- expect { @id_v3.domains.find_by_id 'atlantis' }.to raise_error(Fog::Identity::OpenStack::NotFound)
351
+ expect { @service.domains.find_by_id 'atlantis' }.to raise_error(Fog::Identity::OpenStack::NotFound)
386
352
  end
387
353
  end
388
354
 
@@ -391,17 +357,17 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
391
357
 
392
358
  begin
393
359
  # Create a domain called foobar
394
- foobar_domain = @id_v3.domains.create(:name => 'foobar')
360
+ foobar_domain = @service.domains.create(:name => 'foobar')
395
361
  foobar_id = foobar_domain.id
396
- expect(@id_v3.domains.all(:name => 'foobar').length).to be 1
362
+ expect(@service.domains.all(:name => 'foobar').length).to be 1
397
363
 
398
364
  # Rename it to baz and disable it (required so we can delete it)
399
365
  foobar_domain.update(:name => 'baz', :enabled => false)
400
366
  expect(foobar_domain.name).to eq 'baz'
401
367
 
402
368
  # Read the domain freshly and check the name & enabled state
403
- expect(@id_v3.domains.all(:name => 'baz').length).to be 1
404
- baz_domain = @id_v3.domains.find_by_id foobar_id
369
+ expect(@service.domains.all(:name => 'baz').length).to be 1
370
+ baz_domain = @service.domains.find_by_id foobar_id
405
371
  expect(baz_domain).to_not be_nil
406
372
  expect(baz_domain.name).to eq 'baz'
407
373
  expect(baz_domain.enabled).to be false
@@ -415,9 +381,9 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
415
381
  rescue
416
382
  end
417
383
  # Check that the deletion worked
418
- expect { @id_v3.domains.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound) if foobar_id
384
+ expect { @service.domains.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound) if foobar_id
419
385
  ['foobar', 'baz'].each do |domain_name|
420
- expect(@id_v3.domains.all(:name => domain_name).length).to be 0
386
+ expect(@service.domains.all(:name => domain_name).length).to be 0
421
387
  end
422
388
  end
423
389
  end
@@ -428,7 +394,7 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
428
394
 
429
395
  VCR.use_cassette('idv3_domain_roles_mutation') do
430
396
  begin
431
- foobar_user = @id_v3.users.create(:name => 'foobar_role_user',
397
+ foobar_user = @service.users.create(:name => 'foobar_role_user',
432
398
  :email => 'foobar@example.com',
433
399
  :password => 's3cret!')
434
400
 
@@ -436,18 +402,18 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
436
402
  expect(foobar_user.roles.length).to be 0
437
403
 
438
404
  # Create a role and add it to the user in the user's domain
439
- foobar_role = @id_v3.roles.create(:name => 'foobar_role')
405
+ foobar_role = @service.roles.create(:name => 'foobar_role')
440
406
  foobar_user.grant_role(foobar_role.id)
441
407
  expect(foobar_user.roles.length).to be 1
442
- assignments = @id_v3.role_assignments.all(:user_id => foobar_user.id)
408
+ assignments = @service.role_assignments.all(:user_id => foobar_user.id)
443
409
  expect(assignments.length).to be 1
444
410
  expect(assignments.first.role['id']).to eq foobar_role.id
445
411
  expect(assignments.first.user['id']).to eq foobar_user.id
446
412
  expect(assignments.first.scope['domain']['id']).to eq foobar_user.domain_id
447
413
  expect(assignments.first.links['assignment'].end_with? "/v3/domains/#{foobar_user.domain_id}/users/#{foobar_user.id}/roles/#{foobar_role.id}").to be true
448
414
 
449
- # Quick test of @id_v3.role_assignments.all while we're at it
450
- all_assignments = @id_v3.role_assignments.all
415
+ # Quick test of @service.role_assignments.all while we're at it
416
+ all_assignments = @service.role_assignments.all
451
417
  expect(all_assignments.length).to be >= 1
452
418
 
453
419
  # Check that the user has the role
@@ -457,9 +423,9 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
457
423
  foobar_user.revoke_role(foobar_role.id)
458
424
  expect(foobar_user.check_role(foobar_role.id)).to be false
459
425
  ensure
460
- foobar_user = @id_v3.users.find_by_name('u-foobar_role_user').first unless foobar_user
426
+ foobar_user = @service.users.find_by_name('u-foobar_role_user').first unless foobar_user
461
427
  foobar_user.destroy if foobar_user
462
- foobar_role = @id_v3.roles.all.select { |role| role.name == 'foobar_role' }.first unless foobar_role
428
+ foobar_role = @service.roles.all.select { |role| role.name == 'foobar_role' }.first unless foobar_role
463
429
  foobar_role.destroy if foobar_role
464
430
  end
465
431
 
@@ -471,15 +437,15 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
471
437
 
472
438
  begin
473
439
  # Create a domain called foobar
474
- foobar_domain = @id_v3.domains.create(:name => 'd-foobar')
440
+ foobar_domain = @service.domains.create(:name => 'd-foobar')
475
441
 
476
442
  # Create a group in this domain
477
- foobar_group = @id_v3.groups.create(:name => 'g-foobar',
443
+ foobar_group = @service.groups.create(:name => 'g-foobar',
478
444
  :description => "Group of Foobar users",
479
445
  :domain_id => foobar_domain.id)
480
446
 
481
447
  # Create a user in the domain
482
- foobar_user = @id_v3.users.create(:name => 'u-foobar_foobar',
448
+ foobar_user = @service.users.create(:name => 'u-foobar_foobar',
483
449
  :email => 'foobar@example.com',
484
450
  :password => 's3cret!',
485
451
  :domain_id => foobar_domain.id)
@@ -488,19 +454,19 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
488
454
  expect(foobar_user.roles.length).to be 0
489
455
 
490
456
  # Create a role and add it to the domain group
491
- foobar_role = @id_v3.roles.all.select { |role| role.name == 'foobar_role' }.first
457
+ foobar_role = @service.roles.all.select { |role| role.name == 'foobar_role' }.first
492
458
  foobar_role.destroy if foobar_role
493
- foobar_role = @id_v3.roles.create(:name => 'foobar_role')
459
+ foobar_role = @service.roles.create(:name => 'foobar_role')
494
460
 
495
461
  foobar_group.grant_role foobar_role.id
496
462
  expect(foobar_group.roles.length).to be 1
497
463
 
498
464
  # Add user to the group and check that it inherits the role
499
465
  expect(foobar_user.check_role foobar_role.id).to be false
500
- expect(@id_v3.role_assignments.all(:user_id => foobar_user.id, :effective => true).length).to be 0
466
+ expect(@service.role_assignments.all(:user_id => foobar_user.id, :effective => true).length).to be 0
501
467
  foobar_group.add_user foobar_user.id
502
468
  expect(foobar_user.check_role foobar_role.id).to be false # Still false in absolute assignment terms
503
- assignments = @id_v3.role_assignments.all(:user_id => foobar_user.id, :effective => true)
469
+ assignments = @service.role_assignments.all(:user_id => foobar_user.id, :effective => true)
504
470
  expect(assignments.length).to be 1
505
471
  expect(assignments.first.role['id']).to eq foobar_role.id
506
472
  expect(assignments.first.user['id']).to eq foobar_user.id
@@ -508,7 +474,7 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
508
474
  expect(assignments.first.links['assignment'].end_with? "/v3/domains/#{foobar_domain.id}/groups/#{foobar_group.id}/roles/#{foobar_role.id}").to be true
509
475
  expect(assignments.first.links['membership'].end_with? "/v3/groups/#{foobar_group.id}/users/#{foobar_user.id}").to be true
510
476
 
511
- group_assignments = @id_v3.role_assignments.all(:group_id => foobar_group.id)
477
+ group_assignments = @service.role_assignments.all(:group_id => foobar_group.id)
512
478
  expect(group_assignments.length).to be 1
513
479
  expect(group_assignments.first.role['id']).to eq foobar_role.id
514
480
  expect(group_assignments.first.group['id']).to eq foobar_group.id
@@ -517,16 +483,16 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
517
483
 
518
484
  # Revoke the role from the group and check the user no longer has it
519
485
  foobar_group.revoke_role foobar_role.id
520
- expect(@id_v3.role_assignments.all(:user_id => foobar_user.id, :effective => true).length).to be 0
486
+ expect(@service.role_assignments.all(:user_id => foobar_user.id, :effective => true).length).to be 0
521
487
  ensure
522
488
  # Clean up
523
- foobar_user = @id_v3.users.find_by_name('u-foobar_foobar').first unless foobar_user
489
+ foobar_user = @service.users.find_by_name('u-foobar_foobar').first unless foobar_user
524
490
  foobar_user.destroy if foobar_user
525
- foobar_group = @id_v3.groups.all.select { |group| group.name == 'g-foobar' }.first unless foobar_group
491
+ foobar_group = @service.groups.all.select { |group| group.name == 'g-foobar' }.first unless foobar_group
526
492
  foobar_group.destroy if foobar_group
527
- foobar_role = @id_v3.roles.all.select { |role| role.name == 'foobar_role' }.first unless foobar_role
493
+ foobar_role = @service.roles.all.select { |role| role.name == 'foobar_role' }.first unless foobar_role
528
494
  foobar_role.destroy if foobar_role
529
- foobar_domain = @id_v3.domains.all.select { |domain| domain.name == 'd-foobar' }.first unless foobar_domain
495
+ foobar_domain = @service.domains.all.select { |domain| domain.name == 'd-foobar' }.first unless foobar_domain
530
496
  foobar_domain.update(:enabled => false) if foobar_domain
531
497
  foobar_domain.destroy if foobar_domain
532
498
  end
@@ -536,18 +502,18 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
536
502
  it "lists roles" do
537
503
  VCR.use_cassette('idv3_role') do
538
504
 
539
- roles = @id_v3.roles
505
+ roles = @service.roles
540
506
  expect(roles).to_not be_nil
541
507
  expect(roles.length).to_not be 0
542
508
 
543
- roles_all = @id_v3.roles.all
509
+ roles_all = @service.roles.all
544
510
  expect(roles_all).to_not be_nil
545
511
  expect(roles_all.length).to_not be 0
546
512
 
547
- role_by_id = @id_v3.roles.find_by_id roles_all.first.id
513
+ role_by_id = @service.roles.find_by_id roles_all.first.id
548
514
  expect(role_by_id).to_not be_nil
549
515
 
550
- expect { @id_v3.roles.find_by_id 'atlantis' }.to raise_error(Fog::Identity::OpenStack::NotFound)
516
+ expect { @service.roles.find_by_id 'atlantis' }.to raise_error(Fog::Identity::OpenStack::NotFound)
551
517
  end
552
518
  end
553
519
 
@@ -556,26 +522,26 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
556
522
 
557
523
  begin
558
524
  # Create a role called foobar
559
- foobar_role = @id_v3.roles.create(:name => 'foobar23')
525
+ foobar_role = @service.roles.create(:name => 'foobar23')
560
526
  foobar_id = foobar_role.id
561
- expect(@id_v3.roles.all(:name => 'foobar23').length).to be 1
527
+ expect(@service.roles.all(:name => 'foobar23').length).to be 1
562
528
 
563
529
  # Rename it to baz
564
530
  foobar_role.update(:name => 'baz23')
565
531
  expect(foobar_role.name).to eq 'baz23'
566
532
 
567
533
  # Read the role freshly and check the name & enabled state
568
- expect(@id_v3.roles.all(:name => 'baz23').length).to be 1
569
- baz_role = @id_v3.roles.find_by_id foobar_id
534
+ expect(@service.roles.all(:name => 'baz23').length).to be 1
535
+ baz_role = @service.roles.find_by_id foobar_id
570
536
  expect(baz_role).to_not be_nil
571
537
  expect(baz_role.name).to eq 'baz23'
572
538
  ensure
573
539
  # Delete the role
574
540
  baz_role.destroy if baz_role
575
541
  # Check that the deletion worked
576
- expect { @id_v3.roles.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound) if foobar_id
542
+ expect { @service.roles.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound) if foobar_id
577
543
  ['foobar23', 'baz23'].each do |role_name|
578
- expect(@id_v3.roles.all(:name => role_name).length).to be 0
544
+ expect(@service.roles.all(:name => role_name).length).to be 0
579
545
  end
580
546
  end
581
547
  end
@@ -584,30 +550,30 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
584
550
  it "lists projects" do
585
551
  VCR.use_cassette('idv3_project') do
586
552
 
587
- projects = @id_v3.projects
553
+ projects = @service.projects
588
554
  expect(projects).to_not be_nil
589
555
  expect(projects.length).to_not be 0
590
556
 
591
- projects_all = @id_v3.projects.all
557
+ projects_all = @service.projects.all
592
558
  expect(projects_all).to_not be_nil
593
559
  expect(projects_all.length).to_not be 0
594
- project_byid = @id_v3.projects.find_by_id projects_all.first.id
560
+ project_byid = @service.projects.find_by_id projects_all.first.id
595
561
  expect(project_byid).to_not be_nil
596
562
 
597
- expect { @id_v3.projects.find_by_id 'atlantis' }.to raise_error(Fog::Identity::OpenStack::NotFound)
563
+ expect { @service.projects.find_by_id 'atlantis' }.to raise_error(Fog::Identity::OpenStack::NotFound)
598
564
  end
599
565
  end
600
566
 
601
567
  it "CRUD projects" do
602
568
  VCR.use_cassette('idv3_project_crud') do
603
569
 
604
- default_domain = @id_v3.domains.find_by_id ENV['OS_USER_DOMAIN_ID']||'default'
570
+ default_domain = @service.domains.find_by_id ENV['OS_USER_DOMAIN_ID']||'default'
605
571
 
606
572
  begin
607
573
  # Create a project called foobar - should not work without domain id?
608
- foobar_project = @id_v3.projects.create(:name => 'p-foobar46')
574
+ foobar_project = @service.projects.create(:name => 'p-foobar46')
609
575
  foobar_id = foobar_project.id
610
- expect(@id_v3.projects.all(:name => 'p-foobar46').length).to be 1
576
+ expect(@service.projects.all(:name => 'p-foobar46').length).to be 1
611
577
  expect(foobar_project.domain_id).to eq default_domain.id
612
578
 
613
579
  # Rename it to baz and disable it (required so we can delete it)
@@ -615,8 +581,8 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
615
581
  expect(foobar_project.name).to eq 'p-baz46'
616
582
 
617
583
  # Read the project freshly and check the name & enabled state
618
- expect(@id_v3.projects.all(:name => 'p-baz46').length).to be 1
619
- baz_project = @id_v3.projects.find_by_id foobar_id
584
+ expect(@service.projects.all(:name => 'p-baz46').length).to be 1
585
+ baz_project = @service.projects.find_by_id foobar_id
620
586
  expect(baz_project).to_not be_nil
621
587
  expect(baz_project.name).to eq 'p-baz46'
622
588
  expect(baz_project.enabled).to be false
@@ -625,9 +591,102 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
625
591
  baz_project.destroy
626
592
 
627
593
  # Check that the deletion worked
628
- expect { @id_v3.projects.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound)
594
+ expect { @service.projects.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound)
629
595
  ['p-foobar46', 'p-baz46'].each do |project_name|
630
- expect(@id_v3.projects.all(:name => project_name).length).to be 0
596
+ expect(@service.projects.all(:name => project_name).length).to be 0
597
+ end
598
+ end
599
+ end
600
+ end
601
+
602
+ it "CRUD & list hierarchical projects" do
603
+ VCR.use_cassette('idv3_project_hier_crud_list') do
604
+
605
+ default_domain = @service.domains.find_by_id ENV['OS_USER_DOMAIN_ID']||'default'
606
+
607
+ begin
608
+ # Create a project called foobar
609
+ foobar_project = @service.projects.create(:name => 'p-foobar67')
610
+ foobar_id = foobar_project.id
611
+
612
+ # Create a sub-project called baz
613
+ baz_project = @service.projects.create(:name => 'p-baz67', :parent_id => foobar_id)
614
+ baz_id = baz_project.id
615
+
616
+ expect(baz_project.parent_id).to eq foobar_id
617
+
618
+ # Read the project freshly and check the parent_id
619
+ fresh_baz_project = @service.projects.all(:name => 'p-baz67').first
620
+ expect(fresh_baz_project).to_not be_nil
621
+ expect(fresh_baz_project.parent_id).to eq foobar_id
622
+
623
+ # Create another sub-project called boo
624
+ boo_project = @service.projects.create(:name => 'p-boo67', :parent_id => foobar_id)
625
+ boo_id = boo_project.id
626
+
627
+ # Create a sub-project of boo called booboo
628
+ booboo_project = @service.projects.create(:name => 'p-booboo67', :parent_id => boo_id)
629
+ booboo_id = booboo_project.id
630
+
631
+ # Make sure we have a role on all these projects (needed for subtree_as_list and parents_as_list)
632
+ prj_role = @service.roles.create(:name => 'r-project67')
633
+ [foobar_project, baz_project, boo_project, booboo_project].each do |project|
634
+ project.grant_role_to_user(prj_role.id, @service.current_user_id)
635
+ end
636
+
637
+ # Get the children of foobar, as a tree of IDs
638
+ foobar_kids = @service.projects.find_by_id(foobar_id, :subtree_as_ids).subtree
639
+ expect(foobar_kids.keys.length).to eq 2
640
+
641
+ boo_index = foobar_kids.keys.index boo_id
642
+ expect(boo_index).to_not be_nil
643
+
644
+ foobar_child_id = foobar_kids.keys[boo_index]
645
+ expect(foobar_kids[foobar_child_id].length).to eq 1
646
+ foobar_grandchild_id = foobar_kids[foobar_child_id].keys.first
647
+ expect(foobar_grandchild_id).to eq booboo_id
648
+
649
+ # Get the children of foobar, as a list of objects
650
+ foobar_kids = @service.projects.find_by_id(foobar_id, :subtree_as_list).subtree
651
+ expect(foobar_kids.length).to eq 3
652
+ expect([foobar_kids[0].id,foobar_kids[1].id,foobar_kids[2].id].sort
653
+ ).to eq [baz_id, boo_id, booboo_id].sort
654
+
655
+ # Create a another sub-project of boo called fooboo and check that it appears in the parent's subtree
656
+ fooboo_project = @service.projects.create(:name => 'p-fooboo67', :parent_id => boo_id)
657
+ fooboo_id = fooboo_project.id
658
+ fooboo_project.grant_role_to_user(prj_role.id, @service.current_user_id)
659
+ foobar_new_kids = @service.projects.find_by_id(foobar_id, :subtree_as_list).subtree
660
+ expect(foobar_new_kids.length).to eq 4
661
+
662
+ # Get the parents of booboo, as a tree of IDs
663
+ booboo_parents = @service.projects.find_by_id(booboo_id, :parents_as_ids).parents
664
+ expect(booboo_parents.keys.length).to eq 1
665
+ booboo_parent_id = booboo_parents.keys.first
666
+ expect(booboo_parents[booboo_parent_id].length).to eq 1
667
+ booboo_grandparent_id = booboo_parents[booboo_parent_id].keys.first
668
+ expect(booboo_grandparent_id).to eq foobar_id
669
+ expect(booboo_parents[booboo_parent_id][booboo_grandparent_id]).to be_nil
670
+
671
+ # Get the parents of booboo, as a list of objects
672
+ booboo_parents = @service.projects.find_by_id(booboo_id, :parents_as_list).parents
673
+ expect(booboo_parents.length).to eq 2
674
+ expect([booboo_parents[0].id,booboo_parents[1].id].sort).to eq [foobar_id, boo_id].sort
675
+ ensure
676
+ # Delete the projects
677
+ fooboo_project.destroy if fooboo_project
678
+ booboo_project.destroy if booboo_project
679
+ boo_project.destroy if boo_project
680
+ baz_project.destroy if baz_project
681
+ foobar_project.destroy if foobar_project
682
+ prj_role = @service.roles.all(:name => 'r-project67').first unless prj_role
683
+ prj_role.destroy if prj_role
684
+ # Check that the deletion worked
685
+ expect { @service.projects.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound) if foobar_id
686
+ ['p-booboo67', 'p-fooboo67', 'p-boo67', 'p-baz67', 'p-foobar67'].each do |project_name|
687
+ prj = @service.projects.all(:name => project_name).first
688
+ prj.destroy if prj
689
+ expect(@service.projects.all(:name => project_name).length).to be 0
631
690
  end
632
691
  end
633
692
  end
@@ -637,35 +696,35 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
637
696
  VCR.use_cassette('idv3_project_group_user_roles_mutation') do
638
697
 
639
698
  # Make sure there is no existing project called foobar
640
- @id_v3.projects.all(:name => 'p-foobar69').each do |project|
699
+ @service.projects.all(:name => 'p-foobar69').each do |project|
641
700
  project.update(:enabled => false)
642
701
  project.destroy
643
702
  end
644
- expect(@id_v3.projects.all(:name => 'p-foobar69').length).to be 0
703
+ expect(@service.projects.all(:name => 'p-foobar69').length).to be 0
645
704
 
646
705
  begin
647
706
  # Create a project called foobar
648
- foobar_project = @id_v3.projects.create(:name => 'p-foobar69')
707
+ foobar_project = @service.projects.create(:name => 'p-foobar69')
649
708
  # Create a role called baz
650
- @id_v3.roles.all(:name => 'baz').each do |role|
709
+ @service.roles.all(:name => 'baz').each do |role|
651
710
  role.update(:enabled => false)
652
711
  role.destroy
653
712
  end
654
- baz_role = @id_v3.roles.create(:name => 'baz69')
713
+ baz_role = @service.roles.create(:name => 'baz69')
655
714
 
656
715
  # Create a user
657
- foobar_user = @id_v3.users.create(:name => 'u-foobar69',
716
+ foobar_user = @service.users.create(:name => 'u-foobar69',
658
717
  :email => 'foobar@example.com',
659
718
  :password => 's3cret!')
660
719
 
661
720
  # Create a group and add the user to it
662
- foobar_group = @id_v3.groups.create(:name => 'g-foobar69',
721
+ foobar_group = @service.groups.create(:name => 'g-foobar69',
663
722
  :description => "Group of Foobar users")
664
723
  foobar_group.add_user foobar_user.id
665
724
 
666
725
  # User has no projects initially
667
726
  expect(foobar_user.projects.length).to be 0
668
- expect(@id_v3.role_assignments.all(:user_id => foobar_user.id,
727
+ expect(@service.role_assignments.all(:user_id => foobar_user.id,
669
728
  :project_id => foobar_project.id,
670
729
  :effective => true).length).to be 0
671
730
  expect(foobar_project.user_roles(foobar_user.id).length).to be 0
@@ -684,7 +743,7 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
684
743
  # Group initially has no roles in project
685
744
  expect(foobar_project.group_roles(foobar_group.id).length).to be 0
686
745
 
687
- expect(@id_v3.role_assignments.all(:user_id => foobar_user.id,
746
+ expect(@service.role_assignments.all(:user_id => foobar_user.id,
688
747
  :project_id => foobar_project.id,
689
748
  :effective => true).length).to be 0
690
749
 
@@ -694,7 +753,7 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
694
753
  expect(foobar_project.group_roles(foobar_group.id).length).to be 1
695
754
 
696
755
  # Now we check that a user has the role in that project
697
- assignments = @id_v3.role_assignments.all(:user_id => foobar_user.id,
756
+ assignments = @service.role_assignments.all(:user_id => foobar_user.id,
698
757
  :project_id => foobar_project.id,
699
758
  :effective => true)
700
759
  expect(assignments.length).to be 1
@@ -726,39 +785,39 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
726
785
  it "lists services" do
727
786
  VCR.use_cassette('idv3_service') do
728
787
 
729
- services = @id_v3.services
788
+ services = @service.services
730
789
  expect(services).to_not be_nil
731
790
  expect(services.length).to_not be 0
732
791
 
733
- services_all = @id_v3.services.all
792
+ services_all = @service.services.all
734
793
  expect(services_all).to_not be_nil
735
794
  expect(services_all.length).to_not be 0
736
795
 
737
- some_service = @id_v3.services.find_by_id services_all.first.id
796
+ some_service = @service.services.find_by_id services_all.first.id
738
797
  expect(some_service).to_not be_nil
739
798
 
740
- expect { @id_v3.services.find_by_id 'atlantis' }.to raise_error(Fog::Identity::OpenStack::NotFound)
799
+ expect { @service.services.find_by_id 'atlantis' }.to raise_error(Fog::Identity::OpenStack::NotFound)
741
800
  end
742
801
  end
743
802
 
744
803
  it "CRUD services" do
745
804
  VCR.use_cassette('idv3_services_crud') do
746
805
 
747
- all_services = @id_v3.services.all
806
+ all_services = @service.services.all
748
807
 
749
808
  begin
750
809
  # Create a service called foobar
751
- foobar_service = @id_v3.services.create(:type => 'volume', :name => 'foobar')
810
+ foobar_service = @service.services.create(:type => 'volume', :name => 'foobar')
752
811
  foobar_id = foobar_service.id
753
- expect(@id_v3.services.all(:type => 'volume').select { |service| service.name == 'foobar' }.length).to be 1
812
+ expect(@service.services.all(:type => 'volume').select { |service| service.name == 'foobar' }.length).to be 1
754
813
 
755
814
  # Rename it to baz
756
815
  foobar_service.update(:name => 'baz')
757
816
  expect(foobar_service.name).to eq 'baz'
758
817
 
759
818
  # Read the service freshly and check the name
760
- expect(@id_v3.services.all.select { |service| service.name == 'baz' }.length).to be 1
761
- baz_service = @id_v3.services.find_by_id foobar_id
819
+ expect(@service.services.all.select { |service| service.name == 'baz' }.length).to be 1
820
+ baz_service = @service.services.find_by_id foobar_id
762
821
  expect(baz_service).to_not be_nil
763
822
  expect(baz_service.name).to eq 'baz'
764
823
  expect(baz_service.type).to eq 'volume'
@@ -767,8 +826,8 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
767
826
  baz_service.destroy if baz_service
768
827
 
769
828
  # Check that the deletion worked
770
- expect { @id_v3.services.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound) if foobar_id
771
- expect(@id_v3.services.all.select { |service| ['foobar', 'baz'].include? service.name }.length).to be 0
829
+ expect { @service.services.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound) if foobar_id
830
+ expect(@service.services.all.select { |service| ['foobar', 'baz'].include? service.name }.length).to be 0
772
831
  end
773
832
  end
774
833
  end
@@ -776,36 +835,36 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
776
835
  it "lists endpoints" do
777
836
  VCR.use_cassette('idv3_endpoint') do
778
837
 
779
- endpoints = @id_v3.endpoints
838
+ endpoints = @service.endpoints
780
839
  expect(endpoints).to_not be_nil
781
840
  expect(endpoints.length).to_not be 0
782
841
 
783
- endpoints_all = @id_v3.endpoints.all
842
+ endpoints_all = @service.endpoints.all
784
843
  expect(endpoints_all).to_not be_nil
785
844
  expect(endpoints_all.length).to_not be 0
786
845
 
787
- some_endpoint = @id_v3.endpoints.find_by_id endpoints_all.first.id
846
+ some_endpoint = @service.endpoints.find_by_id endpoints_all.first.id
788
847
  expect(some_endpoint).to_not be_nil
789
848
 
790
- expect { @id_v3.endpoints.find_by_id 'atlantis' }.to raise_error(Fog::Identity::OpenStack::NotFound)
849
+ expect { @service.endpoints.find_by_id 'atlantis' }.to raise_error(Fog::Identity::OpenStack::NotFound)
791
850
  end
792
851
  end
793
852
 
794
853
  it "CRUD endpoints" do
795
854
  VCR.use_cassette('idv3_endpoints_crud') do
796
855
 
797
- service = @id_v3.services.all.first
798
- all_endpoints = @id_v3.endpoints.all
856
+ service = @service.services.all.first
857
+ all_endpoints = @service.endpoints.all
799
858
 
800
859
  begin
801
860
  # Create a endpoint called foobar
802
- foobar_endpoint = @id_v3.endpoints.create(:service_id => service.id,
861
+ foobar_endpoint = @service.endpoints.create(:service_id => service.id,
803
862
  :interface => 'internal',
804
863
  :name => 'foobar',
805
864
  :url => 'http://example.com/foobar',
806
865
  :enabled => false)
807
866
  foobar_id = foobar_endpoint.id
808
- expect(@id_v3.endpoints.all(:interface => 'internal').select { |endpoint| endpoint.name == 'foobar' }.length).to be 1
867
+ expect(@service.endpoints.all(:interface => 'internal').select { |endpoint| endpoint.name == 'foobar' }.length).to be 1
809
868
 
810
869
  # Rename it to baz
811
870
  foobar_endpoint.update(:name => 'baz', :url => 'http://example.com/baz')
@@ -813,8 +872,8 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
813
872
  expect(foobar_endpoint.url).to eq 'http://example.com/baz'
814
873
 
815
874
  # Read the endpoint freshly and check the name
816
- expect(@id_v3.endpoints.all(:interface => 'internal').select { |endpoint| endpoint.name == 'baz' }.length).to be 1
817
- baz_endpoint = @id_v3.endpoints.find_by_id foobar_id
875
+ expect(@service.endpoints.all(:interface => 'internal').select { |endpoint| endpoint.name == 'baz' }.length).to be 1
876
+ baz_endpoint = @service.endpoints.find_by_id foobar_id
818
877
  expect(baz_endpoint).to_not be_nil
819
878
  expect(baz_endpoint.name).to eq 'baz'
820
879
  expect(baz_endpoint.url).to eq 'http://example.com/baz'
@@ -824,21 +883,21 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
824
883
  baz_endpoint.destroy
825
884
 
826
885
  # Check that the deletion worked
827
- expect { @id_v3.endpoints.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound)
828
- expect(@id_v3.endpoints.all.select { |endpoint| ['foobar', 'baz'].include? endpoint.name }.length).to be 0
886
+ expect { @service.endpoints.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound)
887
+ expect(@service.endpoints.all.select { |endpoint| ['foobar', 'baz'].include? endpoint.name }.length).to be 0
829
888
  end
830
889
  end
831
890
  end
832
891
 
833
892
  it "lists OS credentials" do
834
893
  VCR.use_cassette('idv3_credential') do
835
- credentials = @id_v3.os_credentials
894
+ credentials = @service.os_credentials
836
895
  expect(credentials).to_not be_nil
837
896
 
838
- credentials_all = @id_v3.os_credentials.all
897
+ credentials_all = @service.os_credentials.all
839
898
  expect(credentials_all).to_not be_nil
840
899
 
841
- expect { @id_v3.os_credentials.find_by_id 'atlantis' }.to raise_error(Fog::Identity::OpenStack::NotFound)
900
+ expect { @service.os_credentials.find_by_id 'atlantis' }.to raise_error(Fog::Identity::OpenStack::NotFound)
842
901
  end
843
902
  end
844
903
 
@@ -847,10 +906,10 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
847
906
 
848
907
  begin
849
908
  # Create a user
850
- foobar_user = @id_v3.users.create(:name => 'u-foobar_cred',
909
+ foobar_user = @service.users.create(:name => 'u-foobar_cred',
851
910
  :email => 'foobar@example.com',
852
911
  :password => 's3cret!')
853
- project = @id_v3.projects.all.first
912
+ project = @service.projects.all.first
854
913
 
855
914
  access_key = '9c4e774a-f644-498f-90c4-970b3f817fc5'
856
915
  secret_key = '7e084117-b13d-4656-9eca-85376b690897'
@@ -860,18 +919,18 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
860
919
  :secret => secret_key}.to_json
861
920
 
862
921
  # Make sure there are no existing ec2 credentials
863
- @id_v3.os_credentials.all.select { |credential| credential.type == 'foo' || credential.type == 'ec2' }.each do |credential|
922
+ @service.os_credentials.all.select { |credential| credential.type == 'foo' || credential.type == 'ec2' }.each do |credential|
864
923
  credential.destroy
865
924
  end
866
- expect(@id_v3.os_credentials.all.select { |credential| credential.type == 'ec2' }.length).to be 0
925
+ expect(@service.os_credentials.all.select { |credential| credential.type == 'ec2' }.length).to be 0
867
926
 
868
927
  # Create a credential
869
- foo_credential = @id_v3.os_credentials.create(:type => 'ec2',
928
+ foo_credential = @service.os_credentials.create(:type => 'ec2',
870
929
  :project_id => project.id,
871
930
  :user_id => foobar_user.id,
872
931
  :blob => blob_json)
873
932
  credential_id = foo_credential.id
874
- expect(@id_v3.os_credentials.all.select { |credential| credential.type == 'ec2' }.length).to be 1
933
+ expect(@service.os_credentials.all.select { |credential| credential.type == 'ec2' }.length).to be 1
875
934
 
876
935
  # Update secret key
877
936
  new_secret_key = '62307bcd-ca3c-47ae-a114-27a6cadb5bc9'
@@ -881,14 +940,14 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
881
940
  expect(JSON.parse(foo_credential.blob)['secret']).to eq new_secret_key
882
941
 
883
942
  # Read the credential freshly and check the secret key
884
- expect(@id_v3.os_credentials.all.select { |credential| credential.type == 'ec2' }.length).to be 1
885
- updated_credential = @id_v3.os_credentials.find_by_id credential_id
943
+ expect(@service.os_credentials.all.select { |credential| credential.type == 'ec2' }.length).to be 1
944
+ updated_credential = @service.os_credentials.find_by_id credential_id
886
945
  expect(updated_credential).to_not be_nil
887
946
  expect(updated_credential.type).to eq 'ec2'
888
947
  expect(JSON.parse(updated_credential.blob)['secret']).to eq new_secret_key
889
948
 
890
949
  ensure
891
- foobar_user = @id_v3.users.find_by_name('u-foobar_cred').first unless foobar_user
950
+ foobar_user = @service.users.find_by_name('u-foobar_cred').first unless foobar_user
892
951
  foobar_user.destroy if foobar_user
893
952
  # Delete the credential
894
953
  begin
@@ -899,23 +958,23 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
899
958
  end
900
959
 
901
960
  # Check that the deletion worked
902
- expect { @id_v3.os_credentials.find_by_id credential_id }.to raise_error(Fog::Identity::OpenStack::NotFound) if credential_id
903
- expect(@id_v3.os_credentials.all.select { |credential| credential.type == 'ec2' }.length).to be 0
961
+ expect { @service.os_credentials.find_by_id credential_id }.to raise_error(Fog::Identity::OpenStack::NotFound) if credential_id
962
+ expect(@service.os_credentials.all.select { |credential| credential.type == 'ec2' }.length).to be 0
904
963
  end
905
964
  end
906
965
  end
907
966
 
908
967
  it "lists policies" do
909
968
  VCR.use_cassette('idv3_policy') do
910
- policies = @id_v3.policies
969
+ policies = @service.policies
911
970
  expect(policies).to_not be_nil
912
971
  expect(policies.length).to be 0
913
972
 
914
- policies_all = @id_v3.policies.all
973
+ policies_all = @service.policies.all
915
974
  expect(policies_all).to_not be_nil
916
975
  expect(policies_all.length).to be 0
917
976
 
918
- expect { @id_v3.policies.find_by_id 'atlantis' }.to raise_error(Fog::Identity::OpenStack::NotFound)
977
+ expect { @service.policies.find_by_id 'atlantis' }.to raise_error(Fog::Identity::OpenStack::NotFound)
919
978
  end
920
979
  end
921
980
 
@@ -925,13 +984,13 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
925
984
  blob = {'foobar_user' => ['role:compute-user']}.to_json
926
985
 
927
986
  # Make sure there are no existing policies
928
- expect(@id_v3.policies.all.select { |policy| policy.type == 'application/json' }.length).to be 0
987
+ expect(@service.policies.all.select { |policy| policy.type == 'application/json' }.length).to be 0
929
988
 
930
989
  # Create a policy
931
- foo_policy = @id_v3.policies.create(:type => 'application/json',
990
+ foo_policy = @service.policies.create(:type => 'application/json',
932
991
  :blob => blob)
933
992
  policy_id = foo_policy.id
934
- expect(@id_v3.policies.all.select { |policy| policy.type == 'application/json' }.length).to be 1
993
+ expect(@service.policies.all.select { |policy| policy.type == 'application/json' }.length).to be 1
935
994
 
936
995
  # Update policy blob
937
996
  new_blob = {'baz_user' => ['role:compute-user']}.to_json
@@ -939,8 +998,8 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
939
998
  expect(foo_policy.blob).to eq new_blob
940
999
 
941
1000
  # Read the policy freshly and check the secret key
942
- expect(@id_v3.policies.all.select { |policy| policy.type == 'application/json' }.length).to be 1
943
- updated_policy = @id_v3.policies.find_by_id policy_id
1001
+ expect(@service.policies.all.select { |policy| policy.type == 'application/json' }.length).to be 1
1002
+ updated_policy = @service.policies.find_by_id policy_id
944
1003
  expect(updated_policy).to_not be_nil
945
1004
  expect(updated_policy.type).to eq 'application/json'
946
1005
  expect(updated_policy.blob).to eq new_blob
@@ -949,8 +1008,8 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
949
1008
  updated_policy.destroy
950
1009
 
951
1010
  # Check that the deletion worked
952
- expect { @id_v3.policies.find_by_id policy_id }.to raise_error(Fog::Identity::OpenStack::NotFound)
953
- expect(@id_v3.policies.all.select { |policy| policy.type == 'application/json' }.length).to be 0
1011
+ expect { @service.policies.find_by_id policy_id }.to raise_error(Fog::Identity::OpenStack::NotFound)
1012
+ expect(@service.policies.all.select { |policy| policy.type == 'application/json' }.length).to be 0
954
1013
  end
955
1014
  end
956
1015