fog 1.31.0 → 1.32.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +53 -0
  3. data/Rakefile +5 -5
  4. data/fog.gemspec +6 -5
  5. data/lib/fog/cloudstack/models/compute/network.rb +1 -0
  6. data/lib/fog/openstack/compute.rb +41 -98
  7. data/lib/fog/openstack/core.rb +257 -118
  8. data/lib/fog/openstack/identity.rb +4 -0
  9. data/lib/fog/openstack/identity_v3.rb +10 -41
  10. data/lib/fog/openstack/models/baremetal/chassis_collection.rb +10 -4
  11. data/lib/fog/openstack/models/baremetal/drivers.rb +4 -2
  12. data/lib/fog/openstack/models/baremetal/nodes.rb +10 -4
  13. data/lib/fog/openstack/models/baremetal/ports.rb +10 -4
  14. data/lib/fog/openstack/models/compute/addresses.rb +4 -2
  15. data/lib/fog/openstack/models/compute/aggregate.rb +64 -0
  16. data/lib/fog/openstack/models/compute/aggregates.rb +28 -0
  17. data/lib/fog/openstack/models/compute/flavors.rb +5 -0
  18. data/lib/fog/openstack/models/compute/hosts.rb +4 -2
  19. data/lib/fog/openstack/models/compute/images.rb +2 -0
  20. data/lib/fog/openstack/models/compute/key_pairs.rb +4 -2
  21. data/lib/fog/openstack/models/compute/security_groups.rb +4 -2
  22. data/lib/fog/openstack/models/compute/servers.rb +2 -0
  23. data/lib/fog/openstack/models/compute/services.rb +7 -4
  24. data/lib/fog/openstack/models/compute/snapshots.rb +15 -2
  25. data/lib/fog/openstack/models/compute/volumes.rb +15 -2
  26. data/lib/fog/openstack/models/identity_v2/ec2_credentials.rb +6 -3
  27. data/lib/fog/openstack/models/identity_v2/roles.rb +5 -3
  28. data/lib/fog/openstack/models/identity_v2/tenants.rb +5 -3
  29. data/lib/fog/openstack/models/identity_v2/users.rb +7 -3
  30. data/lib/fog/openstack/models/identity_v3/domains.rb +7 -6
  31. data/lib/fog/openstack/models/identity_v3/endpoints.rb +5 -4
  32. data/lib/fog/openstack/models/identity_v3/groups.rb +5 -3
  33. data/lib/fog/openstack/models/identity_v3/os_credentials.rb +5 -3
  34. data/lib/fog/openstack/models/identity_v3/policies.rb +5 -3
  35. data/lib/fog/openstack/models/identity_v3/project.rb +1 -0
  36. data/lib/fog/openstack/models/identity_v3/projects.rb +7 -5
  37. data/lib/fog/openstack/models/identity_v3/role_assignments.rb +10 -5
  38. data/lib/fog/openstack/models/identity_v3/roles.rb +11 -5
  39. data/lib/fog/openstack/models/identity_v3/services.rb +5 -3
  40. data/lib/fog/openstack/models/identity_v3/users.rb +4 -2
  41. data/lib/fog/openstack/models/image/images.rb +10 -4
  42. data/lib/fog/openstack/models/network/floating_ips.rb +2 -0
  43. data/lib/fog/openstack/models/network/lb_health_monitors.rb +2 -0
  44. data/lib/fog/openstack/models/network/lb_members.rb +2 -0
  45. data/lib/fog/openstack/models/network/lb_pools.rb +2 -0
  46. data/lib/fog/openstack/models/network/lb_vips.rb +2 -0
  47. data/lib/fog/openstack/models/network/networks.rb +2 -0
  48. data/lib/fog/openstack/models/network/port.rb +1 -0
  49. data/lib/fog/openstack/models/network/ports.rb +2 -0
  50. data/lib/fog/openstack/models/network/routers.rb +2 -0
  51. data/lib/fog/openstack/models/network/security_group_rules.rb +2 -0
  52. data/lib/fog/openstack/models/network/security_groups.rb +2 -0
  53. data/lib/fog/openstack/models/network/subnets.rb +2 -0
  54. data/lib/fog/openstack/models/orchestration/events.rb +10 -6
  55. data/lib/fog/openstack/models/orchestration/resources.rb +4 -2
  56. data/lib/fog/openstack/models/orchestration/stack.rb +1 -1
  57. data/lib/fog/openstack/models/orchestration/stacks.rb +9 -1
  58. data/lib/fog/openstack/models/planning/plans.rb +4 -2
  59. data/lib/fog/openstack/models/planning/roles.rb +5 -2
  60. data/lib/fog/openstack/models/storage/directories.rb +4 -2
  61. data/lib/fog/openstack/models/storage/files.rb +2 -0
  62. data/lib/fog/openstack/models/volume/volume.rb +1 -0
  63. data/lib/fog/openstack/models/volume/volume_types.rb +2 -0
  64. data/lib/fog/openstack/models/volume/volumes.rb +13 -2
  65. data/lib/fog/openstack/network.rb +18 -97
  66. data/lib/fog/openstack/orchestration.rb +2 -0
  67. data/lib/fog/openstack/requests/baremetal/list_chassis.rb +2 -8
  68. data/lib/fog/openstack/requests/baremetal/list_chassis_detailed.rb +3 -9
  69. data/lib/fog/openstack/requests/baremetal/list_drivers.rb +4 -3
  70. data/lib/fog/openstack/requests/baremetal/list_nodes.rb +3 -9
  71. data/lib/fog/openstack/requests/baremetal/list_nodes_detailed.rb +3 -9
  72. data/lib/fog/openstack/requests/baremetal/list_ports.rb +3 -9
  73. data/lib/fog/openstack/requests/baremetal/list_ports_detailed.rb +3 -9
  74. data/lib/fog/openstack/requests/compute/add_aggregate_host.rb +30 -0
  75. data/lib/fog/openstack/requests/compute/create_aggregate.rb +42 -0
  76. data/lib/fog/openstack/requests/compute/delete_aggregate.rb +28 -0
  77. data/lib/fog/openstack/requests/compute/get_aggregate.rb +26 -0
  78. data/lib/fog/openstack/requests/compute/list_aggregates.rb +36 -0
  79. data/lib/fog/openstack/requests/compute/list_all_addresses.rb +4 -3
  80. data/lib/fog/openstack/requests/compute/list_flavors.rb +6 -5
  81. data/lib/fog/openstack/requests/compute/list_hosts.rb +4 -3
  82. data/lib/fog/openstack/requests/compute/list_key_pairs.rb +4 -3
  83. data/lib/fog/openstack/requests/compute/list_security_groups.rb +15 -2
  84. data/lib/fog/openstack/requests/compute/list_snapshots.rb +18 -4
  85. data/lib/fog/openstack/requests/compute/list_snapshots_detail.rb +27 -0
  86. data/lib/fog/openstack/requests/compute/list_volumes.rb +18 -4
  87. data/lib/fog/openstack/requests/compute/list_volumes_detail.rb +25 -0
  88. data/lib/fog/openstack/requests/compute/remove_aggregate_host.rb +30 -0
  89. data/lib/fog/openstack/requests/compute/update_aggregate.rb +37 -0
  90. data/lib/fog/openstack/requests/compute/update_aggregate_metadata.rb +30 -0
  91. data/lib/fog/openstack/requests/identity_v2/list_ec2_credentials.rb +23 -7
  92. data/lib/fog/openstack/requests/identity_v2/list_roles.rb +5 -4
  93. data/lib/fog/openstack/requests/identity_v2/list_tenants.rb +14 -8
  94. data/lib/fog/openstack/requests/identity_v2/list_users.rb +16 -4
  95. data/lib/fog/openstack/requests/identity_v3/auth_domains.rb +2 -7
  96. data/lib/fog/openstack/requests/identity_v3/auth_projects.rb +6 -11
  97. data/lib/fog/openstack/requests/identity_v3/list_domains.rb +7 -14
  98. data/lib/fog/openstack/requests/identity_v3/list_endpoints.rb +7 -14
  99. data/lib/fog/openstack/requests/identity_v3/list_group_users.rb +5 -13
  100. data/lib/fog/openstack/requests/identity_v3/list_groups.rb +14 -24
  101. data/lib/fog/openstack/requests/identity_v3/list_os_credentials.rb +7 -12
  102. data/lib/fog/openstack/requests/identity_v3/list_policies.rb +7 -11
  103. data/lib/fog/openstack/requests/identity_v3/list_projects.rb +14 -25
  104. data/lib/fog/openstack/requests/identity_v3/list_role_assignments.rb +21 -17
  105. data/lib/fog/openstack/requests/identity_v3/list_roles.rb +7 -25
  106. data/lib/fog/openstack/requests/identity_v3/list_services.rb +7 -13
  107. data/lib/fog/openstack/requests/identity_v3/list_users.rb +7 -15
  108. data/lib/fog/openstack/requests/image/list_public_images.rb +4 -3
  109. data/lib/fog/openstack/requests/image/list_public_images_detailed.rb +9 -6
  110. data/lib/fog/openstack/requests/network/create_port.rb +12 -11
  111. data/lib/fog/openstack/requests/network/create_subnet.rb +7 -7
  112. data/lib/fog/openstack/requests/network/get_port.rb +1 -0
  113. data/lib/fog/openstack/requests/network/update_port.rb +7 -6
  114. data/lib/fog/openstack/requests/orchestration/list_events.rb +46 -0
  115. data/lib/fog/openstack/requests/orchestration/list_resource_events.rb +7 -2
  116. data/lib/fog/openstack/requests/orchestration/list_resource_types.rb +3 -2
  117. data/lib/fog/openstack/requests/orchestration/list_resources.rb +27 -4
  118. data/lib/fog/openstack/requests/orchestration/list_stack_data.rb +2 -2
  119. data/lib/fog/openstack/requests/orchestration/list_stack_data_detailed.rb +49 -0
  120. data/lib/fog/openstack/requests/orchestration/list_stack_events.rb +6 -2
  121. data/lib/fog/openstack/requests/planning/list_plans.rb +4 -3
  122. data/lib/fog/openstack/requests/planning/list_roles.rb +3 -9
  123. data/lib/fog/openstack/requests/volume/create_volume.rb +2 -1
  124. data/lib/fog/openstack/requests/volume/list_snapshots.rb +16 -3
  125. data/lib/fog/openstack/requests/volume/list_snapshots_detailed.rb +27 -0
  126. data/lib/fog/openstack/requests/volume/list_volume_types.rb +6 -6
  127. data/lib/fog/openstack/requests/volume/list_volumes.rb +20 -7
  128. data/lib/fog/openstack/requests/volume/list_volumes_detailed.rb +49 -0
  129. data/lib/fog/openstack/volume.rb +1 -0
  130. data/lib/fog/ovirt/models/compute/server.rb +1 -0
  131. data/lib/fog/ovirt/models/compute/template.rb +1 -0
  132. data/lib/fog/rackspace/docs/queues.md +2 -2
  133. data/lib/fog/rackspace/models/block_storage/snapshot.rb +5 -1
  134. data/lib/fog/version.rb +1 -1
  135. data/lib/fog/vsphere/requests/compute/vm_clone.rb +1 -1
  136. data/lib/tasks/changelog_task.rb +1 -0
  137. data/spec/fog/openstack/identity_v3/authv3_a.yml +55 -35
  138. data/spec/fog/openstack/identity_v3/authv3_b.yml +55 -35
  139. data/spec/fog/openstack/identity_v3/authv3_c.yml +159 -33
  140. data/spec/fog/openstack/identity_v3/authv3_project.yml +79 -35
  141. data/spec/fog/openstack/identity_v3/authv3_token.yml +377 -76
  142. data/spec/fog/openstack/identity_v3/authv3_unscoped.yml +298 -155
  143. data/spec/fog/openstack/identity_v3/authv3_unscoped_reauth.yml +371 -0
  144. data/spec/fog/openstack/identity_v3/idv3.yml +456 -41
  145. data/spec/fog/openstack/identity_v3/idv3_credential.yml +36 -30
  146. data/spec/fog/openstack/identity_v3/idv3_credential_crud.yml +223 -190
  147. data/spec/fog/openstack/identity_v3/idv3_domain.yml +64 -58
  148. data/spec/fog/openstack/identity_v3/idv3_domain_crud.yml +176 -393
  149. data/spec/fog/openstack/identity_v3/idv3_domain_group_roles_mutation.yml +277 -379
  150. data/spec/fog/openstack/identity_v3/idv3_domain_roles_mutation.yml +177 -204
  151. data/spec/fog/openstack/identity_v3/idv3_endpoint.yml +492 -174
  152. data/spec/fog/openstack/identity_v3/idv3_endpoints_crud.yml +669 -435
  153. data/spec/fog/openstack/identity_v3/idv3_group_crud_mutation.yml +378 -298
  154. data/spec/fog/openstack/identity_v3/idv3_other_region.yml +187 -0
  155. data/spec/fog/openstack/identity_v3/idv3_policy.yml +54 -46
  156. data/spec/fog/openstack/identity_v3/idv3_policy_crud.yml +137 -117
  157. data/spec/fog/openstack/identity_v3/idv3_project.yml +116 -86
  158. data/spec/fog/openstack/identity_v3/idv3_project_crud.yml +179 -387
  159. data/spec/fog/openstack/identity_v3/idv3_project_group_user_roles_mutation.yml +415 -556
  160. data/spec/fog/openstack/identity_v3/idv3_role.yml +108 -74
  161. data/spec/fog/openstack/identity_v3/idv3_role_crud.yml +160 -368
  162. data/spec/fog/openstack/identity_v3/idv3_service.yml +156 -94
  163. data/spec/fog/openstack/identity_v3/idv3_services_crud.yml +250 -306
  164. data/spec/fog/openstack/identity_v3/idv3_token.yml +195 -101
  165. data/spec/fog/openstack/identity_v3/idv3_user_crud.yml +276 -193
  166. data/spec/fog/openstack/identity_v3/idv3_users.yml +149 -219
  167. data/spec/fog/openstack/identity_v3_spec.rb +502 -474
  168. data/spec/fog/openstack/volume/volume_common_setup.yml +76 -0
  169. data/spec/fog/openstack/volume/volume_crud.yml +561 -0
  170. data/spec/fog/openstack/volume/volume_type_read.yml +120 -0
  171. data/spec/fog/openstack/volume_spec.rb +165 -0
  172. data/tests/openstack/requests/compute/aggregate_tests.rb +59 -0
  173. data/tests/openstack/requests/network/port_tests.rb +12 -11
  174. data/tests/openstack/requests/orchestration/stack_tests.rb +25 -0
  175. metadata +56 -14
  176. data/spec/fog/openstack/identity_v3/idv2_unscoped_token_v3.yml +0 -467
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7ef4e602225c238bc7f2eb32eba5e3a62e72a85c
4
- data.tar.gz: 9386d2f4f96563b804e0a82c59fc2d305a3df65b
3
+ metadata.gz: 7801c7c007b8ade9b3db8b3adbcccce77483a544
4
+ data.tar.gz: f4b0c047843cc79f845badafc9afeb2e9ba04167
5
5
  SHA512:
