Permalink
Browse files

Merge 0da0da5 into 4b21d69

  • Loading branch information...
2 parents 4b21d69 + 0da0da5 commit e169f525d7a96d25b6a7588eb4a28e9e12b662df @dhague dhague committed May 6, 2015
Showing with 17,373 additions and 1,595 deletions.
  1. +3 −0 Rakefile
  2. +3 −0 fog.gemspec
  3. +1 −1 lib/fog/openstack.rb
  4. +1 −1 lib/fog/openstack/baremetal.rb
  5. +1 −7 lib/fog/openstack/compute.rb
  6. +42 −7 lib/fog/openstack/core.rb
  7. +29 −254 lib/fog/openstack/identity.rb
  8. +264 −0 lib/fog/openstack/identity_v2.rb
  9. +249 −0 lib/fog/openstack/identity_v3.rb
  10. +1 −1 lib/fog/openstack/image.rb
  11. +1 −1 lib/fog/openstack/metering.rb
  12. +0 −44 lib/fog/openstack/models/identity/ec2_credential.rb
  13. +0 −53 lib/fog/openstack/models/identity/ec2_credentials.rb
  14. +0 −50 lib/fog/openstack/models/identity/role.rb
  15. +0 −20 lib/fog/openstack/models/identity/roles.rb
  16. +0 −62 lib/fog/openstack/models/identity/tenant.rb
  17. +0 −29 lib/fog/openstack/models/identity/tenants.rb
  18. +0 −69 lib/fog/openstack/models/identity/user.rb
  19. +0 −41 lib/fog/openstack/models/identity/users.rb
  20. +45 −0 lib/fog/openstack/models/identity_v2/ec2_credential.rb
  21. +55 −0 lib/fog/openstack/models/identity_v2/ec2_credentials.rb
  22. +52 −0 lib/fog/openstack/models/identity_v2/role.rb
  23. +22 −0 lib/fog/openstack/models/identity_v2/roles.rb
  24. +64 −0 lib/fog/openstack/models/identity_v2/tenant.rb
  25. +31 −0 lib/fog/openstack/models/identity_v2/tenants.rb
  26. +71 −0 lib/fog/openstack/models/identity_v2/user.rb
  27. +43 −0 lib/fog/openstack/models/identity_v2/users.rb
  28. +47 −0 lib/fog/openstack/models/identity_v3/domain.rb
  29. +36 −0 lib/fog/openstack/models/identity_v3/domains.rb
  30. +50 −0 lib/fog/openstack/models/identity_v3/endpoint.rb
  31. +27 −0 lib/fog/openstack/models/identity_v3/endpoints.rb
  32. +96 −0 lib/fog/openstack/models/identity_v3/group.rb
  33. +31 −0 lib/fog/openstack/models/identity_v3/groups.rb
  34. +73 −0 lib/fog/openstack/models/identity_v3/os_credential.rb
  35. +31 −0 lib/fog/openstack/models/identity_v3/os_credentials.rb
  36. +31 −0 lib/fog/openstack/models/identity_v3/policies.rb
  37. +46 −0 lib/fog/openstack/models/identity_v3/policy.rb
  38. +98 −0 lib/fog/openstack/models/identity_v3/project.rb
  39. +31 −0 lib/fog/openstack/models/identity_v3/projects.rb
  40. +45 −0 lib/fog/openstack/models/identity_v3/role.rb
  41. +22 −0 lib/fog/openstack/models/identity_v3/role_assignment.rb
  42. +22 −0 lib/fog/openstack/models/identity_v3/role_assignments.rb
  43. +35 −0 lib/fog/openstack/models/identity_v3/roles.rb
  44. +47 −0 lib/fog/openstack/models/identity_v3/service.rb
  45. +31 −0 lib/fog/openstack/models/identity_v3/services.rb
  46. +26 −0 lib/fog/openstack/models/identity_v3/token.rb
  47. +40 −0 lib/fog/openstack/models/identity_v3/tokens.rb
  48. +87 −0 lib/fog/openstack/models/identity_v3/user.rb
  49. +35 −0 lib/fog/openstack/models/identity_v3/users.rb
  50. +1 −9 lib/fog/openstack/network.rb
  51. +1 −6 lib/fog/openstack/orchestration.rb
  52. +1 −1 lib/fog/openstack/planning.rb
  53. +1 −1 lib/fog/openstack/requests/compute/create_security_group.rb
  54. +0 −34 lib/fog/openstack/requests/identity/add_user_to_tenant.rb
  55. +0 −20 lib/fog/openstack/requests/identity/check_token.rb
  56. +0 −57 lib/fog/openstack/requests/identity/create_ec2_credential.rb
  57. +0 −36 lib/fog/openstack/requests/identity/create_role.rb
  58. +0 −32 lib/fog/openstack/requests/identity/create_tenant.rb
  59. +0 −43 lib/fog/openstack/requests/identity/create_user.rb
  60. +0 −24 lib/fog/openstack/requests/identity/create_user_role.rb
  61. +0 −42 lib/fog/openstack/requests/identity/delete_ec2_credential.rb
  62. +0 −28 lib/fog/openstack/requests/identity/delete_role.rb
  63. +0 −31 lib/fog/openstack/requests/identity/delete_tenant.rb
  64. +0 −28 lib/fog/openstack/requests/identity/delete_user.rb
  65. +0 −23 lib/fog/openstack/requests/identity/delete_user_role.rb
  66. +0 −48 lib/fog/openstack/requests/identity/get_ec2_credential.rb
  67. +0 −28 lib/fog/openstack/requests/identity/get_role.rb
  68. +0 −31 lib/fog/openstack/requests/identity/get_tenant.rb
  69. +0 −18 lib/fog/openstack/requests/identity/get_tenants_by_id.rb
  70. +0 −18 lib/fog/openstack/requests/identity/get_tenants_by_name.rb
  71. +0 −32 lib/fog/openstack/requests/identity/get_user_by_id.rb
  72. +0 −27 lib/fog/openstack/requests/identity/get_user_by_name.rb
  73. +0 −43 lib/fog/openstack/requests/identity/list_ec2_credentials.rb
  74. +0 −18 lib/fog/openstack/requests/identity/list_endpoints_for_token.rb
  75. +0 −31 lib/fog/openstack/requests/identity/list_roles.rb
  76. +0 −30 lib/fog/openstack/requests/identity/list_roles_for_user_on_tenant.rb
  77. +0 −45 lib/fog/openstack/requests/identity/list_tenants.rb
  78. +0 −18 lib/fog/openstack/requests/identity/list_user_global_roles.rb
  79. +0 −33 lib/fog/openstack/requests/identity/list_users.rb
  80. +0 −20 lib/fog/openstack/requests/identity/remove_user_from_tenant.rb
  81. +0 −19 lib/fog/openstack/requests/identity/set_tenant.rb
  82. +0 −28 lib/fog/openstack/requests/identity/update_tenant.rb
  83. +0 −32 lib/fog/openstack/requests/identity/update_user.rb
  84. +0 −20 lib/fog/openstack/requests/identity/validate_token.rb
  85. +36 −0 lib/fog/openstack/requests/identity_v2/add_user_to_tenant.rb
  86. +22 −0 lib/fog/openstack/requests/identity_v2/check_token.rb
  87. +59 −0 lib/fog/openstack/requests/identity_v2/create_ec2_credential.rb
  88. +38 −0 lib/fog/openstack/requests/identity_v2/create_role.rb
  89. +34 −0 lib/fog/openstack/requests/identity_v2/create_tenant.rb
  90. +45 −0 lib/fog/openstack/requests/identity_v2/create_user.rb
  91. +26 −0 lib/fog/openstack/requests/identity_v2/create_user_role.rb
  92. +43 −0 lib/fog/openstack/requests/identity_v2/delete_ec2_credential.rb
  93. +30 −0 lib/fog/openstack/requests/identity_v2/delete_role.rb
  94. +33 −0 lib/fog/openstack/requests/identity_v2/delete_tenant.rb
  95. +30 −0 lib/fog/openstack/requests/identity_v2/delete_user.rb
  96. +25 −0 lib/fog/openstack/requests/identity_v2/delete_user_role.rb
  97. +50 −0 lib/fog/openstack/requests/identity_v2/get_ec2_credential.rb
  98. +30 −0 lib/fog/openstack/requests/identity_v2/get_role.rb
  99. +33 −0 lib/fog/openstack/requests/identity_v2/get_tenant.rb
  100. +20 −0 lib/fog/openstack/requests/identity_v2/get_tenants_by_id.rb
  101. +20 −0 lib/fog/openstack/requests/identity_v2/get_tenants_by_name.rb
  102. +34 −0 lib/fog/openstack/requests/identity_v2/get_user_by_id.rb
  103. +29 −0 lib/fog/openstack/requests/identity_v2/get_user_by_name.rb
  104. +45 −0 lib/fog/openstack/requests/identity_v2/list_ec2_credentials.rb
  105. +20 −0 lib/fog/openstack/requests/identity_v2/list_endpoints_for_token.rb
  106. +33 −0 lib/fog/openstack/requests/identity_v2/list_roles.rb
  107. +32 −0 lib/fog/openstack/requests/identity_v2/list_roles_for_user_on_tenant.rb
  108. +47 −0 lib/fog/openstack/requests/identity_v2/list_tenants.rb
  109. +20 −0 lib/fog/openstack/requests/identity_v2/list_user_global_roles.rb
  110. +35 −0 lib/fog/openstack/requests/identity_v2/list_users.rb
  111. +22 −0 lib/fog/openstack/requests/identity_v2/remove_user_from_tenant.rb
  112. +21 −0 lib/fog/openstack/requests/identity_v2/set_tenant.rb
  113. +30 −0 lib/fog/openstack/requests/identity_v2/update_tenant.rb
  114. +34 −0 lib/fog/openstack/requests/identity_v2/update_user.rb
  115. +22 −0 lib/fog/openstack/requests/identity_v2/validate_token.rb
  116. +20 −0 lib/fog/openstack/requests/identity_v3/add_user_to_group.rb
  117. +29 −0 lib/fog/openstack/requests/identity_v3/auth_domains.rb
  118. +29 −0 lib/fog/openstack/requests/identity_v3/auth_projects.rb
  119. +20 −0 lib/fog/openstack/requests/identity_v3/check_domain_group_role.rb
  120. +20 −0 lib/fog/openstack/requests/identity_v3/check_domain_user_role.rb
  121. +20 −0 lib/fog/openstack/requests/identity_v3/check_project_group_role.rb
  122. +20 −0 lib/fog/openstack/requests/identity_v3/check_project_user_role.rb
  123. +21 −0 lib/fog/openstack/requests/identity_v3/create_domain.rb
  124. +21 −0 lib/fog/openstack/requests/identity_v3/create_endpoint.rb
  125. +21 −0 lib/fog/openstack/requests/identity_v3/create_group.rb
  126. +21 −0 lib/fog/openstack/requests/identity_v3/create_os_credential.rb
  127. +21 −0 lib/fog/openstack/requests/identity_v3/create_policy.rb
  128. +21 −0 lib/fog/openstack/requests/identity_v3/create_project.rb
  129. +21 −0 lib/fog/openstack/requests/identity_v3/create_role.rb
  130. +21 −0 lib/fog/openstack/requests/identity_v3/create_service.rb
  131. +21 −0 lib/fog/openstack/requests/identity_v3/create_user.rb
  132. +20 −0 lib/fog/openstack/requests/identity_v3/delete_domain.rb
  133. +20 −0 lib/fog/openstack/requests/identity_v3/delete_endpoint.rb
  134. +20 −0 lib/fog/openstack/requests/identity_v3/delete_group.rb
  135. +20 −0 lib/fog/openstack/requests/identity_v3/delete_os_credential.rb
  136. +20 −0 lib/fog/openstack/requests/identity_v3/delete_policy.rb
  137. +20 −0 lib/fog/openstack/requests/identity_v3/delete_project.rb
  138. +20 −0 lib/fog/openstack/requests/identity_v3/delete_role.rb
  139. +20 −0 lib/fog/openstack/requests/identity_v3/delete_service.rb
  140. +20 −0 lib/fog/openstack/requests/identity_v3/delete_user.rb
  141. +23 −0 lib/fog/openstack/requests/identity_v3/get_domain.rb
  142. +23 −0 lib/fog/openstack/requests/identity_v3/get_endpoint.rb
  143. +23 −0 lib/fog/openstack/requests/identity_v3/get_group.rb
  144. +23 −0 lib/fog/openstack/requests/identity_v3/get_os_credential.rb
  145. +23 −0 lib/fog/openstack/requests/identity_v3/get_policy.rb
  146. +23 −0 lib/fog/openstack/requests/identity_v3/get_project.rb
  147. +23 −0 lib/fog/openstack/requests/identity_v3/get_role.rb
  148. +23 −0 lib/fog/openstack/requests/identity_v3/get_service.rb
  149. +23 −0 lib/fog/openstack/requests/identity_v3/get_user.rb
  150. +20 −0 lib/fog/openstack/requests/identity_v3/grant_domain_group_role.rb
  151. +20 −0 lib/fog/openstack/requests/identity_v3/grant_domain_user_role.rb
  152. +20 −0 lib/fog/openstack/requests/identity_v3/grant_project_group_role.rb
  153. +20 −0 lib/fog/openstack/requests/identity_v3/grant_project_user_role.rb
  154. +20 −0 lib/fog/openstack/requests/identity_v3/group_user_check.rb
  155. +23 −0 lib/fog/openstack/requests/identity_v3/list_domain_group_roles.rb
  156. +23 −0 lib/fog/openstack/requests/identity_v3/list_domain_user_roles.rb
  157. +31 −0 lib/fog/openstack/requests/identity_v3/list_domains.rb
  158. +31 −0 lib/fog/openstack/requests/identity_v3/list_endpoints.rb
  159. +32 −0 lib/fog/openstack/requests/identity_v3/list_group_users.rb
  160. +42 −0 lib/fog/openstack/requests/identity_v3/list_groups.rb
  161. +29 −0 lib/fog/openstack/requests/identity_v3/list_os_credentials.rb
  162. +28 −0 lib/fog/openstack/requests/identity_v3/list_policies.rb
  163. +23 −0 lib/fog/openstack/requests/identity_v3/list_project_group_roles.rb
  164. +23 −0 lib/fog/openstack/requests/identity_v3/list_project_user_roles.rb
  165. +42 −0 lib/fog/openstack/requests/identity_v3/list_projects.rb
  166. +35 −0 lib/fog/openstack/requests/identity_v3/list_role_assignments.rb
  167. +42 −0 lib/fog/openstack/requests/identity_v3/list_roles.rb
  168. +30 −0 lib/fog/openstack/requests/identity_v3/list_services.rb
  169. +23 −0 lib/fog/openstack/requests/identity_v3/list_user_groups.rb
  170. +23 −0 lib/fog/openstack/requests/identity_v3/list_user_projects.rb
  171. +32 −0 lib/fog/openstack/requests/identity_v3/list_users.rb
  172. +20 −0 lib/fog/openstack/requests/identity_v3/remove_user_from_group.rb
  173. +20 −0 lib/fog/openstack/requests/identity_v3/revoke_domain_group_role.rb
  174. +20 −0 lib/fog/openstack/requests/identity_v3/revoke_domain_user_role.rb
  175. +20 −0 lib/fog/openstack/requests/identity_v3/revoke_project_group_role.rb
  176. +20 −0 lib/fog/openstack/requests/identity_v3/revoke_project_user_role.rb
  177. +21 −0 lib/fog/openstack/requests/identity_v3/token_authenticate.rb
  178. +21 −0 lib/fog/openstack/requests/identity_v3/token_check.rb
  179. +21 −0 lib/fog/openstack/requests/identity_v3/token_revoke.rb
  180. +22 −0 lib/fog/openstack/requests/identity_v3/token_validate.rb
  181. +21 −0 lib/fog/openstack/requests/identity_v3/update_domain.rb
  182. +21 −0 lib/fog/openstack/requests/identity_v3/update_endpoint.rb
  183. +21 −0 lib/fog/openstack/requests/identity_v3/update_group.rb
  184. +21 −0 lib/fog/openstack/requests/identity_v3/update_os_credential.rb
  185. +21 −0 lib/fog/openstack/requests/identity_v3/update_policy.rb
  186. +21 −0 lib/fog/openstack/requests/identity_v3/update_project.rb
  187. +21 −0 lib/fog/openstack/requests/identity_v3/update_role.rb
  188. +21 −0 lib/fog/openstack/requests/identity_v3/update_service.rb
  189. +21 −0 lib/fog/openstack/requests/identity_v3/update_user.rb
  190. +1 −1 lib/fog/openstack/volume.rb
  191. +61 −0 spec/fog/openstack/identity_v3/authv3_a.yml
  192. +61 −0 spec/fog/openstack/identity_v3/authv3_b.yml
  193. +61 −0 spec/fog/openstack/identity_v3/authv3_c.yml
  194. +61 −0 spec/fog/openstack/identity_v3/authv3_project.yml
  195. +151 −0 spec/fog/openstack/identity_v3/authv3_token.yml
  196. +334 −0 spec/fog/openstack/identity_v3/authv3_unscoped.yml
  197. +467 −0 spec/fog/openstack/identity_v3/idv2_unscoped_token_v3.yml
  198. +61 −0 spec/fog/openstack/identity_v3/idv3.yml
  199. +111 −0 spec/fog/openstack/identity_v3/idv3_credential.yml
  200. +528 −0 spec/fog/openstack/identity_v3/idv3_credential_crud.yml
  201. +195 −0 spec/fog/openstack/identity_v3/idv3_domain.yml
  202. +686 −0 spec/fog/openstack/identity_v3/idv3_domain_crud.yml
  203. +906 −0 spec/fog/openstack/identity_v3/idv3_domain_group_roles_mutation.yml
  204. +505 −0 spec/fog/openstack/identity_v3/idv3_domain_roles_mutation.yml
  205. +303 −0 spec/fog/openstack/identity_v3/idv3_endpoint.yml
  206. +718 −0 spec/fog/openstack/identity_v3/idv3_endpoints_crud.yml
  207. +975 −0 spec/fog/openstack/identity_v3/idv3_group_crud_mutation.yml
  208. +147 −0 spec/fog/openstack/identity_v3/idv3_policy.yml
  209. +368 −0 spec/fog/openstack/identity_v3/idv3_policy_crud.yml
  210. +211 −0 spec/fog/openstack/identity_v3/idv3_project.yml
  211. +663 −0 spec/fog/openstack/identity_v3/idv3_project_crud.yml
  212. +1,378 −0 spec/fog/openstack/identity_v3/idv3_project_group_user_roles_mutation.yml
  213. +199 −0 spec/fog/openstack/identity_v3/idv3_role.yml
  214. +616 −0 spec/fog/openstack/identity_v3/idv3_role_crud.yml
  215. +223 −0 spec/fog/openstack/identity_v3/idv3_service.yml
  216. +562 −0 spec/fog/openstack/identity_v3/idv3_services_crud.yml
  217. +240 −0 spec/fog/openstack/identity_v3/idv3_token.yml
  218. +572 −0 spec/fog/openstack/identity_v3/idv3_user_crud.yml
  219. +393 −0 spec/fog/openstack/identity_v3/idv3_users.yml
  220. +929 −0 spec/fog/openstack/identity_v3_spec.rb
