Merge "Ensure strings passed to librbd are not unicode" into stable/folsom

This commit is contained in:
Jenkins 2012-11-27 23:16:35 +00:00 committed by Gerrit Code Review
commit a4062940b8
2 changed files with 41 additions and 1 deletions

View File

@ -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)

View File

@ -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