6
- metadata.gz: 60fb274b89ab1917b6b5efac3cbac481e4856c11b4d6b7a9b9bfa0a1d67e0a7cfe155980065501a05a2eef6adfa88471b39e6812fce323947e952fa9ca571340
7
- data.tar.gz: 8cecceddcc6ee4b41ac94a66d28c5b4148c63ca935b9a84b917034bb6e92c2d3e0b29c5c4f70433fee7129cf27ef91905ecd27a59300e3f8d044f5a881209977
6
+ metadata.gz: 444572699a31be8229aca465659aaabc11ddf16d81bfd103914561a82e11dc55f43ab57a2e254fd986eb53dbe4ef3b1f30dc9be25bc4ac09dded50eceb73dbc6
7
+ data.tar.gz: e74522ce110047b1f7bdeb6e4ae263ff5854fd4741d6af224dbded8046543196d26986cbb6e5d7b33717ed1ef848abb9bfac5932ca52f13f6490a2b6cc6909ad
@@ -1,3 +1,56 @@
1
+ ## 1.32.0 07/02/2015
2
+ *Hash* 3339ba764f099c1fab8c989510c427ac65dabeca
3
+
4
+ Statistic | Value
5
+ ------------- | --------:
6
+ Collaborators | 2
7
+ Downloads | 10420612
8
+ Forks | 1453
9
+ Open Issues | 83
10
+ Watchers | 3538
11
+
12
+ **MVP!** Ladislav Smola
13
+
14
+ #### [cloudstack]
15
+ * Use `isdefault` in `listNetworks` response. thanks Yamashita Yuu
16
+
17
+ #### [misc]
18
+ * Various fixes & tweaks for OpenStack Identity V3 API & related tests. thanks Darren Hague
19
+ * Clamp fog-ecloud at 0.1.1 because 0.1.2 was causing a Travis build failure. thanks Darren Hague
20
+ * Reintroduce user_domain and project_domain Refactor - move repetitive code from compute & network to core. Tweak VCR config and Rakefile to make sure tests are run correctly. thanks Darren Hague
21
+ * Fix ruby 1.8.7 failure. thanks Darren Hague
22
+ * Add missing reference to openstack_project_name & simplify test code a little. thanks Darren Hague
23
+ * Adding OpenStack Host Aggregate support. thanks Ladislav Smola
24
+ * OpenStack Baremetal list methods unified interface. thanks Ladislav Smola
25
+ * We need to move all list methods to unified interface, where only Hash is passed as a first argument. The hash can have specific fields, that will be recognized and deleted. Rest of the Hash goes directly to request :query. thanks Ladislav Smola
26
+ * OpenStack Keystone and Ironic change all to detailed list. thanks Ladislav Smola
27
+ * OpenStack Cinder, Swift and Tuskar list methods unified interface. thanks Ladislav Smola
28
+ * OpenStack Compute list methods unified interface. thanks Ladislav Smola
29
+ * OpenStack Glance and Heat list methods unified interface. thanks Ladislav Smola
30
+ * Minor bugs from list methods unification. thanks Ladislav Smola
31
+ * Missing network init uri. thanks Ladislav Smola
32
+ * OpenStack missing list unification of Network and Volume. thanks Ladislav Smola
33
+ * Openstack security groups list typo. thanks Ladislav Smola
34
+ * Don't remove nil keys in OpenStack#create_subnet. thanks Matt Darby
35
+ * Send :force flag in Snapshot payload. thanks Matt Darby
36
+ * OpenStack create_volume: add metadata option. thanks Maurice Schreiber
37
+ * OpenStack volume model: add metadata attribute. thanks Maurice Schreiber
38
+ * OpenStack port: add security groups to model and update request. thanks Maurice Schreiber
39
+ * include core in identity_v3 mock. thanks Maurice Schreiber
40
+ * correct mock format, when there is no input given. thanks Maurice Schreiber
41
+ * Bump fog-aws dependency. thanks Quentin de Metz
42
+ * add missing new method call to example. thanks Ryan King
43
+ * first bits of a spec for Fog::OpenStack::Volume. thanks Stefan Majewsky
44
+ * test the model create() method instead of the create_volume request. thanks Stefan Majewsky
45
+ * Fix typo in vm_clone. thanks alan
46
+ * bump fog-core dep. thanks geemus
47
+ * comment attribute in ovirt. thanks karmab
48
+ * support security-group by create port. thanks kazuhiko yamashita
49
+
50
+ #### [openstack]
51
+ * Minor bugfixes & cleanups in identity_v3 test code. thanks Darren Hague
52
+
53
+
1
54
  ## 1.31.0 06/05/2015
