Add cinder_volume_type to cinder store configuration

Some cinder backend can have several volume types to optimize
storage usage.
Adding this option allows to choose specific volume type in cinder
that can be optimized for images.
Now default_volume_type from cinder configuration is used for
volume creation but this solution is not so suitable for storing
images in cinder.

Closes-Bug: #1616556
Change-Id: I23a8cff7f7aa77acb418f5ad7dd785a893de8608
This commit is contained in:
Andrey Pavlov 2016-08-19 15:32:35 +03:00 committed by Andrey Pavlov
parent 40786d508e
commit 5f9c53613a
3 changed files with 28 additions and 4 deletions

View File

@ -282,6 +282,25 @@ Possible values:
Related options:
* None
""")),
cfg.StrOpt('cinder_volume_type',
default=None,
help=_("""
Volume type that will be used for volume creation in cinder.
Some cinder backends can have several volume types to optimize storage usage.
Adding this option allows an operator to choose a specific volume type
in cinder that can be optimized for images.
If this is not set, then the default volume type specified in the cinder
configuration will be used for volume creation.
Possible values:
* A valid volume type from cinder
Related options:
* None
""")),
]
@ -631,13 +650,15 @@ class Store(glance_store.driver.Store):
metadata = {'glance_image_id': image_id,
'image_size': str(image_size),
'image_owner': owner}
LOG.debug('Creating a new volume: image_size=%d size_gb=%d',
image_size, size_gb)
volume_type = self.conf.glance_store.cinder_volume_type
LOG.debug('Creating a new volume: image_size=%d size_gb=%d type=%s',
image_size, size_gb, volume_type or 'None')
if image_size == 0:
LOG.info(_LI("Since image size is zero, we will be doing "
"resize-before-write for each GB which "
"will be considerably slower than normal."))
volume = client.volumes.create(size_gb, name=name, metadata=metadata)
volume = client.volumes.create(size_gb, name=name, metadata=metadata,
volume_type=volume_type)
volume = self._wait_volume_status(volume, 'creating', 'available')
failed = True

View File

@ -279,6 +279,7 @@ class TestCinderStore(base.StoreBaseTest,
fake_client = FakeObject(auth_token=None, management_url=None)
fake_volume.manager.get.return_value = fake_volume
fake_volumes = FakeObject(create=mock.Mock(return_value=fake_volume))
self.config(cinder_volume_type='some_type')
@contextlib.contextmanager
def fake_open(client, volume, mode):
@ -303,7 +304,8 @@ class TestCinderStore(base.StoreBaseTest,
name='image-%s' % expected_image_id,
metadata={'image_owner': self.context.tenant,
'glance_image_id': expected_image_id,
'image_size': str(expected_size)})
'image_size': str(expected_size)},
volume_type='some_type')
def test_cinder_add(self):
fake_volume = mock.MagicMock(id=str(uuid.uuid4()), status='available')

View File

@ -82,6 +82,7 @@ class OptsTestCase(base.StoreBaseTest):
'cinder_store_user_name',
'cinder_store_password',
'cinder_store_project_name',
'cinder_volume_type',
'default_swift_reference',
'https_insecure',
'filesystem_store_datadir',