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:
parent
40786d508e
commit
5f9c53613a
|
@ -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
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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',
|
||||
|
|
Loading…
Reference in New Issue