2
55
  *Hash* 8c653412b40dd82f82187b9710ccb9177dab3d98
3
56
 
data/Rakefile CHANGED
@@ -54,7 +54,7 @@ end
54
54
 
55
55
  GEM_NAME = "#{name}"
56
56
  task :default => :test
57
- task :travis => ['test', 'test:travis']
57
+ task :travis => ['test', 'test:travis', 'test:openstack_idv3']
58
58
 
59
59
  Rake::TestTask.new do |t|
60
60
  t.pattern = File.join("spec", "**", "*_spec.rb")
@@ -63,7 +63,10 @@ end
63
63
 
64
64
  namespace :test do
65
65
  mock = ENV['FOG_MOCK'] || 'true'
66
- task :travis do
66
+ task :openstack_idv3 do
67
+ sh("export FOG_MOCK=false && bundle exec rspec spec/fog/openstack/identity_v3_spec.rb")
68
+ end
69
+ task :travis => [:openstack_idv3] do
67
70
  sh("export FOG_MOCK=#{mock} && bundle exec shindont")
68
71
  end
69
72
  task :vsphere do
@@ -78,9 +81,6 @@ namespace :test do
78
81
  task :openstack do
79
82
  sh("export FOG_MOCK=#{mock} && bundle exec shindont tests/openstack")
