diff --git a/.zuul.yaml b/.zuul.yaml index d82293393c7e0ffb2bcacf298f415b00bfe965a7..828aa64509bf2fab69c37b24cf123786eadcf4b3 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -1,8 +1,16 @@ - project: + templates: + - openstack-python-jobs + - openstack-python35-jobs + - publish-openstack-sphinx-docs + - periodic-stable-jobs + - check-requirements + - integrated-gate + - integrated-gate-py35 + - release-notes-jobs check: jobs: - cinder-tempest-dsvm-lvm-lio-barbican - - cinder-tox-compliance - cinder-tox-bandit-baseline: voting: false - nova-multiattach @@ -22,9 +30,125 @@ - cinder-tox-py36 - cinder-rally-task: voting: false + - openstack-tox-pylint: + voting: false + timeout: 5400 + irrelevant-files: + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - devstack-plugin-ceph-tempest: + voting: false + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ + - openstack-tox-functional: + voting: false + irrelevant-files: + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - legacy-grenade-dsvm-cinder-mn-sub-volbak: + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ + - legacy-tempest-dsvm-lvm-multibackend: + voting: false + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ + - legacy-tempest-dsvm-full-drbd-devstack: + voting: false + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ + - legacy-tempest-dsvm-full-devstack-plugin-nfs: + voting: false + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ + - neutron-grenade: + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ gate: jobs: - - cinder-tox-compliance - nova-multiattach - openstack-tox-functional-py35: branches: ^(?!driverfixes/).*$ @@ -39,6 +163,40 @@ - ^releasenotes/.*$ - openstack-tox-lower-constraints + - legacy-grenade-dsvm-cinder-mn-sub-volbak: + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ + # TODO(mordred) fix this better + # - openstack-tox-pep8: + # nodeset: ubuntu-trusty + # branches: ^(?!driverfixes/mitaka).*$ + - neutron-grenade: + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ experimental: jobs: - tempest-cinder-v2-api: @@ -51,6 +209,144 @@ - ^contrib/block-box.*$ - ^doc/.*$ - ^releasenotes/.*$ + - legacy-tempest-dsvm-full-sheepdog-src-os-brick: + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ + - legacy-tempest-dsvm-zeromq-multibackend: + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ + - legacy-tempest-dsvm-multibackend-matrix: + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ + - legacy-grenade-dsvm-cinder-mn-sub-volschbak: + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ + - legacy-grenade-dsvm-cinder-mn-sub-bak: + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ + - devstack-plugin-ceph-tempest-py3: + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ + - legacy-tempest-dsvm-neutron-pg-full: + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ + - legacy-tempest-dsvm-neutron-full-opensuse-423: + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ + - legacy-tempest-dsvm-full-sheepdog: + irrelevant-files: + - ^(test-|)requirements.txt$ + - ^.*\.rst$ + - ^api-ref/.*$ + - ^cinder/hacking/.*$ + - ^cinder/locale/.*$ + - ^cinder/tests/functional.*$ + - ^cinder/tests/unit.*$ + - ^contrib/block-box.*$ + - ^doc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^tools/.*$ + - ^tox.ini$ + post: + jobs: + - publish-loci-cinder - job: # Previously named legacy-tempest-dsvm-full-lio name: cinder-tempest-dsvm-lvm-lio-barbican @@ -76,22 +372,6 @@ - ^releasenotes/.*$ - ^tools/.*$ -- job: - # Test that all drivers follow the defined interface - name: cinder-tox-compliance - parent: openstack-tox - timeout: 2400 - vars: - tox_envlist: compliance - required-projects: - - openstack/requirements - files: - - ^cinder/volume/driver.py - - ^cinder/volume/drivers/.*$ - - ^cinder/interface/.*$ - - ^cinder/backup/.*$ - - ^cinder/zonemanager/.*$ - - job: # Security testing for known issues name: cinder-tox-bandit-baseline @@ -119,7 +399,7 @@ parent: openstack-tox nodeset: ubuntu-bionic vars: - tox_envlist: functional-py36 + tox_envlist: functional-py36 irrelevant-files: - ^.*\.rst$ - ^api-ref/.*$ @@ -136,7 +416,7 @@ parent: openstack-tox nodeset: ubuntu-bionic vars: - tox_envlist: py36 + tox_envlist: py36 irrelevant-files: - ^.*\.rst$ - ^api-ref/.*$ diff --git a/cinder/api/validation/parameter_types.py b/cinder/api/validation/parameter_types.py index 80f1b07df3d4e0b252d795457cf33c75c4682f51..71d277cb7809ac7f9412c177c0c3273c4daa5edc 100644 --- a/cinder/api/validation/parameter_types.py +++ b/cinder/api/validation/parameter_types.py @@ -147,7 +147,7 @@ uuid = { extra_specs = { 'type': 'object', 'patternProperties': { - '^[a-zA-Z0-9-_:. ]{1,255}$': { + '^[a-zA-Z0-9-_:. /]{1,255}$': { 'type': 'string', 'maxLength': 255 } }, @@ -173,7 +173,7 @@ group_snapshot_status = { extra_specs_with_null = copy.deepcopy(extra_specs) extra_specs_with_null['patternProperties'][ - '^[a-zA-Z0-9-_:. ]{1,255}$']['type'] = ['string', 'null'] + '^[a-zA-Z0-9-_:. /]{1,255}$']['type'] = ['string', 'null'] name_allow_zero_min_length = { diff --git a/cinder/image/cache.py b/cinder/image/cache.py index ba90c1579d7cc3196e33840f15898cf3cece60b1..9a72f95ff82ba16966a3893a742d141429d09f3b 100644 --- a/cinder/image/cache.py +++ b/cinder/image/cache.py @@ -155,8 +155,10 @@ class ImageVolumeCache(object): 'count': current_count, 'max_count': self.max_cache_size_count}) - while ((current_size > self.max_cache_size_gb - or current_count > self.max_cache_size_count) + while (((current_size > self.max_cache_size_gb and + self.max_cache_size_gb > 0) + or (current_count > self.max_cache_size_count and + self.max_cache_size_count > 0)) and len(entries)): entry = entries.pop() LOG.debug('Reclaiming image-volume cache space; removing cache ' diff --git a/cinder/locale/ko_KR/LC_MESSAGES/cinder.po b/cinder/locale/ko_KR/LC_MESSAGES/cinder.po index cd616aa0cde17a4334b6068be7b1ef6871674401..fc3b3db2f84bde3d4d7ff0dfb09c26900f0cc10f 100644 --- a/cinder/locale/ko_KR/LC_MESSAGES/cinder.po +++ b/cinder/locale/ko_KR/LC_MESSAGES/cinder.po @@ -10,16 +10,17 @@ # Andreas Jaeger , 2016. #zanata # Ian Y. Choi , 2017. #zanata # Jaewook Oh , 2018. #zanata +# Sungwook Choi , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: cinder VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2018-08-09 06:04+0000\n" +"POT-Creation-Date: 2018-10-17 07:34+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2018-03-20 12:19+0000\n" -"Last-Translator: Jaewook Oh \n" +"PO-Revision-Date: 2018-10-18 11:31+0000\n" +"Last-Translator: Sungwook Choi \n" "Language: ko_KR\n" "Plural-Forms: nplurals=1; plural=0;\n" "Generated-By: Babel 2.0\n" @@ -409,6 +410,10 @@ msgstr "백업 RBD 조작이 실패함 " msgid "Backup already exists in database." msgstr "데이터베이스에 이미 백업이 있습니다. " +#, python-format +msgid "Backup driver reported an error: %(reason)s" +msgstr "백업 드라이버가 에러를 리포트하였습니다 : %(reason)s" + msgid "Backup id required" msgstr "백업 ID 필요" @@ -656,6 +661,10 @@ msgstr "" msgid "Can't parse backup record." msgstr "백업 레코드를 구문 분석할 수 없습니다. " +#, python-format +msgid "Canceled backup %(back_id)s restore on volume %(vol_id)s" +msgstr "취소된 백업 %(back_id)s이(가) %(vol_id)s 볼륨에 복원되었습니다." + #, python-format msgid "" "Cannot attach already attached volume %s; multiattach is disabled via the " @@ -835,6 +844,18 @@ msgstr "" "복제 유형 '%(clone_type)s'이(가) 올바르지 않습니다. 올바른 값: " "'%(full_clone)s' 및 '%(linked_clone)s'." +#, python-format +msgid "Cluster %(id)s could not be found." +msgstr "클러스터 %(id)s가 발견되지 않았습니다." + +#, python-format +msgid "Cluster %(id)s still has hosts." +msgstr "클러스터 %(id)s가 아직 호스트를 가지고 있습니다." + +#, python-format +msgid "Cluster %(name)s already exists." +msgstr "%(name)s(이)라는 클러스터가 이미 존재합니다." + msgid "" "Cluster is not formatted. You should probably perform \"dog cluster format\"." msgstr "" @@ -1984,6 +2005,10 @@ msgstr "구역 문자열을 형성하는 중에 예외 발생: %s." msgid "Exception: %s" msgstr "예외: %s" +#, python-format +msgid "Expected a UUID but received %(uuid)s." +msgstr "UUID가 필요하지만 %(uuid)s을/를 받았습니다." + #, python-format msgid "Expected exactly one node called \"%s\"" msgstr "\"%s\"(이)라는 정확히 하나의 노드만 필요" @@ -2988,6 +3013,18 @@ msgstr "Google Cloud Storage oauth2 실패: %(reason)s" msgid "Got bad path information from DRBDmanage! (%s)" msgstr "DRBDmanage에서 잘못된 경로 정보를 가져왔습니다(%s)! " +#, python-format +msgid "Group Type %(id)s already exists." +msgstr "%(id)s(이)라는 그룹 유형이 이미 존재합니다." + +#, python-format +msgid "Group type %(group_type_id)s could not be found." +msgstr "%(group_type_id)s 그룹 유형이 발견되지 않았습니다." + +#, python-format +msgid "Group type with name %(group_type_name)s could not be found." +msgstr "%(group_type_name)s라는 이름을 가진 그룹 유형이 발견되지 않았습니다." + msgid "HPELeftHand url not found" msgstr "HPELeftHand url을 찾을 수 없음" @@ -3581,6 +3618,10 @@ msgstr "" msgid "May specify only one of %s" msgstr "%s 중 하나만 지정할 수 있음 " +#, python-format +msgid "Message %(message_id)s could not be found." +msgstr "%(message_id)s 메시지가 발견되지 않았습니다." + msgid "Metadata backup already exists for this volume" msgstr "이 볼륨에 대한 메타데이터 백업이 이미 존재함" @@ -3979,6 +4020,10 @@ msgstr "" msgid "Pools %s does not exist" msgstr "Pools %s이(가) 존재하지 않음" +#, python-format +msgid "Programming error in Cinder: %(reason)s" +msgstr "Cinder에서 프로그래밍 에러 발생:%(reason)s" + msgid "Project ID" msgstr "프로젝트 ID" @@ -4704,6 +4749,10 @@ msgstr "보유 수는 %s 이하여야 합니다." msgid "The snapshot cannot be created when the volume is in maintenance mode." msgstr "볼륨이 유지보수 모드에 있으면 스냅샷을 작성할 수 없습니다. " +#, python-format +msgid "The snapshot is unavailable: %(data)s" +msgstr "스냅샷을 사용할 수 없습니다 : %(data)s" + msgid "The source volume for this WebDAV operation not found." msgstr "이 WebDAV 조작의 소스 볼륨을 찾을 수 없습니다." diff --git a/cinder/tests/functional/test_volumes.py b/cinder/tests/functional/test_volumes.py index e0a82b5418957f58092f196572621ec618c1f123..cb243b318fb1c6d8e9124953c0f821da20b10706 100644 --- a/cinder/tests/functional/test_volumes.py +++ b/cinder/tests/functional/test_volumes.py @@ -82,7 +82,8 @@ class VolumesTest(functional_helpers._FunctionalTestBase): # Create volume metadata = {'key1': 'value1', - 'key2': 'value2'} + 'key2': 'value2', + 'volume/created/by': 'cinder'} created_volume = self.api.post_volume( {'volume': {'size': 1, 'metadata': metadata}}) diff --git a/cinder/tests/unit/image/test_cache.py b/cinder/tests/unit/image/test_cache.py index 2e19a4b7b14fbb87045e7506f70cbc7566014868..1b23a58ce5861e403b3eaca4a754edfbed596b3a 100644 --- a/cinder/tests/unit/image/test_cache.py +++ b/cinder/tests/unit/image/test_cache.py @@ -236,7 +236,7 @@ class ImageVolumeCacheTestCase(test.TestCase): self.assertFalse(has_space) def test_ensure_space_need_gb(self): - cache = self._build_cache(max_gb=30, max_count=10) + cache = self._build_cache(max_gb=30, max_count=0) mock_delete = mock.patch.object(cache, '_delete_image_volume').start() entries = [] @@ -258,7 +258,7 @@ class ImageVolumeCacheTestCase(test.TestCase): self.context, cluster_name=self.volume_ovo.cluster_name) def test_ensure_space_need_count(self): - cache = self._build_cache(max_gb=30, max_count=2) + cache = self._build_cache(max_gb=0, max_count=2) mock_delete = mock.patch.object(cache, '_delete_image_volume').start() entries = [] diff --git a/cinder/tests/unit/volume/drivers/dell_emc/scaleio/mocks.py b/cinder/tests/unit/volume/drivers/dell_emc/scaleio/mocks.py index b3f2ea3b1e51433126704e40fd1005f14a25fe79..fa77cb3de3bec4039dff9573e8a95b3e4576abfe 100644 --- a/cinder/tests/unit/volume/drivers/dell_emc/scaleio/mocks.py +++ b/cinder/tests/unit/volume/drivers/dell_emc/scaleio/mocks.py @@ -40,7 +40,7 @@ class ScaleIODriver(driver.ScaleIODriver): def unmanage(self, volume): pass - def _is_volume_creation_safe(self, _pd, _sp, _pt): + def _is_volume_creation_safe(self, _pd, _sp): return True diff --git a/cinder/tests/unit/volume/drivers/dell_emc/vmax/test_vmax.py b/cinder/tests/unit/volume/drivers/dell_emc/vmax/test_vmax.py index 8fb63ce11ace71bdd9b120578a249529522341e5..e4a7214ea9ed1f1325fd36127df8eb1862cf4685 100644 --- a/cinder/tests/unit/volume/drivers/dell_emc/vmax/test_vmax.py +++ b/cinder/tests/unit/volume/drivers/dell_emc/vmax/test_vmax.py @@ -2408,19 +2408,6 @@ class VMAXRestTest(test.TestCase): init_list = self.rest.get_initiator_list(array) self.assertEqual([], init_list) - def test_get_in_use_initiator_list_from_array(self): - ref_list = self.data.initiator_list[2]['initiatorId'] - init_list = self.rest.get_in_use_initiator_list_from_array( - self.data.array) - self.assertEqual(ref_list, init_list) - - def test_get_in_use_initiator_list_from_array_failed(self): - array = self.data.array - with mock.patch.object(self.rest, 'get_initiator_list', - return_value=[]): - init_list = self.rest.get_in_use_initiator_list_from_array(array) - self.assertEqual([], init_list) - def test_get_initiator_group_from_initiator(self): initiator = self.data.wwpn1 ref_group = self.data.initiatorgroup_name_f @@ -6778,18 +6765,26 @@ class VMAXMaskingTest(test.TestCase): exception.VolumeBackendAPIException, self.driver_fc.masking.find_initiator_names, connector) - def test_find_initiator_group(self): + def test_find_initiator_group_found(self): with mock.patch.object( - rest.VMAXRest, 'get_in_use_initiator_list_from_array', + rest.VMAXRest, 'get_initiator_list', return_value=self.data.initiator_list[2]['initiatorId']): with mock.patch.object( - rest.VMAXRest, 'get_initiator_group_from_initiator', + rest.VMAXRest, 'get_initiator_group_from_initiator', return_value=self.data.initiator_list): found_init_group_nam = ( self.driver.masking._find_initiator_group( self.data.array, ['FA-1D:4:123456789012345'])) self.assertEqual(self.data.initiator_list, found_init_group_nam) + + def test_find_initiator_group_not_found(self): + with mock.patch.object( + rest.VMAXRest, 'get_initiator_list', + return_value=self.data.initiator_list[2]['initiatorId']): + with mock.patch.object( + rest.VMAXRest, 'get_initiator_group_from_initiator', + return_value=None): found_init_group_nam = ( self.driver.masking._find_initiator_group( self.data.array, ['Error'])) diff --git a/cinder/tests/unit/volume/drivers/hpe/test_hpe3par.py b/cinder/tests/unit/volume/drivers/hpe/test_hpe3par.py index 1b57575f4f12bf912358e9b6a41d7242d03b6357..19466394bc2246c316fee027e275d29f089349bc 100644 --- a/cinder/tests/unit/volume/drivers/hpe/test_hpe3par.py +++ b/cinder/tests/unit/volume/drivers/hpe/test_hpe3par.py @@ -2257,6 +2257,37 @@ class TestHPE3PARDriverBase(HPE3PARBaseDriver): expected + self.standard_logout) + def _FakeRetrying(wait_func=None, + original_retrying = hpecommon.utils.retrying.Retrying, + *args, **kwargs): + return original_retrying(wait_func=lambda *a, **k: 0, + *args, **kwargs) + + @mock.patch('retrying.Retrying', _FakeRetrying) + def test_delete_volume_online_active_done(self): + # setup_mock_client drive with default configuration + # and return the mock HTTP 3PAR client + mock_client = self.setup_driver() + ex = hpeexceptions.HTTPConflict("Online clone is active.") + ex._error_code = 151 + mock_client.deleteVolume = mock.Mock(side_effect=[ex, 200]) + mock_client.isOnlinePhysicalCopy.return_value = False + + with mock.patch.object(hpecommon.HPE3PARCommon, + '_create_client') as mock_create_client: + mock_create_client.return_value = mock_client + self.driver.delete_volume(self.volume) + + expected = [ + mock.call.deleteVolume(self.VOLUME_3PAR_NAME), + mock.call.isOnlinePhysicalCopy(self.VOLUME_3PAR_NAME), + mock.call.deleteVolume(self.VOLUME_3PAR_NAME)] + + mock_client.assert_has_calls( + self.standard_login + + expected + + self.standard_logout) + @mock.patch.object(volume_types, 'get_volume_type') def test_delete_volume_replicated(self, _mock_volume_types): # setup_mock_client drive with default configuration diff --git a/cinder/tests/unit/volume/drivers/netapp/dataontap/client/test_api.py b/cinder/tests/unit/volume/drivers/netapp/dataontap/client/test_api.py index 48d4372e30e81a319d26710989e5955d68c9a971..537f8996c9b432c606cf685090a77a30fa548312 100644 --- a/cinder/tests/unit/volume/drivers/netapp/dataontap/client/test_api.py +++ b/cinder/tests/unit/volume/drivers/netapp/dataontap/client/test_api.py @@ -21,6 +21,7 @@ Tests for NetApp API layer import ddt from lxml import etree import mock +from oslo_utils import netutils import paramiko import six from six.moves import urllib @@ -237,6 +238,25 @@ class NetAppApiServerTests(test.TestCase): self.root.send_http_request(na_element) + @ddt.data('192.168.1.0', '127.0.0.1', '0.0.0.0', + '::ffff:8', 'fdf8:f53b:82e4::53', '2001::1', + 'fe80::200::abcd', '2001:0000:4136:e378:8000:63bf:3fff:fdd2') + def test__get_url(self, host): + port = '80' + root = netapp_api.NaServer(host, port=port) + + protocol = root.TRANSPORT_TYPE_HTTP + url = root.URL_FILER + + if netutils.is_valid_ipv6(host): + host = netutils.escape_ipv6(host) + + result = '%s://%s:%s/%s' % (protocol, host, port, url) + + url = root._get_url() + + self.assertEqual(result, url) + class NetAppApiElementTransTests(test.TestCase): """Test case for NetApp API element translations.""" diff --git a/cinder/tests/unit/volume/drivers/netapp/dataontap/fakes.py b/cinder/tests/unit/volume/drivers/netapp/dataontap/fakes.py index 2c5219cedbc1280330ccfc04e4db33e89110b302..48f303a038a5ec646b1966a2c30ff5833262d088 100644 --- a/cinder/tests/unit/volume/drivers/netapp/dataontap/fakes.py +++ b/cinder/tests/unit/volume/drivers/netapp/dataontap/fakes.py @@ -30,8 +30,10 @@ HOST_NAME = 'fake.host.name' BACKEND_NAME = 'fake_backend_name' POOL_NAME = 'aggr1' SHARE_IP = '192.168.99.24' +IPV6_ADDRESS = 'fe80::6e40:8ff:fe8a:130' EXPORT_PATH = '/fake/export/path' NFS_SHARE = '%s:%s' % (SHARE_IP, EXPORT_PATH) +NFS_SHARE_IPV6 = '[%s]:%s' % (IPV6_ADDRESS, EXPORT_PATH) HOST_STRING = '%s@%s#%s' % (HOST_NAME, BACKEND_NAME, POOL_NAME) NFS_HOST_STRING = '%s@%s#%s' % (HOST_NAME, BACKEND_NAME, NFS_SHARE) AGGREGATE = 'aggr1' @@ -242,9 +244,7 @@ ISCSI_TARGET_DETAILS_LIST = [ ] IPV4_ADDRESS = '192.168.14.2' -IPV6_ADDRESS = 'fe80::6e40:8ff:fe8a:130' NFS_SHARE_IPV4 = IPV4_ADDRESS + ':' + EXPORT_PATH -NFS_SHARE_IPV6 = IPV6_ADDRESS + ':' + EXPORT_PATH RESERVED_PERCENTAGE = 7 MAX_OVER_SUBSCRIPTION_RATIO = 19.0 diff --git a/cinder/tests/unit/volume/drivers/netapp/dataontap/test_nfs_base.py b/cinder/tests/unit/volume/drivers/netapp/dataontap/test_nfs_base.py index 3cca4d986c8852ba740add3f8e4ccce33defa88c..e2de9d9e120cf484a616a42e0dca4f9f05186ee6 100644 --- a/cinder/tests/unit/volume/drivers/netapp/dataontap/test_nfs_base.py +++ b/cinder/tests/unit/volume/drivers/netapp/dataontap/test_nfs_base.py @@ -323,18 +323,16 @@ class NetAppNfsDriverTestCase(test.TestCase): self.driver._delete_file.assert_called_once_with(snapshot.volume_id, snapshot.name) - def test__get_volume_location(self): + @ddt.data(fake.NFS_SHARE, fake.NFS_SHARE_IPV6) + def test__get_volume_location(self, provider): volume_id = fake.VOLUME_ID - self.mock_object(self.driver, '_get_host_ip', - return_value='168.124.10.12') - self.mock_object(self.driver, '_get_export_path', - return_value='/fake_mount_path') + + self.mock_object(self.driver, '_get_provider_location', + return_value=provider) retval = self.driver._get_volume_location(volume_id) - self.assertEqual('168.124.10.12:/fake_mount_path', retval) - self.driver._get_host_ip.assert_called_once_with(volume_id) - self.driver._get_export_path.assert_called_once_with(volume_id) + self.assertEqual(provider, retval) def test__clone_backing_file_for_volume(self): self.assertRaises(NotImplementedError, @@ -507,34 +505,35 @@ class NetAppNfsDriverTestCase(test.TestCase): self.assertEqual(0, mock_delete.call_count) - def test_get_export_ip_path_volume_id_provided(self): - mock_get_host_ip = self.mock_object(self.driver, '_get_host_ip') - mock_get_host_ip.return_value = fake.IPV4_ADDRESS - - mock_get_export_path = self.mock_object( - self.driver, '_get_export_path') - mock_get_export_path.return_value = fake.EXPORT_PATH + @ddt.data((fake.NFS_SHARE, fake.SHARE_IP), + (fake.NFS_SHARE_IPV6, fake.IPV6_ADDRESS)) + @ddt.unpack + def test_get_export_ip_path_volume_id_provided(self, provider_location, + ip): + mock_get_host_ip = self.mock_object(self.driver, + '_get_provider_location') + mock_get_host_ip.return_value = provider_location - expected = (fake.IPV4_ADDRESS, fake.EXPORT_PATH) + expected = (ip, fake.EXPORT_PATH) result = self.driver._get_export_ip_path(fake.VOLUME_ID) self.assertEqual(expected, result) - def test_get_export_ip_path_share_provided(self): - expected = (fake.SHARE_IP, fake.EXPORT_PATH) + @ddt.data((fake.NFS_SHARE, fake.SHARE_IP, fake.EXPORT_PATH), + (fake.NFS_SHARE_IPV6, fake.IPV6_ADDRESS, fake.EXPORT_PATH)) + @ddt.unpack + def test_get_export_ip_path_share_provided(self, share, ip, path): + expected = (ip, path) - result = self.driver._get_export_ip_path(share=fake.NFS_SHARE) + result = self.driver._get_export_ip_path(share=share) self.assertEqual(expected, result) def test_get_export_ip_path_volume_id_and_share_provided(self): - mock_get_host_ip = self.mock_object(self.driver, '_get_host_ip') - mock_get_host_ip.return_value = fake.IPV4_ADDRESS - - mock_get_export_path = self.mock_object( - self.driver, '_get_export_path') - mock_get_export_path.return_value = fake.EXPORT_PATH + mock_get_host_ip = self.mock_object(self.driver, + '_get_provider_location') + mock_get_host_ip.return_value = fake.NFS_SHARE_IPV4 expected = (fake.IPV4_ADDRESS, fake.EXPORT_PATH) @@ -547,26 +546,6 @@ class NetAppNfsDriverTestCase(test.TestCase): self.assertRaises(exception.InvalidInput, self.driver._get_export_ip_path) - def test_get_host_ip(self): - mock_get_provider_location = self.mock_object( - self.driver, '_get_provider_location') - mock_get_provider_location.return_value = fake.NFS_SHARE - expected = fake.SHARE_IP - - result = self.driver._get_host_ip(fake.VOLUME_ID) - - self.assertEqual(expected, result) - - def test_get_export_path(self): - mock_get_provider_location = self.mock_object( - self.driver, '_get_provider_location') - mock_get_provider_location.return_value = fake.NFS_SHARE - expected = fake.EXPORT_PATH - - result = self.driver._get_export_path(fake.VOLUME_ID) - - self.assertEqual(expected, result) - def test_construct_image_url_loc(self): img_loc = fake.FAKE_IMAGE_LOCATION diff --git a/cinder/tests/unit/volume/drivers/netapp/dataontap/test_nfs_cmode.py b/cinder/tests/unit/volume/drivers/netapp/dataontap/test_nfs_cmode.py index 421ece1b19a2a43460aa0489cdda1b9473c27776..e43c7c612ca914b3fdb62fff8d226f3d28e957f6 100644 --- a/cinder/tests/unit/volume/drivers/netapp/dataontap/test_nfs_cmode.py +++ b/cinder/tests/unit/volume/drivers/netapp/dataontap/test_nfs_cmode.py @@ -1129,18 +1129,20 @@ class NetAppCmodeNfsDriverTestCase(test.TestCase): fake.EXPORT_PATH, fake.IMAGE_FILE_ID, fake.VOLUME['name'], fake.VSERVER_NAME, dest_exists=True) - def test_get_source_ip_and_path(self): + @ddt.data((fake.NFS_SHARE, fake.SHARE_IP), + (fake.NFS_SHARE_IPV6, fake.IPV6_ADDRESS)) + @ddt.unpack + def test_get_source_ip_and_path(self, share, ip): self.driver._get_ip_verify_on_cluster = mock.Mock( - return_value=fake.SHARE_IP) + return_value=ip) src_ip, src_path = self.driver._get_source_ip_and_path( - fake.NFS_SHARE, fake.IMAGE_FILE_ID) + share, fake.IMAGE_FILE_ID) - self.assertEqual(fake.SHARE_IP, src_ip) + self.assertEqual(ip, src_ip) assert_path = fake.EXPORT_PATH + '/' + fake.IMAGE_FILE_ID self.assertEqual(assert_path, src_path) - self.driver._get_ip_verify_on_cluster.assert_called_once_with( - fake.SHARE_IP) + self.driver._get_ip_verify_on_cluster.assert_called_once_with(ip) def test_get_destination_ip_and_path(self): self.driver._get_ip_verify_on_cluster = mock.Mock( diff --git a/cinder/tests/unit/volume/drivers/netapp/fakes.py b/cinder/tests/unit/volume/drivers/netapp/fakes.py index ebbead0aa99071d66454c50a227cac599f437f2e..6f74f55ae210d96135f93530845a6f7542128970 100644 --- a/cinder/tests/unit/volume/drivers/netapp/fakes.py +++ b/cinder/tests/unit/volume/drivers/netapp/fakes.py @@ -24,17 +24,19 @@ ISCSI_FAKE_LUN_ID = 1 ISCSI_FAKE_IQN = 'iqn.1993-08.org.debian:01:10' -ISCSI_FAKE_ADDRESS = '10.63.165.216' +ISCSI_FAKE_ADDRESS_IPV4 = '10.63.165.216' +ISCSI_FAKE_ADDRESS_IPV6 = 'fe80::72a4:a152:aad9:30d9' ISCSI_FAKE_PORT = '2232' ISCSI_FAKE_VOLUME = {'id': 'fake_id'} ISCSI_FAKE_TARGET = {} -ISCSI_FAKE_TARGET['address'] = ISCSI_FAKE_ADDRESS +ISCSI_FAKE_TARGET['address'] = ISCSI_FAKE_ADDRESS_IPV4 ISCSI_FAKE_TARGET['port'] = ISCSI_FAKE_PORT ISCSI_FAKE_VOLUME = {'id': 'fake_id', 'provider_auth': 'None stack password'} +ISCSI_FAKE_VOLUME_NO_AUTH = {'id': 'fake_id', 'provider_auth': ''} FC_ISCSI_TARGET_INFO_DICT = {'target_discovered': False, 'target_portal': '10.63.165.216:2232', @@ -44,6 +46,13 @@ FC_ISCSI_TARGET_INFO_DICT = {'target_discovered': False, 'auth_method': 'None', 'auth_username': 'stack', 'auth_password': 'password'} +FC_ISCSI_TARGET_INFO_DICT_IPV6 = {'target_discovered': False, + 'target_portal': + '[fe80::72a4:a152:aad9:30d9]:2232', + 'target_iqn': ISCSI_FAKE_IQN, + 'target_lun': ISCSI_FAKE_LUN_ID, + 'volume_id': ISCSI_FAKE_VOLUME['id']} + VOLUME_NAME = 'fake_volume_name' VOLUME_ID = 'fake_volume_id' VOLUME_TYPE_ID = 'fake_volume_type_id' diff --git a/cinder/tests/unit/volume/drivers/netapp/test_utils.py b/cinder/tests/unit/volume/drivers/netapp/test_utils.py index 8f98aa2f3f7cf07b68e2da3873f554bda7c98097..85478004c2c2be24ba9ce39769eddbdad6fcc2ad 100644 --- a/cinder/tests/unit/volume/drivers/netapp/test_utils.py +++ b/cinder/tests/unit/volume/drivers/netapp/test_utils.py @@ -38,6 +38,7 @@ from cinder.volume import qos_specs from cinder.volume import volume_types +@ddt.ddt class NetAppDriverUtilsTestCase(test.TestCase): @mock.patch.object(na_utils, 'LOG', mock.Mock()) @@ -121,7 +122,7 @@ class NetAppDriverUtilsTestCase(test.TestCase): actual_properties = na_utils.get_iscsi_connection_properties( fake.ISCSI_FAKE_LUN_ID, fake.ISCSI_FAKE_VOLUME, - fake.ISCSI_FAKE_IQN, fake.ISCSI_FAKE_ADDRESS, + fake.ISCSI_FAKE_IQN, fake.ISCSI_FAKE_ADDRESS_IPV4, fake.ISCSI_FAKE_PORT) actual_properties_mapped = actual_properties['data'] @@ -134,7 +135,7 @@ class NetAppDriverUtilsTestCase(test.TestCase): actual_properties = na_utils.get_iscsi_connection_properties( FAKE_LUN_ID, fake.ISCSI_FAKE_VOLUME, fake.ISCSI_FAKE_IQN, - fake.ISCSI_FAKE_ADDRESS, fake.ISCSI_FAKE_PORT) + fake.ISCSI_FAKE_ADDRESS_IPV4, fake.ISCSI_FAKE_PORT) actual_properties_mapped = actual_properties['data'] @@ -145,9 +146,17 @@ class NetAppDriverUtilsTestCase(test.TestCase): self.assertRaises(TypeError, na_utils.get_iscsi_connection_properties, FAKE_LUN_ID, fake.ISCSI_FAKE_VOLUME, - fake.ISCSI_FAKE_IQN, fake.ISCSI_FAKE_ADDRESS, + fake.ISCSI_FAKE_IQN, fake.ISCSI_FAKE_ADDRESS_IPV4, fake.ISCSI_FAKE_PORT) + def test_iscsi_connection_properties_ipv6(self): + actual_properties = na_utils.get_iscsi_connection_properties( + '1', fake.ISCSI_FAKE_VOLUME_NO_AUTH, fake.ISCSI_FAKE_IQN, + fake.ISCSI_FAKE_ADDRESS_IPV6, fake.ISCSI_FAKE_PORT) + + self.assertDictEqual(actual_properties['data'], + fake.FC_ISCSI_TARGET_INFO_DICT_IPV6) + def test_get_volume_extra_specs(self): fake_extra_specs = {'fake_key': 'fake_value'} fake_volume_type = {'extra_specs': fake_extra_specs} @@ -538,6 +547,29 @@ class NetAppDriverUtilsTestCase(test.TestCase): self.assertIsNone(result) + @ddt.data(("192.168.99.24:/fake/export/path", "192.168.99.24", + "/fake/export/path"), + ("127.0.0.1:/", "127.0.0.1", "/"), + ("[f180::30d9]:/path_to-export/3.1/this folder", "f180::30d9", + "/path_to-export/3.1/this folder"), + ("[::]:/", "::", "/"), + ("[2001:db8::1]:/fake_export", "2001:db8::1", "/fake_export")) + @ddt.unpack + def test_get_export_host_junction_path(self, share, host, junction_path): + result_host, result_path = na_utils.get_export_host_junction_path( + share) + + self.assertEqual(host, result_host) + self.assertEqual(junction_path, result_path) + + @ddt.data("192.14.21.0/wrong_export", "192.14.21.0:8080:/wrong_export" + "2001:db8::1:/wrong_export", + "[2001:db8::1:/wrong_export", "2001:db8::1]:/wrong_export") + def test_get_export_host_junction_path_with_invalid_exports(self, share): + self.assertRaises(exception.NetAppDriverException, + na_utils.get_export_host_junction_path, + share) + class OpenStackInfoTestCase(test.TestCase): diff --git a/cinder/tests/unit/volume/drivers/solidfire/test_solidfire.py b/cinder/tests/unit/volume/drivers/solidfire/test_solidfire.py index c1665e0cf7fa2a888299a65460e1da9280956276..4b29863b33c920e26b9637f2f79cbaa95af83b43 100644 --- a/cinder/tests/unit/volume/drivers/solidfire/test_solidfire.py +++ b/cinder/tests/unit/volume/drivers/solidfire/test_solidfire.py @@ -27,6 +27,8 @@ from cinder import context from cinder import exception from cinder.objects import fields from cinder import test +from cinder.tests.unit import fake_group_snapshot +from cinder.tests.unit import fake_snapshot from cinder.tests.unit.image import fake as fake_image from cinder.tests.unit import utils as test_utils from cinder.volume import configuration as conf @@ -1275,6 +1277,45 @@ class SolidFireVolumeTestCase(test.TestCase): sfv._sf_terminate_connection(testvol, connector, False) rem_vag.assert_called_with(vol_id, vag_id) + def test_sf_term_conn_without_connector(self): + # Verify we correctly force the deletion of a volume. + mod_conf = self.configuration + mod_conf.sf_enable_vag = True + sfv = solidfire.SolidFireDriver(configuration=mod_conf) + testvol = {'project_id': 'testprjid', + 'name': 'testvol', + 'size': 1, + 'id': 'a720b3c0-d1f0-11e1-9b23-0800200c9a66', + 'volume_type_id': None, + 'provider_location': '10.10.7.1:3260 iqn.2010-01.com.' + 'solidfire:87hg.uuid-2cc06226-cc' + '74-4cb7-bd55-14aed659a0cc.4060 0', + 'provider_auth': 'CHAP stack-1-a60e2611875f40199931f2' + 'c76370d66b 2FE0CQ8J196R', + 'provider_geometry': '4096 4096', + 'created_at': timeutils.utcnow(), + 'provider_id': "1 1 1", + 'multiattach': False + } + provider_id = testvol['provider_id'] + vol_id = int(provider_id.split()[0]) + vag_id = 1 + vags = [{'attributes': {}, + 'deletedVolumes': [], + 'initiators': ['iqn.2012-07.org.fake:01'], + 'name': 'fakeiqn', + 'volumeAccessGroupID': vag_id, + 'volumes': [1, 2], + 'virtualNetworkIDs': []}] + + with mock.patch.object(sfv, + '_get_vags_by_volume', + return_value=vags), \ + mock.patch.object(sfv, + '_remove_volume_from_vags') as rem_vags: + sfv._sf_terminate_connection(testvol, None, False) + rem_vags.assert_called_with(vol_id) + def test_safe_create_vag_simple(self): # Test the sunny day call straight into _create_vag. sfv = solidfire.SolidFireDriver(configuration=self.configuration) @@ -1516,7 +1557,7 @@ class SolidFireVolumeTestCase(test.TestCase): 'volumes': [vol_id, 43]}] with mock.patch.object(sfv, - '_base_get_vags', + '_get_vags_by_volume', return_value=vags), \ mock.patch.object(sfv, '_remove_volume_from_vag') as rem_vol: @@ -1797,8 +1838,8 @@ class SolidFireVolumeTestCase(test.TestCase): source = {'group_snapshot_id': 'typical_cgsnap_id', 'volume_id': 'typical_vol_id', 'id': 'no_id_4_u'} - name = (self.configuration.sf_volume_prefix - + source.get('group_snapshot_id')) + name = (self.configuration.sf_volume_prefix + + source.get('group_snapshot_id')) with mock.patch.object(sfv, '_get_group_snapshot_by_name', return_value={}) as get,\ @@ -1819,6 +1860,36 @@ class SolidFireVolumeTestCase(test.TestCase): {'status': fields.GroupStatus.AVAILABLE}) group_cg_test.assert_called_once_with(group) + @mock.patch('cinder.volume.utils.is_group_a_cg_snapshot_type') + def test_delete_group_snap_cg(self, group_cg_test): + sfv = solidfire.SolidFireDriver(configuration=self.configuration) + group_cg_test.return_value = True + cgsnapshot = fake_group_snapshot.fake_group_snapshot_obj( + mock.MagicMock()) + snapshots = fake_snapshot.fake_snapshot_obj(mock.MagicMock()) + + with mock.patch.object(sfv, '_delete_cgsnapshot', + return_value={}) as _del_mock: + model_update = sfv.delete_group_snapshot(self.ctxt, + cgsnapshot, snapshots) + _del_mock.assert_called_once_with(self.ctxt, cgsnapshot, snapshots) + self.assertEqual({}, model_update) + + @mock.patch('cinder.volume.utils.is_group_a_cg_snapshot_type') + def test_delete_group_snap(self, group_cg_test): + sfv = solidfire.SolidFireDriver(configuration=self.configuration) + group_cg_test.return_value = False + cgsnapshot = fake_group_snapshot.fake_group_snapshot_obj( + mock.MagicMock()) + snapshots = fake_snapshot.fake_snapshot_obj(mock.MagicMock()) + + with mock.patch.object(sfv, '_delete_cgsnapshot', + return_value={}) as _del_mock: + + self.assertRaises(NotImplementedError, sfv.delete_group_snapshot, + self.ctxt, cgsnapshot, snapshots) + _del_mock.assert_not_called() + @mock.patch('cinder.volume.utils.is_group_a_cg_snapshot_type') def test_create_group_rainy(self, group_cg_test): sfv = solidfire.SolidFireDriver(configuration=self.configuration) diff --git a/cinder/tests/unit/volume/drivers/test_lvm_driver.py b/cinder/tests/unit/volume/drivers/test_lvm_driver.py index 884af0103f7d44dce83f05624610ff4a128da06d..08cd428b79ead926e62b36d140a0c7abb02cfa18 100644 --- a/cinder/tests/unit/volume/drivers/test_lvm_driver.py +++ b/cinder/tests/unit/volume/drivers/test_lvm_driver.py @@ -957,6 +957,7 @@ class LVMISCSITestCase(test_driver.BaseDriverTestCase): # This value is set in check_for_setup_error. self.configuration = conf.Configuration(None) self.configuration.lvm_type = 'thin' + self.configuration.target_helper = 'lioadm' vg_obj = fake_lvm.FakeBrickLVM('cinder-volumes', False, None, diff --git a/cinder/tests/unit/volume/drivers/test_nimble.py b/cinder/tests/unit/volume/drivers/test_nimble.py index 6b36bf1a30e5b983f384e2aaa3857218754f6696..f0939616f06038634d6957b46e21c5ca39df0e05 100644 --- a/cinder/tests/unit/volume/drivers/test_nimble.py +++ b/cinder/tests/unit/volume/drivers/test_nimble.py @@ -1298,6 +1298,27 @@ class NimbleDriverConnectionTestCase(NimbleDriverBaseTestCase): self.mock_client_service.method_calls, expected_calls) + @mock.patch(NIMBLE_URLLIB2) + @mock.patch(NIMBLE_CLIENT) + @mock.patch.object(obj_volume.VolumeList, 'get_all_by_host', + mock.Mock(return_value=[])) + @NimbleDriverBaseTestCase.client_mock_decorator(create_configuration( + 'nimble', 'nimble_pass', '10.18.108.55', 'default', '*')) + def test_terminate_connection_without_connector(self): + self.mock_client_service.get_initiator_grp_list.return_value = ( + FAKE_IGROUP_LIST_RESPONSE) + self.driver.terminate_connection( + {'name': 'test-volume', + 'provider_location': '12 13', + 'id': 12}, + None) + expected_calls = [mock.call._get_igroupname_for_initiator( + 'test-initiator1'), + mock.call.remove_all_acls({'name': 'test-volume'})] + self.mock_client_service.assert_has_calls( + self.mock_client_service.method_calls, + expected_calls) + @mock.patch(NIMBLE_URLLIB2) @mock.patch(NIMBLE_CLIENT) @mock.patch.object(obj_volume.VolumeList, 'get_all_by_host', diff --git a/cinder/volume/drivers/dell_emc/scaleio/driver.py b/cinder/volume/drivers/dell_emc/scaleio/driver.py index bc274d0a0dc7c0260de90a9f42f0feafb6de6d30..281f6e1d41ac39899510915f5a37fd9268ea8a84 100644 --- a/cinder/volume/drivers/dell_emc/scaleio/driver.py +++ b/cinder/volume/drivers/dell_emc/scaleio/driver.py @@ -600,8 +600,7 @@ class ScaleIODriver(driver.VolumeDriver): provisioning = "ThickProvisioned" allowed = self._is_volume_creation_safe(protection_domain_name, - storage_pool_name, - provisioning) + storage_pool_name) if not allowed: # Do not allow thick volume creation on this backend. # Volumes may leak data between tenants. diff --git a/cinder/volume/drivers/dell_emc/vmax/common.py b/cinder/volume/drivers/dell_emc/vmax/common.py index 5f5fd319a578cbc236f611f93c228acadfafad55..2b6b0e88812762d14e1caafb2022ea5275df7b90 100644 --- a/cinder/volume/drivers/dell_emc/vmax/common.py +++ b/cinder/volume/drivers/dell_emc/vmax/common.py @@ -532,7 +532,7 @@ class VMAXCommon(object): async_grp = None LOG.info("Unmap volume: %(volume)s.", {'volume': volume}) if connector is not None: - host = connector['host'] + host = self.utils.get_host_short_name(connector['host']) attachment_list = volume.volume_attachment LOG.debug("Volume attachment list: %(atl)s. " "Attachment type: %(at)s", diff --git a/cinder/volume/drivers/dell_emc/vmax/fc.py b/cinder/volume/drivers/dell_emc/vmax/fc.py index 30c3eb3bfa83fad10ab0364d69bb883e228fe221..083441cf17c871dcee98922bf47a3ee4f2c946de 100644 --- a/cinder/volume/drivers/dell_emc/vmax/fc.py +++ b/cinder/volume/drivers/dell_emc/vmax/fc.py @@ -98,6 +98,9 @@ class VMAXFCDriver(san.SanDriver, driver.FibreChannelDriver): - Fix for SSL verification/cert application (bug #1772924) - Log VMAX metadata of a volume (bp vmax-metadata) - Fix for get-pools command (bug #1784856) + Backport from 3.3.0 + - Fix for initiator retrieval and short hostname unmapping + (bugs #1783855 #1783867) """ VERSION = "3.2.0" @@ -309,7 +312,7 @@ class VMAXFCDriver(san.SanDriver, driver.FibreChannelDriver): """ loc = volume.provider_location name = ast.literal_eval(loc) - host = connector['host'] + host = self.common.utils.get_host_short_name(connector['host']) zoning_mappings = {} try: array = name['array'] diff --git a/cinder/volume/drivers/dell_emc/vmax/iscsi.py b/cinder/volume/drivers/dell_emc/vmax/iscsi.py index d58d43435981f04efa81b08b68eb3fe10f208d53..42b7b243849ed3e05a2d7c3f402b6a4191aae1ca 100644 --- a/cinder/volume/drivers/dell_emc/vmax/iscsi.py +++ b/cinder/volume/drivers/dell_emc/vmax/iscsi.py @@ -103,10 +103,12 @@ class VMAXISCSIDriver(san.SanISCSIDriver): - Fix for SSL verification/cert application (bug #1772924) - Log VMAX metadata of a volume (bp vmax-metadata) - Fix for get-pools command (bug #1784856) + Backport from 3.3.0 + - Fix for initiator retrieval and short hostname unmapping + (bugs #1783855 #1783867) """ VERSION = "3.2.0" - # ThirdPartySystems wiki CI_WIKI_NAME = "EMC_VMAX_CI" diff --git a/cinder/volume/drivers/dell_emc/vmax/masking.py b/cinder/volume/drivers/dell_emc/vmax/masking.py index 81a52d12d44aa13ea1b303f54de952ebc8e1fa9c..31496b762c5ef0060aa9f1df62cb85d7c3f49c8e 100644 --- a/cinder/volume/drivers/dell_emc/vmax/masking.py +++ b/cinder/volume/drivers/dell_emc/vmax/masking.py @@ -788,10 +788,9 @@ class VMAXMasking(object): :returns: initiator group name -- string or None """ ig_name = None - init_list = self.rest.get_in_use_initiator_list_from_array( - serial_number) for initiator in initiator_names: - found_init = [init for init in init_list if initiator in init] + params = {'initiator_hba': initiator.lower()} + found_init = self.rest.get_initiator_list(serial_number, params) if found_init: ig_name = self.rest.get_initiator_group_from_initiator( serial_number, found_init[0]) diff --git a/cinder/volume/drivers/dell_emc/vmax/rest.py b/cinder/volume/drivers/dell_emc/vmax/rest.py index da3dc39ff82d5b5155e361d3a59d5f935eac7d32..4c576681a02eeef3762c4af732101c346747aa8f 100644 --- a/cinder/volume/drivers/dell_emc/vmax/rest.py +++ b/cinder/volume/drivers/dell_emc/vmax/rest.py @@ -1339,17 +1339,6 @@ class VMAXRest(object): init_list = [] return init_list - def get_in_use_initiator_list_from_array(self, array): - """Get the list of initiators which are in-use from the array. - - Gets the list of initiators from the array which are in - hosts/ initiator groups. - :param array: the array serial number - :returns: init_list - """ - params = {'in_a_host': 'true'} - return self.get_initiator_list(array, params) - def get_initiator_group_from_initiator(self, array, initiator): """Given an initiator, get its corresponding initiator group, if any. diff --git a/cinder/volume/drivers/hpe/hpe_3par_common.py b/cinder/volume/drivers/hpe/hpe_3par_common.py index c17ac64f38ef85a3e19cb95e155dba961b80c118..41e1d6cef679e1af8515916bc9a91d259ac91707 100644 --- a/cinder/volume/drivers/hpe/hpe_3par_common.py +++ b/cinder/volume/drivers/hpe/hpe_3par_common.py @@ -42,17 +42,10 @@ import re import six import uuid -from oslo_serialization import base64 -from oslo_utils import importutils - -hpe3parclient = importutils.try_import("hpe3parclient") -if hpe3parclient: - from hpe3parclient import client - from hpe3parclient import exceptions as hpeexceptions - from oslo_config import cfg from oslo_log import log as logging from oslo_log import versionutils +from oslo_serialization import base64 from oslo_service import loopingcall from oslo_utils import excutils from oslo_utils import units @@ -62,6 +55,7 @@ from cinder import exception from cinder import flow_utils from cinder.i18n import _ from cinder.objects import fields +from cinder import utils from cinder.volume import configuration from cinder.volume import qos_specs from cinder.volume import utils as volume_utils @@ -70,6 +64,15 @@ from cinder.volume import volume_types import taskflow.engines from taskflow.patterns import linear_flow +try: + import hpe3parclient + from hpe3parclient import client + from hpe3parclient import exceptions as hpeexceptions +except ImportError: + hpe3parclient = None + client = None + hpeexceptions = None + LOG = logging.getLogger(__name__) MIN_CLIENT_VERSION = '4.2.0' @@ -269,11 +272,12 @@ class HPE3PARCommon(object): 4.0.8 - Added support for report backend state in service list. 4.0.9 - Set proper backend on subsequent operation, after group failover. bug #1773069 + 4.0.10 - Added retry in delete_volume. bug #1783934 """ - VERSION = "4.0.9" + VERSION = "4.0.10" stats = {} @@ -499,6 +503,12 @@ class HPE3PARCommon(object): self.client.id = stats['array_id'] def check_for_setup_error(self): + """Verify that requirements are in place to use HPE driver.""" + if not all((hpe3parclient, client, hpeexceptions)): + msg = _('HPE driver setup error: some required ' + 'libraries (hpe3parclient, client.*) not found.') + LOG.error(msg) + raise exception.VolumeDriverException(message=msg) if self.client: self.client_login() try: @@ -2465,6 +2475,17 @@ class HPE3PARCommon(object): raise exception.CinderException(ex) def delete_volume(self, volume): + + @utils.retry(exception.VolumeIsBusy, interval=2, retries=10) + def _try_remove_volume(volume_name): + try: + self.client.deleteVolume(volume_name) + except Exception: + msg = _("The volume is currently busy on the 3PAR " + "and cannot be deleted at this time. " + "You can try again later.") + raise exception.VolumeIsBusy(message=msg) + # v2 replication check # If the volume type is replication enabled, we want to call our own # method of deconstructing the volume and its dependencies @@ -2515,13 +2536,7 @@ class HPE3PARCommon(object): else: # the volume is being operated on in a background # task on the 3PAR. - # TODO(walter-boring) do a retry a few times. - # for now lets log a better message - msg = _("The volume is currently busy on the 3PAR" - " and cannot be deleted at this time. " - "You can try again later.") - LOG.error(msg) - raise exception.VolumeIsBusy(message=msg) + _try_remove_volume(volume_name) elif (ex.get_code() == 32): # Error 32 means that the volume has children diff --git a/cinder/volume/drivers/lvm.py b/cinder/volume/drivers/lvm.py index e8c21ec7acce25bc6c7f86404ad520f841bc2b5b..8210bb43a1719ccda4abdf650e56dcf124219961 100644 --- a/cinder/volume/drivers/lvm.py +++ b/cinder/volume/drivers/lvm.py @@ -242,6 +242,10 @@ class LVMVolumeDriver(driver.VolumeDriver): # This includes volumes and snapshots. total_volumes = len(self.vg.get_volumes()) + supports_multiattach = True + if self.configuration.target_helper == 'lioadm': + supports_multiattach = False + # Skip enabled_pools setting, treat the whole backend as one pool # XXX FIXME if multipool support is added to LVM driver. single_pool = {} @@ -260,7 +264,7 @@ class LVMVolumeDriver(driver.VolumeDriver): total_volumes=total_volumes, filter_function=self.get_filter_function(), goodness_function=self.get_goodness_function(), - multiattach=True, + multiattach=supports_multiattach, backend_state='up' )) data["pools"].append(single_pool) diff --git a/cinder/volume/drivers/netapp/dataontap/client/api.py b/cinder/volume/drivers/netapp/dataontap/client/api.py index 3f0c5ac83af3464d85414d428d5373dbb38d30af..31d8d276e8b0486ece95da3d342469a4b57a13e6 100644 --- a/cinder/volume/drivers/netapp/dataontap/client/api.py +++ b/cinder/volume/drivers/netapp/dataontap/client/api.py @@ -26,6 +26,7 @@ from eventlet import semaphore from lxml import etree from oslo_log import log as logging +from oslo_utils import netutils import random import six from six.moves import urllib @@ -281,7 +282,12 @@ class NaServer(object): return processed_response.get_child_by_name('results') def _get_url(self): - return '%s://%s:%s/%s' % (self._protocol, self._host, self._port, + host = self._host + + if netutils.is_valid_ipv6(host): + host = netutils.escape_ipv6(host) + + return '%s://%s:%s/%s' % (self._protocol, host, self._port, self._url) def _build_opener(self): diff --git a/cinder/volume/drivers/netapp/dataontap/nfs_base.py b/cinder/volume/drivers/netapp/dataontap/nfs_base.py index fe297924b686249de50978f0e3d7de78dbeae1fa..2afa49de8ace2a62dda8ef055b1d48fb35053d0d 100644 --- a/cinder/volume/drivers/netapp/dataontap/nfs_base.py +++ b/cinder/volume/drivers/netapp/dataontap/nfs_base.py @@ -31,6 +31,7 @@ import time from oslo_concurrency import processutils from oslo_config import cfg from oslo_log import log as logging +from oslo_utils import netutils from oslo_utils import units import six from six.moves import urllib @@ -279,8 +280,13 @@ class NetAppNfsDriver(driver.ManageableVD, def _get_volume_location(self, volume_id): """Returns NFS mount address as :.""" - nfs_server_ip = self._get_host_ip(volume_id) - export_path = self._get_export_path(volume_id) + provider_location = self._get_provider_location(volume_id) + nfs_server_ip, export_path = na_utils.get_export_host_junction_path( + provider_location) + + if netutils.is_valid_ipv6(nfs_server_ip): + nfs_server_ip = netutils.escape_ipv6(nfs_server_ip) + return nfs_server_ip + ':' + export_path def _clone_backing_file_for_volume(self, volume_name, clone_name, @@ -303,14 +309,6 @@ class NetAppNfsDriver(driver.ManageableVD, volume = self.db.volume_get(self._context, volume_id) return volume.provider_location - def _get_host_ip(self, volume_id): - """Returns IP address for the given volume.""" - return self._get_provider_location(volume_id).rsplit(':')[0] - - def _get_export_path(self, volume_id): - """Returns NFS export path for the given volume.""" - return self._get_provider_location(volume_id).rsplit(':')[1] - def _volume_not_present(self, nfs_mount, volume_name): """Check if volume exists.""" try: @@ -749,7 +747,7 @@ class NetAppNfsDriver(driver.ManageableVD, ip = na_utils.resolve_hostname(host) share_candidates = [] for sh in self._mounted_shares: - sh_exp = sh.split(':')[1] + sh_exp = sh.split(':')[-1] if sh_exp == dir: share_candidates.append(sh) if share_candidates: @@ -864,11 +862,12 @@ class NetAppNfsDriver(driver.ManageableVD, """ if volume_id: - host_ip = self._get_host_ip(volume_id) - export_path = self._get_export_path(volume_id) + provider_location = self._get_provider_location(volume_id) + host_ip, export_path = na_utils.get_export_host_junction_path( + provider_location) elif share: - host_ip = share.split(':')[0] - export_path = share.split(':')[1] + host_ip, export_path = na_utils.get_export_host_junction_path( + share) else: raise exception.InvalidInput( 'A volume ID or share was not specified.') diff --git a/cinder/volume/drivers/netapp/dataontap/nfs_cmode.py b/cinder/volume/drivers/netapp/dataontap/nfs_cmode.py index 827f808654518635c36ebce67ce474d7a57dfebf..39a411babb6fdb8bf2f834c5189cee942ff38d1e 100644 --- a/cinder/volume/drivers/netapp/dataontap/nfs_cmode.py +++ b/cinder/volume/drivers/netapp/dataontap/nfs_cmode.py @@ -187,7 +187,7 @@ class NetAppCmodeNfsDriver(nfs_base.NetAppNfsDriver, return target_path = '%s' % (volume['name']) share = volume_utils.extract_host(volume['host'], level='pool') - export_path = share.split(':')[1] + __, export_path = na_utils.get_export_host_junction_path(share) flex_vol_name = self.zapi_client.get_vol_by_junc_vserver(self.vserver, export_path) self.zapi_client.file_assign_qos(flex_vol_name, @@ -325,9 +325,8 @@ class NetAppCmodeNfsDriver(nfs_base.NetAppNfsDriver, vserver_addresses = self.zapi_client.get_operational_lif_addresses() for share in self._mounted_shares: + host, junction_path = na_utils.get_export_host_junction_path(share) - host = share.split(':')[0] - junction_path = share.split(':')[1] address = na_utils.resolve_hostname(host) if address not in vserver_addresses: @@ -365,7 +364,7 @@ class NetAppCmodeNfsDriver(nfs_base.NetAppNfsDriver, ip_vserver = self._get_vserver_for_ip(ip) if ip_vserver and shares: for share in shares: - ip_sh = share.split(':')[0] + ip_sh, __ = na_utils.get_export_host_junction_path(share) sh_vserver = self._get_vserver_for_ip(ip_sh) if sh_vserver == ip_vserver: LOG.debug('Share match found for ip %s', ip) @@ -541,15 +540,17 @@ class NetAppCmodeNfsDriver(nfs_base.NetAppNfsDriver, volume['id']) def _get_source_ip_and_path(self, nfs_share, file_name): - src_ip = self._get_ip_verify_on_cluster(nfs_share.split(':')[0]) - src_path = os.path.join(nfs_share.split(':')[1], file_name) + host, share_path = na_utils.get_export_host_junction_path(nfs_share) + src_ip = self._get_ip_verify_on_cluster(host) + src_path = os.path.join(share_path, file_name) + return src_ip, src_path def _get_destination_ip_and_path(self, volume): share = volume_utils.extract_host(volume['host'], level='pool') - share_ip_and_path = share.split(":") - dest_ip = self._get_ip_verify_on_cluster(share_ip_and_path[0]) - dest_path = os.path.join(share_ip_and_path[1], volume['name']) + share_ip, share_path = na_utils.get_export_host_junction_path(share) + dest_ip = self._get_ip_verify_on_cluster(share_ip) + dest_path = os.path.join(share_path, volume['name']) return dest_ip, dest_path diff --git a/cinder/volume/drivers/netapp/utils.py b/cinder/volume/drivers/netapp/utils.py index e99458d4c5826593e257e330799dbbadceaf0c1d..d682e777b42c045e22960393099c575f8cfe98be 100644 --- a/cinder/volume/drivers/netapp/utils.py +++ b/cinder/volume/drivers/netapp/utils.py @@ -30,6 +30,7 @@ import socket from oslo_concurrency import processutils as putils from oslo_log import log as logging +from oslo_utils import netutils import six from cinder import context @@ -174,6 +175,9 @@ def log_extra_spec_warnings(extra_specs): def get_iscsi_connection_properties(lun_id, volume, iqn, address, port): + # literal ipv6 address + if netutils.is_valid_ipv6(address): + address = netutils.escape_ipv6(address) properties = {} properties['target_discovered'] = False @@ -361,6 +365,30 @@ def get_legacy_qos_policy(extra_specs): return dict(policy_name=external_policy_name) +def get_export_host_junction_path(share): + if '[' in share and ']' in share: + try: + # ipv6 + host = re.search('\[(.*)\]', share).group(1) + junction_path = share.split(':')[-1] + except AttributeError: + raise exception.NetAppDriverException(_("Share '%s' is " + "not in a valid " + "format.") % share) + else: + # ipv4 + path = share.split(':') + if len(path) == 2: + host = path[0] + junction_path = path[1] + else: + raise exception.NetAppDriverException(_("Share '%s' is " + "not in a valid " + "format.") % share) + + return host, junction_path + + class hashabledict(dict): """A hashable dictionary that is comparable (i.e. in unit tests, etc.)""" def __hash__(self): diff --git a/cinder/volume/drivers/nimble.py b/cinder/volume/drivers/nimble.py index 33273f0dd8e5d7cc22fd67a0667e28cf73f78e71..4f284f807c33f29f96bdb7d16bfd57c61ca60248 100644 --- a/cinder/volume/drivers/nimble.py +++ b/cinder/volume/drivers/nimble.py @@ -719,6 +719,13 @@ class NimbleISCSIDriver(NimbleBaseVolumeDriver, san.SanISCSIDriver): {'vol': volume['name'], 'conn': connector, 'loc': volume['provider_location']}) + + if connector is None: + LOG.warning("Removing ALL host connections for volume %s", + volume) + self.APIExecutor.remove_all_acls(volume) + return + initiator_name = connector['initiator'] initiator_group_name = self._get_igroupname_for_initiator( initiator_name) @@ -910,6 +917,12 @@ class NimbleFCDriver(NimbleBaseVolumeDriver, driver.FibreChannelDriver): 'loc': volume['provider_location']}) wwpns = [] + if connector is None: + LOG.warning("Removing ALL host connections for volume %s", + volume) + self.APIExecutor.remove_all_acls(volume) + return + initiator_name = connector['initiator'] for wwpn in connector['wwpns']: wwpns.append(wwpn) @@ -1378,6 +1391,26 @@ class NimbleRestAPIExecutor(object): 'igroup': initiator_group_id}) return r.json()['data'][0] + def get_volume_acl_records(self, volume_id): + api = "volumes/" + six.text_type(volume_id) + r = self.get(api) + if not r.json()['data']: + raise NimbleAPIException(_("Unable to retrieve information for " + "volume: %s") % volume_id) + return r.json()['data']['access_control_records'] + + def remove_all_acls(self, volume): + LOG.info("removing all access control list from volume=%(vol)s", + {"vol": volume['name']}) + volume_id = self.get_volume_id_by_name(volume['name']) + acl_records = self.get_volume_acl_records(volume_id) + if acl_records is not None: + for acl_record in acl_records: + LOG.info("removing acl=%(acl)s with igroup=%(igroup)s", + {"acl": acl_record['id'], + "igroup": acl_record['initiator_group_name']}) + self.remove_acl(volume, acl_record['initiator_group_name']) + def remove_acl(self, volume, initiator_group_name): LOG.info("removing ACL from volume=%(vol)s" "and %(igroup)s", diff --git a/cinder/volume/drivers/solidfire.py b/cinder/volume/drivers/solidfire.py index 9b9925773ed413865916b46e56b94c9bb33a1b34..73838e0c1ff3965992dd05b972b90973f823d0fe 100644 --- a/cinder/volume/drivers/solidfire.py +++ b/cinder/volume/drivers/solidfire.py @@ -250,11 +250,11 @@ class SolidFireDriver(san.SanISCSIDriver): self.cluster_pairs = [] self.replication_enabled = False self.failed_over = False + self.verify_ssl = self.configuration.driver_ssl_cert_verify self.target_driver = SolidFireISCSI(solidfire_driver=self, configuration=self.configuration) self.default_cluster = self._create_cluster_reference() self.active_cluster = self.default_cluster - self.verify_ssl = self.configuration.driver_ssl_cert_verify # If we're failed over, we need to parse things out and set the active # cluster appropriately @@ -1201,6 +1201,13 @@ class SolidFireDriver(san.SanISCSIDriver): matching_vags = [vag for vag in vags if vag['name'] == vag_name] return matching_vags + def _get_vags_by_volume(self, vol_id): + params = {"volumeID": vol_id} + vags = self._issue_api_request( + 'GetVolumeStats', + params)['result']['volumeStats']['volumeAccessGroups'] + return vags + def _add_initiator_to_vag(self, iqn, vag_id): # Added a vag_id return as there is a chance that we might have to # create a new VAG if our target VAG is deleted underneath us. @@ -1258,9 +1265,8 @@ class SolidFireDriver(san.SanISCSIDriver): def _remove_volume_from_vags(self, vol_id): # Due to all sorts of uncertainty around multiattach, on volume # deletion we make a best attempt at removing the vol_id from VAGs. - vags = self._base_get_vags() - targets = [v for v in vags if vol_id in v['volumes']] - for vag in targets: + vags = self._get_vags_by_volume(vol_id) + for vag in vags: self._remove_volume_from_vag(vol_id, vag['volumeAccessGroupID']) def _remove_vag(self, vag_id): @@ -1833,6 +1839,13 @@ class SolidFireDriver(san.SanISCSIDriver): self._delete_cgsnapshot_by_name(snap_name) return None, None + def delete_group_snapshot(self, context, group_snapshot, snapshots): + if vol_utils.is_group_a_cg_snapshot_type(group_snapshot): + return self._delete_cgsnapshot(context, group_snapshot, snapshots) + + # Default implementation handles other scenarios. + raise NotImplementedError() + def _delete_consistencygroup(self, ctxt, group, volumes): # TODO(chris_morrell): exception handling and return correctly updated # volume_models. @@ -2337,21 +2350,26 @@ class SolidFireISCSI(iscsi_driver.SanISCSITarget): If the VAG is empty then the VAG is also removed. """ if self.configuration.sf_enable_vag: - iqn = properties['initiator'] - vag = self._get_vags_by_name(iqn) provider_id = volume['provider_id'] vol_id = int(provider_id.split()[0]) - if vag and not volume['multiattach']: - # Multiattach causes problems with removing volumes from VAGs. - # Compromise solution for now is to remove multiattach volumes - # from VAGs during volume deletion. - vag = vag[0] - vag_id = vag['volumeAccessGroupID'] - if [vol_id] == vag['volumes']: - self._remove_vag(vag_id) - elif vol_id in vag['volumes']: - self._remove_volume_from_vag(vol_id, vag_id) + if properties: + iqn = properties['initiator'] + vag = self._get_vags_by_name(iqn) + + if vag and not volume['multiattach']: + # Multiattach causes problems with removing volumes from + # VAGs. + # Compromise solution for now is to remove multiattach + # volumes from VAGs during volume deletion. + vag = vag[0] + vag_id = vag['volumeAccessGroupID'] + if [vol_id] == vag['volumes']: + self._remove_vag(vag_id) + elif vol_id in vag['volumes']: + self._remove_volume_from_vag(vol_id, vag_id) + else: + self._remove_volume_from_vags(vol_id) return super(SolidFireISCSI, self).terminate_connection(volume, properties, diff --git a/debian/changelog b/debian/changelog index 70efd03dff5984a47f11459ac4e98e49648b0792..1f45db4469a973c28bd31a61e3a1da32c940806f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,21 @@ +cinder (2:13.0.1-1) unstable; urgency=medium + + [ Michal Arbet ] + * New upstream version + * d/cinder-common.config.in: + * d/cinder-common.postinst.in: + * d/cinder-common.templates.in: + - Handle glance_api_servers via debconf (Closes: #912992) + - Handle my_ip via debconf (Closes: #912991) + * Fix volume_group name in config (Closes: #912987) + * d/cinder-common.postrm.in: + - Fix deletion of policy.json (Closes: #912984) + * d/rules: Make auth_strategy default to keystone + * d/copyright: Add me to copyright file + * d/control: Add me to uploaders field + + -- Michal Arbet Tue, 06 Nov 2018 13:57:47 +0100 + cinder (2:13.0.0-2) unstable; urgency=medium * Uploading to unstable. diff --git a/debian/cinder-common.config.in b/debian/cinder-common.config.in index ecc5f685d886bdb7a55ea07c403ec201eaf715f9..ce767346a555b29fcf75e9fde641f074e02dc20b 100644 --- a/debian/cinder-common.config.in +++ b/debian/cinder-common.config.in @@ -7,12 +7,38 @@ CINDER_CONF=/etc/cinder/cinder.conf #PKGOS-INCLUDE# +manage_cinder_my_ip () { + pkgos_inifile get ${CINDER_CONF} DEFAULT my_ip + if [ -n "${RET}" ] && [ ! "${RET}" = "NOT_FOUND" ] ; then + db_set cinder/my-ip "${RET}" + else + DEFROUTE_IF=`awk '{ if ( $2 == "00000000" ) print $1 }' /proc/net/route | head -n 1` + if [ -n "${DEFROUTE_IF}" ] ; then + DEFROUTE_IP=`LC_ALL=C ip addr show "${DEFROUTE_IF}" | grep inet | head -n 1 | awk '{print $2}' | cut -d/ -f1 | grep -E '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'` + if [ -n "${DEFROUTE_IP}" ] ; then + db_set cinder/my-ip ${DEFROUTE_IP} + fi + fi + fi + db_input high cinder/my-ip || true + db_go +} + +manage_glance_api_servers () { + pkgos_inifile get ${CINDER_CONF} DEFAULT glance_api_servers + if [ -n "${RET}" ] && [ ! "${RET}" = "NOT_FOUND" ] ; then + db_set cinder/glance-api-servers "${RET}" + fi + db_input high cinder/glance-api-servers || true + db_go +} + pkgos_var_user_group cinder pkgos_dbc_read_conf -pkg cinder-common ${CINDER_CONF} database connection cinder $@ pkgos_rabbit_read_conf ${CINDER_CONF} oslo_messaging_rabbit cinder pkgos_read_admin_creds ${CINDER_CONF} keystone_authtoken cinder -pkgos_inifile get ${CINDER_CONF} DEFAULT volume_group +pkgos_inifile get ${CINDER_CONF} lvm volume_group if [ -n "${RET}" ] && [ ! "${RET}" = "NOT_FOUND" ] ; then db_set cinder/volume_group "${RET}" else @@ -28,5 +54,6 @@ else fi db_input high cinder/volume_group || true db_go +manage_cinder_my_ip exit 0 diff --git a/debian/cinder-common.postinst.in b/debian/cinder-common.postinst.in index 5fb3d308dd03b962b14087287f1ae03fa5f2a6c8..3cb85bc6cd905b0e0079644169791d8da90e4915 100755 --- a/debian/cinder-common.postinst.in +++ b/debian/cinder-common.postinst.in @@ -30,7 +30,17 @@ if [ "$1" = "configure" ] || [ "$1" = "reconfigure" ] ; then pkgos_write_admin_creds ${CINDER_CONF} keystone_authtoken cinder db_get cinder/volume_group if [ -n "${RET}" ] ; then - pkgos_inifile set ${CINDER_CONF} DEFAULT volume_group ${RET} + pkgos_inifile set ${CINDER_CONF} lvm volume_group ${RET} + fi + + db_get cinder/my-ip + if [ -n "${RET}" ] ; then + pkgos_inifile set ${CINDER_CONF} DEFAULT my_ip ${RET} + fi + + db_get cinder/glance-api-servers + if [ -n "${RET}" ] ; then + pkgos_inifile set ${CINDER_CONF} DEFAULT glance_api_servers ${RET} fi chmod 0440 /etc/sudoers.d/cinder-common diff --git a/debian/cinder-common.postrm.in b/debian/cinder-common.postrm.in index f335536d310839f2b6e0c60b9a7b6f67c5ae3028..7276f9383c15103c7b3246e60f98e426a19ea147 100755 --- a/debian/cinder-common.postrm.in +++ b/debian/cinder-common.postrm.in @@ -11,6 +11,7 @@ if [ "$1" = "purge" ] && [ -f /usr/share/debconf/confmodule ] ; then rmdir --ignore-fail-on-non-empty /etc/cinder || true rm -f /etc/default/cinder-common rm -rf /var/lib/cinder /var/log/cinder + rm -f /etc/cinder/policy.json fi #DEBHELPER# diff --git a/debian/cinder-common.templates.in b/debian/cinder-common.templates.in index 301f1016a920e80e901462e7afa0a42818fb9553..c1cae15e88e1d29102851c5ec3e91e1d2adf9bad 100644 --- a/debian/cinder-common.templates.in +++ b/debian/cinder-common.templates.in @@ -13,3 +13,14 @@ _Description: Cinder volume group: Please specify the name of the LVM volume group on which Cinder will create partitions. +Template: cinder/my-ip +Type: string +_Description: Value for my_ip: + This value will be stored in the my_ip directive of cinder.conf. + +Template: cinder/glance-api-servers +Type: string +Default: http://127.0.0.1:9292 +_Description: Value for glance_api_servers: + A list of the URLs of glance API servers available to cinder ([http[s]://][hostname|ip]:port). + diff --git a/debian/control b/debian/control index 960797181d73b8b1e1695a362a8819813b3c561b..d6a4f2ec11b0be786ddcd4fecabaee9ebfb09b34 100644 --- a/debian/control +++ b/debian/control @@ -4,6 +4,7 @@ Priority: optional Maintainer: Debian OpenStack Uploaders: Thomas Goirand , + Michal Arbet , Build-Depends: debhelper (>= 10), dh-python, diff --git a/debian/copyright b/debian/copyright index 19109ac56cb10ee22820df78d35caa16534d3377..5ad10a7a11d96ef18bd9586020ef7b6ee752fe22 100644 --- a/debian/copyright +++ b/debian/copyright @@ -101,6 +101,7 @@ License: Apache-2 Files: debian/* Copyright: (c) 2016-2018, Ondřej Nový (c) 2012-2018, Thomas Goirand + (c) 2017-2018, Michal Arbet (c) 2017, David Rabel (c) 2012, Chuck Short (c) 2016, Ondřej Kobližek diff --git a/debian/rules b/debian/rules index 0f738ee608dd746b616b16f5a3c8bb467db5078b..d4725be605523970d05e13b2cf4285b7edb8f48a 100755 --- a/debian/rules +++ b/debian/rules @@ -81,6 +81,8 @@ endif dh_missing --fail-missing -Xbin/cinder-all install -D -m 0440 debian/cinder-common.sudoers $(CURDIR)/debian/cinder-common/etc/sudoers.d/cinder-common + pkgos-fix-config-default $(CURDIR)/debian/cinder-common/usr/share/cinder-common/cinder.conf DEFAULT auth_strategy keystone + # Set LVM as default backend pkgos-fix-config-default $(CURDIR)/debian/cinder-common/usr/share/cinder-common/cinder.conf DEFAULT enabled_backends lvm echo "[lvm]" >> $(CURDIR)/debian/cinder-common/usr/share/cinder-common/cinder.conf diff --git a/doc/source/configuration/block-storage/backup/ceph-backup-driver.rst b/doc/source/configuration/block-storage/backup/ceph-backup-driver.rst index a90a55cccbe52e8333b013c3ff2b1e4bc0157635..81de086932d7c95f9dc90308ad7ed06ced7b7fb0 100644 --- a/doc/source/configuration/block-storage/backup/ceph-backup-driver.rst +++ b/doc/source/configuration/block-storage/backup/ceph-backup-driver.rst @@ -37,7 +37,7 @@ To enable the Ceph backup driver, include the following option in the .. code-block:: ini - backup_driver = cinder.backup.drivers.ceph + backup_driver = cinder.backup.drivers.ceph.CephBackupDriver The following configuration options are available for the Ceph backup driver. diff --git a/doc/source/configuration/block-storage/backup/gcs-backup-driver.rst b/doc/source/configuration/block-storage/backup/gcs-backup-driver.rst index 9e3d6edf2a243326449cd9db5ba8982e6969af19..c6adae16dc9c141719dcaa3ba6584c96709863c6 100644 --- a/doc/source/configuration/block-storage/backup/gcs-backup-driver.rst +++ b/doc/source/configuration/block-storage/backup/gcs-backup-driver.rst @@ -10,7 +10,7 @@ To enable the GCS backup driver, include the following option in the .. code-block:: ini - backup_driver = cinder.backup.drivers.gcs + backup_driver = cinder.backup.drivers.gcs.GoogleBackupDriver The following configuration options are available for the GCS backup driver. diff --git a/doc/source/configuration/block-storage/backup/glusterfs-backup-driver.rst b/doc/source/configuration/block-storage/backup/glusterfs-backup-driver.rst index e771443598fd0251fc76ecbd9eda74197b48228d..57e0f5b6cc8fd89f0fc9c0595a1beb62963c5b1f 100644 --- a/doc/source/configuration/block-storage/backup/glusterfs-backup-driver.rst +++ b/doc/source/configuration/block-storage/backup/glusterfs-backup-driver.rst @@ -9,7 +9,7 @@ To enable the GlusterFS backup driver, include the following option in the .. code-block:: ini - backup_driver = cinder.backup.drivers.glusterfs + backup_driver = cinder.backup.drivers.glusterfs.GlusterfsBackupDriver The following configuration options are available for the GlusterFS backup driver. diff --git a/doc/source/configuration/block-storage/backup/nfs-backup-driver.rst b/doc/source/configuration/block-storage/backup/nfs-backup-driver.rst index 641289a23d7b51be0f07415d18d77b9d64058b6c..44c67a281549c2b6295cb659a2017ad6419ed1d7 100644 --- a/doc/source/configuration/block-storage/backup/nfs-backup-driver.rst +++ b/doc/source/configuration/block-storage/backup/nfs-backup-driver.rst @@ -10,7 +10,7 @@ To enable the NFS backup driver, include the following option in the .. code-block:: ini - backup_driver = cinder.backup.drivers.nfs + backup_driver = cinder.backup.drivers.nfs.NFSBackupDriver The following configuration options are available for the NFS back-end backup driver. diff --git a/doc/source/configuration/block-storage/backup/posix-backup-driver.rst b/doc/source/configuration/block-storage/backup/posix-backup-driver.rst index d31f10a9f6a43be3f67b9bf0e7aa8eac39effc78..596132dc1f938392313f058425ef7cbd47241d62 100644 --- a/doc/source/configuration/block-storage/backup/posix-backup-driver.rst +++ b/doc/source/configuration/block-storage/backup/posix-backup-driver.rst @@ -10,7 +10,7 @@ option in the ``cinder.conf`` file: .. code-block:: ini - backup_driver = cinder.backup.drivers.posix + backup_driver = cinder.backup.drivers.posix.PosixBackupDriver The following configuration options are available for the POSIX file systems backup driver. diff --git a/doc/source/configuration/block-storage/backup/swift-backup-driver.rst b/doc/source/configuration/block-storage/backup/swift-backup-driver.rst index 6cd411ff7a7b272821341c6136f51cb7d059348a..87f26eca044b53ea3f2a26fd3f7bf37f147fc20c 100644 --- a/doc/source/configuration/block-storage/backup/swift-backup-driver.rst +++ b/doc/source/configuration/block-storage/backup/swift-backup-driver.rst @@ -10,7 +10,7 @@ To enable the swift backup driver, include the following option in the .. code-block:: ini - backup_driver = cinder.backup.drivers.swift + backup_driver = cinder.backup.drivers.swift.SwiftBackupDriver The following configuration options are available for the Swift back-end backup driver. diff --git a/doc/source/configuration/block-storage/backup/tsm-backup-driver.rst b/doc/source/configuration/block-storage/backup/tsm-backup-driver.rst index 21a5d0518b4ef60a93f5234d6957c275de335ecd..9f7631a4b173bd36c9e40461746e8bfb6b443814 100644 --- a/doc/source/configuration/block-storage/backup/tsm-backup-driver.rst +++ b/doc/source/configuration/block-storage/backup/tsm-backup-driver.rst @@ -15,7 +15,7 @@ To enable the IBM TSM backup driver, include the following option in .. code-block:: ini - backup_driver = cinder.backup.drivers.tsm + backup_driver = cinder.backup.drivers.tsm.TSMBackupDriver The following configuration options are available for the TSM backup driver. diff --git a/doc/source/configuration/block-storage/drivers/dell-emc-vmax-driver.rst b/doc/source/configuration/block-storage/drivers/dell-emc-vmax-driver.rst index 8fbc2b4a5c2f05bdc63d87e4278618d8f396c3f9..b1dfdca6dfee9b4cf21dad0ba04b7d44b6ca4599 100644 --- a/doc/source/configuration/block-storage/drivers/dell-emc-vmax-driver.rst +++ b/doc/source/configuration/block-storage/drivers/dell-emc-vmax-driver.rst @@ -12,20 +12,31 @@ storage management software. They use the Requests HTTP library to communicate with a Unisphere for VMAX instance, using a RESTAPI interface in the backend to perform VMAX storage operations. +.. note:: + + KNOWN ISSUE: + Workload support was dropped in PowerMax OS 5978. If a VMAX All Flash array + is upgraded to PowerMax OS 5978 or greater and existing volume types + leveraged workload i.e. DSS, DSS_REP, OLTP and OLTP_REP, attaching and + detaching will no longer work and the volume type will be unusable. + Refrain from upgrading to PowerMax OS 5978 or greater on an All Flash + until a fix is merged. Please contact your Dell EMC VMAX customer support + representative if in any doubt. + System requirements and licensing ================================= -The Dell EMC VMAX Cinder driver supports the VMAX-3 hybrid series and VMAX -All-Flash arrays. +The Dell EMC VMAX Cinder driver supports the VMAX-3 hybrid series, VMAX +All-Flash series and the PowerMax arrays. -The array operating system software, Solutions Enabler 8.4.0.7 or later, and -Unisphere for VMAX 8.4.0.15 or later are required to run Dell EMC VMAX Cinder -driver. +The array operating system software, Solutions Enabler 9.0.0.0 or later, and +Unisphere for PowerMax 9.0.0.6 or later are required to run Dell EMC VMAX +Cinder driver. -You can download Solutions Enabler and Unisphere from the Dell EMC's support -web site (login is required). See the ``Solutions Enabler 8.4.0 Installation -and Configuration Guide`` and ``Unisphere for VMAX 8.4.0 Installation Guide`` -at ``support.emc.com``. +Download Solutions Enabler and Unisphere from the Dell EMC's support web site +(login is required). See the ``Dell EMC Solutions Enabler 9.0 Installation +and Configuration Guide`` and ``Dell EMC Unisphere for PowerMax Installation +Guide`` at ``support.emc.com``. Required VMAX software suites for OpenStack ------------------------------------------- @@ -99,6 +110,7 @@ VMAX drivers support these operations: - Volume replication SRDF/S, SRDF/A and SRDF Metro - Quality of service (QoS) - Manage and unmanage volumes and snapshots +- List Manageable Volumes/Snapshots VMAX drivers also support the following features: @@ -108,8 +120,14 @@ VMAX drivers also support the following features: - Oversubscription - Service Level support - SnapVX support -- Compression support(All Flash only) +- Compression support(All Flash and PowerMax) +- Deduplication support(PowerMax) - CHAP Authentication +- Multi-attach support +- Volume Metadata in logs +- Encrypted Volume support +- Extending attached volume +- Replicated volume retype support .. note:: @@ -175,7 +193,7 @@ contains ``child`` storage groups for each configured SRP/slo/workload/compression-enabled or disabled/replication-enabled or disabled combination. -VMAX All Flash and Hybrid +PowerMax, VMAX All Flash and Hybrid Parent storage group: @@ -194,6 +212,11 @@ Child storage groups: CD and RE are only set if compression is explicitly disabled or replication explicitly enabled. See the compression and replication sections below. +.. note:: + + For PowerMax and any All Flash with PowerMax OS (5978) or greater, workload + is NONE + VMAX Driver Integration ======================= @@ -208,16 +231,15 @@ VMAX Driver Integration Solutions Enabler can be installed on a physical server, or as a Virtual Appliance (a VMware ESX server VM). Additionally, starting with HYPERMAX OS Q3 2015, you can manage VMAX3 arrays using the Embedded Management - (eManagement) container application. See the ``Solutions Enabler 8.4.0 - Installation and Configuration Guide`` on ``support.emc.com`` for more - details. + (eManagement) container application. See the ``Dell EMC Solutions Enabler + 9.0 Installation and Configuration Guide`` on ``support.emc.com`` for + more details. .. note:: You must discover storage arrays before you can use the VMAX drivers. - Follow instructions in ``Solutions Enabler 8.4.0 Installation and - Configuration Guide`` on ``support.emc.com`` for more - details. + Follow instructions in ```Dell EMC Solutions Enabler 9.0 Installation + and Configuration Guide`` on ``support.emc.com`` for more details. #. Download Unisphere from ``support.emc.com`` and install it. @@ -225,8 +247,8 @@ VMAX Driver Integration - i.e., on the same server running Solutions Enabler; on a server connected to the Solutions Enabler server; or using the eManagement container application (containing Solutions Enabler and Unisphere for - VMAX). See ``Unisphere for VMAX 8.4.0 Installation Guide`` at - ``support.emc.com``. + VMAX). See ``Dell EMC Solutions Enabler 9.0 Installation and Configuration + Guide`` at ``support.emc.com``. 2. FC Zoning with VMAX @@ -285,6 +307,8 @@ complex and open-zoning would raise security concerns. Service Level and workload can be added to the cinder.conf when the backend is the default case and there is no associated volume type. This not a recommended configuration as it is too restrictive. + Workload is NONE for PowerMax and any All Flash with PowerMax OS + (5978) or greater. +-----------------+------------------------+---------+----------+ | VMAX parameter | cinder.conf parameter | Default | Required | @@ -411,6 +435,8 @@ complex and open-zoning would raise security concerns. is the additional property which has to be set and is of the format: ``+++``. This can be obtained from the output of the ``cinder get-pools--detail``. + Workload is NONE for PowerMax or any All Flash with PowerMax OS (5978) + or greater. .. code-block:: console @@ -454,9 +480,12 @@ complex and open-zoning would raise security concerns. .. note:: - VMAX Hybrid supports Optimized, Diamond, Platinum, Gold, Silver, Bronze, - and NONE service levels. VMAX All Flash supports Diamond and None. Both - support DSS_REP, DSS, OLTP_REP, OLTP, and None workloads. + PowerMax and Hybrid support Optimized, Diamond, Platinum, Gold, Silver, + Bronze, and NONE service levels. VMAX All Flash supports Diamond and None. + Hybrid and All Flash support DSS_REP, DSS, OLTP_REP, OLTP, and None + workloads, the latter up until ucode 5977. There is no support for + workloads in PowerMax OS (5978) or greater. + 7. Interval and Retries ----------------------- @@ -1076,7 +1105,8 @@ uncompressed. .. note:: - This feature is only applicable for All Flash arrays, 250F, 450F or 850F. + This feature is only applicable for All Flash arrays, 250F, 450F, 850F + and 950F and PowerMax 2000 and 8000. Use case 1 - Compression disabled create, attach, detach, and delete volume ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1182,8 +1212,11 @@ Live migration configuration Please refer to the following for more information: -https://docs.openstack.org/nova/queens/admin/live-migration-usage.html -https://docs.openstack.org/nova/queens/admin/configuring-migrations.html +https://docs.openstack.org/nova/latest/admin/live-migration-usage.html + +and + +https://docs.openstack.org/nova/latest/admin/configuring-migrations.html .. note:: @@ -1362,6 +1395,55 @@ We then decide to detach the volume from ‘Multi-attach-Instance-B’ on HostB: storage group. The non-FAST managed storage group is cleaned up, if required. +.. note:: + + Known issue - the multi-attach flag is still false after a retype. This + is being addressed in https://bugs.launchpad.net/cinder/+bug/1790840 + + +15. Volume Encryption support +----------------------------- + +Please refer to the following: +https://docs.openstack.org/cinder/latest/configuration/block-storage/volume-encryption.html + + +16. Volume metadata in logs +--------------------------- + +If debug is enabled in the default section of the cinder.conf, VMAX Cinder +driver will log additional volume information in the Cinder volume log, +on each successful operation. The facilitates bridging the gap between +OpenStack and the Array by tracing and describing the volume from a VMAX/ +PowerMax view point. + +.. code-block:: console + + +-------------------------+---------------------------------------------------------+ + | Key | Value | + +-------------------------+---------------------------------------------------------+ + | service_level | Gold | + | is_compression_disabled | no | + | vmax_driver_version | 3.2.0 | + | identifier_name | OS-819470ab-a6d4-49cc-b4db-6f85e82822b7 | + | openstack_release | 13.0.0.0b3.dev3 | + | volume_id | 819470ab-a6d4-49cc-b4db-6f85e82822b7 | + | vmax_model | PowerMax_8000 | + | operation | delete | + | default_sg_name | OS-DEFAULT_SRP-Gold-NONE-SG | + | device_id | 01C03 | + | unisphere_version | V9.0.0.9 | + | workload | NONE | + | openstack_version | 13.0.0 | + | volume_updated_time | 2018-08-03 03:13:53 | + | platform | Linux-4.4.0-127-generic-x86_64-with-Ubuntu-16.04-xenial | + | python_version | 2.7.12 | + | volume_size | 20 | + | srp | DEFAULT_SRP | + | openstack_name | 91_Test_Vol56 | + | vmax_firmware_version | 5978.143.144 | + | serial_number | 000197600196 | + +-------------------------+---------------------------------------------------------+ Cinder supported operations @@ -1615,6 +1697,15 @@ retype, follow these steps: $ cinder retype --migration-policy on-demand +.. note:: + + With the Rocky release the following is now supported + + - Retype non-replicated volume to a replicated volume type + - Retype replicated volume to a non-replicated volume type + - Retype a replicated volume to a different replicated volume type + + Generic volume group support ---------------------------- @@ -2094,6 +2185,55 @@ the VMAX backend will have the ``OS-`` prefix removed to indicate it is no longer OpenStack managed. In the example above, the snapshot after unmanaging from OpenStack will be named ``VMAXSnapshot`` on the storage backend. +List manageable volumes and snapshots +------------------------------------- + +Manageable volumes +~~~~~~~~~~~~~~~~~~ + +Volumes that can be managed by and imported into Openstack. + +List manageable volume is filtered by: + +- Volume size should be 1026MB or greater (1GB VMAX Cinder Vol = 1026 MB) +- Volume size should be a whole integer GB capacity +- Volume should not be a part of masking view. +- Volume status should be ``Ready`` +- Volume service state should be ``Normal`` +- Volume emulation type should be ``FBA`` +- Volume configuration should be ``TDEV`` +- Volume should not be a system resource. +- Volume should not be ``private`` +- Volume should not be ``encapsulated`` +- Volume should not be ``reserved`` +- Volume should not be a part of an RDF session +- Volume should not be a snapVX Target +- Volume identifier should not begin with ``OS-``. + +Manageable snaphots +~~~~~~~~~~~~~~~~~~~ + +Snapshots that can be managed by and imported into Openstack + +List manageable snapshots is filtered by: + +- The source volume should be marked as SnapVX source. +- The source volume should be 1026MB or greater +- The source volume should be a whole integer GB capacity. +- The source volume emulation type should be ``FBA``. +- The source volume configuration should be ``TDEV``. +- The source volume should not be ``private``. +- The source volume should be not be a system resource. +- The snapshot identifier should not start with ``OS-`` or ``temp-``. +- The snapshot should not be expired. +- The snapshot generation number should npt be greater than 0. + +.. note:: + + There is some delay in the syncing of the Unisphere for PowerMax database + when the state/properties of a volume is modified using ``symcli``. To + prevent this it is preferrable to modify state/properties of volumes within + Unisphere. Upgrading from SMI-S based driver to RESTAPI based driver ========================================================= diff --git a/doc/source/configuration/block-storage/drivers/hpe-3par-driver.rst b/doc/source/configuration/block-storage/drivers/hpe-3par-driver.rst index 67f3aeaee25bcc1177336018d870f8539b83e8d7..25e7c86e051b7461a04da52540aad6a3f806c212 100644 --- a/doc/source/configuration/block-storage/drivers/hpe-3par-driver.rst +++ b/doc/source/configuration/block-storage/drivers/hpe-3par-driver.rst @@ -1,5 +1,5 @@ ======================================== -HPE 3PAR Fibre Channel and iSCSI drivers +HPE 3PAR Driver for OpenStack Cinder ======================================== The ``HPE3PARFCDriver`` and ``HPE3PARISCSIDriver`` drivers, which are based on @@ -8,8 +8,8 @@ by communicating with the HPE 3PAR storage system over HTTP, HTTPS, and SSH connections. The HTTP and HTTPS communications use ``python-3parclient``, which is part of the Python standard library. -For information about how to manage HPE 3PAR storage systems, see the HPE 3PAR -user documentation. +For information on HPE 3PAR Driver for OpenStack Cinder, refer to +`content kit page `_. System requirements ~~~~~~~~~~~~~~~~~~~ @@ -30,19 +30,17 @@ the HPE 3PAR storage system: * python-3parclient version 4.2.0 or newer. - * Array must have the Adaptive Flash Cache license installed. - * Flash Cache must be enabled on the array with the CLI command :command:`createflashcache SIZE`, where size must be in 16 GB increments. For example, :command:`createflashcache 128g` will create 128 GB of Flash Cache for each node pair in the array. - * The Dynamic Optimization license is required to support any feature that + * Dynamic Optimization is required to support any feature that results in a volume changing provisioning type or CPG. This may apply to the volume :command:`migrate`, :command:`retype` and :command:`manage` commands. - * The Virtual Copy License is required to support any feature that involves + * The Virtual Copy feature supports any operation that involves volume snapshots. This applies to the volume :command:`snapshot-*` commands. @@ -52,14 +50,8 @@ the HPE 3PAR storage system: * HPE 3PAR Operating System software version 3.3.1 MU1 or higher. - * Array must have the Compression license installed. - * HPE 3PAR Storage System with 8k or 20k series -* HPE 3PAR drivers will now check the licenses installed on the array and - disable driver capabilities based on available licenses. This will apply to - thin provisioning, QoS support and volume replication. - * HPE 3PAR Web Services API Server must be enabled and running. * One Common Provisioning Group (CPG). @@ -205,7 +197,7 @@ pairs and associate them with a volume type, run the following commands: $ openstack help volume qos The following keys require that the HPE 3PAR StoreServ storage array has a -Priority Optimization license installed. +Priority Optimization enabled. ``hpe3par:vvs`` The virtual volume set name that has been predefined by the Administrator @@ -243,7 +235,7 @@ Priority Optimization license installed. one is set the other will be set to the same value. The following key requires that the HPE 3PAR StoreServ storage array has an -Adaptive Flash Cache license installed. +Adaptive Flash Cache enabled. * ``hpe3par:flash_cache`` - The flash-cache policy, which can be turned on and off by setting the value to ``true`` or ``false``. diff --git a/releasenotes/notes/bugfix-netapp-driver-cinder-ipv6-c3c4d0d6a7d0de91.yaml b/releasenotes/notes/bugfix-netapp-driver-cinder-ipv6-c3c4d0d6a7d0de91.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c93bde7615019badc77f15ffe1e84d98c1305d02 --- /dev/null +++ b/releasenotes/notes/bugfix-netapp-driver-cinder-ipv6-c3c4d0d6a7d0de91.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - Fixed support for IPv6 on management and data paths for NFS, iSCSI + and FCP NetApp ONTAP drivers. diff --git a/releasenotes/notes/fix-netapp-cg-da4fd6c396e5bedb.yaml b/releasenotes/notes/fix-netapp-cg-da4fd6c396e5bedb.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3161337b8bafd1148d8cb3d848f697295b89a688 --- /dev/null +++ b/releasenotes/notes/fix-netapp-cg-da4fd6c396e5bedb.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - Fixes a bug in NetApp SolidFire where the deletion of group snapshots + was failing. diff --git a/releasenotes/notes/fix-netapp-force_detach-36bdf75dd2c9a030.yaml b/releasenotes/notes/fix-netapp-force_detach-36bdf75dd2c9a030.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4ea36bf12a1cd431387521df6a80908b700bcf3e --- /dev/null +++ b/releasenotes/notes/fix-netapp-force_detach-36bdf75dd2c9a030.yaml @@ -0,0 +1,3 @@ +--- +fixes: + - Fixes force_detach behavior for volumes in NetApp SolidFire driver. diff --git a/releasenotes/notes/lio-multiattach-disabled-a6ee89072fe5d032.yaml b/releasenotes/notes/lio-multiattach-disabled-a6ee89072fe5d032.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d12e9be7543d08a2f8b9810c711ab74d3e1068e0 --- /dev/null +++ b/releasenotes/notes/lio-multiattach-disabled-a6ee89072fe5d032.yaml @@ -0,0 +1,5 @@ +--- +issues: + - | + Multiattach support is disabled for the LVM driver when using the LIO iSCSI + target. This functionality will be fixed in a later release. diff --git a/releasenotes/source/locale/ja/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/ja/LC_MESSAGES/releasenotes.po deleted file mode 100644 index c1de5bbaf8505d5440a1c429a9a4d7f674161238..0000000000000000000000000000000000000000 --- a/releasenotes/source/locale/ja/LC_MESSAGES/releasenotes.po +++ /dev/null @@ -1,1227 +0,0 @@ -# Akihiro Motoki , 2016. #zanata -# Yoshiki Eguchi , 2016. #zanata -# Hidekazu Nakamura , 2017. #zanata -# Yuko Fukuda , 2017. #zanata -# Shu Muto , 2018. #zanata -msgid "" -msgstr "" -"Project-Id-Version: Cinder Release Notes\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-03-17 05:21+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2018-02-16 09:09+0000\n" -"Last-Translator: Shu Muto \n" -"Language-Team: Japanese\n" -"Language: ja\n" -"X-Generator: Zanata 4.3.3\n" -"Plural-Forms: nplurals=1; plural=0\n" - -msgid "" -"\"volume_extension:types_extra_specs:create\": \"rule:admin or rule:" -"type_admin\", \"volume_extension:types_extra_specs:delete\": \"rule:admin or " -"rule:type_admin\", \"volume_extension:types_extra_specs:index\": \"\", " -"\"volume_extension:types_extra_specs:show\": \"rule:admin or rule:type_admin " -"or rule:type_viewer\", \"volume_extension:types_extra_specs:update\": \"rule:" -"admin or rule:type_admin\"" -msgstr "" -"\"volume_extension:types_extra_specs:create\": \"rule:admin or rule:" -"type_admin\", \"volume_extension:types_extra_specs:delete\": \"rule:admin or " -"rule:type_admin\", \"volume_extension:types_extra_specs:index\": \"\", " -"\"volume_extension:types_extra_specs:show\": \"rule:admin or rule:type_admin " -"or rule:type_viewer\", \"volume_extension:types_extra_specs:update\": \"rule:" -"admin or rule:type_admin\"" - -msgid "10.0.0" -msgstr "10.0.0" - -msgid "10.0.1" -msgstr "10.0.1" - -msgid "10.0.3" -msgstr "10.0.3" - -msgid "10.0.4" -msgstr "10.0.4" - -msgid "10.0.5" -msgstr "10.0.5" - -msgid "11.0.0" -msgstr "11.0.0" - -msgid "11.0.1" -msgstr "11.0.1" - -msgid "11.0.2" -msgstr "11.0.2" - -msgid "" -"3PAR driver creates FC VLUN of match-set type instead of host sees. With " -"match-set, the host will see the virtual volume on specified NSP (Node-Slot-" -"Port). This change in vlun type fixes bug 1577993." -msgstr "" -"3PAR ドライバーはホストが見る代わりに match-set タイプの FC VLUN を作成しま" -"す。 match-set でホストは指定された NSP(Node-Slot-Port)上の仮想ボリュームを" -"見ます。これはバグ 1577993 の vlun type に関する修正です。" - -msgid "7.0.1" -msgstr "7.0.1" - -msgid "7.0.2" -msgstr "7.0.2" - -msgid "7.0.3" -msgstr "7.0.3" - -msgid "8.0.0" -msgstr "8.0.0" - -msgid "8.1.0" -msgstr "8.1.0" - -msgid "8.1.1" -msgstr "8.1.1" - -msgid "8.1.1-11" -msgstr "8.1.1-11" - -msgid "9.0.0" -msgstr "9.0.0" - -msgid "9.1.0" -msgstr "9.1.0" - -msgid "9.1.1" -msgstr "9.1.1" - -msgid "9.1.2" -msgstr "9.1.2" - -msgid "" -"A bug in the Quobyte driver was fixed that prevented backing up volumes and " -"snapshots" -msgstr "" -"ボリュームのバックアップとスナップショットの取得を阻止していたQuobyteドライバ" -"のバグが修正されました。" - -msgid "" -"A new API to display the volumes summary. This summary API displays the " -"total number of volumes and total volume's size in GB." -msgstr "" -"ボリュームサマリを表示する新しい API。このサマリ API はボリューム数とボリュー" -"ムサイズの合計(GB)を表示します。" - -msgid "" -"Add 'LUNType' configuration verification for Huawei driver when connecting " -"to Dorado array. Because Dorado array only supports 'Thin' lun type, so " -"'LUNType' only can be configured as 'Thin', any other type is invalid and if " -"'LUNType' not explicitly configured, by default use 'Thin' for Dorado array." -msgstr "" -"Huawei ドライバーにDorado アレイへの接続時の 'LUNType' 設定検証を追加しまし" -"た。Dorado アレイは 'Thin' lun タイプのみサポートしているため、'LUNType' の" -"み 'Thin' に設定し、その他のタイプは無効であり、'LUNType' が明示的に設定され" -"ていない場合はデフォルトで 'Thin' を Dorado アレイに使用します。" - -msgid "" -"Add 'display_name' and 'display_description' validation for creating/" -"updating snapshot and volume operations." -msgstr "" -"スナップショットの作成/更新とボリューム操作に 'display_name' と " -"'display_description' の検証を追加しました。" - -msgid "Add CG capability to generic volume groups in Huawei driver." -msgstr "" -"Huaweiドライバーで 一般的なボリュームグループにコンシステンシーグループ能力を" -"追加しました。" - -msgid "Add CG capability to generic volume groups in INFINIDAT driver." -msgstr "" -"INFINIDAT ドライバーで 一般的なボリュームグループにコンシステンシーグループ能" -"力を追加しました。" - -msgid "" -"Add Support for QoS in the Nimble Storage driver. QoS is available from " -"Nimble OS release 4.x and above." -msgstr "" -" Nimble ストレージドライバーに QoS サポートを追加しました。QoS は Nimble OS " -"release 4.x とそれ以降で利用可能。" - -msgid "Add Support for deduplication of volumes in the Nimble Storage driver." -msgstr "" -"Nimble ストレージドライバーでボリュームの重複排除サポートを追加しました。" - -msgid "Add ``admin_or_storage_type_admin`` rule to ``policy.json``, e.g." -msgstr "" -"``policy.json`` に ``admin_or_storage_type_admin`` を追加しました。 例:" - -msgid "" -"Add ``all_tenants``, ``project_id`` support in attachment list&detail APIs." -msgstr "" -"接続リストと詳細の API に ``all_tenants`` と ``project_id`` のサポートを追加" -"しました。" - -msgid "" -"Add ``all_tenants``, ``project_id`` support in the attachment list and " -"detail APIs." -msgstr "" -"接続リストと詳細の API に ``all_tenants`` と ``project_id`` のサポートを追加" -"しました。" - -msgid "Add ``storage_type_admin`` role." -msgstr "``storage_type_admin`` ロールを追加しました。" - -msgid "Add ``user_id`` field to snapshot list/detail and snapshot show." -msgstr "" -"snapshot list/detail および snapshot show に ``user_id`` フィールドを追加しま" -"した。" - -msgid "Add ``volume-type`` filter to API Get-Pools" -msgstr "Get-Pools API に ``volume-type`` フィルターを追加しました。" - -msgid "" -"Add ability to enable multi-initiator support to allow live migration in the " -"Nimble backend driver." -msgstr "" -"Nimble バックエンドドライバーで、ライブマイグレーションでのマルチイニシエー" -"ターのサポートを可能にする機能を追加しました。" - -msgid "" -"Add ability to extend ``in-use`` volume. User should be aware of the whole " -"environment before using this feature because it's dependent on several " -"external factors below:" -msgstr "" -"``使用中``ボリュームを拡張できるようになりました。以下のいくつかの外部要因に" -"依存しているため、この機能を使用する前に環境全体を認識しておく必要がありま" -"す。" - -msgid "Add ability to specify backup driver via class name." -msgstr "クラス名でバックアップドライバーを指定できるようになりました。" - -msgid "Add backup snapshots support for Storwize/SVC driver." -msgstr "" -"Storwize/SVC ドライバーにスナップショットバックアップのサポートを追加しまし" -"た。" - -msgid "Add chap authentication support for the vmax backend." -msgstr "VMAX バックエンドに chap 認証のサポートを追加しました。" - -msgid "" -"Add consistency group capability to Generic Volume Groups in the Dell EMC SC " -"driver." -msgstr "" -"Dell EMC SC ドライバに汎用Volume Groupに対する整合性グループ機能が追加されま" -"した。" - -msgid "" -"Add consistency group capability to generic volume groups in Storwize " -"drivers." -msgstr "" -"Storwize ドライバーの一般的なボリュームグループにコンシステンシーグループ能力" -"を追加しました。" - -msgid "Add consistency group replication support in XIV\\A9000 Cinder driver." -msgstr "" -"XIV\\A9000 Cinder ドライバーでコンシステンシーグループレプリケーションをサ" -"ポートしました。" - -msgid "" -"Add consistent group capability to generic volume groups in CoprHD driver." -msgstr "" -"CoprHD ドライバーの一般的なボリュームグループにコンシステンシーグループ能力を" -"追加しました。" - -msgid "" -"Add consistent group capability to generic volume groups in Lefthand driver." -msgstr "" -"Lefthandドライバに汎用Volume Groupに対する整合性グループ機能が追加されまし" -"た。" - -msgid "" -"Add consistent group capability to generic volume groups in Pure drivers." -msgstr "" -"Pure ドライバで 一般的なボリュームグループにコンシステンシーグループ能力を追" -"加しました。" - -msgid "Add consistent group capability to generic volume groups in VNX driver." -msgstr "" -"VNX ドライバーで 一般的なボリュームグループにコンシステンシーグループ能力を追" -"加しました。" - -msgid "" -"Add consistent group capability to generic volume groups in XIV, Spectrum " -"Accelerate and A9000/R storage systems." -msgstr "" -"XIV, Spectrum Accelerate, A9000/R ストレージシステムに汎用ボリュームグループ" -"に整合性グループ機能が追加されました。" - -msgid "" -"Add consistent group capability to generic volume groups in the SolidFire " -"driver." -msgstr "" -" SolidFire ドライバーの一般的なボリュームグループにコンシステンシーグループ能" -"力を追加しました。" - -msgid "" -"Add consistent group capability to generic volume groups in the XtremIO " -"driver." -msgstr "" -" XtremIO ドライバーで 一般的なボリュームグループにコンシステンシーグループ能" -"力を追加しました。" - -msgid "" -"Add consistent group snapshot support to generic volume groups in VMAX " -"driver version 3.0." -msgstr "" -" VMAX ドライバーの一般的なボリュームグループにコンシステンシーグループスナッ" -"プショットのサポートを追加しました。" - -msgid "" -"Add consistent replication group support in Dell EMC VMAX cinder driver." -msgstr "" -"Dell EMC VMAX Cinder ドライバーに、 整合レプリケーショングループのサポートを" -"追加しました。" - -msgid "Add consistent replication group support in Storwize Cinder driver." -msgstr "" -"Storwize Cinder ドライバーに、 整合レプリケーショングループのサポートを追加し" -"ました。" - -msgid "Add consistent replication group support in VNX cinder driver." -msgstr "" -"VNX Cinder ドライバーに、 整合レプリケーショングループのサポートを追加しまし" -"た。" - -msgid "" -"Add enhanced support to the QNAP Cinder driver, including 'CHAP', 'Thin " -"Provision', 'SSD Cache', 'Dedup' and 'Compression'." -msgstr "" -"Add enhanced support to the QNAP Cinder driver, including 'CHAP'、'Thin " -"Provision'、'SSD Cache'、'Dedup' および 'Compression' を含む、サポート強化を " -"QNAP Cinder ドライバーに追加しました。" - -msgid "Add filter, sorter and pagination support in group snapshot listings." -msgstr "" -"グループスナップショットの一覧にフィルター、ソート、ページ送りのサポートを追" -"加しました。" - -msgid "Add filters support to get_pools API v3.28." -msgstr "get_pools API v3.28 でフィルタサポートを追加しました。" - -msgid "" -"Add get_manageable_volumes and get_manageable_snapshots implementations for " -"Pure Storage Volume Drivers." -msgstr "" -"Pure Storage ボリュームドライバーに get_manageable_volumes と " -"get_manageable_snapshots 実装を追加しました。" - -msgid "" -"Add global mirror with change volumes(gmcv) support and user can manage gmcv " -"replication volume by SVC driver. An example to set a gmcv replication " -"volume type, set property replication_type as \" gmcv\", property " -"replication_enabled as \" True\" and set property drivers:" -"cycle_period_seconds as 500." -msgstr "" -"ボリューム変更を伴うグローバルミラー (gmcv) のサポートを追加し、SVC ドライ" -"バーで gmcv レプリケーションボリュームを管理できるようになりました。gmcv レプ" -"リケーションボリュームタイプを設定する一つの例として、プロパティー " -"replication_type を \" gmcv\" に設定し、プロパティー replication_enabled " -"を \" True\" に設定し、プロパティー driver:cycle_period_seconds を 500 に" -"設定します。" - -msgid "Add mirrored volume support in IBM SVC/Storwize driver." -msgstr "" -"IBM SVC/Storwize ドライバーにミラーされたボリュームのサポートを追加しました。" - -msgid "Add multipath enhancement to Storwize iSCSI driver." -msgstr "Storwize SVC ドライバーにマルチパスのサポートを追加しました。" - -msgid "Add provider_id in the detailed view of a volume for admin." -msgstr "管理者向けにボリューム詳細表示に provider_id を追加しました。" - -msgid "Add support for hybrid aggregates to the NetApp cDOT drivers." -msgstr "" -"NetApp cDOT ドライバーに ハイブリッドアグリゲートのサポートを追加しました。" - -msgid "Add support for reporting pool disk type in Huawei driver." -msgstr "" -" Huawei ドライバーにプールディスクタイプをレポートするサポートを追加しまし" -"た。" - -msgid "Add support to backup volume using snapshot in the Unity driver." -msgstr "" -"Unity ドライバにスナップショットを使うボリュームバックアップのサポートを追加" -"しました。" - -msgid "Add support to configure IO ports option in Dell EMC Unity driver." -msgstr "" -"Dell EMC Unity ドライバーに IO ポートオプション設定のサポートを追加しました。" - -msgid "Add v2.1 volume replication support in VMAX driver." -msgstr " VMAXドライバーに、 v2.1 レプリケーションのサポートを追加しました。" - -msgid "" -"Added Cheesecake (v2.1) replication support to the Pure Storage Volume " -"drivers." -msgstr "" -"Pure Storage ボリュームドライバーに Cheesecake (v2.1) レプリケーションのサ" -"ポートを追加しました。" - -msgid "Added Cinder consistency group for the NetApp NFS driver." -msgstr "NetApp NFS ドライバー用に整合性グループのサポートを追加しました。" - -msgid "Added Consistency Group support in ScaleIO driver." -msgstr "Scale IO ドライバーに整合性グループのサポートを追加しました。" - -msgid "Added Datera EDF API 2.1 support." -msgstr "Datera EDF API 2.1 サポートを追加しました。" - -msgid "Added Datera Multi-Tenancy Support." -msgstr "Datera マルチテナントサポートを追加しました。" - -msgid "Added Datera Template Support." -msgstr "Datera テンプレートサポートを追加しました。" - -msgid "Added HA support for NexentaEdge iSCSI driver" -msgstr " NexentaEdge iSCSI ドライバに HA サポートを追加しました。" - -msgid "Added Keystone v3 support for Swift backup driver in single user mode." -msgstr "" -"シングルユーザーモードで、Swift バックアップドライバー用の Keystone v3 のサ" -"ポートを追加しました。" - -msgid "Added Migrate and Extend for Nexenta NFS driver." -msgstr "Nexenta NFS ドライバーにマイグレーションと拡張の機能を追加しました。" - -msgid "Added NBD driver for NexentaEdge." -msgstr "NexentaEdge 用 NBD ドライバーを追加しました。" - -msgid "Added Nimble Storage Fibre Channel backend driver." -msgstr "" -"Nimble Storage ファイバーチャネルバックエンドドライバーを追加しました。" - -msgid "Added QoS support in ScaleIO driver." -msgstr "Scale IO ドライバーに QoS サポートを追加しました。" - -msgid "Added REST API to update backup name and description." -msgstr "バックアップ名と説明を更新する REST API を追加しました。" - -msgid "" -"Added RPC backward compatibility layer similar to the one implemented in " -"Nova. This means that Cinder services can be upgraded one-by-one without " -"breakage. After all the services are upgraded SIGHUP signals should be " -"issued to all the services to signal them to reload cached minimum RPC " -"versions. Alternative is of course restart of them. Please note that cinder-" -"api service doesn't support SIGHUP yet. Please also take into account that " -"all the rolling upgrades capabilities are considered tech preview, as we " -"don't have a CI testing it yet." -msgstr "" -"Novaに実装されているものと近い、RPC 後方互換性レイヤーを追加しました。これ" -"は、 Cinder サービスを1つずつ、破損させずにアップグレードできることを意味し" -"ます。全てのサービスをアップグレードした後、 キャッシュされた最小のRPCバー" -"ジョンを再読み込みすることを知らせるために、 SIGHUP シグナルを全てのサービス" -"に送信します。代替手段は、もちろん全てのサービスを再起動トすることです。" -"cinder-api サービスではまだ SIGHUP をサポートしていないことに注意してくださ" -"い。また、まだこの機能のCIテストは行われていないため、すべてのローリングアッ" -"プグレード機能がテクニカルプレビューであることを考慮してください。" - -msgid "Added Retype functionality to Nexenta iSCSI and NFS drivers." -msgstr "" -"Nexenta iSCSI ドライバーおよび NFS ドライバーにタイプ変更機能を追加しました。" - -msgid "" -"Added a new config option `scheduler_weight_handler`. This is a global " -"option which specifies how the scheduler should choose from a listed of " -"weighted pools. By default the existing weigher is used which always chooses " -"the highest weight." -msgstr "" -"新しい設定オプション `scheduler_weight_handler` を追加しました。これはグロー" -"バルオプションで、どのようにスケジューラが重みづけされたプールのリストから選" -"択するかを指定します。デフォルトでは今ある weigher が使われます。これは常に最" -"高の weight を選びます。" - -msgid "" -"Added a new weight handler `StochasticHostWeightHandler`. This weight " -"handler chooses pools randomly, where the random probabilities are " -"proportional to the weights, so higher weighted pools are chosen more " -"frequently, but not all the time. This weight handler spreads new shares " -"across available pools more fairly." -msgstr "" -"新しいウェイトハンドラ― `StochasticHostWeightHandler` を追加しました。この" -"ウェイトハンドラ―はランダムにプールを選びます。ランダム性は重みに比例しますの" -"で、より高く重みづけられたプールはより頻繁に選ばれますが、いつもそうではあり" -"ません。このウェイトハンドラはより公平に使用可能なプール間で新しく分け合うこ" -"とを広めます。" - -msgid "Added ability to backup snapshots." -msgstr "バックアップスナップショットを可能にする機能を追加しました。" - -msgid "Added ability to query backups by project ID." -msgstr "プロジェクト ID によりバックアップを検索できる機能を追加しました。" - -msgid "" -"Added additional metrics reported to the scheduler for Pure Volume Drivers " -"for better filtering and weighing functions." -msgstr "" -"Pure ボリュームドライバのフィルタリング機能と重みづけ機能の向上のため、スケ" -"ジューラーにレポートされる指標を追加しました。" - -msgid "Added backend FC and iSCSI drivers for NEC Storage." -msgstr "NEC ストレージ用に FC と iSCSI バックエンドドライバーを追加しました。" - -msgid "Added backend ISCSI driver for Reduxio." -msgstr "Reduxio用バックエンド ISCSIドライバーを追加しました。" - -msgid "Added backend driver for Coho Data storage." -msgstr "Coho Data ストレージ用バックエンドドライバーを追加しました。" - -msgid "Added backend driver for DISCO storage." -msgstr "Discoストレージ用バックエンドドライバーを追加しました。" - -msgid "Added backend driver for Dell EMC Unity storage." -msgstr " Dell EMC Unity ストレージ用バックエンドドライバーを追加しました。" - -msgid "Added backend driver for FalconStor FreeStor." -msgstr " FalconStor FreeStor 用バックエンドドライバーを追加しました。" - -msgid "Added backend driver for Fujitsu ETERNUS DX (FC)." -msgstr " Fujitsu ETERNUS DX 用バックエンドドライバー (FC) を追加 しました。" - -msgid "Added backend driver for Fujitsu ETERNUS DX (iSCSI)." -msgstr "Fujitsu ETERNUS DX 用バックエンドドライバー (iSCSI) を追加しました。" - -msgid "Added backend driver for Huawei FusionStorage." -msgstr "Huawei FusionStorage用バックエンドドライバーを追加しました。" - -msgid "Added backend driver for Nexenta Edge iSCSI storage." -msgstr "Nexenta Edge iSCSI ストレージ用バックエンドドライバーを追加しました。" - -msgid "Added backend driver for NexentaStor5 NFS storage." -msgstr "NexentaStor5 NFS ストレージ用バックエンドドライバーを追加しました。" - -msgid "Added backend driver for NexentaStor5 iSCSI storage." -msgstr "NexentaStor5 iSCSI ストレージ用バックエンドドライバーを追加しました。" - -msgid "Added backend driver for Synology iSCSI-supported storage." -msgstr "" -"Synology iSCSI-supported ストレージ用バックエンドドライバーを追加しました。" - -msgid "Added backend driver for Violin Memory 7000 iscsi storage." -msgstr "" -"Violin Memory 7000 iscsi ストレージ用バックエンドドライバーを追加しました。" - -msgid "Added backend driver for ZTE iSCSI storage." -msgstr "ZTE iSCSI ストレージ用バックエンドドライバーを追加しました。" - -msgid "Added cinder backup driver for Google Cloud Storage." -msgstr "Google Cloud ストレージ用 バックアップドライバーを追加しました。" - -msgid "" -"Added config option ``vmware_connection_pool_size`` in the VMware VMDK " -"driver to specify the maximum number of connections (to vCenter) in the http " -"connection pool." -msgstr "" -"VMware VMDK ドライバに ``vmware_connection_pool_size`` 設定オプションを追加し" -"て、http sつ属プールの(vCenterへの)最大接続数を指定します。" - -msgid "" -"Added config option to enable/disable automatically calculation an over-" -"subscription ratio max for Pure Volume Drivers. When disabled the drivers " -"will now respect the max_oversubscription_ratio config option." -msgstr "" -"Pure ボリュームドライバー用に、オーバーサブスクリプション比率の最大値の自動計" -"算を有効/無効にする設定オプションを追加しました。ドライバーを無効にした場合、" -"設定オプション max_oversubscription_ratio が優先されます。" - -msgid "" -"Added consistency group support to generic volume groups in ScaleIO Driver." -msgstr "" -"ScaleIOドライバの汎用ボリュームグループに整合性グループのサポートを追加しまし" -"た。" - -msgid "Added consistency group support to the Huawei driver." -msgstr "Huawei ドライバー用に整合性グループのサポートを追加しました。" - -msgid "" -"Added create/delete APIs for group snapshots and an API to create group from " -"source." -msgstr "" -"グループスナップショットの作成/削除 API と、ソースからグループを作成する API " -"を追加しました。" - -msgid "Added driver for Tegile IntelliFlash arrays." -msgstr "Tegile IntelliFlash アレイ用ドライバーを追加しました。" - -msgid "Added driver for the InfiniBox storage array." -msgstr "InfiniBox ストレージアレイ 用ドライバーを追加しました。" - -msgid "Added extend method to NFS driver for NexentaStor 5." -msgstr "NexentaStor 5 用 NFS ドライバーへ拡張メソッドを追加しました。" - -msgid "Added group type and group specs APIs." -msgstr "グループタイプと group specs API を追加しました。 " - -msgid "" -"Added host-level (whole back end replication - v2.1) replication support to " -"the NetApp cDOT drivers (iSCSI, FC, NFS)." -msgstr "" -"NetApp cDOT ドライバー(iSCSI、FC、NFS)用にホストレベル(全体バックエンドレ" -"プリケーション v2.1)レプリケーションサポートを追加しました。" - -msgid "Added iSCSI CHAP uni-directional authentication for NetApp drivers." -msgstr "NetAPp ドライバー用に iSCSI CHAP の一方向認証機能を追加しました。" - -msgid "Added manage/unmanage snapshot support for Huawei drivers." -msgstr "" -"Huawei ドライバー用にスナップショットの管理/管理解除機能のサポートを追加しま" -"した。" - -msgid "Added manage/unmanage snapshot support to the HNAS NFS driver." -msgstr "" -"HNAS NFS ドライバー用にスナップショットの管理/管理解除機能のサポートを追加し" -"ました。" - -msgid "Added manage/unmanage volume support for Dell Equallogic driver." -msgstr "" -"Dell Equallogic ドライバー用にボリュームの管理/管理解除機能のサポートを追加し" -"ました。" - -msgid "Added manage/unmanage volume support for Huawei drivers." -msgstr "" -"Huawei ドライバー用にボリュームの管理/管理解除機能のサポートを追加しました。" - -msgid "Added multiple management IP support to Storwize SVC driver." -msgstr "Storwize SVC ドライバー用に複数の管理IPのサポートを追加しました。" - -msgid "Added multiple pools support to Storwize SVC driver." -msgstr "Storwize SVC ドライバー用に複数プールのサポートを追加しました。" - -msgid "" -"Added new BoolOpt ``backup_ceph_image_journals`` for enabling the Ceph image " -"features required to support RBD mirroring of Cinder backup pool." -msgstr "" -"Ceph イメージ機能を有効とするために新しい BoolOpt " -"``backup_ceph_image_journals`` を追加しました。これは Cinder バックアッププー" -"ルの RBD ミラーリングをサポートするために必要です。" - -msgid "" -"Added new Hitachi VSP FC Driver. The VSP driver supports all Hitachi VSP " -"Family and HUSVM." -msgstr "" -"新しい Hitachi VSP FC ドライバを追加しました。VSP ドライバはすべての Hitachi " -"VSP ファミリーと HUSVM をサポートします。" - -msgid "Added oversubscription support in the VMAX driver" -msgstr "" -"VMAX ドライバーに オーバーサブスクリプションの サポートを追加しました。" - -msgid "Added replication failback support for the Dell SC driver." -msgstr "" -"Dell SC ドライバー用にレプリケーションフェイルバックのサポートを追加しまし" -"た。" - -msgid "Added replication v2.1 support to the Dell Storage Center drivers." -msgstr "" -"Dell Storage Center ドライバー用に、レプリケーション V2.1 のサポートを追加し" -"ました。" - -msgid "Added replication v2.1 support to the IBM Storwize driver." -msgstr "" -"IBM Storwize ドライバー用に、レプリケーション V2.1 のサポートを追加しました。" - -msgid "Added replication v2.1 support to the IBM XIV/DS8K driver." -msgstr "" -"IBM XIV/DS8K ドライバー用に、レプリケーション V2.1 のサポートを追加しました。" - -msgid "Added reset status API to generic volume group." -msgstr "一般的なボリュームグループに reset status API を追加しました。" - -msgid "Added reset status API to group snapshot." -msgstr "グループスナップショットに reset status API を追加しました。" - -msgid "Added snapshot manage/unmanage support to the EMC XtremIO driver." -msgstr "" -"EMC XtremIO ドライバー用にスナップショットの管理/管理解除機能のサポートを追加" -"しました。" - -msgid "Added snapshot manage/unmanage support to the HPE 3PAR driver." -msgstr "" -"HPE 3PAR ドライバー用にスナップショットの管理/管理解除機能のサポートを追加し" -"ました。" - -msgid "Added snapshot manage/unmanage support to the HPE LeftHand driver." -msgstr "" -"HPE LeftHand ドライバー用にスナップショットの管理/管理解除機能のサポートを追" -"加しました。" - -msgid "Added support for API microversions, as well as /v3 API endpoint." -msgstr "" -"API マイクロバージョンおよび /v3 API エンドポイントのサポートを追加しました。" - -msgid "Added support for ZMQ messaging layer in multibackend configuration." -msgstr "" -"マルチバックエンド設定において、 Zero MQ メッセージングドライバーのサポートを" -"追加しました。" - -msgid "" -"Added support for ZeroMQ messaging driver in cinder single backend config." -msgstr "" -"cinder の単一のバックエンド設定において、 Zero MQ メッセージングドライバーの" -"サポートを追加しました。" - -msgid "" -"Added support for creating a consistency group from a source consistency " -"group in the HPE 3PAR driver." -msgstr "" -"HPE 3PAR ドライバーに、ソースの整合性グループから整合性グループを作成する機能" -"を追加しました。" - -msgid "" -"Added support for creating, deleting, and updating consistency groups for " -"NetApp 7mode and CDOT backends." -msgstr "" -"NetApp 7mode と CDOT バックエンドに、整合性グループの追加、削除、更新機能のサ" -"ポートを追加しました。" - -msgid "" -"Added support for images with vmware_adaptertype set to paraVirtual in the " -"VMDK driver." -msgstr "" -"VMDK ドライバーに、準仮想化のため vmware_adaptertype を設定したイメージのサ" -"ポートを追加しました。" - -msgid "Added support for manage volume in the VMware VMDK driver." -msgstr "" -"VMware VMDK ドライバーに、ボリュームの管理機能のサポートを追加しました。" - -msgid "Added support for manage/unmanage snapshot in the ScaleIO driver." -msgstr "" -"ScaleIO ドライバー用にスナップショットの管理/管理解除機能のサポートを追加しま" -"した。" - -msgid "Added support for manage/unmanage volume in the ScaleIO driver." -msgstr "" -"ScaleIO ドライバー用にボリュームの管理/管理解除機能のサポートを追加しました。" - -msgid "" -"Added support for oversubscription in thin provisioning in the ScaleIO " -"driver. Volumes should have extra_specs with the key provisioning:type with " -"value equals to either 'thick' or 'thin'. max_oversubscription_ratio can be " -"defined by the global config or for ScaleIO specific with the config option " -"sio_max_over_subscription_ratio. The maximum oversubscription ratio " -"supported at the moment is 10.0." -msgstr "" -"ScaleIO ドライバに、シンプロビジョニングのオーバーサブスクリプションのサポー" -"トを追加しました。ボリュームは extra_specs に 鍵 provisioning:type、値が " -"'thick' または 'thin' とするべきです。max_oversubscription_ratio をグローバ" -"ルオプションとして定義するか、ScaleIO 固有の設定オプション " -"sio_max_over_subscription_ratio が定義できます。最大オーバーサブスクリプショ" -"ン比率は 10.0 がサポートされます。" - -msgid "" -"Added support for querying volumes filtered by glance metadata key/value " -"using 'glance_metadata' optional URL parameter. For example, \"volumes/" -"detail?glance_metadata={\"image_name\":\"xxx\"}\"." -msgstr "" -"glance メタデータの項目である'glance_metadata' とオプションのURLパラメータ" -"を キー/値 として、ボリュームをフィルターするクエリーを作成する機能のサポート" -"を追加しました。例: \"volumes/detail?glance_metadata={\"image_name\":\"xxx" -"\"}\"" - -msgid "" -"Added support for scaling QoS in the ScaleIO driver. The new QoS keys are " -"maxIOPSperGB and maxBWSperGB." -msgstr "" -"ScaleIO ドライバー用にスケーリング QoS 機能のサポートを追加しました。新しい " -"QoS キーは maxIOPSperGB と maxBWSperGB です。" - -msgid "" -"Added support for taking, deleting, and restoring a cgsnapshot for NetApp " -"7mode and CDOT backends." -msgstr "" -"NetApp 7mode と CDOT バックエンドに、cgsnapshot の取得、削除、リストア機能の" -"サポートを追加しました。" - -msgid "" -"Added the ability to list manageable volumes and snapshots via GET operation " -"on the /v2//os-volume-manage and /v2//os-snapshot-" -"manage URLs, respectively." -msgstr "" -"GET オペレーションにより、管理可能なボリュームとスナップショットのリストを表" -"示を行う機能を追加しました。URLはそれぞれ、 /v2//os-volume-" -"manage と /v2//os-snapshot-manage です。" - -msgid "" -"Added the options ``visibility`` and ``protected`` to the os-" -"volume_upload_image REST API call." -msgstr "" -"os-volume_upload_image REST API コールに、 ``visibility`` と ``protected`` オ" -"プションを追加しました。" - -msgid "Added v2.1 replication support in Huawei Cinder driver." -msgstr "" -"Huawei Cinder ドライバーに、 v2.1 レプリケーションのサポートを追加しました。" - -msgid "Added v2.1 replication support to SolidFire driver." -msgstr "" -"SolidFire ドライバーに、 v2.1 レプリケーションのサポートを追加しました。" - -msgid "Added v2.1 replication support to the HPE 3PAR driver." -msgstr "" -"HPE 3PAR ドライバーに、 v2.1 レプリケーションのサポートを追加しました。" - -msgid "Added v2.1 replication support to the HPE LeftHand driver." -msgstr "" -"HPE LeftHand ドライバーに、 v2.1 レプリケーションのサポートを追加しました。" - -msgid "Added volume backend drivers for CoprHD FC, iSCSI and Scaleio." -msgstr "" -"CoprHD FC / iSCSI と Scaleio 用ボリュームバックエンドドライバーを追加しまし" -"た。" - -msgid "Added volume driver for Zadara Storage VPSA." -msgstr "Zadara Storage VPSA 用ボリュームバックエンドドライバーを追加しました。" - -msgid "" -"Adding or removing volume_type_access from any project during DB migration " -"62 must not be performed." -msgstr "" -"DB マイグレーションを行っているプロジェクトでは、 volume_type_access の追加/" -"削除は行われません。" - -msgid "Adds v2.1 replication support in VNX Cinder driver." -msgstr "" -"VNX Cinder ドライバーに、 v2.1 レプリケーションのサポートを追加しました。" - -msgid "" -"All Datera DataFabric backed volume-types will now use API version 2 with " -"Datera DataFabric" -msgstr "" -"全ての Datera DataFabric を背後に持つボリュームタイプは、 Datera DataFabric " -"との通信に API バージョン 2 を利用するようになりました。" - -msgid "" -"Allow API user to remove the consistency group name or description " -"information." -msgstr "" -"API ユーザーが整合性グループの名前や説明を削除することが許容されるようになり" -"ました。" - -msgid "" -"Allow for eradicating Pure Storage volumes, snapshots, and pgroups when " -"deleting their Cinder counterpart." -msgstr "" -"Pure Storage のボリューム、スナップショット、 pgroup を、 cincer カウンター" -"パートが削除された際に一括で削除できるようになりました。" - -msgid "Allow spaces when managing existing volumes with the HNAS iSCSI driver." -msgstr "" -"HNAS iSCSI ドライバーで既存のボリュームを管理する際、スペースが許容されるよう" -"になりました。" - -msgid "" -"An error has been corrected in the EMC ScaleIO driver that had caused all " -"volumes to be provisioned at 'thick' even if user had specificed 'thin'." -msgstr "" -"EMC ScaleIO において、プロビジョニングで 'thin' を指定した場合でもすべてのボ" -"リュームが 'thick' としてプロビジョニングされるエラーを修正しました。" - -msgid "" -"Any Volume Drivers configured in the DEFAULT config stanza should be moved " -"to their own stanza and enabled via the enabled_backends config option. The " -"older style of config with DEFAULT is deprecated and will be removed in " -"future releases." -msgstr "" -"DEFAULT config スタンザで設定されているすべてのボリュームドライバーは、自身の" -"スタンザに移動させ、 enabled_backends config オプションを有効にしなければいけ" -"ません。 DEFAULT を使った古いスタイルの設定は非推奨であり、今後のリリースで削" -"除される予定です。" - -msgid "Backend driver for Scality SRB has been removed." -msgstr "Scality SRB 用のバックエンドドライバーは削除されました。" - -msgid "Better cleanup handling in the NetApp E-Series driver." -msgstr "より良いNetApp E-Series ドライバにおけるクリーンアップ処理" - -msgid "" -"BoolOpt ``datera_acl_allow_all`` is changed to a volume type extra spec " -"option-- ``DF:acl_allow_all``" -msgstr "" -"BoolOpt ``datera_acl_allow_all` はボリュームタイプの extra spec オプション " -"``DF:acl_allow_all`` に変更されました。" - -msgid "Broke Datera driver up into modules." -msgstr "Datera ドライバがモジュール化されました。" - -msgid "Bug Fixes" -msgstr "バグ修正" - -msgid "Capabilites List for Datera Volume Drivers" -msgstr "Datera ボリュームドライバ用のケイパビリティーリスト" - -msgid "Capacity reporting fixed with Huawei backend drivers." -msgstr "" -"Huawei バックエンドドライバにおけるキャパシティーレポーティングが修正されま" -"した。" - -msgid "Changes config option default for datera_num_replicas from 1 to 3" -msgstr "" -"設定オプション datera_num_replicas のデフォルト値を 1 から 3 に変更しました。" - -msgid "Cinder Release Notes" -msgstr "Cinder リリースノート" - -msgid "Current Series Release Notes" -msgstr "開発中バージョンのリリースノート" - -msgid "Deprecated IBM driver _multipath_enabled config flags." -msgstr "IBM driver _multipath_enabled 設定フラグは非推奨となりました。" - -msgid "Deprecated datera_api_version option." -msgstr "datera_api_versionオプションは非推奨となりました。" - -msgid "" -"Deprecated the configuration option ``hnas_svcX_volume_type``. Use option " -"``hnas_svcX_pool_name`` to indicate the name of the services (pools)." -msgstr "" -"``hnas_svcX_volume_type``構成オプションは非推奨となりました。サービス(プール)" -"の名前を指定する際には、``hnas_svcX_pool_name``オプションを使用してください。" - -msgid "" -"Deprecated the configuration option ``nas_ip``. Use option ``nas_host`` to " -"indicate the IP address or hostname of the NAS system." -msgstr "" -"``nas_ip``構成オプションは非推奨となりました。NASシステムのIPアドレスまはたホ" -"スト名を指定する際には、``nas_host``オプションを使用してください。" - -msgid "Deprecation Notes" -msgstr "廃止予定の機能" - -msgid "Known Issues" -msgstr "既知の問題" - -msgid "Liberty Series Release Notes" -msgstr "Liberty バージョンのリリースノート" - -msgid "Mitaka Series Release Notes" -msgstr "Mitaka バージョンのリリースノート" - -msgid "New Features" -msgstr "新機能" - -msgid "New iSCSI Cinder volume driver for Kaminario K2 all-flash arrays." -msgstr "" -"Kaminario K2 all-flash アレイの新しい iSCSI Cinder ボリュームドライバー" - -msgid "New path - cinder.volume.drivers.hpe.hpe_3par_fc.HPE3PARFCDriver" -msgstr "新しいパス - cinder.volume.drivers.hpe.hpe_3par_fc.HPE3PARFCDriver" - -msgid "New path - cinder.volume.drivers.hpe.hpe_3par_iscsi.HPE3PARISCSIDriver" -msgstr "" -"新しいパス - cinder.volume.drivers.hpe.hpe_3par_iscsi.HPE3PARISCSIDriver" - -msgid "" -"New path - cinder.volume.drivers.hpe.hpe_lefthand_iscsi." -"HPELeftHandISCSIDriver" -msgstr "" -"新しいパス - cinder.volume.drivers.hpe.hpe_lefthand_iscsi." -"HPELeftHandISCSIDriver" - -msgid "New path - cinder.volume.drivers.hpe.hpe_xp_fc.HPEXPFCDriver" -msgstr "新しいパス - cinder.volume.drivers.hpe.hpe_xp_fc.HPEXPFCDriver" - -msgid "New path - cinder.volume.drivers.huawei.huawei_driver.HuaweiFCDriver" -msgstr "新しいパス - cinder.volume.drivers.huawei.huawei_driver.HuaweiFCDriver" - -msgid "New path - cinder.volume.drivers.huawei.huawei_driver.HuaweiISCSIDriver" -msgstr "" -"新しいパス - cinder.volume.drivers.huawei.huawei_driver.HuaweiISCSIDriver" - -msgid "Newton Series Release Notes" -msgstr "Newton バージョンのリリースノート" - -msgid "Ocata Series Release Notes" -msgstr "Ocata バージョンのリリースノート" - -msgid "Other Notes" -msgstr "その他の注意点" - -msgid "Pike Series Release Notes" -msgstr "Pike バージョンのリリースノート" - -msgid "QNAP" -msgstr "QNAP" - -msgid "QNAP Cinder driver added support for QES fw 2.0.0." -msgstr "QNAP Cinder ドライバーに QES fw 2.0.0 サポートを追加しました。" - -msgid "QoS support in EMC VMAX iSCSI and FC drivers." -msgstr "EMC VMAX iSCSI と FC ドライバーの QoS サポート" - -msgid "Queens Series Release Notes" -msgstr "Queens バージョンのリリースノート" - -msgid "Re-added QNAP Cinder volume driver." -msgstr "QNAP Cinder ボリュームドライバーを再追加しました。" - -msgid "Reduxio" -msgstr "Reduxio" - -msgid "Removed - ``eqlx_chap_login``" -msgstr "``eqlx_chap_login`` を削除しました" - -msgid "Removed - ``eqlx_chap_password``" -msgstr "``eqlx_chap_password`` を削除しました" - -msgid "Removed - ``eqlx_cli_timeout``" -msgstr "``eqlx_cli_timeout`` を削除しました" - -msgid "Removed - ``eqlx_use_chap``" -msgstr "``eqlx_use_chap`` を削除しました" - -msgid "" -"Removing cinder-all binary. Instead use the individual binaries like cinder-" -"api, cinder-backup, cinder-volume, cinder-scheduler." -msgstr "" -"cinder-all バイナリーを削除しました。代わりに cinder-api、cinder-backup、" -"cinder-volume、cinder-scheduler などの個別のバイナリーを使用してください。" - -msgid "" -"Removing deprecated file cinder.middleware.sizelimit. In your api-paste.ini, " -"replace cinder.middleware.sizelimit:RequestBodySizeLimiter.factory with " -"oslo_middleware.sizelimit:RequestBodySizeLimiter.factory" -msgstr "" -"廃止予定だった cinder.middleware.sizelimit を削除しました。api-paste.ini の " -"cinder.middleware.sizelimit:RequestBodySizeLimiter.factory を " -"oslo_middleware.sizelimit:RequestBodySizeLimiter.factory に入れ替えてくださ" -"い。" - -msgid "" -"Removing the Dell EqualLogic driver's deprecated configuration options. " -"Please replace old options in your cinder.conf with the new one." -msgstr "" -"廃止予定だった Dell EqualLogic ドライバーを削除しました。cinder.conf の古いオ" -"プションを新しいものに入れ替えてください。" - -msgid "" -"Rename Huawei18000ISCSIDriver and Huawei18000FCDriver to HuaweiISCSIDriver " -"and HuaweiFCDriver." -msgstr "" -"Huawei18000ISCSIDriver と Huawei18000FCDriver を HuaweiISCSIDriver と " -"HuaweiFCDriver に名前を変更しました。" - -msgid "Replaced with - ``chap_password``" -msgstr "``chap_password`` に置き換えられました" - -msgid "Replaced with - ``chap_username``" -msgstr "``chap_username`` に置き換えられました" - -msgid "Replaced with - ``ssh_conn_timeout``" -msgstr "``ssh_conn_timeout`` に置き換えられました" - -msgid "Replaced with - ``use_chap_auth``" -msgstr "``use_chap_auth`` に置き換えられました" - -msgid "Security Issues" -msgstr "セキュリティー上の問題" - -msgid "Show CG Snapshot checks both tables." -msgstr "両方のテーブルに CG スナップショットチェックを表示する。" - -msgid "Show CG checks both tables." -msgstr "両方のテーブルに CG チェックを表示する。" - -msgid "Start using reno to manage release notes." -msgstr "リリースノートの管理に reno を使い始めました。" - -msgid "" -"Starting from Mitaka release Cinder is having a tech preview of rolling " -"upgrades support." -msgstr "" -"Mitaka リリースから、Cinder はローリングアップグレードの技術プレビューをはじ" -"めました。" - -msgid "Support Force backup of in-use cinder volumes for Nimble Storage." -msgstr "" -"Nimble ストレージで、使用中の Cinder ボリュームの強制バックアップをサポートし" -"ました。" - -msgid "" -"Support cinder_img_volume_type property in glance image metadata to specify " -"volume type." -msgstr "" -"ボリュームタイプを指定するための Glance イメージメタデータの " -"cinder_img_volume_type プロパティをサポートしました。" - -msgid "Support for Consistency Groups in the NetApp E-Series Volume Driver." -msgstr "" -"NetApp E-Series ボリュームドライバーで整合性グループをサポートしました。" - -msgid "Support for Dot Hill AssuredSAN arrays has been removed." -msgstr "Dot Hill AssuredSAN アレイのサポートを削除しました。" - -msgid "Support for VMAX SRDF/Metro on VMAX cinder driver." -msgstr "VMAX cinder ドライバーで VMAX SRDF/Metro をサポートしました。" - -msgid "Support for compression on VMAX All Flash in the VMAX driver." -msgstr "VMAX ドライバーの VMAX All Flash で圧縮をサポートしました。" - -msgid "" -"Support for creating a consistency group from consistency group in XtremIO." -msgstr "XtremIO の整合性グループからの整合性グループの作成をサポートしました。" - -msgid "Support for force backup of in-use Cinder volumes in Nimble driver." -msgstr "" -"Nimble ドライバーで、使用中の Cinder ボリュームの強制バックアップをサポートし" -"ました。" - -msgid "Support for iSCSI in INFINIDAT InfiniBox driver." -msgstr "INFINIDAT InfiniBox ドライバーで iSCSI をサポートしました。" - -msgid "Support for iSCSI multipath in Huawei driver." -msgstr "Huawei ドライバーで iSCSI マルチパスをサポートしました。" - -msgid "Support for iSCSI multipathing in EMC VMAX driver." -msgstr "EMC VMAX ドライバーで iSCSI マルチパスをサポートしました。" - -msgid "Support for manage/ unmanage snapshots on VMAX cinder driver." -msgstr "" -"VMAX ドライバーでスナップショットの管理/管理解除機能をサポートしました。" - -msgid "Support for snapshot backup using the optimal path in Huawei driver." -msgstr "" -"Huawei ドライバーで最適パスを使用したスナップショットバックアップをサポートし" -"ました。" - -msgid "Support iSCSI configuration in replication in Huawei driver." -msgstr "Huawei ドライバーで複製における iSCSI 設定をサポートしました。" - -msgid "" -"Support manage/unmanage volume and manage/unmanage snapshot functions for " -"the NEC volume driver." -msgstr "" -"NEC ボリュームドライバーで、ボリュームとスナップショットの管理/管理解除機能の" -"サポートしました。" - -msgid "Support to sort snapshots with \"name\"." -msgstr "「名前」によるスナップショットのソートをサポートしました。" - -msgid "Tegile" -msgstr "Tegile" - -msgid "Upgrade Notes" -msgstr "アップグレード時の注意" - -msgid "Violin" -msgstr "Violin" - -msgid "Violin Memory 6000 array series drivers are removed." -msgstr "Violin Memory 6000 array シリーズのドライバーは削除されました。" - -msgid "Volume Manage/Unmanage support for Datera Volume Drivers" -msgstr "" -"Datera Volume ドライバー用にボリュームの管理/管理解除機能のサポートを追加しま" -"した。" - -msgid "" -"Volume manage/unmanage support for IBM FlashSystem FC and iSCSI drivers." -msgstr "" -"IBM FlashSystem FC および iSCSI ドライバー用にボリュームの管理/管理解除機能の" -"サポートを追加しました。" - -msgid "Volume manage/unmanage support for Oracle ZFSSA iSCSI and NFS drivers." -msgstr "" -"Oracle ZFSSA iSCSI および NFS ドライバー用にボリュームの管理/管理解除機能のサ" -"ポートを追加しました。" - -msgid "X-IO" -msgstr "X-IO" - -msgid "ZTE" -msgstr "ZTE" - -msgid "" -"``\"admin_or_storage_type_admin\": \"is_admin:True or role:storage_type_admin" -"\",``" -msgstr "" -"``\"admin_or_storage_type_admin\": \"is_admin:True or role:storage_type_admin" -"\",``" - -msgid "" -"``\"volume_extension:types_manage\": \"rule:admin_or_storage_type_admin\", " -"\"volume_extension:volume_type_access:addProjectAccess\": \"rule:" -"admin_or_storage_type_admin\", \"volume_extension:volume_type_access:" -"removeProjectAccess\": \"rule:admin_or_storage_type_admin\",``" -msgstr "" -"``\"volume_extension:types_manage\": \"rule:admin_or_storage_type_admin\", " -"\"volume_extension:volume_type_access:addProjectAccess\": \"rule:" -"admin_or_storage_type_admin\", \"volume_extension:volume_type_access:" -"removeProjectAccess\": \"rule:admin_or_storage_type_admin\",``" - -msgid "``choice_client``" -msgstr "``choice_client``" - -msgid "``choice_client`` to ``disco_choice_client``" -msgstr "``choice_client`` から ``disco_choice_client``" - -msgid "" -"``cinder.keymgr.conf_key_mgr.ConfKeyManager`` still remains, but the " -"``fixed_key`` configuration options should be moved to the ``[key_manager]`` " -"section" -msgstr "" -"``cinder.keymgr.conf_key_mgr.ConfKeyManager`` は残っていますが、" -"``fixed_key`` 設定オプションは ``[key_manager]`` セクションに移動する必要があ" -"ります" - -msgid "``clone_check_timeout`` to ``disco_clone_check_timeout``" -msgstr "``clone_check_timeout`` から ``disco_clone_check_timeout``" - -msgid "``disco_client_port``" -msgstr "``disco_client_port``" - -msgid "``disco_client``" -msgstr "``disco_client``" - -msgid "``disco_src_api_port``" -msgstr "``disco_src_api_port``" - -msgid "" -"``iscsi_ip_address``, ``iscsi_port``, ``target_helper``, " -"``iscsi_target_prefix`` and ``iscsi_protocol`` config options are deprecated " -"in flavor of ``target_ip_address``, ``target_port``, ``target_helper``, " -"``target_prefix`` and ``target_protocol`` accordingly. Old config options " -"will be removed in S release." -msgstr "" -"``iscsi_ip_address``、``iscsi_port``、``target_helper``、" -"``iscsi_target_prefix``、``iscsi_protocol`` 設定オプションは廃止予定となり、" -"``target_ip_address``、``target_port``、``target_helper``、" -"``target_prefix``、``target_protocol``に変更されました。古い設定オプションは " -"S リリースで削除予定です。" - -msgid "``os-set_image_metadata``" -msgstr "``os-set_image_metadata``" - -msgid "``os-unset_image_metadata``" -msgstr "``os-unset_image_metadata``" - -msgid "``rest_ip``" -msgstr "``rest_ip``" - -msgid "``rest_ip`` to ``disco_rest_ip``" -msgstr "``rest_ip`` から ``disco_rest_ip``" - -msgid "``restore_check_timeout`` to ``disco_restore_check_timeout``" -msgstr "``restore_check_timeout`` から ``disco_restore_check_timeout``" - -msgid "``retry_interval``" -msgstr "``retry_interval``" - -msgid "``retry_interval`` to ``disco_retry_interval``" -msgstr "``retry_interval`` から ``disco_retry_interval``" - -msgid "``snapshot_check_timeout`` to ``disco_snapshot_check_timeout``" -msgstr "``snapshot_check_timeout`` から ``disco_snapshot_check_timeout``" - -msgid "``volume_name_prefix`` to ``disco_volume_name_prefix``" -msgstr "``volume_name_prefix`` から ``disco_volume_name_prefix``"