/glance/tests/unit/test_store_location.py

https://github.com/griddynamics/glance · Python · 284 lines · 190 code · 53 blank · 41 comment · 3 complexity · 31538f7eb2403dd230d3a2b20fbb4941 MD5 · raw file

  1. # vim: tabstop=4 shiftwidth=4 softtabstop=4
  2. # Copyright 2011 OpenStack, LLC
  3. # All Rights Reserved.
  4. #
  5. # Licensed under the Apache License, Version 2.0 (the "License"); you may
  6. # not use this file except in compliance with the License. You may obtain
  7. # a copy of the License at
  8. #
  9. # http://www.apache.org/licenses/LICENSE-2.0
  10. #
  11. # Unless required by applicable law or agreed to in writing, software
  12. # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  13. # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  14. # License for the specific language governing permissions and limitations
  15. # under the License.
  16. import unittest
  17. from glance.common import exception
  18. import glance.store
  19. import glance.store.location as location
  20. import glance.store.http
  21. import glance.store.filesystem
  22. import glance.store.swift
  23. import glance.store.s3
  24. glance.store.create_stores({})
  25. class TestStoreLocation(unittest.TestCase):
  26. def test_get_location_from_uri_back_to_uri(self):
  27. """
  28. Test that for various URIs, the correct Location
  29. object can be contructed and then the original URI
  30. returned via the get_store_uri() method.
  31. """
  32. good_store_uris = [
  33. 'https://user:pass@example.com:80/images/some-id',
  34. 'http://images.oracle.com/123456',
  35. 'swift://account:user:pass@authurl.com/container/obj-id',
  36. 'swift+https://account:user:pass@authurl.com/container/obj-id',
  37. 's3://accesskey:secretkey@s3.amazonaws.com/bucket/key-id',
  38. 's3://accesskey:secretwith/aslash@s3.amazonaws.com/bucket/key-id',
  39. 's3+http://accesskey:secret@s3.amazonaws.com/bucket/key-id',
  40. 's3+https://accesskey:secretkey@s3.amazonaws.com/bucket/key-id',
  41. 'file:///var/lib/glance/images/1']
  42. for uri in good_store_uris:
  43. loc = location.get_location_from_uri(uri)
  44. # The get_store_uri() method *should* return an identical URI
  45. # to the URI that is passed to get_location_from_uri()
  46. self.assertEqual(loc.get_store_uri(), uri)
  47. def test_bad_store_scheme(self):
  48. """
  49. Test that a URI with a non-existing scheme triggers exception
  50. """
  51. bad_uri = 'unknown://user:pass@example.com:80/images/some-id'
  52. self.assertRaises(exception.UnknownScheme,
  53. location.get_location_from_uri,
  54. bad_uri)
  55. def test_filesystem_store_location(self):
  56. """
  57. Test the specific StoreLocation for the Filesystem store
  58. """
  59. uri = 'file:///var/lib/glance/images/1'
  60. loc = glance.store.filesystem.StoreLocation({})
  61. loc.parse_uri(uri)
  62. self.assertEqual("file", loc.scheme)
  63. self.assertEqual("/var/lib/glance/images/1", loc.path)
  64. self.assertEqual(uri, loc.get_uri())
  65. bad_uri = 'fil://'
  66. self.assertRaises(Exception, loc.parse_uri, bad_uri)
  67. bad_uri = 'file://'
  68. self.assertRaises(exception.BadStoreUri, loc.parse_uri, bad_uri)
  69. def test_http_store_location(self):
  70. """
  71. Test the specific StoreLocation for the HTTP store
  72. """
  73. uri = 'http://example.com/images/1'
  74. loc = glance.store.http.StoreLocation({})
  75. loc.parse_uri(uri)
  76. self.assertEqual("http", loc.scheme)
  77. self.assertEqual("example.com", loc.netloc)
  78. self.assertEqual("/images/1", loc.path)
  79. self.assertEqual(uri, loc.get_uri())
  80. uri = 'https://example.com:8080/images/container/1'
  81. loc.parse_uri(uri)
  82. self.assertEqual("https", loc.scheme)
  83. self.assertEqual("example.com:8080", loc.netloc)
  84. self.assertEqual("/images/container/1", loc.path)
  85. self.assertEqual(uri, loc.get_uri())
  86. uri = 'https://user:password@example.com:8080/images/container/1'
  87. loc.parse_uri(uri)
  88. self.assertEqual("https", loc.scheme)
  89. self.assertEqual("example.com:8080", loc.netloc)
  90. self.assertEqual("user", loc.user)
  91. self.assertEqual("password", loc.password)
  92. self.assertEqual("/images/container/1", loc.path)
  93. self.assertEqual(uri, loc.get_uri())
  94. uri = 'https://user:@example.com:8080/images/1'
  95. loc.parse_uri(uri)
  96. self.assertEqual("https", loc.scheme)
  97. self.assertEqual("example.com:8080", loc.netloc)
  98. self.assertEqual("user", loc.user)
  99. self.assertEqual("", loc.password)
  100. self.assertEqual("/images/1", loc.path)
  101. self.assertEqual(uri, loc.get_uri())
  102. bad_uri = 'htt://'
  103. self.assertRaises(Exception, loc.parse_uri, bad_uri)
  104. bad_uri = 'http://'
  105. self.assertRaises(exception.BadStoreUri, loc.parse_uri, bad_uri)
  106. bad_uri = 'http://user@example.com:8080/images/1'
  107. self.assertRaises(exception.BadStoreUri, loc.parse_uri, bad_uri)
  108. def test_swift_store_location(self):
  109. """
  110. Test the specific StoreLocation for the Swift store
  111. """
  112. uri = 'swift://example.com/images/1'
  113. loc = glance.store.swift.StoreLocation({})
  114. loc.parse_uri(uri)
  115. self.assertEqual("swift", loc.scheme)
  116. self.assertEqual("example.com", loc.authurl)
  117. self.assertEqual("https://example.com", loc.swift_auth_url)
  118. self.assertEqual("images", loc.container)
  119. self.assertEqual("1", loc.obj)
  120. self.assertEqual(None, loc.user)
  121. self.assertEqual(uri, loc.get_uri())
  122. uri = 'swift+https://user:pass@authurl.com/images/1'
  123. loc.parse_uri(uri)
  124. self.assertEqual("swift+https", loc.scheme)
  125. self.assertEqual("authurl.com", loc.authurl)
  126. self.assertEqual("https://authurl.com", loc.swift_auth_url)
  127. self.assertEqual("images", loc.container)
  128. self.assertEqual("1", loc.obj)
  129. self.assertEqual("user", loc.user)
  130. self.assertEqual("pass", loc.key)
  131. self.assertEqual(uri, loc.get_uri())
  132. uri = 'swift+https://user:pass@authurl.com/v1/container/12345'
  133. loc.parse_uri(uri)
  134. self.assertEqual("swift+https", loc.scheme)
  135. self.assertEqual("authurl.com/v1", loc.authurl)
  136. self.assertEqual("https://authurl.com/v1", loc.swift_auth_url)
  137. self.assertEqual("container", loc.container)
  138. self.assertEqual("12345", loc.obj)
  139. self.assertEqual("user", loc.user)
  140. self.assertEqual("pass", loc.key)
  141. self.assertEqual(uri, loc.get_uri())
  142. uri = 'swift+http://account:user:pass@authurl.com/v1/container/12345'
  143. loc.parse_uri(uri)
  144. self.assertEqual("swift+http", loc.scheme)
  145. self.assertEqual("authurl.com/v1", loc.authurl)
  146. self.assertEqual("http://authurl.com/v1", loc.swift_auth_url)
  147. self.assertEqual("container", loc.container)
  148. self.assertEqual("12345", loc.obj)
  149. self.assertEqual("account:user", loc.user)
  150. self.assertEqual("pass", loc.key)
  151. self.assertEqual(uri, loc.get_uri())
  152. bad_uri = 'swif://'
  153. self.assertRaises(Exception, loc.parse_uri, bad_uri)
  154. bad_uri = 'swift://'
  155. self.assertRaises(exception.BadStoreUri, loc.parse_uri, bad_uri)
  156. bad_uri = 'swift://user@example.com:8080/images/1'
  157. self.assertRaises(exception.BadStoreUri, loc.parse_uri, bad_uri)
  158. bad_uri = 'swift://user:pass@http://example.com:8080/images/1'
  159. self.assertRaises(exception.BadStoreUri, loc.parse_uri, bad_uri)
  160. def test_s3_store_location(self):
  161. """
  162. Test the specific StoreLocation for the S3 store
  163. """
  164. uri = 's3://example.com/images/1'
  165. loc = glance.store.s3.StoreLocation({})
  166. loc.parse_uri(uri)
  167. self.assertEqual("s3", loc.scheme)
  168. self.assertEqual("example.com", loc.s3serviceurl)
  169. self.assertEqual("images", loc.bucket)
  170. self.assertEqual("1", loc.key)
  171. self.assertEqual(None, loc.accesskey)
  172. self.assertEqual(uri, loc.get_uri())
  173. uri = 's3+https://accesskey:pass@s3serviceurl.com/images/1'
  174. loc.parse_uri(uri)
  175. self.assertEqual("s3+https", loc.scheme)
  176. self.assertEqual("s3serviceurl.com", loc.s3serviceurl)
  177. self.assertEqual("images", loc.bucket)
  178. self.assertEqual("1", loc.key)
  179. self.assertEqual("accesskey", loc.accesskey)
  180. self.assertEqual("pass", loc.secretkey)
  181. self.assertEqual(uri, loc.get_uri())
  182. uri = 's3+https://accesskey:pass@s3serviceurl.com/v1/bucket/12345'
  183. loc.parse_uri(uri)
  184. self.assertEqual("s3+https", loc.scheme)
  185. self.assertEqual("s3serviceurl.com/v1", loc.s3serviceurl)
  186. self.assertEqual("bucket", loc.bucket)
  187. self.assertEqual("12345", loc.key)
  188. self.assertEqual("accesskey", loc.accesskey)
  189. self.assertEqual("pass", loc.secretkey)
  190. self.assertEqual(uri, loc.get_uri())
  191. uri = 's3://accesskey:pass/withslash@s3serviceurl.com/v1/bucket/12345'
  192. loc.parse_uri(uri)
  193. self.assertEqual("s3", loc.scheme)
  194. self.assertEqual("s3serviceurl.com/v1", loc.s3serviceurl)
  195. self.assertEqual("bucket", loc.bucket)
  196. self.assertEqual("12345", loc.key)
  197. self.assertEqual("accesskey", loc.accesskey)
  198. self.assertEqual("pass/withslash", loc.secretkey)
  199. self.assertEqual(uri, loc.get_uri())
  200. bad_uri = 's://'
  201. self.assertRaises(Exception, loc.parse_uri, bad_uri)
  202. bad_uri = 's3://'
  203. self.assertRaises(exception.BadStoreUri, loc.parse_uri, bad_uri)
  204. bad_uri = 's3://accesskey@example.com:8080/images/1'
  205. self.assertRaises(exception.BadStoreUri, loc.parse_uri, bad_uri)
  206. bad_uri = 's3://user:pass@http://example.com:8080/images/1'
  207. self.assertRaises(exception.BadStoreUri, loc.parse_uri, bad_uri)
  208. def test_get_store_from_scheme(self):
  209. """
  210. Test that the backend returned by glance.store.get_backend_class
  211. is correct or raises an appropriate error.
  212. """
  213. good_results = {
  214. 'swift': glance.store.swift.Store,
  215. 'swift+http': glance.store.swift.Store,
  216. 'swift+https': glance.store.swift.Store,
  217. 's3': glance.store.s3.Store,
  218. 's3+http': glance.store.s3.Store,
  219. 's3+https': glance.store.s3.Store,
  220. 'file': glance.store.filesystem.Store,
  221. 'filesystem': glance.store.filesystem.Store,
  222. 'http': glance.store.http.Store,
  223. 'https': glance.store.http.Store}
  224. for scheme, store in good_results.items():
  225. store_obj = glance.store.get_store_from_scheme(scheme)
  226. self.assertEqual(store_obj.__class__, store)
  227. bad_results = ['fil', 'swift+h', 'unknown']
  228. for store in bad_results:
  229. self.assertRaises(exception.UnknownScheme,
  230. glance.store.get_store_from_scheme,
  231. store)