80
83
  end
81
- task :openstack_idv3 do
82
- sh("export FOG_MOCK=#{mock} && bundle exec rspec spec/fog/openstack/identity_v3_spec.rb")
83
- end
84
84
  task :cloudstack do
85
85
  sh("export FOG_MOCK=#{mock} && bundle exec shindont tests/cloudstack")
86
86
  end
@@ -11,8 +11,8 @@ Gem::Specification.new do |s|
11
11
  ## If your rubyforge_project name is different, then edit it and comment out
12
12
  ## the sub! line in the Rakefile
13
13
  s.name = "fog"
14
- s.version = "1.31.0"
15
- s.date = "2015-06-04"
14
+ s.version = "1.32.0"
15
+ s.date = "2015-07-02"
16
16
  s.rubyforge_project = "fog"
17
17
 
18
18
  ## Make sure your summary is short. The description may be as long
@@ -44,7 +44,7 @@ Gem::Specification.new do |s|
44
44
  s.rdoc_options = ["--charset=UTF-8"]
45
45
  s.extra_rdoc_files = %w[README.md]
46
46
 
47
- s.add_dependency("fog-core", "~> 1.30")
47
+ s.add_dependency("fog-core", "~> 1.32")
48
48
  s.add_dependency("fog-json")
49
49
  s.add_dependency("fog-xml", "~> 0.1.1")
50
50
 
@@ -53,9 +53,9 @@ Gem::Specification.new do |s|
53
53
 
54
54
  # Modular providers (please keep sorted)
55
55
  s.add_dependency("fog-atmos")
56
- s.add_dependency("fog-aws", "~> 0.0")
56
+ s.add_dependency("fog-aws", ">= 0.6.0")
57
57
  s.add_dependency("fog-brightbox", "~> 0.4")
58
- s.add_dependency("fog-ecloud")
58
+ s.add_dependency("fog-ecloud", "= 0.1.1")
59
59
  s.add_dependency("fog-google", ">= 0.0.2")
60
60
  s.add_dependency("fog-local")
61
61
  s.add_dependency("fog-powerdns", ">= 0.1.1")
@@ -85,6 +85,7 @@ Gem::Specification.new do |s|
85
85
  s.add_development_dependency("thor")
86
86
  s.add_development_dependency("yard")
87
87
  s.add_development_dependency("rspec-core")
88
+ s.add_development_dependency("rspec-expectations")
88
89
  s.add_development_dependency("vcr")
89
90
  s.add_development_dependency("webmock")
90
91
 
@@ -38,6 +38,7 @@ module Fog
38
38
  attribute :canuse_for_deploy, :aliases => 'canusefordeploy'
39
39
  attribute :is_persistent, :aliases => 'ispersistent', :type => :boolean
40
40
  attribute :display_network, :aliases => 'displaynetwork'
41
+ attribute :is_default, :aliases => 'isdefault', :type => :boolean
41
42
 
42
43
  # restart network - will return a job
43
44
  def restart(options={})
@@ -10,12 +10,15 @@ module Fog
10
10
  :openstack_api_key, :openstack_username, :openstack_identity_endpoint,
11
11
  :current_user, :current_tenant, :openstack_region,
12
12
  :openstack_endpoint_type,
13
- :openstack_project_name,
14
- :openstack_project_domain, :openstack_user_domain
13
+ :openstack_project_name, :openstack_project_id,
14
+ :openstack_project_domain, :openstack_user_domain, :openstack_domain_name,
15
+ :openstack_project_domain_id, :openstack_user_domain_id, :openstack_domain_id
15
16
 
16
17
  ## MODELS
17
18
  #
18
19
  model_path 'fog/openstack/models/compute'
20
+ model :aggregate
21
+ collection :aggregates
19
22
  model :server
20
23
  collection :servers
21
24
  model :service
@@ -49,6 +52,17 @@ module Fog
49
52
  #
50
53
  request_path 'fog/openstack/requests/compute'
51
54
 
55
+ # Aggregate CRUD
56
+ request :list_aggregates
57
+ request :create_aggregate
58
+ request :update_aggregate
59
+ request :get_aggregate
60
+ request :update_aggregate
61
+ request :update_aggregate_metadata
62
+ request :add_aggregate_host
63
+ request :remove_aggregate_host
64
+ request :delete_aggregate
65
+
52
66
  # Server CRUD
53
67
  request :list_servers
54
68
  request :list_servers_detail
@@ -164,6 +178,7 @@ module Fog
164
178
 
165
179
  # Volume
166
180
  request :list_volumes
181
+ request :list_volumes_detail
167
182
  request :create_volume
168
183
  request :get_volume_details
169
184
  request :delete_volume
@@ -171,8 +186,10 @@ module Fog
171
186
  request :detach_volume
172
187
  request :get_server_volumes
173
188
 
189
+ # Snapshot
174
190
  request :create_volume_snapshot
175
191
  request :list_snapshots
192
+ request :list_snapshots_detail
176
193
  request :get_snapshot_details
177
194
  request :delete_snapshot
178
195
 
@@ -208,6 +225,15 @@ module Fog
208
225
  :security_groups => {},
209
226
  :addresses => {}
210
227
  },
