Merge "Ensure strings passed to librbd are not unicode" into stable/folsom
This commit is contained in:
commit
a4062940b8
|
@ -69,6 +69,9 @@ class StoreLocation(glance.store.location.StoreLocation):
|
|||
"""
|
||||
|
||||
def process_specs(self):
|
||||
# convert to ascii since librbd doesn't handle unicode
|
||||
for key, value in self.specs.iteritems():
|
||||
self.specs[key] = str(value)
|
||||
self.fsid = self.specs.get('fsid')
|
||||
self.pool = self.specs.get('pool')
|
||||
self.image = self.specs.get('image')
|
||||
|
@ -92,7 +95,14 @@ class StoreLocation(glance.store.location.StoreLocation):
|
|||
reason = _('URI must start with rbd://')
|
||||
LOG.error(_("Invalid URI: %(uri)s: %(reason)s") % locals())
|
||||
raise exception.BadStoreUri(message=reason)
|
||||
pieces = uri[len(prefix):].split('/')
|
||||
# convert to ascii since librbd doesn't handle unicode
|
||||
try:
|
||||
ascii_uri = str(uri)
|
||||
except UnicodeError:
|
||||
reason = _('URI contains non-ascii characters')
|
||||
LOG.error(_("Invalid URI: %(uri)s: %(reason)s") % locals())
|
||||
raise exception.BadStoreUri(message=reason)
|
||||
pieces = ascii_uri[len(prefix):].split('/')
|
||||
if len(pieces) == 1:
|
||||
self.fsid, self.pool, self.image, self.snapshot = \
|
||||
(None, None, pieces[0], None)
|
||||
|
|
|
@ -290,6 +290,15 @@ class TestStoreLocation(base.StoreClearingUnitTest):
|
|||
self.assertEqual(None, loc.pool)
|
||||
self.assertEqual(None, loc.snapshot)
|
||||
|
||||
uri = u'rbd://imagename'
|
||||
loc = glance.store.rbd.StoreLocation({})
|
||||
loc.parse_uri(uri)
|
||||
|
||||
self.assertEqual('imagename', loc.image)
|
||||
self.assertEqual(None, loc.fsid)
|
||||
self.assertEqual(None, loc.pool)
|
||||
self.assertEqual(None, loc.snapshot)
|
||||
|
||||
uri = 'rbd://fsid/pool/image/snap'
|
||||
loc = glance.store.rbd.StoreLocation({})
|
||||
loc.parse_uri(uri)
|
||||
|
@ -299,6 +308,15 @@ class TestStoreLocation(base.StoreClearingUnitTest):
|
|||
self.assertEqual('pool', loc.pool)
|
||||
self.assertEqual('snap', loc.snapshot)
|
||||
|
||||
uri = u'rbd://fsid/pool/image/snap'
|
||||
loc = glance.store.rbd.StoreLocation({})
|
||||
loc.parse_uri(uri)
|
||||
|
||||
self.assertEqual('image', loc.image)
|
||||
self.assertEqual('fsid', loc.fsid)
|
||||
self.assertEqual('pool', loc.pool)
|
||||
self.assertEqual('snap', loc.snapshot)
|
||||
|
||||
uri = 'rbd://%2f/%2f/%2f/%2f'
|
||||
loc = glance.store.rbd.StoreLocation({})
|
||||
loc.parse_uri(uri)
|
||||
|
@ -308,6 +326,15 @@ class TestStoreLocation(base.StoreClearingUnitTest):
|
|||
self.assertEqual('/', loc.pool)
|
||||
self.assertEqual('/', loc.snapshot)
|
||||
|
||||
uri = u'rbd://%2f/%2f/%2f/%2f'
|
||||
loc = glance.store.rbd.StoreLocation({})
|
||||
loc.parse_uri(uri)
|
||||
|
||||
self.assertEqual('/', loc.image)
|
||||
self.assertEqual('/', loc.fsid)
|
||||
self.assertEqual('/', loc.pool)
|
||||
self.assertEqual('/', loc.snapshot)
|
||||
|
||||
bad_uri = 'rbd:/image'
|
||||
self.assertRaises(exception.BadStoreUri, loc.parse_uri, bad_uri)
|
||||
|
||||
|
@ -332,6 +359,9 @@ class TestStoreLocation(base.StoreClearingUnitTest):
|
|||
bad_uri = 'http://///'
|
||||
self.assertRaises(exception.BadStoreUri, loc.parse_uri, bad_uri)
|
||||
|
||||
bad_uri = 'rbd://' + unichr(300)
|
||||
self.assertRaises(exception.BadStoreUri, loc.parse_uri, bad_uri)
|
||||
|
||||
def test_get_store_from_scheme(self):
|
||||
"""
|
||||
Test that the backend returned by glance.store.get_backend_class
|
||||
|
|
Loading…
Reference in New Issue