diff options
author | Andrey Pavlov <andrey-mp@yandex.ru> | 2016-08-19 15:32:35 +0300 |
---|---|---|
committer | Andrey Pavlov <andrey.mp@gmail.com> | 2016-10-12 10:11:58 +0300 |
commit | 5f9c53613a2e405f0893b6e707350805478b0c4a (patch) | |
tree | 4506dc00ecbc581610f1297a7a53caef3c372c00 | |
parent | 40786d508e7605c0bb950e07d8698e79546a9f11 (diff) | |
download | glance_store-5f9c53613a2e405f0893b6e707350805478b0c4a.tar.gz |
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
-rw-r--r-- | glance_store/_drivers/cinder.py | 27 | ||||
-rw-r--r-- | glance_store/tests/unit/test_cinder_store.py | 4 | ||||
-rw-r--r-- | glance_store/tests/unit/test_opts.py | 1 |
3 files changed, 28 insertions, 4 deletions
diff --git a/glance_store/_drivers/cinder.py b/glance_store/_drivers/cinder.py index 4e3ca1f..9d3b9ad 100644 --- a/glance_store/_drivers/cinder.py +++ b/glance_store/_drivers/cinder.py @@ -283,6 +283,25 @@ 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 diff --git a/glance_store/tests/unit/test_cinder_store.py b/glance_store/tests/unit/test_cinder_store.py index e1d1a58..d18a101 100644 --- a/glance_store/tests/unit/test_cinder_store.py +++ b/glance_store/tests/unit/test_cinder_store.py @@ -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') diff --git a/glance_store/tests/unit/test_opts.py b/glance_store/tests/unit/test_opts.py index ef73c4b..b00c9d5 100644 --- a/glance_store/tests/unit/test_opts.py +++ b/glance_store/tests/unit/test_opts.py @@ -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', |