228
+ :aggregates => [{
229
+ "availability_zone" => "nova",
230
+ "created_at" => "2012-11-16T06:22:23.032493",
231
+ "deleted" => false,
232
+ "deleted_at" => nil,
233
+ "id" => 1,
234
+ "name" => "name",
235
+ "updated_at" => nil
236
+ }],
211
237
  :images => {
212
238
  "0e09fbd6-43c5-448a-83e9-0d3d05f9747e" => {
213
239
  "id"=>"0e09fbd6-43c5-448a-83e9-0d3d05f9747e",
@@ -266,18 +292,14 @@ module Fog
266
292
  @data = nil
267
293
  end
268
294
 
269
- def initialize(options={})
270
- @openstack_username = options[:openstack_username]
271
- @openstack_user_domain = options[:openstack_user_domain] || options[:openstack_domain]
272
- @openstack_project_domain = options[:openstack_project_domain] || options[:openstack_domain] || 'Default'
273
- @openstack_auth_uri = URI.parse(options[:openstack_auth_url])
274
-
275
- @current_tenant = options[:openstack_tenant]
276
- @current_tenant_id = options[:openstack_tenant_id]
295
+ include Fog::OpenStack::Core
277
296
 
297
+ def initialize(options={})
278
298
  @auth_token = Fog::Mock.random_base64(64)
279
299
  @auth_token_expiration = (Time.now.utc + 86400).iso8601
280
300
 
301
+ initialize_identity options
302
+
281
303
  management_url = URI.parse(options[:openstack_auth_url])
282
304
  management_url.port = 8774
283
305
  management_url.path = '/v1.1/1'
@@ -296,77 +318,28 @@ module Fog
296
318
  self.class.data.delete("#{@openstack_username}-#{@current_tenant}")
297
319
  end
298
320
 
299
- def credentials
300
- { :provider => 'openstack',
301
- :openstack_auth_url => @openstack_auth_uri.to_s,
302
- :openstack_auth_token => @auth_token,
303
- :openstack_management_url => @openstack_management_url,
304
- :openstack_identity_endpoint => @openstack_identity_public_endpoint }
305
- end
306
321
  end
307
322
 
308
323
  class Real
309
- attr_reader :auth_token
310
- attr_reader :auth_token_expiration
311
- attr_reader :current_user
312
- attr_reader :current_tenant
313
- attr_reader :current_tenant_id
314
- attr_reader :openstack_user_domain
315
- attr_reader :openstack_project_domain
324
+
325
+ include Fog::OpenStack::Core
316
326
 
317
327
  def initialize(options={})
318
- @openstack_auth_token = options[:openstack_auth_token]
319
- @auth_token = options[:openstack_auth_token]
320
- @openstack_identity_public_endpoint = options[:openstack_identity_endpoint]
321
-
322
- unless @auth_token
323
- missing_credentials = Array.new
324
- @openstack_api_key = options[:openstack_api_key]
325
- @openstack_username = options[:openstack_username]
326
- @openstack_user_domain = options[:openstack_user_domain] || options[:openstack_domain]
327
- @openstack_project_domain = options[:openstack_project_domain] || options[:openstack_domain] || 'Default'
328
-
329
- missing_credentials << :openstack_api_key unless @openstack_api_key
330
- missing_credentials << :openstack_username unless @openstack_username
331
- raise ArgumentError, "Missing required arguments: #{missing_credentials.join(', ')}" unless missing_credentials.empty?
332
- end
328
+ initialize_identity options
333
329
 
334
- @openstack_tenant = options[:openstack_tenant]
335
- @openstack_tenant_id = options[:openstack_tenant_id]
336
- @openstack_user_domain = options[:openstack_user_domain] || options[:openstack_domain]
337
- @openstack_project_domain = options[:openstack_project_domain] || options[:openstack_domain] || 'Default'
338
- @openstack_auth_uri = URI.parse(options[:openstack_auth_url])
339
- @openstack_management_url = options[:openstack_management_url]
340
- @openstack_must_reauthenticate = false
330
+ @openstack_identity_service_type = options[:openstack_identity_service_type] || 'identity'
341
331
  @openstack_service_type = options[:openstack_service_type] || ['nova', 'compute']
342
332
  @openstack_service_name = options[:openstack_service_name]
343
- @openstack_identity_service_type = options[:openstack_identity_service_type] || 'identity'
344
- @openstack_endpoint_type = options[:openstack_endpoint_type] || 'publicURL'
345
- @openstack_region = options[:openstack_region]
346
333
 
347
334
  @connection_options = options[:connection_options] || {}
348
335
 
349
- @current_user = options[:current_user]
350
- @current_tenant = options[:current_tenant]
351
-
352
- authenticate
336
+ authenticate_compute
353
337
 
354
338
  @persistent = options[:persistent] || false
355
339
  @connection = Fog::Core::Connection.new("#{@scheme}://#{@host}:#{@port}", @persistent, @connection_options)
356
340
  end
357
341
 
358
- def credentials
359
- { :provider => 'openstack',
360
- :openstack_user_domain => @openstack_user_domain,
361
- :openstack_project_domain => @openstack_project_domain,
362
- :openstack_auth_url => @openstack_auth_uri.to_s,
363
- :openstack_auth_token => @auth_token,
364
- :openstack_management_url => @openstack_management_url,
365
- :openstack_identity_endpoint => @openstack_identity_public_endpoint,
366
- :openstack_region => @openstack_region,
367
- :current_user => @current_user,
368
- :current_tenant => @current_tenant }
369
- end
342
+
370
343
 
371
344
  def reload
372
345
  @connection.reset
@@ -386,7 +359,7 @@ module Fog
386
359
  rescue Excon::Errors::Unauthorized => error
387
360
  if error.response.body != 'Bad username or password' # token expiration
388
361
  @openstack_must_reauthenticate = true
389
- authenticate
362
+ authenticate_compute
390
363
  retry
391
364
  else # Bad Credentials
392
365
  raise error
@@ -409,35 +382,8 @@ module Fog
409
382
 
410
383
  private
411
384
 
412
- def authenticate
413
- if !@openstack_management_url || @openstack_must_reauthenticate
414
- options = {
415
- :openstack_api_key => @openstack_api_key,
416
- :openstack_username => @openstack_username,
417
- :openstack_user_domain => @openstack_user_domain,
418
- :openstack_project_domain => @openstack_project_domain,
419
- :openstack_auth_token => @openstack_must_reauthenticate ? nil : @auth_token,
420
- :openstack_auth_uri => @openstack_auth_uri,
421
- :openstack_region => @openstack_region,
422
- :openstack_tenant => @openstack_tenant,
423
- :openstack_tenant_id => @openstack_tenant_id,
424
- :openstack_service_type => @openstack_service_type,
425
- :openstack_service_name => @openstack_service_name,
426
- :openstack_identity_service_type => @openstack_identity_service_type,
427
- :openstack_endpoint_type => @openstack_endpoint_type
428
- }
429
-
430
- credentials = Fog::OpenStack.authenticate(options, @connection_options)
431
-
432
- @current_user = credentials[:user]
433
- @current_tenant = credentials[:tenant]
434
-
435
- @openstack_must_reauthenticate = false
436
- @auth_token = credentials[:token]
437
- @auth_token_expiration = credentials[:expires]
438
- @openstack_management_url = credentials[:server_management_url]
439
- @openstack_identity_public_endpoint = credentials[:identity_public_endpoint]
440
- end
385
+ def authenticate_compute
386
+ authenticate
441
387
 
442
388
  uri = URI.parse(@openstack_management_url)
443
389
  @host = uri.host
@@ -449,9 +395,6 @@ module Fog
449
395
  "OpenStack compute binding only supports version 2 (a.k.a. 1.1)")
450
396
  end
451
397
 
452
- @port = uri.port
453
- @scheme = uri.scheme
454
-
455
398
  # Not all implementations have identity service in the catalog
456
399
  if @openstack_identity_public_endpoint || @openstack_management_url
457
400
  @identity_connection = Fog::Core::Connection.new(
@@ -53,6 +53,127 @@ module Fog
53
53
  service(:baremetal, 'Baremetal')
54
54
  service(:planning, 'Planning')
55
55
 
56
+ module Core
57
+ attr_reader :auth_token
58
+ attr_reader :auth_token_expiration
59
+ attr_reader :current_user
60
+ attr_reader :current_tenant
61
+ attr_reader :openstack_domain_name
62
+ attr_reader :openstack_user_domain
63
+ attr_reader :openstack_project_domain
64
+ attr_reader :openstack_domain_id
65
+ attr_reader :openstack_user_domain_id
66
+ attr_reader :openstack_project_domain_id
67
+
68
+ def initialize_identity options
69
+ @openstack_auth_token = options[:openstack_auth_token]
70
+ @auth_token ||= options[:openstack_auth_token]
71
+ @openstack_identity_public_endpoint = options[:openstack_identity_endpoint]
72
+
73
+ @openstack_username = options[:openstack_username]
74
+ @openstack_userid = options[:openstack_userid]
75
+
76
+ @openstack_domain_name = options[:openstack_domain_name]
77
+ @openstack_user_domain = options[:openstack_user_domain]
78
+ @openstack_project_domain = options[:openstack_project_domain]
79
+ @openstack_domain_id = options[:openstack_domain_id]
80
+ @openstack_user_domain_id = options[:openstack_user_domain_id]
81
+ @openstack_project_domain_id = options[:openstack_project_domain_id]
82
+
83
+ @openstack_project_name = options[:openstack_project_name]
84
+ @openstack_tenant = options[:openstack_tenant]
85
+ @openstack_tenant_id = options[:openstack_tenant_id]
86
+
87
+ @openstack_auth_uri = URI.parse(options[:openstack_auth_url])
88
+
89
+ @openstack_management_url = options[:openstack_management_url]
90
+
91
+ @openstack_must_reauthenticate = false
92
+
93
+ @openstack_endpoint_type = options[:openstack_endpoint_type] || 'publicURL'
94
+ @openstack_region = options[:openstack_region]
95
+
96
+ unless @auth_token
97
+ missing_credentials = Array.new
98
+ @openstack_api_key = options[:openstack_api_key]
99
+ @openstack_username = options[:openstack_username]
100
+ @openstack_userid = options[:openstack_userid]
101
+
102
+ missing_credentials << :openstack_api_key unless @openstack_api_key
103
+ unless @openstack_username || @openstack_userid
104
+ missing_credentials << 'openstack_username or openstack_userid'
105
+ end
106
+ raise ArgumentError, "Missing required arguments: #{missing_credentials.join(', ')}" unless missing_credentials.empty?
107
+ end
108
+
109
+ @current_user = options[:current_user]
110
+ @current_tenant = options[:current_tenant]
111
+
112
+ end
113
+
114
+ def credentials
115
+ { :provider => 'openstack',
116
+ :openstack_domain_name => @openstack_domain_name,
117
+ :openstack_user_domain => @openstack_user_domain,
118
+ :openstack_project_domain => @openstack_project_domain,
119
+ :openstack_domain_id => @openstack_domain_id,
120
+ :openstack_user_domain_id => @openstack_user_domain_id,
121
+ :openstack_project_domain_id => @openstack_project_domain_id,
122
+ :openstack_auth_url => @openstack_auth_uri.to_s,
123
+ :openstack_auth_token => @auth_token,
124
+ :openstack_management_url => @openstack_management_url,
125
+ :openstack_identity_endpoint => @openstack_identity_public_endpoint,
126
+ :openstack_region => @openstack_region,
127
+ :current_user => @current_user,
128
+ :current_tenant => @current_tenant }
129
+ end
130
+
131
+ private
132
+ def authenticate
133
+ if !@openstack_management_url || @openstack_must_reauthenticate
134
+ options = {
135
+ :openstack_tenant => @openstack_tenant,
136
+ :openstack_tenant_id => @openstack_tenant_id,
137
+ :openstack_api_key => @openstack_api_key,
138
+ :openstack_username => @openstack_username,
139
+ :openstack_userid => @openstack_userid,
140
+ :openstack_user_domain => @openstack_user_domain,
141
+ :openstack_project_domain => @openstack_project_domain,
142
+ :openstack_user_domain_id => @openstack_user_domain_id,
143
+ :openstack_project_domain_id => @openstack_project_domain_id,
144
+ :openstack_domain_name => @openstack_domain_name,
145
+ :openstack_project_name => @openstack_project_name,
146
+ :openstack_domain_id => @openstack_domain_id,
147
+ :openstack_project_id => @openstack_project_id,
148
+ :openstack_auth_uri => @openstack_auth_uri,
149
+ :openstack_auth_token => @openstack_must_reauthenticate ? nil : @openstack_auth_token,
150
+ :openstack_service_type => @openstack_service_type,
151
+ :openstack_service_name => @openstack_service_name,
152
+ :openstack_endpoint_type => @openstack_endpoint_type,
153
+ :openstack_region => @openstack_region
154
+ }
155
+
156
+ credentials = Fog::OpenStack.authenticate(options, @connection_options)
157
+
158
+ @current_user = credentials[:user]
159
+ @current_tenant = credentials[:tenant]
160
+
161
+ @openstack_must_reauthenticate = false
162
+ @auth_token = credentials[:token]
163
+ @openstack_management_url = credentials[:server_management_url]
164
+ else
165
+ @auth_token = @openstack_auth_token
166
+ end
167
+ @openstack_management_uri = URI.parse(@openstack_management_url)
168
+
169
+ @host = @openstack_management_uri.host
170
+ @path = @openstack_management_uri.path
171
+ @port = @openstack_management_uri.port
172
+ @scheme = @openstack_management_uri.scheme
173
+ true
174
+ end
175
+ end
176
+
56
177
  def self.authenticate(options, connection_options = {})
57
178
  case options[:openstack_auth_uri].path
58
179
  when /v1(\.\d+)?/
@@ -175,8 +296,7 @@ module Fog
175
296
 
176
297
  # Keystone Style Auth
177
298
  def self.authenticate_v3(options, connection_options = {})
178
- uri = options[:openstack_auth_uri]
179
- tenant_name = options[:openstack_tenant]
299
+ uri = options[:openstack_auth_uri]
180
300
  project_name = options[:openstack_project_name]
181
301
  service_type = options[:openstack_service_type]
182
302
  service_name = options[:openstack_service_name]
@@ -184,11 +304,11 @@ module Fog
184
304
  endpoint_type = map_endpoint_type(options[:openstack_endpoint_type] || 'publicURL')
185
305
  openstack_region = options[:openstack_region]
186
306
 
187
- body, token_headers = retrieve_tokens_v3(options, connection_options)
307
+ token, body = retrieve_tokens_v3 options, connection_options
188
308
 
189
- service = get_service(body, service_type, service_name)
309
+ service = get_service_v3(body, service_type, service_name, openstack_region)
190
310
 
191
- options[:unscoped_token] = token_headers['X-Subject-Token']
311
+ options[:unscoped_token] = token
192
312
 
193
313
  unless service
194
314
  unless project_name
@@ -196,8 +316,8 @@ module Fog
196
316
  :expects => [200],
197
317
  :headers => {'Content-Type' => 'application/json',
198
318
  'Accept' => 'application/json',
199
- 'X-Auth-Token' => token_headers['X-Subject-Token']},
200
- :method => 'GET'
319
+ 'X-Auth-Token' => token},
320
+ :method => 'GET'
201
321
  }