View
@@ -72,6 +72,9 @@ namespace :test do
task :openstack do
sh("export FOG_MOCK=#{mock} && bundle exec shindont tests/openstack")
end
+ task :openstack_idv3 do
+ sh("export FOG_MOCK=#{mock} && bundle exec rspec spec/fog/openstack/identity_v3_spec.rb")
+ end
task :cloudstack do
sh("export FOG_MOCK=#{mock} && bundle exec shindont tests/cloudstack")
end
View
@@ -84,6 +84,9 @@ Gem::Specification.new do |s|
s.add_development_dependency("simplecov")
s.add_development_dependency("thor")
s.add_development_dependency("yard")
+ s.add_development_dependency("rspec-core")
+ s.add_development_dependency("vcr")
+ s.add_development_dependency("webmock")
s.files = `git ls-files`.split("\n")
s.test_files = `git ls-files -- {spec,tests}/*`.split("\n")
@@ -1,5 +1,5 @@
require 'fog/openstack/compute'
-require 'fog/openstack/identity'
+require 'fog/openstack/identity_v2'
require 'fog/openstack/image'
require 'fog/openstack/metering'
require 'fog/openstack/network'
@@ -337,7 +337,7 @@ def authenticate
:openstack_endpoint_type => @openstack_endpoint_type
}
- credentials = Fog::OpenStack.authenticate_v2(options, @connection_options)
+ credentials = Fog::OpenStack.authenticate(options, @connection_options)
@current_user = credentials[:user]
@current_tenant = credentials[:tenant]
@@ -410,13 +410,7 @@ def authenticate
:openstack_endpoint_type => @openstack_endpoint_type
}
- if @openstack_auth_uri.path =~ /\/v2.0/
- credentials = Fog::OpenStack.authenticate_v2(options, @connection_options)
- elsif @openstack_auth_uri.path =~ /\/v3/
- credentials = Fog::OpenStack.authenticate_v3(options, @connection_options)
- else
- credentials = Fog::OpenStack.authenticate_v1(options, @connection_options)
- end
+ credentials = Fog::OpenStack.authenticate(options, @connection_options)
@current_user = credentials[:user]
@current_tenant = credentials[:tenant]
@@ -177,10 +177,11 @@ def self.authenticate_v2(options, connection_options = {})
def self.authenticate_v3(options, connection_options = {})
uri = options[:openstack_auth_uri]
tenant_name = options[:openstack_tenant]
+ project_name = options[:openstack_project_name]
service_type = options[:openstack_service_type]
service_name = options[:openstack_service_name]
identity_service_type = options[:openstack_identity_service_type]
- endpoint_type = (options[:openstack_endpoint_type] || 'public').to_s
+ endpoint_type = map_endpoint_type(options[:openstack_endpoint_type] || 'publicURL')
openstack_region = options[:openstack_region]
body, token_headers = retrieve_tokens_v3(options, connection_options)
@@ -190,6 +191,29 @@ def self.authenticate_v3(options, connection_options = {})
options[:unscoped_token] = token_headers['X-Subject-Token']
unless service
+ unless project_name
+ request_body = {
+ :expects => [200],
+ :headers => {'Content-Type' => 'application/json',
+ 'Accept' => 'application/json',
+ 'X-Auth-Token' => token_headers['X-Subject-Token']},
+ :method => 'GET'
+ }
+ user_id = body['token']['user']['id']
+ response = Fog::Core::Connection.new(
+ "#{uri.scheme}://#{uri.host}:#{uri.port}/v3/users/#{user_id}/projects", false, connection_options).request(request_body)
+
+ projects_body = Fog::JSON.decode(response.body)
+ if projects_body['projects'].empty?
+ raise Fog::Errors::NotFound.new('No Project Found')
+ else
+ options[:openstack_project_name] = projects_body['projects'].first['name']
+ options[:openstack_domain_name] = body['token']['user']['domain']['name']
+ end
+ end
+
+ tenant_name = options[:openstack_project_name]
+
unless tenant_name
response = Fog::Core::Connection.new(
"#{uri.scheme}://#{uri.host}:#{uri.port}/v3/projects", false, connection_options).request({
@@ -211,8 +235,6 @@ def self.authenticate_v3(options, connection_options = {})
service = get_service(body, service_type, service_name)
end
- endpoint_type = 'public'
-
service['endpoints'] = service['endpoints'].select do |endpoint|
endpoint['region'] == openstack_region && endpoint['interface'] == endpoint_type
end if openstack_region
@@ -238,13 +260,14 @@ def self.authenticate_v3(options, connection_options = {})
admin = true if r["name"] == "admin"
end
- if service['endpoints'].count > 1 and not admin
- regions = service["endpoints"].map{ |e| e['region'] }.uniq.join(',')
- raise Fog::Errors::NotFound.new("Multiple regions available choose one of these '#{regions}'")
+ regions = service["endpoints"].map{ |e| e['region'] }.uniq
+ if regions.count > 1 and not admin
+ raise Fog::Errors::NotFound.new("Multiple regions available choose one of these '#{regions.join(',')}'")
end
identity_service = get_service(body, identity_service_type) if identity_service_type
- tenant = body['token']['project']['name']
+ tenant = body['token']['project']['name'] if body['token']['project']
+ tenant = body['token']['user']['project']['name'] unless body['token']['project']
user = body['token']['user']['name']
management_url = service['endpoints'].find{|s| s["interface"][endpoint_type]}["url"]
@@ -411,5 +434,17 @@ def self.escape(str,extra_exclude_chars = '')
'%' + $1.unpack('H2' * $1.bytesize).join('%').upcase
end
end
+
+ def self.map_endpoint_type type
+ case type
+ when "publicURL"
+ "public"
+ when "internalURL"
+ "internal"
+ when "adminURL"
+ "admin"
+ end
+
+ end
end
end
Oops, something went wrong.

0 comments on commit e169f52

Please sign in to comment.