202
322
  user_id = body['token']['user']['id']
203
323
  response = Fog::Core::Connection.new(
@@ -205,34 +325,34 @@ module Fog
205
325
 
206
326
  projects_body = Fog::JSON.decode(response.body)
207
327
  if projects_body['projects'].empty?
208
- raise Fog::Errors::NotFound.new('No Project Found')
328
+ options[:openstack_domain_id] = body['token']['user']['domain']['id']
209
329
  else
210
330
  options[:openstack_project_name] = projects_body['projects'].first['name']
211
- options[:openstack_domain_name] = body['token']['user']['domain']['name']
331
+ options[:openstack_domain_id] = projects_body['projects'].first['domain_id']
212
332
  end
213
333
  end
214
334
 
215
- tenant_name = options[:openstack_project_name]
335
+ token, body = retrieve_tokens_v3(options, connection_options)
336
+ service = get_service_v3(body, service_type, service_name, openstack_region)
337
+ end
216
338
 
217
- unless tenant_name
218
- response = Fog::Core::Connection.new(
219
- "#{uri.scheme}://#{uri.host}:#{uri.port}/v3/projects", false, connection_options).request({
220
- :expects => [200, 204],
221
- :headers => {'Content-Type' => 'application/json',
222
- 'Accept' => 'application/json',
223
- 'X-Auth-Token' => token_headers['X-Subject-Token']},
224
- :method => 'GET'
225
- })
226
- body = Fog::JSON.decode(response.body)
227
- if body['projects'].empty?
228
- raise Fog::Errors::NotFound.new('No Tenant Found')
229
- else
230
- options[:openstack_tenant] = body['projects'].first['name']
231
- end
339
+ unless service
340
+ available_services = body['token']['catalog'].map { |service|
341
+ service['type']
342
+ }.sort.join ', '
232
343
 
233
- end
234
- body, token_headers = retrieve_tokens_v3(options, connection_options)
235
- service = get_service(body, service_type, service_name)
344
+ available_regions = body['token']['catalog'].map { |service|
345
+ service['endpoints'].map { |endpoint|
346
+ endpoint['region']
347
+ }.uniq
348
+ }.uniq.sort.join ', '
349
+
350
+ missing = service_type.join ', '
351
+
352
+ message = "Could not find service #{missing}#{(' in region '+openstack_region) if openstack_region}."+
353
+ " Have #{available_services}#{(' in regions '+available_regions) if openstack_region}"
354
+
355
+ raise Fog::Errors::NotFound, message
236
356
  end
237
357
 
238
358
  service['endpoints'] = service['endpoints'].select do |endpoint|
@@ -243,48 +363,34 @@ module Fog
243
363
  raise Fog::Errors::NotFound.new("No endpoints available for region '#{openstack_region}'")
244
364
  end if openstack_region
245
365
 
246
- unless service
247
- available = body['token']['catalog'].map { |endpoint|
248
- endpoint['type']
249
- }.sort.join ', '
250
-
251
- missing = service_type.join ', '
252
-
253
- message = "Could not find service #{missing}. Have #{available}"
254
-
255
- raise Fog::Errors::NotFound, message
366
+ regions = service["endpoints"].map { |e| e['region'] }.uniq
367
+ if regions.count > 1
368
+ raise Fog::Errors::NotFound.new("Multiple regions available choose one of these '#{regions.join(',')}'")
256
369
  end
257
370
 
258
- admin = false
259
- body['token']['roles'].each do |r|
260
- admin = true if r["name"] == "admin"
261
- end
371
+ identity_service = get_service_v3(body, identity_service_type) if identity_service_type
262
372
 
263
- regions = service["endpoints"].map{ |e| e['region'] }.uniq
264
- if regions.count > 1 and not admin
265
- raise Fog::Errors::NotFound.new("Multiple regions available choose one of these '#{regions.join(',')}'")
266
- end
373
+ management_url = service['endpoints'].find { |e| e['interface']==endpoint_type }['url']
374
+ identity_url = identity_service['endpoints'].find { |e| e['interface']=='public' }['url'] if identity_service
267
375
 
268
- identity_service = get_service(body, identity_service_type) if identity_service_type
269
- tenant = body['token']['project']['name'] if body['token']['project']
270
- tenant = body['token']['user']['project']['name'] unless body['token']['project']
271
- user = body['token']['user']['name']
376
+ if body['token']['project']
377
+ tenant = body['token']['project']['name']
378
+ else
379
+ tenant = body['token']['user']['project']['name'] if body['token']['user']['project']
380
+ end
272
381
 
273
- management_url = service['endpoints'].find{|s| s["interface"][endpoint_type]}["url"]
274
- identity_url = identity_service['endpoints'].find{|s| s["interface"]["public"]}["url"] if identity_service
275
- {
276
- :user => user,
277
- :tenant => tenant,
278
- :identity_public_endpoint => identity_url,
279
- :server_management_url => management_url,
280
- :token => token_headers['X-Subject-Token'],
281
- :expires => body['token']['expires_at'],
282
- :current_user_id => body['token']['user']['id'],
283
- :unscoped_token => options[:unscoped_token]
382
+ return {
383
+ :user => body['token']['user']['name'],
384
+ :tenant => tenant,
385
+ :identity_public_endpoint => identity_url,
386
+ :server_management_url => management_url,
387
+ :token => token,
388
+ :expires => body['token']['expires_at'],
389
+ :current_user_id => body['token']['user']['id'],
390
+ :unscoped_token => options[:unscoped_token]
284
391
  }
285
392
  end
286
393
 
287
-
288
394
  def self.get_service(body, service_type=[], service_name=nil)
289
395
  if not body['access'].nil?
290
396
  body['access']['serviceCatalog'].find do |s|
@@ -340,87 +446,120 @@ module Fog
340
446
  end
341
447
 
342
448
  def self.retrieve_tokens_v3(options, connection_options = {})
343
- api_key = options[:openstack_api_key].to_s
344
- username = options[:openstack_username].to_s
345
- if options[:openstack_tenant_id]
346
- tenant_id = options[:openstack_tenant_id].to_s
347
- else
348
- tenant_name = options[:openstack_tenant].to_s
349
- end
350
- auth_token = options[:openstack_auth_token] || options[:unscoped_token]
351
- uri = options[:openstack_auth_uri]
352
- userdomain = options[:openstack_user_domain] || options[:openstack_domain] || 'Default'
353
- project_domain = options[:openstack_project_domain] || options[:openstack_domain] || 'Default'
449
+
450
+ api_key = options[:openstack_api_key].to_s
451
+ username = options[:openstack_username].to_s
452
+ userid = options[:openstack_userid]
453
+ domain_id = options[:openstack_domain_id]
454
+ domain_name = options[:openstack_domain_name]
455
+ project_domain = options[:openstack_project_domain]
456
+ project_domain_id = options[:openstack_project_domain_id]
457
+ user_domain = options[:openstack_user_domain]
458
+ user_domain_id = options[:openstack_user_domain_id]
459
+ project_name = options[:openstack_project_name]
460
+ project_id = options[:openstack_project_id]
461
+ auth_token = options[:openstack_auth_token] || options[:unscoped_token]
462
+ uri = options[:openstack_auth_uri]
354
463
 
355
464
  connection = Fog::Core::Connection.new(uri.to_s, false, connection_options)
356
- request_body = {:auth => Hash.new}
465
+ request_body = {:auth => {}}
466
+
467
+ scope = {}
468
+
469
+ if project_name || project_id
470
+ scope[:project] = if project_id.nil? then
471
+ if project_domain || project_domain_id
472
+ {:name => project_name, :domain => project_domain_id.nil? ? {:name => project_domain} : {:id => project_domain_id}}
473
+ else
474
+ {:name => project_name, :domain => domain_id.nil? ? {:name => domain_name} : {:id => domain_id}}
475
+ end
476
+ else
477
+ {:id => project_id}
478
+ end
479
+ elsif domain_name || domain_id
480
+ scope[:domain] = domain_id.nil? ? {:name => domain_name} : {:id => domain_id}
481
+ else
482
+ # unscoped token
483
+ end
357
484
 
358
485
  if auth_token
359
- request_body[:auth][:token] = {
360
- :id => auth_token
486
+ request_body[:auth][:identity] = {
487
+ :methods => %w{token},
488
+ :token => {
489
+ :id => auth_token
490
+ }
361
491
  }
362
492
  else
363
493
  request_body[:auth][:identity] = {
364
- :methods => ["password"],
365
- :password => {
366
- :user => {
367
- :name => username,
368
- :password => api_key
494
+ :methods => %w{password},
495
+ :password => {
496
+ :user => {
497
+ :password => api_key
498
+ }
369
499
  }
370
- }
371
500
  }
372
- unless tenant_id.nil?
373
- request_body[:auth][:scope] = {
374
- :project => {
375
- :id => tenant_id
376
- }
377
- }
501
+
502
+ if userid
503
+ request_body[:auth][:identity][:password][:user][:id] = userid
378
504
  else
379
- request_body[:auth][:scope] = {
380
- :project => {
381
- :name => tenant_name
382
- }
383
- }
384
- end
385
- unless userdomain.to_s.empty?
386
- request_body[:auth][:identity][:password][:user][:domain] = {
387
- :name => userdomain
388
- }
389
- end
390
- unless project_domain.to_s.empty?
391
- request_body[:auth][:scope][:project][:domain] = {
392
- :name => project_domain
393
- }
505
+ if user_domain || user_domain_id
506
+ request_body[:auth][:identity][:password][:user].merge! :domain => user_domain_id.nil? ? {:name => user_domain} : {:id => user_domain_id}
507
+ elsif domain_name || domain_id
508
+ request_body[:auth][:identity][:password][:user].merge! :domain => domain_id.nil? ? {:name => domain_name} : {:id => domain_id}
509
+ end
510
+ request_body[:auth][:identity][:password][:user][:name] = username
394
511
  end
512
+
395
513
  end
514
+ request_body[:auth][:scope] = scope unless scope.empty?
515
+
516
+ puts "request_body: #{request_body}" if user_domain=='Default2'
396
517
 
397
518
  response = connection.request({
398
- :expects => [201],
399
- :headers => {'Content-Type' => 'application/json'},
400
- :body => Fog::JSON.encode(request_body),
401
- :method => 'POST',
402
- :path => (uri.path and not uri.path.empty?) ? uri.path : 'v3'
403
- })
519
+ :expects => [201],
520
+ :headers => {'Content-Type' => 'application/json'},
521
+ :body => Fog::JSON.encode(request_body),
522
+ :method => 'POST',
523
+ :path => (uri.path and not uri.path.empty?) ? uri.path : 'v2.0'
524
+ })
525
+
526
+ puts "response.body: #{response.body}" if user_domain=='Default2'
527
+
528
+ [response.headers["X-Subject-Token"], Fog::JSON.decode(response.body)]
529
+ end
530
+
531
+ def self.get_service_v3(hash, service_type=[], service_name=nil, region=nil)
532
+
533
+ services = hash['token']['catalog'].find_all do |s|
534
+ if service_name.nil? or service_name.empty?
535
+ service_type.include?(s['type'])
536
+ else
537
+ service_type.include?(s['type']) and s['name'] == service_name
538
+ end
539
+ end if hash['token']['catalog']
540
+
541
+ services.find do |s|
542
+ region.nil? or s['endpoints'].any? { |ep| ep['region'] == region }
543
+ end if services
404
544
 
405
- return Fog::JSON.decode(response.body), response.headers
406
545
  end
407
546
 
408
547
  def self.get_supported_version(supported_versions, uri, auth_token, connection_options = {})
409
548
  connection = Fog::Core::Connection.new("#{uri.scheme}://#{uri.host}:#{uri.port}", false, connection_options)
410
549
  response = connection.request({
411
- :expects => [200, 204, 300],
412
- :headers => {'Content-Type' => 'application/json',
413
- 'Accept' => 'application/json',
414
- 'X-Auth-Token' => auth_token},
415
- :method => 'GET'
416
- })
550
+ :expects => [200, 204, 300],
551
+ :headers => {'Content-Type' => 'application/json',
552
+ 'Accept' => 'application/json',
553
+ 'X-Auth-Token' => auth_token},
554
+ :method => 'GET'
555
+ })
417
556
 
418
557
  body = Fog::JSON.decode(response.body)
419
558
  version = nil
420
559
  unless body['versions'].empty?
421
560
  supported_version = body['versions'].find do |x|
422
561
  x["id"].match(supported_versions) &&
423
- (x["status"] == "CURRENT" || x["status"] == "SUPPORTED")
562
+ (x["status"] == "CURRENT" || x["status"] == "SUPPORTED")
424
563
  end
425
564
  version = supported_version["id"] if supported_version
426
565
  end
@@ -433,7 +572,7 @@ module Fog
433
572
  end
434
573
 
435
574
  # CGI.escape, but without special treatment on spaces
436
- def self.escape(str,extra_exclude_chars = '')
575
+ def self.escape(str, extra_exclude_chars = '')
437
576
  str.gsub(/([^a-zA-Z0-9_.-#{extra_exclude_chars}]+)/) do
438
577
  '%' + $1.unpack('H2' * $1.bytesize).join('%').upcase
439
578
  end