From 6adc73299b1ec16916f8dfe89a60714eaae9b447 Mon Sep 17 00:00:00 2001 From: inori Date: Wed, 31 Jan 2024 02:32:42 -0500 Subject: [PATCH] Fujitsu Driver: Improve CLI function When the CLI command execution encounters an error, the storage returns an error code. However, only some error codes could be parsed, resulting the inability to view specific error information in the log. To fix this issue, the parsing of error codes has been added when the CLI encounters an error, allowing the error information to be viewed in the log. In addition, this patch also adds support for SSH keys, allowing connections to the storage using SSH key. Closes-Bug: #2048850 Change-Id: I204f3889e3401b142dd7c9a6e11585639585abfc --- .../unit/volume/drivers/test_fujitsu_dx.py | 161 +- .../drivers/fujitsu/eternus_dx/constants.py | 1821 +++++++++++++++++ .../fujitsu/eternus_dx/eternus_dx_cli.py | 79 +- .../fujitsu/eternus_dx/eternus_dx_common.py | 192 +- .../drivers/fujitsu-eternus-dx-driver.rst | 22 + ...improve-cli-function-6cabf36ffc6d44d6.yaml | 40 + 6 files changed, 2136 insertions(+), 179 deletions(-) create mode 100644 releasenotes/notes/fujitsu-improve-cli-function-6cabf36ffc6d44d6.yaml diff --git a/cinder/tests/unit/volume/drivers/test_fujitsu_dx.py b/cinder/tests/unit/volume/drivers/test_fujitsu_dx.py index 62e97c6d19a..122a842f580 100644 --- a/cinder/tests/unit/volume/drivers/test_fujitsu_dx.py +++ b/cinder/tests/unit/volume/drivers/test_fujitsu_dx.py @@ -24,6 +24,7 @@ from cinder import exception from cinder import ssh_utils from cinder.tests.unit import test from cinder.volume import configuration as conf +from cinder.volume.drivers.fujitsu.eternus_dx import constants as CONSTANTS with mock.patch.dict('sys.modules', pywbem=mock.Mock()): from cinder.volume.drivers.fujitsu.eternus_dx \ @@ -35,6 +36,8 @@ with mock.patch.dict('sys.modules', pywbem=mock.Mock()): from cinder.volume.drivers.fujitsu.eternus_dx \ import eternus_dx_iscsi as dx_iscsi +PRIVATE_KEY_PATH = '/etc/cinder/eternus' + CONFIG_FILE_NAME = 'cinder_fujitsu_eternus_dx.xml' STORAGE_SYSTEM = '172.16.0.2' @@ -111,7 +114,7 @@ TEST_CONNECTOR = {'initiator': ISCSI_INITIATOR, 'wwpns': TEST_WWPN} STORAGE_IP = '172.16.0.2' TEST_USER = 'testuser' -TEST_PASSWORD = 'testpassword' +TEST_PASSWORD = 'testpass' STOR_CONF_SVC = 'FUJITSU_StorageConfigurationService' CTRL_CONF_SVC = 'FUJITSU_ControllerConfigurationService' @@ -181,7 +184,7 @@ FAKE_POOLS = [{ }] FAKE_STATS = { - 'driver_version': '1.4.7', + 'driver_version': '1.4.8', 'storage_protocol': 'iSCSI', 'vendor_name': 'FUJITSU', 'QoS_support': True, @@ -191,7 +194,7 @@ FAKE_STATS = { 'pools': FAKE_POOLS, } FAKE_STATS2 = { - 'driver_version': '1.4.7', + 'driver_version': '1.4.8', 'storage_protocol': 'FC', 'vendor_name': 'FUJITSU', 'QoS_support': True, @@ -353,7 +356,7 @@ FAKE_MODEL_INFO2 = { FAKE_CLI_OUTPUT = { "result": 0, - 'rc': '0', + 'rc': str(CONSTANTS.RC_OK), "message": 'TEST_MESSAGE' } @@ -429,7 +432,7 @@ class FakeEternusConnection(object): global MAP_STAT, VOL_STAT if MethodName == 'CreateOrModifyElementFromStoragePool': VOL_STAT = '1' - rc = 0 + rc = CONSTANTS.RC_OK vol = self._enum_volumes() if InPool.get('InstanceID') == 'FUJITSU:RSP0005': job = {'TheElement': vol[1].path} @@ -440,29 +443,29 @@ class FakeEternusConnection(object): job = {'TheElement': vol[0].path} elif MethodName == 'ReturnToStoragePool': VOL_STAT = '0' - rc = 0 + rc = CONSTANTS.RC_OK job = {} elif MethodName == 'GetReplicationRelationships': - rc = 0 + rc = CONSTANTS.RC_OK job = {'Synchronizations': []} elif MethodName == 'ExposePaths': MAP_STAT = '1' - rc = 0 + rc = CONSTANTS.RC_OK job = {} elif MethodName == 'HidePaths': MAP_STAT = '0' - rc = 0 + rc = CONSTANTS.RC_OK job = {} elif MethodName == 'CreateElementReplica': - rc = 0 + rc = CONSTANTS.RC_OK snap = self._enum_snapshots() job = {'TargetElement': snap[0].path} elif MethodName == 'CreateReplica': - rc = 0 + rc = CONSTANTS.RC_OK snap = self._enum_snapshots() job = {'TargetElement': snap[0].path} elif MethodName == 'ModifyReplicaSynchronization': - rc = 0 + rc = CONSTANTS.RC_OK job = {} else: raise exception.VolumeBackendAPIException(data="invoke method") @@ -1083,6 +1086,8 @@ class FJFCDriverTestCase(test.TestCase): self.configuration.cinder_eternus_config_file = self.config_file.name self.configuration.safe_get = self.fake_safe_get self.configuration.max_over_subscription_ratio = '20.0' + self.configuration.fujitsu_passwordless = False + self.configuration.fujitsu_private_key_path = PRIVATE_KEY_PATH self.configuration.fujitsu_use_cli_copy = False self.mock_object(dx_common.FJDXCommon, '_get_eternus_connection', @@ -1398,6 +1403,8 @@ class FJISCSIDriverTestCase(test.TestCase): self.configuration.cinder_eternus_config_file = self.config_file.name self.configuration.safe_get = self.fake_safe_get self.configuration.max_over_subscription_ratio = '20.0' + self.configuration.fujitsu_passwordless = False + self.configuration.fujitsu_private_key_path = PRIVATE_KEY_PATH self.configuration.fujitsu_use_cli_copy = False self.mock_object(dx_common.FJDXCommon, '_get_eternus_connection', @@ -1781,31 +1788,28 @@ class FJCLITestCase(test.TestCase): ret = '%s\r\n00\r\n0019\r\nCLI> ' % exec_cmdline elif exec_cmdline.startswith('start copy-opc'): ret = '%s\r\n00\r\n0019\r\nCLI> ' % exec_cmdline + elif exec_cmdline.startswith('show cli-error-code'): + ret = '%s\r\n00\r\n0001\r\n0001\tBad Value\r\nCLI> ' % exec_cmdline else: ret = None return ret - @mock.patch.object(eternus_dx_cli.FJDXCLI, '_exec_cli_with_eternus') - def test_create_error_message(self, mock_exec_cli_with_eternus): - expected_error_value = {'message': ['-bandwidth-limit', 'asdf'], - 'rc': 'E8101', - 'result': 0} + def test_show_cli_error_message(self): + FAKE_OPTION = {'error-code': '0001'} + FAKE_MESSAGE = 'Bad Value' + FAKE_MESSAGE_OUTPUT = {**FAKE_CLI_OUTPUT, 'message': FAKE_MESSAGE} - FAKE_VOLUME_NAME = 'FJosv_0qJ4rpOHgFE8ipcJOMfBmg==' - FAKE_BANDWIDTH_LIMIT = 'abcd' - FAKE_QOS_OPTION = self.create_fake_options( - volume_name=FAKE_VOLUME_NAME, - bandwidth_limit=FAKE_BANDWIDTH_LIMIT) + ERROR_MESSAGE_OUTPUT = self.cli._show_cli_error_message(**FAKE_OPTION) + self.assertEqual(FAKE_MESSAGE_OUTPUT, ERROR_MESSAGE_OUTPUT) - error_cli_output = ('\r\nCLI> set volume-qos -volume-name %s ' - '-bandwidth-limit %s\r\n' - '01\r\n8101\r\n-bandwidth-limit\r\nasdf\r\n' - 'CLI> ' % (FAKE_VOLUME_NAME, FAKE_BANDWIDTH_LIMIT)) - mock_exec_cli_with_eternus.return_value = error_cli_output + def test_create_error_message(self): + FAKE_CODE = '0001' + FAKE_MSG = 'Bad Value' + expected_error_message = ('E' + FAKE_CODE, FAKE_MSG) - error_qos_output = self.cli._set_volume_qos(**FAKE_QOS_OPTION) - - self.assertEqual(expected_error_value, error_qos_output) + ERROR_MESSAGE = self.cli._create_error_message(FAKE_CODE, + FAKE_MSG) + self.assertEqual(expected_error_message, ERROR_MESSAGE) def test_get_options(self): expected_option = " -bandwidth-limit 2" @@ -2005,6 +2009,8 @@ class FJCommonTestCase(test.TestCase): self.configuration.cinder_eternus_config_file = self.config_file.name self.configuration.safe_get = self.fake_safe_get self.configuration.max_over_subscription_ratio = '20.0' + self.configuration.fujitsu_passwordless = False + self.configuration.fujitsu_private_key_path = PRIVATE_KEY_PATH self.configuration.fujitsu_use_cli_copy = False self.mock_object(dx_common.FJDXCommon, '_get_eternus_connection', @@ -2107,6 +2113,101 @@ class FJCommonTestCase(test.TestCase): for key, value in diction.items(): volume[key] = value + @mock.patch.object(ssh_utils, 'SSHPool') + def test_ssh_to_storage_by_password(self, mock_ssh_pool): + command = 'show_enclosure_status' + self.driver.common.fjdxcli = {} + self.driver.common._exec_eternus_cli(command) + + mock_ssh_pool.assert_called_with(STORAGE_IP, 22, None, TEST_USER, + password=TEST_PASSWORD, max_size=2) + + @mock.patch.object(ssh_utils, 'SSHPool') + def test_ssh_to_storage_by_key(self, mock_ssh_pool): + command = 'show_enclosure_status' + self.configuration.fujitsu_passwordless = True + driver = dx_iscsi.FJDXISCSIDriver(configuration=self.configuration) + self.driver = driver + + self.driver.common.fjdxcli = {} + self.driver.common._exec_eternus_cli(command) + + mock_ssh_pool.assert_called_with(STORAGE_IP, 22, None, TEST_USER, + privatekey=PRIVATE_KEY_PATH, + max_size=2) + + def test_exec_eternus_cli_success(self): + command = 'show_enclosure_status' + + FAKE_CLI_ENCLOUSER_STATUS = (0, None, {'version': 'V10L87-9000'}) + + cli_enclosure_status = self.driver.common._exec_eternus_cli(command) + + self.assertEqual(FAKE_CLI_ENCLOUSER_STATUS, cli_enclosure_status) + + @mock.patch.object(eternus_dx_cli.FJDXCLI, '_exec_cli_with_eternus') + def test_exec_eternus_cli_success_with_retry(self, + mock_exec_cli_with_eternus): + command = 'stop_copy_session' + mock_exec_cli_with_eternus.side_effect = [ + '\r\nCLI> stop copy-session\r\n01\r\n0060\r\nCLI> ', + '\r\nCLI> show cli-error-code -error-code ' + '0060\r\n00\r\n0060\r\n0060\tResource locked\r\nCLI> ', + '\r\nCLI> stop copy-session\r\n00\r\nCLI> '] + + retry_msg = 'INFO:cinder.volume.drivers.fujitsu.eternus_dx.' \ + 'eternus_dx_common:_exec_eternus_cli, retry, ' \ + 'ip: 172.16.0.2, RetryCode: E0060, TryNum: 1.' + FAKE_STOP_COPY_SESSION = (0, None, []) + + with self.assertLogs('cinder.volume.drivers.fujitsu.eternus_dx.' + 'eternus_dx_common', level='INFO') as cm: + cli_return = self.driver.common._exec_eternus_cli(command) + + self.assertIn(retry_msg, cm.output) + self.assertEqual(FAKE_STOP_COPY_SESSION, cli_return) + + @mock.patch.object(eternus_dx_cli.FJDXCLI, '_exec_cli_with_eternus') + def test_exec_eternus_cli_authentication_fail(self, + mock_exec_cli_with_eternus): + command = 'check_user_role' + mock_exec_cli_with_eternus.side_effect = ( + exception.VolumeBackendAPIException( + 'Execute CLI command error. Error: Authentication failed.')) + authentication_fail_msg = 'WARNING:' \ + 'cinder.volume.drivers.fujitsu.eternus_dx.' \ + 'eternus_dx_common:_exec_eternus_cli, ' \ + 'retry, ip: 172.16.0.2, ' \ + 'Message: Execute CLI command error. ' \ + 'Error: Authentication failed., TryNum: 1.' + FAKE_STOP_COPY_SESSION = (4, '4', + 'Execute CLI command error. ' + 'Error: Authentication failed.') + + with self.assertLogs('cinder.volume.drivers.fujitsu.eternus_dx.' + 'eternus_dx_common', level='WARNING') as cm: + cli_return = self.driver.common._exec_eternus_cli(command) + self.assertIn(authentication_fail_msg, cm.output) + self.assertEqual(FAKE_STOP_COPY_SESSION, cli_return) + + @mock.patch.object(eternus_dx_cli.FJDXCLI, '_exec_cli_with_eternus') + @mock.patch.object(dx_common, 'LOG') + def test_exec_eternus_cli_retry_exceed(self, mock_log, + mock_exec_cli_with_eternus): + command = 'stop_copy_session' + mock_exec_cli_with_eternus.side_effect = [ + '\r\nCLI> stop copy-session\r\n01\r\n0060\r\nCLI> ', + '\r\nCLI> show cli-error-code -error-code ' + '0060\r\n00\r\n0060\r\n0060\tResource locked\r\nCLI> '] * 3 + + exceed_msg = '_exec_eternus_cli, Retry was exceeded.' + FAKE_STOP_COPY_SESSION = (4, 'E0060', 'Resource locked') + + cli_return = self.driver.common._exec_eternus_cli(command) + + mock_log.warning.assert_called_with(exceed_msg) + self.assertEqual(FAKE_STOP_COPY_SESSION, cli_return) + def test_get_eternus_model(self): ETERNUS_MODEL = self.driver.common._get_eternus_model() self.assertEqual(3, ETERNUS_MODEL) diff --git a/cinder/volume/drivers/fujitsu/eternus_dx/constants.py b/cinder/volume/drivers/fujitsu/eternus_dx/constants.py index 8ca17a04bff..3c8428850e4 100644 --- a/cinder/volume/drivers/fujitsu/eternus_dx/constants.py +++ b/cinder/volume/drivers/fujitsu/eternus_dx/constants.py @@ -30,6 +30,7 @@ TIMES_MIN = 3 EC_REC = 3 RETRY_INTERVAL = 5 # Error code keyword. +RG_VOLNUM_MAX = 32769 VOLUME_IS_BUSY = 32786 DEVICE_IS_BUSY = 32787 VOLUMENAME_IN_USE = 32788 @@ -47,6 +48,9 @@ MAX_THROUGHPUT = 2097151 MIN_IOPS = 1 MIN_THROUGHPUT = 1 +RC_OK = 0 +RC_FAILED = 4 + QOS_VERSION = 'V11L30-0000' # Here is a misspelling, and the right value should be "Thinprovisioning_POOL". # It would not be compatible with the metadata of the legacy volumes, @@ -142,3 +146,1820 @@ RETCODE_dic = { '35346': 'Copy table size is not setup', '35347': 'Copy table size is not enough', } + +CLIRETCODE_dic = { + 'E0001': 'Bad value', + 'E0002': 'Value out of range', + 'E0003': 'Too many parameters', + 'E0004': 'Missing parameter', + 'E0005': 'Incorrect parameter combination', + 'E0006': 'Inconsistent status', + 'E0007': 'Inconsistent usage', + 'E0008': 'Inconsistent size', + 'E0009': 'Inconsistent RAID level', + 'E0010': 'Inconsistent model type of device', + 'E0011': 'Inconsistent network setup', + 'E0012': 'Inconsistent e-mail setup', + 'E0014': 'Inconsistent disk status', + 'E0015': 'Inconsistent enclosure status', + 'E0019': 'Inconsistent parameter', + 'E0020': 'Internal error', + 'E0021': 'The requested operation has failed', + 'E0030': 'Command not supported', + 'E0031': 'Reserved keyword is used', + 'E0032': 'Controller firmware cannot be downgraded', + 'E0033': 'Not applicable to this target', + 'E0034': 'Mainframe resources', + 'E0035': 'Disk firmware can only be upgraded', + 'E0041': 'Incorrect password syntax', + 'E0042': 'Incorrect password', + 'E0050': 'Incorrect file', + 'E0051': 'Incorrect license key', + 'E0052': 'File access failure', + 'E0053': 'Remote server access failure', + 'E0060': 'Resource locked', + 'E0061': 'Lock was relinquished to another user', + 'E0070': 'Resource busy', + 'E0071': 'Resource is linked to the other resource', + 'E0072': 'Resource is temporarily insufficient', + 'E0073': 'Drive is currently busy. Wait a while, and then retry', + 'E0080': 'Resource limited', + 'E0081': 'Number of active disks has reached the system limit', + 'E0089': 'Not available under current Advanced Copy usable' + ' mode conditions', + 'E0090': 'Not available under current system status conditions', + 'E0091': 'Not available under current SNMP settings', + 'E0092': 'Not available under current operation mode conditions', + 'E0093': 'Not available under current host affinity mode conditions', + 'E0094': 'Not available under current encryption status conditions', + 'E0095': 'Not available under current e-mailing conditions', + 'E0097': 'Not available under master controller module', + 'E0098': 'Not available under slave controller module', + 'E0099': 'Not available under current system configuration', + 'E0100': 'No space', + 'E0101': 'No memory', + 'E0102': 'Not available under system disk status', + 'E0110': 'Resource does not exist', + 'E0111': 'Resource is not reserved', + 'E0113': 'No SNMP trap information', + 'E0114': 'No volumes in the RAID group / Thin Provisioning Pool', + 'E0115': 'Performance monitor has not started', + 'E0116': 'The system disks are included in the RAID group', + 'E0117': 'No target disks', + 'E0118': 'Remote Copy target is not supported model', + 'E0120': 'Already registered', + 'E0122': 'Closure of all CLI and GUI ports requires confirmation', + 'E0123': 'Closure of all CLI ports requires confirmation', + 'E0131': 'Already unmapped', + 'E0132': 'Already stopped', + 'E0133': 'Already running for expanding others', + 'E0140': 'One or more components have failed', + 'E0141': 'At least one resource is required', + 'E0142': 'One or more encrypted volumes exist', + 'E0143': 'Unexpected error occurred during operator intervention', + 'E0145': 'Advanced Copy table exists', + 'E0146': 'RAID group contains a temporary volume', + 'E0150': 'Collecting performance data', + 'E0151': 'Power-off or power-on in process', + 'E0152': 'Volumes formatting in process', + 'E0153': 'Encryption or decryption of volumes in process', + 'E0154': 'Advanced Copy session active', + 'E0155': 'Volumes migration in process', + 'E0156': 'RAID group expansion in process', + 'E0157': 'Remote Copy session active', + 'E0158': 'Controller firmware update in process', + 'E0159': 'Remote maintenance in process', + 'E0160': 'Competing with background process', + 'E0161': 'Competing with disk diagnosis running in background process', + 'E0162': 'Competing with RAID group diagnosis running in ' + 'background process', + 'E0163': 'Competing with hot update of firmware in background process', + 'E0164': 'Competing with cold update of firmware in background process', + 'E0165': 'Competing with update of disk firmware in background process', + 'E0166': 'Competing with quick formatting of volume in ' + 'background process', + 'E0167': 'Competing with changing Advanced Copy parameters in ' + 'background process', + 'E0168': 'Competing with allocating remote copy buffer in ' + 'background process', + 'E0169': 'Competing with preparing firmware update in background process', + 'E0170': 'Competing with setting cache control in background process', + 'E0171': 'Competing with reassigning RAID group controller in ' + 'background process', + 'E0172': 'Competing with initializing volume in background process', + 'E0173': 'Competing with encrypting or decrypting volume in ' + 'background process', + 'E0174': 'Competing with registering RAID group in background process', + 'E0175': 'Competing with deleting RAID group in background process', + 'E0176': 'Competing with registering volume in background process', + 'E0177': 'Competing with deleting volume in background process', + 'E0178': 'Competing with registering global hot spare in ' + 'background process', + 'E0179': 'Competing with changing maintenance mode in background process', + 'E0180': 'Competing with moving volume in background process', + 'E0181': 'Competing with expanding RAID group in background process', + 'E0182': 'Competing with collecting G-List information in ' + 'background process', + 'E0183': 'Competing with setting Eco-mode in background process', + 'E0184': 'Competing with assigning Eco-mode schedule in ' + 'background process', + 'E0185': 'Competing with setting Eco-mode schedule in background process', + 'E0186': 'Competing with setting date and time in background process', + 'E0187': 'Competing with expanding volume in background process', + 'E0188': 'Competing with deleting Advanced Copy session in ' + 'background process', + 'E0190': 'Competing with registering dedicated hot spare in ' + 'background process', + 'E0191': 'Competing with releasing dedicated hot spare in ' + 'background process', + 'E0192': 'Competing with collecting event information in ' + 'background process', + 'E0193': 'Competing with deleting snap data volume in ' + 'background process', + 'E0194': 'Reclamation of Thin Provisioning Volume is in progress', + 'E0195': 'Rebuild or Copyback in process', + 'E0196': 'Competing with storage migration in background process', + 'E0197': 'Quick UNMAP in process', + 'E0198': 'Flexible tier migration in process', + 'E0200': 'Competing with setting Flexible tier mode in background process', + 'E0201': 'Competing with deleting Flexible tier pool in ' + 'background process', + 'E0202': 'Competing with formatting Flexible tier pool in ' + 'background process', + 'E0203': 'Competing with registering Flexible tier volume in ' + 'background process', + 'E0204': 'Competing with setting Flexible tier sub pool priority in ' + 'background process', + 'E0205': 'Competing with setting Flexible tier pool parameters in ' + 'background process', + 'E0206': 'Competing with Flexible tier migration in background process', + 'E0207': 'Competing with registering Thin Provisioning Pool in ' + 'background process', + 'E0208': 'Competing with deleting Thin Provisioning Volume in ' + 'background process', + 'E0209': 'Competing with formatting Thin Provisioning Volume in ' + 'background process', + 'E0210': 'Competing with setting Thin Provisioning Volume parameters in ' + 'background process', + 'E0211': 'Competing with registering REC Disk Buffer Volume in ' + 'background process', + 'E0212': 'Competing with deleting REC Disk Buffer Volume in ' + 'background process', + 'E0213': 'Competing with inhibiting copy destination volume in ' + 'background process', + 'E0214': 'Competing with Thin Provisioning Pool migration in ' + 'background process', + 'E0215': 'Competing with setting cache size limit to volume in ' + 'background process', + 'E0216': 'Competing with setting Offloaded Data Transfer Mode in ' + 'background process', + 'E0217': 'Competing with setting Key management group ID in ' + 'background process', + 'E0218': 'Competing with changing Key in background process', + 'E0300': 'Syntax error in REC path information. (Incorrect file header)', + 'E0301': 'Syntax error in REC path information. (Version mismatch)', + 'E0302': 'Syntax error in REC path information. (Incorrect label)', + 'E0303': 'Syntax error in REC path information. (Incorrect operand)', + 'E0304': 'Syntax error in REC path information. (Duplicate definition)', + 'E0305': 'Syntax error in REC path information. (Missing label)', + 'E0306': 'Syntax error in REC path information. (Too many labels)', + 'E0307': 'Syntax error in REC path information. (Missing double quotes)', + 'E0308': 'Syntax error in REC path information. (Unexpected label)', + 'E0309': 'Syntax error in REC path information. (Undefined information)', + 'E0311': 'Syntax error in REC path information. (Too many lines)', + 'E0312': 'Syntax error in REC path information. (Overlong line)', + 'E0313': 'Syntax error in REC path information. ' + '(WWN does not match actual)', + 'E0314': 'Syntax error in REC path information. ' + '(Host port mode does not match actual)', + 'E0315': 'Syntax error in REC path information. (Number of storage-links ' + 'for one storage system over upper limit)', + 'E0316': 'Syntax error in REC path information. (Number of storage-links ' + 'between one pair of storage systems over upper limit)', + 'E0317': 'Syntax error in REC path information. (Number of port-links for ' + 'one host interface port over upper limit)', + 'E0318': 'Syntax error in REC path information. (Number of host interface ' + 'ports for one storage system over upper limit)', + 'E0319': 'Syntax error in REC path information. (Total number of ' + 'storage systems over upper limit)', + 'E0320': 'Syntax error in REC path information. (Total number of ' + 'links over upper limit)', + 'E0321': 'Syntax error in REC path information. (CA type or IP version ' + 'do not match)', + 'E0330': 'Flexible tier mode is valid', + 'E0331': 'Flexible tier mode is not valid', + 'E0332': 'One or more Flexible Tier Pools exist', + 'E0333': 'Cannot format Flexible Tier Pool', + 'E0334': 'RAID Migration cannot be set to the specified volume', + 'E0335': 'RAID Migration cannot be set to the specified ' + 'Flexible Tier Pool', + 'E0336': 'Migration failed because of insufficient free space of ' + 'the destination pool', + 'E0337': 'The specified Flexible Tier Pool does not have a ' + 'Flexible Tier Sub Pool', + 'E0342': 'The time out occurred', + 'E0343': 'The network is not normal', + 'E0344': 'The time out occurred in the network', + 'E0345': 'The network of IDM server is unreachable', + 'E0346': 'The IDM server is unreachable', + 'E0347': 'The IDM server refused the connection', + 'E0348': 'The IDM server reset the connection', + 'E0349': 'The SSL communication fault occurred', + 'E0350': 'The name resolution of the host name failed', + 'E0351': 'It failed in the HTTP authentication', + 'E0352': 'The HTTP authentic method does not correspond', + 'E0353': 'It failed in the SOCKS authentication', + 'E0354': 'The SOCKS authentic method does not correspond', + 'E0355': 'Export log in process', + 'E0356': 'AIS Connect or AIS Connect server authentication is enabled', + 'E0357': 'AIS Connect is disabled', + 'E0358': 'REMCS is enabled', + 'E0359': 'Log Transmission of E-Mail notification is enabled', + 'E0360': 'AIS SSL certificate is not registered', + 'E0361': 'AIS SSL certificate is invalid', + 'E0362': 'Log transmission of E-Mail notification and AIS connect ' + 'cannot be enabled simultaneously', + 'E0390': 'Backup REC path information does not exist', + 'E0391': 'Round trip time measurement has failed', + 'E0392': 'Unsupported path type', + 'E0393': 'Syntax error in REC path information. (iSCSI parameter(s) ' + 'do not match actual)', + 'E0394': 'Failed to access the server', + 'E0395': 'The object cannot be operated', + 'E0396': 'A part of SpinUp/Down failed', + 'E0397': 'All SpinUp/Down failed', + 'E0399': 'Syntax error in REC path information', + 'E5000': 'Parameter not supported', + 'E5001': 'User authority to use the parameter is improper', + 'E5002': 'Authority of security is necessary for data decryption', + 'E5003': 'The user authority to use the command is improper', + 'E5010': 'The volume encryption is specified for SED disk', + 'E5081': 'Abnormal pinned CBE error', + 'E5084': 'System not ready', + 'E5100': 'Thin Provisioning mode is invalid', + 'E5033': 'Cannot Warm Boot CFL', + 'E5034': 'Cannot Hard Boot CFL', + 'E5101': 'Check thin-pro-pool Status', + 'E5102': 'Migration session count is limit', + 'E5104': 'Thin Provisioning Pool capacity is limit', + 'E5105': 'Existing unused disks are not enough', + 'E5106': 'RAID or Volume is insufficient', + 'E5107': 'RAID type is temporary', + 'E5108': 'Volume type is not Thin Provisioning Volume', + 'E5109': 'RAID group belong to thin-provisioning-pool/flexible-tier-pool', + 'E5110': 'Thin Provisioning Volume count is limit', + 'E5200': 'No copy license', + 'E5201': 'Invalid copy phase', + 'E5202': 'Exist SDV / SDPV', + 'E5203': 'Exist REC disk buffer', + 'E5204': 'Exist REC buffer', + 'E5205': 'Exist REC path setting', + 'E5206': 'Exist any of copy session(s)', + 'E5207': 'Exist volume(s) of protection from copy destination', + 'E5208': 'Copy license information updating due to trial license expired', + 'E5209': 'Not support E6K to target of REC', + 'E5210': 'Data in disk buffer', + 'E5211': 'The RAID group is for REC disk buffer', + 'E5212': 'Source and destination RA type is not match', + 'E5213': 'The times registering trial license has been reached ' + 'the system limit', + 'E5214': 'Exist RA', + 'E5215': 'Result string is too long', + 'E5216': 'Compete for the affinity path', + 'E5217': 'The specified multiplicity or priority level mismatch connect ' + 'mode (Direct/Switched) of the REC path', + 'E5300': 'An error occurred in the copy path connection', + 'E5301': 'An unsupported command was issued by the remote storage', + 'E5302': 'The specified volume number is not correct (exceeding ' + 'the maximum volume number)', + 'E5303': 'The specified volume is not supported', + 'E5304': 'Advanced copy cannot be set to the specified volume', + 'E5305': 'There is "Bad Sector" in the copy source volume', + 'E5306': 'Encryption settings of copy source volume and copy ' + 'destination volume are different', + 'E5307': 'The copy source volume and copy destination volume don\'t ' + 'belong to the same resource domain', + 'E5308': 'The specified volume is a "Temporary"', + 'E5309': 'Disk failure occurred while the relevant copy session is in ' + '"Suspend" state. The copy session turns into "Error" state', + 'E5310': 'Parameter error occurred', + 'E5311': 'Source volume whose capacity is larger than destination ' + 'volume\'s cannot be specified', + 'E5312': 'It failed to reverse the copy session', + 'E5313': 'Copy range conflicts with the existing RAID migration session', + 'E5314': 'The specified copy range of the copy source volume is ' + 'overlap with the copy range in an existing session ' + '(excluding cascade and restore)', + 'E5315': 'The specified copy range of the copy destination volume is ' + 'overlap with the copy range in an existing session ' + '(excluding cascade and restore copy)', + 'E5316': 'The specified cascade copy cannot be done', + 'E5317': 'The copy session which is in progress of restoring was ' + 'specified', + 'E5318': 'The number of cascades exceeds the maximum', + 'E5319': 'An "Error Suspend" session was specified', + 'E5320': 'Multiple copy sessions in REC Consistency mode cannot operate ' + 'in a single storage', + 'E5321': 'The state of the specified session is not correct', + 'E5322': 'A command was issued while processing ' + 'CONCURRENT SUSPEND command', + 'E5323': 'The specified operation is not a "Force specify"', + 'E5324': 'There is no path to access to the copy source volume or ' + 'copy destination volume', + 'E5325': 'The specified volume is an Advanced Copy read-only volume. ' + 'It cannot be set as copy destination volume', + 'E5326': 'The STOP command was issued to a SnapOPC/SnapOPC+ session ' + 'which is in progress of restoring', + 'E5327': 'REC buffer transfer is not complete in time or ' + 'buffer recovery is processing under SUSPEND command process. ' + 'SUSPEND command cannot be done', + 'E5328': 'REC buffer data transfer is under monitoring. The specified ' + 'session cannot be reversed', + 'E5329': 'It will lead to EC/REC cascade copy session that is not in ' + '"Suspend" state but has cascade source volume', + 'E5330': 'The copy session has already been reversed', + 'E5331': 'The number of copy sessions exceeds the allowable maximum ' + 'copy sessions for this storage', + 'E5332': 'The copy license is not valid', + 'E5333': 'The number of copy sessions exceeds the allowable maximum ' + 'copy sessions for each copy source volume', + 'E5334': 'The number of copy sessions exceeds the allowable maximum ' + 'copy sessions for each copy destination volume', + 'E5335': 'The number of SnapOPC+ copy session generations exceeds ' + 'the maximum for a copy source volume', + 'E5336': 'Copy area of copy source volumes in monitoring copy sessions is ' + 'overlap', + 'E5337': 'The new copy session settings are the same with an existing ' + 'one\'s. The new copy session cannot be started', + 'E5338': 'Copy destination volume and cascade copy destination volume ' + 'in the copy session is overlap', + 'E5339': 'It will lead to copy destination volumes overlap. EC/REC ' + 'cascade copy session cannot be reversed', + 'E5340': 'SDV is being initialized', + 'E5341': 'There is already a copy session where the specified SDV ' + 'was set as copy destination', + 'E5342': 'The copy session has already been set', + 'E5343': 'The copy session has already been deleted', + 'E5344': 'The copy session is in progress of transition to "Suspend" ' + 'state asynchronously or has already been in "Suspend" state', + 'E5345': 'The state of the session is already Active', + 'E5346': 'The copy table has not been set yet', + 'E5347': 'Copy table size is not sufficient', + 'E5348': 'REC buffer is not in "Active" state', + 'E5349': 'Copy source and copy destination, usage (sending or receiving) ' + 'of REC buffer settings after resuming copy sessions don\'t ' + 'match the original settings', + 'E5350': 'REC buffer setting is being changed or REC buffer related ' + 'functions are in progress', + 'E5351': 'Copy source and copy destination, usage (sending or receiving) ' + 'of REC buffer settings after reversing copy sessions don\'t ' + 'match the original settings', + 'E5352': 'The disk configured the RAID group of the specified volume is ' + 'in motor OFF state due to ECO-mode', + 'E5353': 'The specified BoxID cannot be found', + 'E5354': 'The copy path is not in "Normal" state. Copy sessions in ' + 'this storage were deleted but copy sessions in the remote ' + 'storage still exist', + 'E5355': 'Firmware update is in progress. The specified operation ' + 'cannot be done', + 'E5356': 'Advanced copy resolution settings of the local storage and ' + 'remote storage are different', + 'E5357': 'SDV was specified as a copy destination volume where ' + 'the copy session is not SnapOPC+', + 'E5358': 'SDV was specified as a copy source volume in SnapOPC+', + 'E5359': 'A standard volume was specified as copy destination volume ' + 'in SnapOPC+', + 'E5360': 'An error, which can be recovered by retry, occurred', + 'E5361': 'The storage is in "Not Ready" or internal error state', + 'E5362': 'The specified volume is currently configured with ' + 'Bind-in-Cache extent. RAID Migration cannot apply ' + 'to this volume', + 'E5363': 'The previous generation session is Readying', + 'E5364': 'The restore OPC cannot start by using concurrent OPC', + 'E5365': 'The restore OPC of readying session cannot start', + 'E5366': 'The specified copy range is overlap with the copy range in ' + 'an existing xcopy session', + 'E5367': 'The specified copy range is overlap with the copy range in ' + 'an existing Readying or Copying OPC session', + 'E5368': 'The specified session cannot restart because it is ' + 'under restore', + 'E5369': 'The specified remote Box ID is not support the out of band copy', + 'E5370': 'In the remote old model storage, the specified volume ' + 'is invalid', + 'E5371': 'In the remote old model storage, parameter error occurred', + 'E5372': 'In the remote old model storage, the specified copy range ' + 'is overlap with the copy range in an existing session', + 'E5373': 'In the remote old model storage, status of session or status of ' + 'volume is error', + 'E5374': 'In the remote old model storage, the number of copy sessions ' + 'exceeds the allowable maximum copy sessions', + 'E5375': 'In the remote old model storage, the new copy session overlap ' + 'with the existing one\'s. The new copy session cannot ' + 'be started', + 'E5376': 'In the remote old model storage, error occurred about setting ' + 'of the copy table or status of REC Buffer', + 'E5377': 'In the remote old model storage, the specified copy volume is ' + 'a "SDV"', + 'E5378': 'In the remote old model storage, an error occurred in the copy ' + 'path connection', + 'E5379': 'An unsupported command was issued by the remote old ' + 'model storage', + 'E5380': 'In the remote old model storage, copy session has been ' + 'already set', + 'E5381': 'In the remote old model storage, copy session has been ' + 'already deleted', + 'E5382': 'In the remote old model storage, copy session is already ' + 'in "Suspend" status or changing to be "Suspend" status', + 'E5383': 'In the remote old model storage, copy session status is ' + 'already in "Active" status', + 'E5384': 'In the remote old model storage, no copy license', + 'E5385': 'In the remote old model storage configuration, ' + 'the specified BoxID cannot be found', + 'E5386': 'The copy path is not in "Normal" state. Copy sessions in ' + 'this storage were deleted but copy sessions in the remote ' + 'old model storage still exist', + 'E5387': 'In the remote old model storage, firmware update is in ' + 'progress. The specified operation cannot be done', + 'E5388': 'Copy resolution settings of the local storage and remote ' + 'old model storage are different', + 'E5389': 'In the remote old model storage, an error, which can be ' + 'recovered by retry, occurred', + 'E5390': 'The remote old model storage is in "Not Ready" or ' + 'internal error state', + 'E5391': 'There is not the certification of consistency', + 'E5392': 'Multiple copy source storage exists', + 'E5393': 'The certification of consistency is unknown', + 'E5394': 'The copy source storage is not support this command', + 'E5395': 'Controller Module failed', + 'E5396': 'The remote storage is not support this function', + 'E5400': 'The same command that was issued by specifying by ' + 'start has already been processed', + 'E5401': 'The same command that was issued by specifying by ' + 'restart has already been processed', + 'E5402': 'REC transfer mode which specified by Start or ' + 'Resume command is invalid at all RA ports which configure path', + 'E5501': 'iSNS server cannot be connected from the specified ' + 'iSCSI CA port', + 'E5502': 'CLI cannot change the host or port parameter ' + 'setting created by GUI', + 'E5503': 'The Multiple VLAN setting of a specified port is invalid', + 'E5504': 'The specified Additional IP Information setting is invalid', + 'E5601': 'The automatic setup of IPv6 address cannot be performed', + 'E5701': 'The factory setup is not done', + 'E5900': 'Command error', + 'E6000': 'Advanced Copy session that covers the entire volume is active', + 'E6001': 'The specified volume is ODX Buffer Volume', + 'E6002': 'The specified volume is volume during Zero Reclamation ' + 'execution', + 'E6003': 'Offloaded Data Transfer Mode is valid', + 'E6004': 'Offloaded Data Transfer Mode is not valid', + 'E6005': 'ODX Buffer Volume exist', + 'E6006': 'The specified volume is not ODX Buffer Volume', + 'E6007': 'Offloaded Data Transfer in process', + 'E6008': 'The specified volume is not volume during Zero Reclamation ' + 'execution', + 'E6009': 'Not available under operating Bind-in-Cache', + 'E6010': 'Current cache page size is over specified cache limit size', + 'E6011': 'Not available under cache limit settings', + 'E6012': 'The RAID migration from which a security level differs requires ' + 'security authority', + 'E6201': 'The specified RAID group does not consist of SED', + 'E7001': 'SED authentication key is not registered', + 'E7002': 'The master server is not registered in the key management group', + 'E7003': 'Rejected by the server. Please try again to be ' + 'accepted on the server', + 'E7004': 'The key which can be changed is not in the server', + 'E7005': 'Abnormal state of the key', + 'E7006': 'The key is not acquired', + 'E7007': 'The key management group is not registered', + 'E7100': 'The specified Flexible Tier Pool has Flexible Tier Volume(s) ' + 'which is balancing', + 'E7101': 'There is no free OLU or SLU to create destination LUN', + 'E7102': 'It is in the process of deleting source Thin Provisioning ' + 'Volume internally which is done after migration', + 'E7103': 'Number of migration sessions has reached the system limit', + 'E7104': 'The source LUN has already using for migrated', + 'E7105': 'The source LUN has already been used at other session', + 'E7106': 'The resource in the internal is depleted', + 'E7107': 'State of source volume or destination volume is error', + 'E7108': 'The specified volume doesn\'t have migration session ' + 'during startup', + 'E7109': 'The specified volume is currently configured with ' + 'Bind-in-Cache extent', + 'E7110': 'Logical capacity which can be migrate is over', + 'E7111': 'Physical capacity of destination pool is error', + 'E7112': 'There is not enough free space to create the pool in the device', + 'E7113': 'Balancing cannot be executed because there is not ' + 'enough free space in the pool', + 'E7114': 'Balancing cannot be executed because the device is in ' + 'error state', + 'E8000': 'Undefined command', + 'E8001': 'Undefined parameter', + 'E8002': 'Another user is performing an operation', + 'E8003': 'The lock session ID cannot be obtained', + 'E8004': 'The value cannot be specified under current user authority', + 'E8005': 'The specified user account does not exist', + 'E8006': 'Because there will be no user account that can configure ' + 'user account or role, the specified operation cannot be done', + 'E8007': 'Your password has expired. You must change your password and ' + 'log in again', + 'E8008': 'Password policy and Lockout policy cannot be enforced on ' + 'a user account with the Software role', + 'E8100': 'The syntax is incorrect', + 'E8101': 'An unusable character is specified', + 'E8102': 'The parameter is out of the allowed range', + 'E8103': 'An unnecessary parameter is specified', + 'E8104': 'The required parameter is not specified', + 'E8105': 'The number of specified values is too many', + 'E8106': 'The number of specified values is not enough', + 'E8107': 'The number of specified characters is too many', + 'E8108': 'The number of specified characters is not enough', + 'E8109': 'The combination of the parameters or values is incorrect', + 'E810A': 'A value that is not a multiple of 100GB is specified for ' + 'the Extreme Cache capacity', + 'E810B': 'The specified value does not match the current setting value', + 'E810C': 'The specified value is not supported by the device model', + 'E810D': 'No values are specified', + 'E810E': 'The format of the value is incorrect', + 'E810F': 'The password is incorrect', + 'E8110': 'The file is incorrect', + 'E8111': 'The update interval needs to be a multiple of 30 seconds', + 'E8800': 'Unable to resolve destination address', + 'E8801': 'The route addition failed. Check the network address of ' + 'the destination and the source port', + 'E8802': 'Cannot connect to the server', + 'E8803': 'Login incorrect', + 'E8804': 'The processing status of packet capture is invalid', + 'E8805': 'Detected an error during FTP command establishment. Maybe an ' + 'incorrect file path is the cause of the error', + 'E8806': 'Detected an error during FTP command execution. Maybe ' + 'the incorrect file name or permission settings are ' + 'the cause of the error', + 'E8807': 'Detect FTP Connection Failure', + 'E8808': 'Reading data from the FTP server failed', + 'E8809': 'Writing data to the FTP server failed', + 'E8900': 'IP setting is required for at least one port', + 'E8901': 'The master IP address is not configured', + 'E8902': 'The specified allow IP or allow netmask is 0', + 'E8903': 'Netmask is not configured', + 'E8904': 'The same IP address cannot be specified', + 'E8905': 'Master IP and slave IP addresses must be in ' + 'the same network address', + 'E8906': 'The master connect IP is not configured', + 'E8907': 'The slave link local IP is not configured', + 'E8908': 'The specified IPv6 prefix length is out of range', + 'E8909': 'Allow IP address is in the same network address ' + 'with the master IP address', + 'E890A': 'Allow IP address is in the same network address ' + 'with the master connect IP address', + 'E890B': 'Same network address with other port\'s master IP address', + 'E890C': 'Same network address with other port\'s allow IP address', + 'E890D': 'Same network address with other port\'s connect IP address', + 'E890E': 'Bad subnet mask for IP address', + 'E890F': 'Bad prefix length for IP address', + 'E8910': 'Invalid IP address', + 'E8911': 'The specified IPv6 link local address is incorrect', + 'E8912': 'The specified IPv6 global address is incorrect', + 'E8913': 'The subnet mask setting is incorrect', + 'E8914': 'The primary DNS IP address is not configured', + 'E8915': 'The gateway setting is incorrect', + 'E8916': 'The master link local IP is not configured', + 'E8917': 'Gateway and master IP addresses must be in ' + 'the same network address', + 'E8918': 'Master and slave connect IP addresses must be in ' + 'the same network address', + 'E8919': 'Gateway and connect IP addresses must be in ' + 'the same network address', + 'E891A': 'Same network address with other port\'s DNS IP address', + 'E891B': 'The specified address is broadcast address', + 'E9000': 'The device model does not support the command', + 'E9001': 'The command cannot be executed because the device is in ' + '"Not Ready" status', + 'E9002': 'The storage cluster license is not registered', + 'E9003': 'The storage cluster license is already registered', + 'E9004': 'The copy license and storage cluster license is not registered', + 'E9005': 'The dedup license is not registered', + 'E9006': 'The command cannot be executed because the device is not in ' + '"Normal" status', + 'E9007': 'The GS license is registered', + 'E9008': 'The Advanced Copy license is not registered', + 'E9009': 'The Non-disruptive Storage Migration license is not registered', + 'E900A': 'The Non-disruptive Storage Migration license is ' + 'already registered', + 'E9200': 'The Extreme Cache function is not enabled', + 'E9201': 'The Flexible Tier mode is enabled', + 'E9202': 'The Thin Provisioning allocation mode is TPV balancing', + 'E9203': 'Disk Patrol is disabled', + 'E9204': 'The device contains pinned data', + 'E9205': 'The command cannot be executed because the network setting is ' + 'the factory default setting', + 'E9206': 'The Extreme Cache function is enabled', + 'E9207': 'The operation mode is not "Maintenance Mode"', + 'E9208': 'SMI-S server is enabled', + 'E9209': 'SMI-S server is disabled', + 'E920A': 'SMI-S server startup or shutdown is in progress', + 'E920B': 'The VVOL function is not enabled', + 'E920C': 'The Extreme Cache Pool function is not enabled', + 'E920D': 'The Extreme Cache function and Extreme Cache Pool function is ' + 'not enabled', + 'E920E': 'The encryption mode is disabled', + 'E920F': 'It is necessary to disable the EXC or EXC Pool function before ' + 'enable the EXC or EXC Pool function', + 'E9210': 'Collecting performance data is already running', + 'E9211': 'Collecting performance data has been started by Storage Cruiser', + 'E9212': 'The Deduplication/Compression mode is not enabled', + 'E9213': 'The NAS audit log is enabled', + 'E9214': 'The NAS audit log is disabled', + 'E9215': 'The Deduplication/Compression mode is enabled', + 'E9217': 'Collecting performance data is not started', + 'E9218': 'Performance data is being collected', + 'E9219': 'The current default chunk size of the device is different from ' + 'one or more existing Flexible Tier Pools', + 'E9220': 'SSL certificate used for SMI-S HTTPS connection can be changed ' + 'only when enabling SMI-S function', + 'E9221': 'SSL certificate for Web GUI is not registered', + 'E9222': 'The Veeam B&R storage integration function is not enabled', + 'E9223': 'Thin provisioning is not enabled', + 'E9224': 'One or more specified objects are used for Veeam B&R', + 'E9225': 'One or more specified objects are not used for Veeam B&R', + 'E9300': 'Competing with cold update of firmware in background process', + 'E9301': 'Competing with hot update of firmware in background process', + 'E9302': 'Competing with update of disk firmware in background process', + 'E9303': 'Competing with diagnosing RAID groups', + 'E9304': 'Competing with diagnosing Disks', + 'E9305': 'Competing with quick formatting of volume in background process', + 'E9306': 'Competing with changing Advanced Copy parameters in ' + 'background process', + 'E9307': 'Competing with allocating remote copy buffer in ' + 'background process', + 'E9308': 'Competing with preparing firmware update in background process', + 'E9309': 'Competing with setting cache control in background process', + 'E930A': 'Competing with reassigning RAID group controller in ' + 'background process', + 'E930B': 'Competing with initializing volume in background process', + 'E930C': 'Competing with encrypting or decrypting volume in ' + 'background process', + 'E930D': 'Competing with registering RAID group in background process', + 'E930E': 'Competing with deleting RAID group in background process', + 'E930F': 'Competing with registering volume in background process', + 'E9310': 'Competing with deleting volume in background process', + 'E9311': 'Competing with registering global hot spare in ' + 'background process', + 'E9312': 'Competing with changing maintenance mode in background process', + 'E9313': 'Competing with expanding RAID group in background process', + 'E9314': 'Competing with collecting G-List information in ' + 'background process', + 'E9315': 'Competing with setting Eco-mode in background process', + 'E9316': 'Competing with assigning Eco-mode schedule in ' + 'background process', + 'E9317': 'Competing with setting Eco-mode schedule in background process', + 'E9318': 'Competing with setting date and time in background process', + 'E9319': 'Competing with expanding volume in background process', + 'E931A': 'Competing with deleting Advanced Copy session in ' + 'background process', + 'E931B': 'Competing with deleting Advanced Copy session in ' + 'background process', + 'E931C': 'Competing with storage migration in background process', + 'E931D': 'Competing with storage migration in background process', + 'E931E': 'Competing with deleting snap data volume in background process', + 'E931F': 'Competing with changing Advanced Copy parameters in ' + 'background process', + 'E9320': 'Competing with searching target WWNs', + 'E9321': 'Competing with collecting disk performance information', + 'E9322': 'Competing with checking file of storage migration ' + 'path information', + 'E9323': 'Competing with checking file of storage migration ' + 'path information', + 'E9324': 'Competing with registering Thin Provisioning Pool in ' + 'background process', + 'E9325': 'Competing with deleting Thin Provisioning Pool in ' + 'background process', + 'E9326': 'Competing with formatting Thin Provisioning Pool in ' + 'background process', + 'E9327': 'Competing with registering Thin Provisioning Volume in ' + 'background process', + 'E9328': 'Competing with deleting Thin Provisioning Volume in ' + 'background process', + 'E9329': 'Competing with formatting Thin Provisioning Volume in ' + 'background process', + 'E932A': 'Competing with setting Thin Provisioning Pool parameters in ' + 'background process', + 'E932B': 'Competing with setting Thin Provisioning Volume parameters in ' + 'background process', + 'E932C': 'Competing with setting Thin Provisioning mode in ' + 'background process', + 'E932D': 'Competing with assigning Eco-mode schedule in ' + 'background process', + 'E932E': 'Competing with registering REC Disk Buffer Volume in ' + 'background process', + 'E932F': 'Competing with deleting REC Disk Buffer Volume in ' + 'background process', + 'E9330': 'Competing with inhibiting copy destination volume in ' + 'background process', + 'E9331': 'Competing with moving volume in background process', + 'E9332': 'Competing with balancing Thin Provisioning Pool or ' + 'Flexible Tier Pool data in background process', + 'E9333': 'Competing with registering dedicated hot spare in ' + 'background process', + 'E9334': 'Competing with releasing dedicated hot spare in ' + 'background process', + 'E9335': 'Competing with collecting event information in ' + 'background process', + 'E9336': 'Competing with controlling advanced copy session', + 'E9337': 'Competing with controlling advanced copy session', + 'E9338': 'Competing with controlling advanced copy session', + 'E9339': 'Competing with controlling advanced copy session', + 'E933A': 'Competing with setting Flexible tier mode in background process', + 'E933B': 'Competing with deleting Flexible Tier Pool in ' + 'background process', + 'E933C': 'Competing with formatting Flexible Tier Pool in ' + 'background process', + 'E933D': 'Competing with registering Flexible Tier Volume in ' + 'background process', + 'E933E': 'Competing with setting Flexible Tier Sub Pool priority in ' + 'background process', + 'E933F': 'Competing with setting Flexible Tier Pool parameters in ' + 'background process', + 'E9340': 'Flexible Tier Migration in process', + 'E9341': 'Competing with setting cache size limit to volume in ' + 'background process', + 'E9342': 'Competing with setting Offloaded Data Transfer Mode in ' + 'background process', + 'E9343': 'Competing with setting Key management group ID in ' + 'background process', + 'E9344': 'Competing with changing Key in background process', + 'E9345': 'NAS configuration process is in progress', + 'E9346': 'Storage cluster license configuration process is in progress', + 'E9347': 'TFO group configuration process is in progress', + 'E9348': 'TFOV configuration process is in progress', + 'E9349': 'TFO group activate process is in progress', + 'E934A': 'TFO pair configuration process is in progress', + 'E934B': 'VVOL mode setting process is in progress', + 'E934D': 'System cache function setting process is in progress', + 'E934E': 'Starting SSD sanitization process is in progress', + 'E9380': 'The Storage migration is in progress', + 'E9400': 'No memory', + 'E9401': 'No message queue', + 'E9402': 'No semaphore', + 'E9403': 'CLI session limit reached', + 'EA000': 'The CM status is not normal', + 'EA001': 'The specifed CE does not exist', + 'EA002': 'The specified CM does not exist', + 'EA003': 'One or more CMs are not normal', + 'EA004': 'One or more CEs are not normal', + 'EA200': 'The CA port type is incorrect', + 'EA201': 'The specified CA port does not exist', + 'EA202': 'The relevant operation cannot be executed because all of ' + 'the CAs are NAS CAs', + 'EA203': 'Host port mode of the CA port is incorrect', + 'EA204': 'The WWPN/WWNN has not been changed', + 'EA205': 'The CA Port status is not normal', + 'EA400': 'The number of maximum disk slots is exceeded', + 'EA401': 'Cannot add Drive Enclosure any more', + 'EA402': 'The Drive Enclosure type does not support', + 'EA600': 'No PFM is installed in the device', + 'EA601': 'A PFM is not installed in some of the CMs in the device', + 'EA602': 'The PFM status is not normal', + 'EA603': 'The number of PFMs is different between the CMs', + 'EA604': 'The specified disk does not exist', + 'EA605': 'The disk type is incorrect', + 'EA606': 'The capacity of the specified disk is insufficient', + 'EA607': 'The specified disk is not available as a member disk', + 'EA608': 'One or more specified disks are installed in ' + 'the CE different from the specified assigned CM', + 'EA609': 'SED and non-SED cannot be specified at the same time', + 'EA60A': 'The drive is being used', + 'EA60B': 'The drive status is incorrect', + 'EA60C': 'The specified PFM does not exist', + 'EA60D': 'The specified PFMs are not available as Extreme Cache', + 'EA800': 'The maintenance target is inconsistent status', + 'EA801': 'Not available under current system status conditions', + 'EB000': 'The specified Flexible Tier Sub Pool does not exist', + 'EB001': 'One or more TPP or FTSP exists in the device', + 'EB002': 'The Fast Recovery RAID group cannot be specified', + 'EB003': 'The specified RAID group does not exist', + 'EB004': 'The specified RAID group status is not normal', + 'EB005': 'The specified RAID group are already used', + 'EB006': 'The number of volumes exceeds the maximum number of ' + 'registrations in the RAID group', + 'EB007': 'The free capacity of the RAID group is insufficient', + 'EB008': 'One or more VVOLs exist in the specified Flexible Tier Pool', + 'EB009': 'The RAID group used for the Extreme Cache Pool ' + 'cannot be specified', + 'EB00A': 'The Extreme Cache Pool already exists for the specified CM', + 'EB00B': 'The Extreme Cache Pool does not exist for the specified CM', + 'EB00C': 'The specified disk is already used', + 'EB00D': 'One or more Deduplication/Compression volumes exist ' + 'in the specified pool', + 'EB00E': 'Deduplication and/or Compression is not enabled on ' + 'the specified pool', + 'EB00F': 'Extreme Cache Pool exists', + 'EB010': 'Not allowed to configure this RAID Level with the ' + 'specified disks', + 'EB011': 'The free capacity of the pool is insufficient', + 'EB012': 'The pool status is not normal', + 'EB013': 'The Flexible Tier Pool status is not normal', + 'EB014': 'A volume for VVOL metadata exists in the specified pool', + 'EB015': 'There are one or more Thin provisioning pools with ' + 'Compression enabled', + 'EB016': 'Encryption option cannot be used for Extreme Cache Pool ' + 'composed of SED-SSDs', + 'EB017': 'Eco-mode schedule is assigned to the specified pool', + 'EB018': 'Deduplication and/or Compression is enabled on ' + 'the specified pool', + 'EB019': 'The specified RAID Group is in use for Thin Provisioning Pool ' + 'or Flexible Tier Pool', + 'EB01A': 'The specified RAID Group is in use for REC disk buffer', + 'EB01B': 'The specified RAID Group is in use for Mainframe system ' + '(DVCF mode is on)', + 'EB01C': 'The specified RAID Group is in use for Mainframe system ' + '(Mainframe volume exists)', + 'EB01D': 'The type of volume that configures the specified RAID Group ' + 'is inapplicable', + 'EB01E': 'The disk kind of the RAID Groups must be the same', + 'EB01F': 'The RAID level must be the same', + 'EB020': 'The number of member disks must be the same', + 'EB021': 'The stripe depth must be the same', + 'EB022': 'Physical free capacity of the destination pool is insufficient', + 'EB023': 'RAID group expansion is running', + 'EB024': 'The total logical capacity of the pool volumes exceeds ' + 'the maximum value', + 'EB025': 'The specified Thin provisioning pool does not exist', + 'EB026': 'The specified Flexible tier pool does not exist', + 'EB027': 'Raid group\'s stripe depth is expanded', + 'EB028': 'Encryption option cannot be used for RAID Group or ' + 'Thin Provisioning Pool composed of SED', + 'EB029': 'The specified Thin Provisioning Pool is in use for ' + 'Flexible Tier Pool', + 'EB02A': 'The specified RAID group is not in use for Flexible Tier Pool', + 'EB02B': 'The specified Thin Provisioning Pool is not applicable for ' + 'Deduplication or Compression', + 'EB02C': 'The specified chunk size exceeds the current default chunk ' + 'size of the device', + 'EB02D': 'The specified PFM has already been used as Extreme Cache', + 'EB02E': 'There are no PFMs which can be used as Extreme Cache', + 'EB02F': 'One or more PFMs being currently used as Extreme Cache exist', + 'EB030': 'The specified CE is not using Extreme Cache', + 'EB031': 'There are no PFMs being used as Extreme Cache', + 'EB032': 'There are one or more PFMs which cannot be used as ' + 'Extreme Cache', + 'EB033': 'Chunk size cannot be specified under the current ' + 'maximum pool capacity', + 'EB034': 'Neither Thin provisioning pool nor Flexible Tier Pool exists', + 'EB300': 'The volume type is incorrect', + 'EB301': 'The volume status is not normal', + 'EB302': 'The type of drive that configures the RLU or the TPP that ' + 'the volume belongs to is incorrect', + 'EB303': 'The specified volume does not exist', + 'EB304': 'An incorrect UID is specified', + 'EB305': 'The cache size limit is set', + 'EB306': 'The volume in Fast Recovery RAID group cannot be specified', + 'EB307': 'One or more VVOLs exist in the device', + 'EB308': 'The number of volumes exceeds the maximum number of ' + 'registrations', + 'EB309': 'The specified volume is being used as a VVOL', + 'EB30A': 'The specified volume\'s data integrity is T10-DIF', + 'EB30B': 'The specified volume is thick provisioning volume', + 'EB30C': 'One or more Deduplication/Compression volumes exist', + 'EB30D': 'Zero Reclamation is running', + 'EB30E': 'The VVOL cannot be specified with the other resources', + 'EB30F': 'Data migration is running', + 'EB31A': 'Balancing process is running', + 'EB31B': 'The specified volume has no error data', + 'EB31C': 'The specified volume has too many error data', + 'EB31D': 'The volume for VVOL metadata already exists', + 'EB31E': 'The specified volume is being used as a volume for ' + 'VVOL metadata', + 'EB31F': 'The Deduplication/Compression System volume status is ' + 'not normal', + 'EB320': 'One or more NAS volumes exist', + 'EB321': 'An encryption process is running at the specified volume', + 'EB322': 'Volume formatting is running', + 'EB323': 'New volume size must be equal or greater than the original one', + 'EB324': 'The number of migration sessions exceeds the maximum value', + 'EB325': 'Total migration capacity exceeds the maximum value', + 'EB326': 'The destination RAID Group must be different from the one of ' + 'the specified volume', + 'EB327': 'The total capacity of Deduplication/Compression volumes in ' + 'the specified pool must be equal or less than ten times ' + 'the capacity of the Deduplication/Compression System volume', + 'EB328': 'Since the specified volume is configured by SED, encryption ' + 'option is not applicable', + 'EB329': 'The size of the specified volume is not enough', + 'EB32A': 'The specified size exceeds the maximum size under ' + 'the current NAS configuration', + 'EB32B': 'The concatenation count of the specified volume exceeds ' + 'the maximum value', + 'EB32D': 'The specified volume name is already registered', + 'EB32E': 'The specified volume name is reserved keyword', + 'EB32F': 'The specified volume is already encrypted', + 'EB330': 'The specified volume is already decrypted', + 'EB331': 'The specified Snap Data Pool Volume capacity is not ' + 'a multiple of Snap Data Pool Volume Resolution', + 'EB332': 'The specified volume is already registered', + 'EB333': 'The total capacity of the Snap Data Pool Volume ' + 'exceeds the maximum value', + 'EB334': 'The resource, which can be used only in ' + 'expand volume mode, exists', + 'EB335': 'Advanced Copy session is active', + 'EB336': 'Advanced Copy (ODX) session is active', + 'EB337': 'Volume(s) is used in LUN mapping', + 'EB338': 'Volume(s) is used in Storage Cluster', + 'EB339': 'The Deduplication/Compression volume is being used', + 'EB33A': 'Non-disruptive Storage Migration is in process', + 'EB33B': 'External LU information cannot be deleted or does not ' + 'exist for the specified volumes', + 'EB33C': 'Data migration is not running for the specified volume(s)', + 'EB33D': 'The migration status of the specified volume(s) is not normal', + 'EB33E': 'Data synchronization cannot be stopped manually for ' + 'the specified volume(s) because it is not running in ' + 'manual-stop mode', + 'EB33F': 'No target volumes to stop data synchronization', + 'EB340': 'Compression is not applicable for the specified volume. ' + 'For migration to the compression enabled pool, ' + '"-data-reduction-disable yes" needs to be specified', + 'EB341': 'The specified volume is used for Snapshot. TPP or FTRP needs to ' + 'be specified for the destination', + 'EB342': 'The specified operation is not applicable because compression ' + 'is enabled for the specified Thin provisioning pool or volume', + 'EB343': 'The specified volume is used for Data Container', + 'EB344': 'No target volumes exist', + 'EB345': 'One or more Data Container Volumes are not normal', + 'EB346': 'The specified volume is not enabled for Compression', + 'EB347': 'Migrating within the same pool is not applicable except for ' + 'changing compression function of the specified volume', + 'EB348': 'Only Data Container Volume can be specified', + 'EB349': 'One or more target volumes are being used for LUN mapping', + 'EB34A': 'Snapshot Volume for Veeam B&R cannot be created for ' + 'the specified volume', + 'EB34B': 'Snapshot cannot be created due to internal resource shortage', + 'EB500': 'Number of iSNS server has reached the iSCSI CA port limit', + 'EB501': 'The specified port belongs to a port group', + 'EB502': 'The LUN group, which is set in specified host affinity and ' + 'port, specify volume does not exist', + 'EB503': 'Host Response resource does not exist', + 'EB504': 'Host I/F resource limited', + 'EB505': 'Host affinity mode is inconsistent', + 'EB506': 'The host specified does not exist', + 'EB507': 'There is no host affinity setting including the specified port ' + 'and host', + 'EB508': 'The specified port is affinity setting', + 'EB509': 'The specified LUN group has already been used in ' + 'the host affinity', + 'EB50A': 'The specified LUN group has already been used in the TFO group', + 'EB50B': 'The specified volume has already been used in the host affinity', + 'EB50C': 'The specified volume has already been used in the TFO group', + 'EB50D': 'The specified volume is already used in other TFO group', + 'EB50E': 'Host I/F already registered', + 'EB50F': 'Host Group resource does not exist', + 'EB510': 'TFO pair does not exist in the volume of all of ' + 'the LUN group that has been set affinity in the specified host ' + 'and port specified', + 'EB511': 'The specified host is already used in the host affinity that ' + 'includes the LUN mask group', + 'EB512': 'The specified host belongs to a host group', + 'EB513': 'The specified LUN mask group has already been used in ' + 'the host affinity', + 'EB514': 'The LUN mask group which can be affinity setting does not exist', + 'EB515': 'The source port is already used in the host affinity ' + 'that includes the LUN mask group', + 'EB516': 'The destination port is already used in the host affinity that ' + 'includes the LUN mask group', + 'EB517': 'Host number or LUN group number, which can be used only in ' + 'expand host mode, exists', + 'EB518': 'The number of hosts exceeds the maximum number of hosts which ' + 'can be registered if expand host mode is disabled', + 'EB519': 'The iSCSI hosts, which have the same iSCSI name but one of ' + 'them has no IP address configuration, cannot be used for ' + 'the same CA port in host affinity setting', + 'EB51A': 'The iSCSI hosts, which have the same iSCSI name but one of ' + 'them has no IP address configuration, cannot be used for ' + 'the same host group', + 'EB51B': 'The specified iSCSI Name cannot be used because it causes a ' + 'conflict in host affinity setting at a CA port in which a ' + 'host with the same iSCSI Name has already been used', + 'EB51C': 'The specified iSCSI Name cannot be used because it causes a ' + 'conflict in host group setting in which a host with the same ' + 'iSCSI Name has already been used', + 'EB51D': 'The LUN group cannot be used for Veeam B&R', + 'EB900': 'REC path is not set', + 'EB901': 'REC path is not normal', + 'EB902': 'REC Buffer is mirror recovery status', + 'EB903': 'CFL is canceled because REC session is not continuable state', + 'EB904': 'REC path is set in this device', + 'EB905': 'REC path using iSCSI interface exists', + 'EB906': 'There is CA port whose port mode is CA/RA or RA', + 'EB907': 'The resource, which can be used only in expand volume mode, ' + 'exists', + 'EB908': 'There is no REC path information connected to the specified ' + 'remote storage', + 'EB909': 'The specified RA path does not exist', + 'EB90A': 'REC Line Speed cannot be changed since the Connection Type of ' + 'the REC path connected to the specified remote storage is ' + '"Direct"', + 'EBD00': 'Does not meet a requirement for downgrading', + 'EBD01': 'The specified firmware version is older than the ' + 'current firmware version. If firmware downgrade is required, ' + 'specify the "-cm-downgrade" option', + 'EBD02': 'The controller firmware is being received from the REMCS center', + 'EBD03': 'The specified generation is not in valid status', + 'EBD04': 'The specified controller firmware is already registered', + 'EBD05': 'The specified generation is already registered on the ' + 'Flash memory', + 'EBD06': 'Not available under current system status conditions', + 'EBD07': 'The "hot-auto" application type cannot be executed in ' + 'current configuration', + 'EBD08': 'The "hot-manual" application type cannot be executed in ' + 'current configuration', + 'EBD09': 'One or more components have failed when applying the firmware', + 'EBD0A': 'An internal process failed', + 'EBD0B': 'The rebooting process has finished, but an error has been ' + 'detected in the Master CM', + 'EBD0C': 'The status of the Master CM is not normal. The rebooting ' + 'process cannot be executed', + 'EBD0D': 'The hot firmware application failed because the system is ' + 'under heavy I/O load', + 'EBD0E': 'The hot firmware application failed because the pinned data ' + 'exists', + 'EBD0F': 'The Data migration is in progress', + 'EBD10': 'The hot firmware application cannot be executed under ' + 'the current condition of the Advanced Copy function', + 'EBD11': 'There is no redundant path available for accessing ' + 'the external storage device(s)', + 'EBD12': 'External storage access path redundancy error', + 'EBD13': 'The specified firmware version is newer than or equal to ' + 'the current firmware version', + 'EBD14': 'An error has been detected. The controller firmware ' + 'application has failed', + 'EBD15': 'The controller firmware application has finished, ' + 'but has failed for one or more components', + 'EBD16': 'The status of the Master CM is not normal. The firmware ' + 'application cannot be executed', + 'EBD17': 'An error has been detected. The rebooting process has failed', + 'EBD18': 'The rebooting process has finished, but has failed for ' + 'one or more components', + 'EBD19': 'The hot firmware application has been cancelled', + 'EBD1A': 'The rebooting process has finished, but one or ' + 'more access paths, by which external LUs are not accessible, ' + 'have been detected. There is a possibility that ' + 'an error occurs on the access paths or the external LUs', + 'EBD1B': 'An error has been detected. The firmware application for ' + 'the PFMs has failed', + 'EBD1C': 'The firmware application for the PFMs has finished, but ' + 'has failed for one or more PFMs', + 'EBD1D': 'Switching firmware has failed', + 'EBE00': 'The specified volume is being used as a NAS volume', + 'EBE01': 'This operation is not applicable to the specified object', + 'EBE02': 'The NAS function is not available', + 'EBE03': 'The number of NAS-TPVs exceeds the maximum number of ' + 'registrations', + 'EBE04': 'The number of NAS-TPVs (Backup) exceeds the maximum number of ' + 'registrations', + 'EBE05': 'Number of NAS System Volume has reached the system limit', + 'EBE06': 'Capacity of NAS System Volume has reached the system limit', + 'EBE07': 'An error was detected in NAS Engine', + 'EBE08': 'NAS system volume does not exist', + 'EBE09': 'NAS system volume is not writable', + 'EBE0A': 'The firmware does not support NAS', + 'EBE0B': 'This operation is not applicable to the Unified Storage', + 'EBE20': 'Specified NAS share does not exist', + 'EBE21': 'The number of NAS share exceeds the maximum number of ' + 'registrations', + 'EBE22': 'Specified NAS share name already exists', + 'EBE23': 'Insufficient NAS share resources', + 'EBE24': '[-force] option is only used for the NAS Volume whose ' + 'status is "Readying"', + 'EBE25': 'R and RW cannot be set to the same user or group', + 'EBE26': 'Specified host is not registered in the Allow NFS Hosts', + 'EBE27': 'Specified NAS share does not support CIFS service', + 'EBE28': 'Home directory function is already enabled', + 'EBE29': 'The specified NAS share is used for home directory function', + 'EBE30': 'Specified NAS interface does not exist', + 'EBE31': 'The number of NAS interfaces exceeds the maximum ' + 'number of registrations', + 'EBE32': 'Another non-VLAN IP address has been registered with this port', + 'EBE33': 'The specified IPv4 address is already registered', + 'EBE34': 'The specified IPv6 link local address is already registered', + 'EBE35': 'The specified IPv6 address is already registered', + 'EBE36': 'No valid IP address exists', + 'EBE37': 'The VLAN ID setting is incorrect', + 'EBE38': 'The IPv4 address is incorrect', + 'EBE39': 'The subnet mask setting is incorrect', + 'EBE3A': 'The gateway address is incorrect', + 'EBE3B': 'The IPv4 host address bits should be non-all-0 and non-all-1', + 'EBE3C': 'The specified IPv6 link local address is incorrect', + 'EBE3D': 'The specified IPv6 global address is incorrect', + 'EBE3E': 'The IPv6 prefix length should be 3-128', + 'EBE3F': 'The IPv6 gateway address should be same subnet or ' + 'have other interface ID', + 'EBE40': 'The specified IPv6 address is not a link local address or ' + 'a global address', + 'EBE41': 'The specified IP address already exists', + 'EBE42': 'The primary DNS server information is not set', + 'EBE43': 'Specified NAS interface is not assigned to port', + 'EBE44': 'The same VLAN ID has been registered to this port', + 'EBE45': 'The specified NAS interface is used by multi-path', + 'EBE70': 'The specified port is the master port for the bonding', + 'EBE71': 'The specified port is the member port for the bonding', + 'EBE72': 'The specified port is not the master port for the bonding', + 'EBE73': 'The specified port is not the member port for the bonding', + 'EBE74': 'The specified port is on a different CM', + 'EBE75': 'The number of member ports exceeds the maximum number of ' + 'registrations', + 'EBE76': 'Cannot delete the bond because the multi-path is enabled', + 'EBE80': 'The specified port belong to the multi-path', + 'EBE81': 'The specified port is not multi-path pair', + 'EBE82': 'The specified port is installed in the same CM', + 'EBE83': 'The IP address of the NAS interface under the multi-path ports ' + 'has to have the same network address', + 'EBE90': 'The server settings conflicted', + 'EBE91': 'NAS AD/LDAP server setting is not complete. Some more ' + 'parameters need to be specified', + 'EBE92': 'Available NAS interface not exist', + 'EBE93': 'One or more NAS AD/LDAP servers are registered', + 'EBE94': 'The same local group cannot be set to both Primary and ' + 'Secondary groups', + 'EBE95': 'The specified local user name or ID is already registered', + 'EBE96': 'The specified local group does not exist', + 'EBE97': 'The specified local user does not exist', + 'EBE98': 'The specified local group name or ID is already registered', + 'EBE99': 'The specified local group is used as Primary group', + 'EBE9A': 'One or more local users or groups are registered', + 'EBE9B': 'The number of local users exceeds the maximum number of ' + 'registrations', + 'EBE9C': 'The number of local groups exceeds the maximum number of ' + 'registrations', + 'EBE9D': 'BUILTIN group can be used only for Secondary group', + 'EBE9E': 'Specified group name is incorrect', + 'EBE9F': 'LDAP server is not configured', + 'EBEA0': 'The specified route is already registered', + 'EBEA1': 'The specified route is not registered', + 'EBEA2': 'The specified gateway cannot be accessed', + 'EBEA3': 'The host address or the interface ID portion of the IP address ' + 'should be zero', + 'EBEA4': 'The destination address is the same as the interface address', + 'EBEA5': 'The gateway address is the same as the interface address', + 'EBEA6': 'The specified destination address is incorrect', + 'EBEB0': 'The number of NAS snapshot volumes exceeds ' + 'the maximum number of registrations', + 'EBEB1': 'The specified NAS snapshot configurations not exist', + 'EBEB2': 'The NAS snapshot configurations is set to specified volume', + 'EBEB3': 'The Snap Data Pool Volume which is match ' + 'the encryption status of the specified volume, does not exist', + 'EBEB4': 'The NAS snapshot configurations is the manual collecting mode', + 'EBEC0': 'The number of NAS quota settings exceeds the maximum number of ' + 'registrations', + 'EBEC1': 'A NAS quota setting already exists', + 'EBEC2': 'Warning value larger than limit value is specified', + 'EBEC3': 'Specified NAS quota setting does not exist', + 'EBEC4': 'Deletion of the quota setting associated with ' + 'specified volume failed', + 'EBEC5': 'All of quota setting failed.', + 'EBEC6': 'Deletion of the quota setting associated with ' + 'specified NAS share failed', + 'EBEE0': 'The specified NAS share has already been configured for ' + 'FTP service', + 'EBEE1': 'The number of NAS share folders for FTP service exceeds ' + 'the allowable maximum', + 'EBEE2': 'The specified NAS share has not been configured for FTP service', + 'EBF00': 'The number of registered TFO group has exceeded maximum ' + 'in this device', + 'EBF01': 'TFO group is exist', + 'EBF02': 'TFO group does not exist', + 'EBF03': 'The specified TFO group name is already registered', + 'EBF04': 'The specified CA Port is not in the specified TFO group', + 'EBF05': 'The specified TFO group is primary', + 'EBF06': 'The specified port is not TFO port', + 'EBF07': 'The specified port is already TFO pair port configured', + 'EBF08': 'Different types of CA ports cannot be used in TFO group', + 'EBF09': 'The maximum TFO capacity cannot be decreased when ' + 'TFO pair exists', + 'EBF0A': 'The specified volume is not in process of TFO pair', + 'EBF0B': 'The TFO group is primary', + 'EBF0C': 'The specified volume is in process of TFO pair', + 'EBF0D': 'There is a volume what is in process of TFO pair', + 'EBF0E': 'The specified volume is configured TFOV', + 'EBF10': 'Change of size was specified volume is TFOV', + 'EBF11': 'The parameter needs storage cluster license', + 'EBF12': 'The destination port belongs to TFO group', + 'EBF13': 'The source port belongs to TFO group', + 'EBF15': 'The specified port has been changed WWPN/WWNN', + 'EBF16': 'TFO group is set to manual failover', + 'EC000': 'VVOL Fault : ActivateProviderFailed', + 'EC001': 'VVOL Fault : InactiveProvider', + 'EC002': 'VVOL Fault : IncompatibleVolume', + 'EC003': 'VVOL Fault : IncorrectSite', + 'EC004': 'VVOL Fault : InvalidArgument', + 'EC005': 'VVOL Fault : InvalidCertificate', + 'EC006': 'VVOL Fault : InvalidLogin', + 'EC007': 'VVOL Fault : InvalidProfile', + 'EC008': 'VVOL Fault : InvalidSession', + 'EC009': 'VVOL Fault : InvalidStatisticsContext', + 'EC00A': 'The specified VVOL copy session does not exist', + 'EC010': 'VVOL Fault : LostAlarm', + 'EC011': 'VVOL Fault : LostEvent', + 'EC012': 'VVOL Fault : NotCancellable', + 'EC013': 'VVOL Fault : NotFound', + 'EC014': 'VVOL Fault : NotImplemented', + 'EC015': 'VVOL Fault : NotSupported', + 'EC016': 'VVOL Fault : OutOfResource', + 'EC017': 'VVOL Fault : PermissionDenied', + 'EC018': 'VVOL Fault : ResourceInUse', + 'EC020': 'VVOL Fault : StorageFault', + 'EC021': 'VVOL Fault : Timeout', + 'EC022': 'VVOL Fault : TooMany', + 'EC100': 'One or more external drives exist', + 'EC101': 'The specified external storage devices do not exist', + 'EC102': 'The number of external drives exceeds the maximum number of ' + 'registrations', + 'EC103': 'External LUs do not exist', + 'EC104': 'External drives do not exist', + 'EC105': 'External drives are already used', + 'EC106': 'The status of external drives is not normal', + 'EC107': 'The specified external RAID group does not exist', + 'EC108': 'External RAID groups are already used', + 'EC109': 'The specified external RAID group is not in "Broken" state', + 'EC10A': 'The number of external RAID groups exceeds ' + 'the maximum number of registrations', + 'EC10B': 'The status of external RAID groups is not normal', + 'EC10C': 'The specified external RAID group name has already been used', + 'EC10D': 'External LUs are not accessible', + 'ED000': 'Send failed internal command', + 'ED001': 'Receive failed internal command response', + 'ED002': 'Internal command retry timeout', + 'ED003': 'Internal command progress retry timeout', + 'ED180': 'Flexible Tier Migration is running', + 'ED181': 'Quick UNMAP is being performed', + 'ED182': 'The cache LUN size limit is being set', + 'ED183': 'Because EC is being executed, the processing was discontinued', + 'ED184': 'Because OPC is being executed, the processing was discontinued', + 'ED185': 'Because REC is being executed, the processing was discontinued', + 'ED186': 'Offloaded Data Transfer is being performed', + 'ED187': 'The REC disk buffer volume is associated', + 'ED190': 'The internal resources are insufficient', + 'ED191': 'The internal resources are insufficient', + 'ED192': 'The internal resources are insufficient', + 'ED193': 'A non-master-CM component received a command', + 'ED194': 'The internal resources are insufficient', + 'ED195': 'Internal processes are running. Wait for a while and try again', + 'ED196': 'The internal resources are insufficient', + 'ED197': 'Number of the processing request is reached the limit', + 'ED198': 'Process is timeout', + 'ED199': 'The process terminated with an error because pinned ' + 'data existed', + 'ED19A': 'The key management server responded with an error', + 'ED19B': 'An error occurred during communication with the key ' + 'management server', + 'ED19C': 'The key management server contains no keys that can be changed', + 'ED19F': 'The command process is being canceled', + 'ED1A0': 'Another process is running', + 'ED1A1': 'EC is running', + 'ED1A2': 'OPC is running', + 'ED1A3': 'REC is running', + 'ED1A4': 'ROPC is running', + 'ED1A5': 'CCP is running', + 'ED1A6': 'Quick Format is running', + 'ED1A7': 'Rebuild operation is running', + 'ED1A8': 'There is no redundancy', + 'ED1A9': 'A DE is being rebooted', + 'ED1AA': 'CFL is running', + 'ED1AB': 'CFD is running', + 'ED1AC': 'Operations associated with Log file, Panic Dump or ' + 'Event information are being processed', + 'ED1AD': 'The hot spare is in use', + 'ED1AE': 'Upgrade Dirty Recovery is running', + 'ED1AF': 'Degrade Dirty Recovery is running', + 'ED1B0': 'Remote Maintenance is running', + 'ED1B1': 'Command Lock is being processed', + 'ED1B2': 'The configuration is being changed', + 'ED1B3': 'Bind In Cache (Extent) is set', + 'ED1B4': 'Data Migration is running', + 'ED1B5': 'Logical Device Expansion is running', + 'ED1B6': 'Write Through is running', + 'ED1B7': 'An encryption process or a decryption process is running', + 'ED1B8': 'Bind In Cache is set', + 'ED1B9': 'Some of the spinup or spindown operations failed', + 'ED1BA': 'Eco-mode schedule suspension timeout occurred', + 'ED1BB': 'All of the spinup and spindown operations failed', + 'ED1BC': 'There is an encryption volume', + 'ED1BD': 'Operation Mode is not in "Maintenance Mode"', + 'ED1BE': 'A Storage Migration path is set or Storage Migration is running', + 'ED1BF': 'Extended Copy is running', + 'ED1C0': 'An error occurred in the module', + 'ED1C1': 'An error occurred in the CM', + 'ED1C2': 'An error occurred in the CA', + 'ED1C3': 'An error occurred in the BRT', + 'ED1C4': 'An error occurred in the SVC', + 'ED1C5': 'An error occurred in the RSP', + 'ED1C6': 'An error occurred in the FRT', + 'ED1C7': 'An error occurred in the PBC', + 'ED1C8': 'An error occurred in the battery', + 'ED1C9': 'An error occurred in the DE', + 'ED1CA': 'An error occurred in the DE path', + 'ED1CB': 'An error occurred in the user drive', + 'ED1CC': 'An error occurred in the system drive', + 'ED1CD': 'An error occurred in the Flash-ROM', + 'ED1CE': 'An error occurred in the FE Expander', + 'ED1CF': 'An error occurred in the BE Expander', + 'ED1D0': 'An error occurred in the EXP', + 'ED1D1': 'An error occurred in the drive path', + 'ED1D2': 'An error occurred in the drive', + 'ED1D3': 'Unable to retrieve data from NAS Engine. ' + 'Please check the status of the NAS Engine', + 'ED1E0': 'Power-on has not been performed yet or power-off is being ' + 'performed', + 'ED1E1': 'Zero is specified for the module ID in the transmitter', + 'ED1E2': 'The lock has been acquired', + 'ED1E3': 'Locking has not been performed', + 'ED1E4': 'An unsupported command was specified', + 'ED1E5': 'The parameter length is incorrect', + 'ED1E6': 'The specified parameter is incorrect.', + 'ED1E7': 'The data length is incorrect', + 'ED1E8': 'The specified data is incorrect', + 'ED1E9': 'The execution of the command is requested while this command is ' + 'already being performed', + 'ED1EA': 'The target object cannot be operated', + 'ED1EB': 'An internal process failed', + 'ED1EC': 'Because Storage Cluster is being executed, the processing was ' + 'discontinued', + 'ED1ED': 'The Flexible Tier Pool shrinking is in process', + 'ED200': 'The user name or password is incorrect', + 'ED201': 'The user name is duplicated', + 'ED202': 'The number of registered users has reached the limit', + 'ED203': 'This user has already registered the User Key. The process was ' + 'aborted', + 'ED204': 'The specified role name is not registered', + 'ED205': 'An internal process failed', + 'ED206': 'The login request exceeds the allowable maximum number of ' + 'login process', + 'ED207': 'The specified process cannot be performed because a process ' + 'that the Virtual Disk Service issued is already running', + 'ED208': 'The specified RAID group is not in "Available" state', + 'ED209': 'An error has occurred in a communication path', + 'ED20A': 'No writable generation exists', + 'ED20B': 'The source volume of migration is being deleted by internal ' + 'process after completed migration', + 'ED20C': 'The cache memory size is insufficient for Bind-in-Cache', + 'ED20D': 'No response is received', + 'ED20E': 'iSNS server is not set', + 'ED20F': 'The installation type information for the DE that is ' + 'to be added is insufficient', + 'ED210': 'Maintenance mode start or maintenance mode end is being ' + 'executed by operation', + 'ED211': 'The license information is being updated because ' + 'the trial license expired', + 'ED212': 'The Bitmap is being acquired', + 'ED213': 'The storage is not in "Not Ready" state', + 'ED214': 'The Not Ready factor is not Machine Down Recovery failed', + 'ED215': '(if processing mode is 0x00) CM with the following status ' + 'exists among defined CM: Status other than Online - This CM is ' + 'not included in the Cyclic composition', + 'ED216': 'The device is a busy state. Please wait for a while', + 'ED217': 'Storage Cruiser is being used. The process was aborted', + 'ED218': 'Command executed from except Storage Cruiser. The process was ' + 'aborted', + 'ED219': 'Reading all BUDs failed', + 'ED21A': 'No BUDs are accessible', + 'ED21B': 'Writing all BUDs failed', + 'ED21C': 'All of the BUD capacity is used', + 'ED21D': 'A timeout occurred during firmware registration', + 'ED220': 'The disk where the archive that tries to be registered ' + 'can be applied doesn\'t exist in the device', + 'ED221': 'The archive that tries to be registered is unsupported firmware', + 'ED222': 'Reading the history data failed', + 'ED223': 'Reading the composition data failed', + 'ED224': 'Writing the history data failed', + 'ED225': 'Keeping the composition data failed', + 'ED226': 'Keeping the newest composition data failed', + 'ED227': 'The configuration is internally being updated', + 'ED228': 'Reading from a BUD failed', + 'ED229': 'The BUD doesn\'t exist', + 'ED22A': 'The target module does not exist', + 'ED22B': 'The process cannot be performed because another function is ' + 'being executed', + 'ED22C': 'The revision that changes the Advanced Copy version cannot be ' + 'performed because an EC, an OPC, or a REC is running', + 'ED22D': 'The execution was canceled because an error occurred during ' + 'communication with the CM', + 'ED22E': 'The firmware application or EC switch has not executed', + 'ED22F': 'The free capacity of the Flexible Tier Pool is insufficient', + 'ED230': 'The EC switching operation that changes ' + 'the Advanced Copy version is attempted while an EC, an OPC, ' + 'or a REC is running', + 'ED231': 'Distribution of the control domain failed', + 'ED232': 'The storage is not in "Normal" state', + 'ED233': 'The version is not normal', + 'ED234': 'A remote copy is running', + 'ED235': 'Reclamation of Thin Provisioning Volume is in progress', + 'ED236': 'Not all batteries are in "Full Charge" state', + 'ED237': 'Controller Firmware is not registered', + 'ED238': 'CFL is not executed yet', + 'ED239': 'Because the numbers of connections to the specified device ' + 'reached the maximum number, it is not possible to connect it. ' + 'Please wait for a while', + 'ED23A': 'The firmware distribution function between devices of ' + 'the specified device doesn\'t have interchangeability with ' + 'this device', + 'ED23B': 'The firmware types do not match', + 'ED23C': 'The error occurred by the communication with ' + 'the specified device', + 'ED23D': 'Powering off is being performed', + 'ED23E': 'CFL is running', + 'ED23F': 'The firmware is being downloaded', + 'ED240': 'Gateway is not set though the specified device is set ' + 'outside the subnet', + 'ED241': 'Duplicated IP address between the specified device and ' + 'used LAN port', + 'ED242': 'The specified device is in the subnet of unused LAN port', + 'ED243': 'Duplicated IP address between the specified device and ' + 'allowed IP of unused LAN port', + 'ED244': 'Group IDs of the specified storage and ' + 'the current storage are different', + 'ED245': 'IP address of DNS is not valid', + 'ED246': 'Acceptable IP addresses from other subnet have been specified ' + 'but Gateway has not been set', + 'ED247': 'The port specified for used LAN port of a remote support is ' + 'not set', + 'ED248': 'Gateway is not set though DNS is set outside of the subnet', + 'ED249': 'Gateway is not set though the PROXY server is set outside of ' + 'the subnet', + 'ED24A': 'Gateway is not set though the HTTP server is set outside of ' + 'the subnet', + 'ED24B': 'Gateway is not set though the SMTP server is set outside of ' + 'the subnet', + 'ED24C': 'Gateway is not set though the POP server is set outside of ' + 'the subnet', + 'ED24D': 'Gateway is not set though the NTP server is set outside of ' + 'the subnet', + 'ED24E': 'DNS server to resolve server name is not specified', + 'ED24F': 'Please export the log, and contact the person in charge of ' + 'maintenance', + 'ED250': 'The name resolution of the PROXY server failed', + 'ED251': 'The name resolution of the HTTP server failed', + 'ED252': 'The name resolution of the SMTP server failed', + 'ED253': 'The name resolution of the POP server failed', + 'ED254': 'The name resolution of the NTP server failed', + 'ED255': 'Even though the command terminated successfully, ' + 'the name resolution of the primary DNS failed. The secondary ' + 'DNS is used instead', + 'ED256': 'The name resolution succeeded by the IPv6 Primary DNS server', + 'ED257': 'The name resolution succeeded by the IPv6 Secondary DNS server', + 'ED258': 'The name resolution succeeded by the IPv4 Primary DNS server', + 'ED259': 'The name resolution succeeded by the IPv4 Secondary DNS server', + 'ED25A': 'Login to the POP server is impossible because the user name or ' + 'password is incorrect', + 'ED25B': 'Error occurred in authentication with AUTH', + 'ED25C': 'Error occurred in communication with SMTP server', + 'ED25D': 'Error occurred in communication with HTTP server', + 'ED25E': 'Error occurred in communication with PROXY server', + 'ED25F': 'Error occurred in communication with POP server', + 'ED260': 'Time out occurred in communication with SMTP server', + 'ED261': 'Time out occurred in communication with HTTP server', + 'ED262': 'Time out occurred in communication with PROXY server', + 'ED263': 'Time out occurred in communication with POP server', + 'ED264': 'Error occurred in sending data to SMTP server', + 'ED265': 'Error occurred in sending data to HTTP server', + 'ED266': 'Error occurred in sending data to PROXY server', + 'ED267': 'Error occurred in sending data to POP server', + 'ED268': 'Error occurred in receiving data from SMTP server', + 'ED269': 'Error occurred in receiving data from HTTP server', + 'ED26A': 'Error occurred in receiving data from PROXY server', + 'ED26B': 'Error occurred in receiving data from POP server', + 'ED26C': 'Duplicated IP address between DNS server and used LAN port', + 'ED26D': 'The IP address for DNS server is in the subnet of unused ' + 'LAN port', + 'ED26E': 'Duplicated IP address between DNS server and allowed IP of ' + 'unused LAN port', + 'ED26F': 'Duplicated IP address between PROXY server and used LAN port', + 'ED270': 'Duplicated IP address between HTTP server and used LAN port', + 'ED271': 'Duplicated IP address between SMTP server and used LAN port', + 'ED272': 'Duplicated IP address between POP server and used LAN port', + 'ED273': 'Duplicated IP address between NTP server and used LAN port', + 'ED274': 'The IP address for the PROXY server is in the subnet of ' + 'unused LAN port', + 'ED275': 'The IP address for the HTTP server is in the subnet of ' + 'unused LAN port', + 'ED276': 'The IP address for the SMTP server is in the subnet of ' + 'unused LAN port', + 'ED277': 'The IP address for the POP server is in the subnet of ' + 'unused LAN port', + 'ED278': 'The IP address for the NTP server is in the subnet of ' + 'unused LAN port', + 'ED279': 'Duplicated IP address between PROXY server and ' + 'allowed IP of unused LAN port', + 'ED27A': 'The Flexible Tier Pool is in "Broken" state', + 'ED27B': 'The ODX Buffer volume exists.', + 'ED27C': 'The Flexible Tier Pool balancing is in process', + 'ED27D': 'Online Storage Migration is in process', + 'ED27E': 'Freeing up space in the Flexible Tier Pool is in process', + 'ED27F': 'The last RAID group in the Flexible Tier Pool cannot be deleted', + 'ED280': 'The RAID group is being deleted by internal process after ' + 'Flexible Tier Pool shrinking', + 'ED281': 'Duplicated IP address between HTTP server and allowed IP of ' + 'unused LAN port', + 'ED282': 'Duplicated IP address between SMTP server and allowed IP of ' + 'unused LAN port', + 'ED283': 'Duplicated IP address between POP server and allowed IP of ' + 'unused LAN port', + 'ED284': 'Duplicated IP address between NTP server and allowed IP of ' + 'unused LAN port', + 'ED285': 'The Flexible Tier Pool shrinking is in process', + 'ED286': 'Failed to start SSD sanitization', + 'ED287': 'The Flexible Tier Pool shrinking is in process', + 'ED288': 'The Flexible Tier Pool shrinking is not in process', + 'ED289': 'The password cannot be set. (Minimum password age ' + 'policy violation', + 'ED28A': 'The device is not registered', + 'ED28B': 'The password cannot be set. (Password history policy violation', + 'ED28C': 'No BUDs are available', + 'ED28D': 'The password cannot be set. (Minimum password length ' + 'policy violation', + 'ED28E': 'The remote support center is busy', + 'ED28F': 'The network information is being set', + 'ED290': 'No controller firmware can be downloaded', + 'ED291': 'The information of the device is being sent again ' + 'because outdated information is registered in the remote ' + 'support center. Wait approximately ten minutes and try again', + 'ED292': 'An error occurred during HTTP communication', + 'ED293': 'An error occurred during SMTP communication', + 'ED294': 'A communication error occurred', + 'ED295': 'No log files exist', + 'ED296': 'The specified SLU does not exist', + 'ED297': 'Data cannot be obtained because of a cache miss', + 'ED298': 'The cache data cannot be obtained because the specified mirror ' + 'cache does not exist', + 'ED299': 'The cache data cannot be obtained because the cache of ' + 'the drive that is specified contains dirty data', + 'ED29A': 'Even though the CCHH mode is specified, the relevant volume is ' + 'not a Mainframe volume or a MVV volume', + 'ED29B': 'Specified Head Number is invalid', + 'ED29C': 'Specified CCHH or SLBA is out of range', + 'ED29D': 'The LU type of the specified SLU is TPPC, FTV, or TMP FTV', + 'ED29E': 'The storage is in "Machine Down" state', + 'ED29F': 'Status of target RAID group is not Broken', + 'ED2A0': 'The access path to the specified RAID group is not normal', + 'ED2A1': 'There is no access path to the target RAID group', + 'ED2A2': 'The password cannot be set. (Password complexity policy ' + 'violation', + 'ED2A3': 'Invalid firmware file', + 'ED2A4': 'The specified Role name has already been used', + 'ED2A5': 'The number of roles has reached the maximum number of ' + 'registrations', + 'ED2A6': 'Deletion of a role that is assigned to a user is attempted', + 'ED2A8': 'The specified Snap Data Pool Volume does not exist', + 'ED2A9': 'The Copy Bitmap is insufficient', + 'ED2AA': 'Processing was interrupted because it reached max copy session ' + 'count or copy function is not enable', + 'ED2AB': 'The specified volume is in process of copy session or ' + 'RAID Migration', + 'ED2AC': 'An invalid LU is specified', + 'ED2AD': 'Because specified session is not the oldest one, ' + 'the processing was not performed', + 'ED2AE': 'The specified volume is being initialized', + 'ED2AF': 'The encryption settings of the copy source and the copy ' + 'destination are different', + 'ED2B0': 'The drive motor is stopped for either the copy source or ' + 'the copy destination due to an Eco-mode schedule', + 'ED2B1': 'The specified destination volume is being used by ' + 'another session', + 'ED2B2': 'The Thin Provisioning function is disabled', + 'ED2B3': 'Slave CM: Execution was discontinued for the other ' + 'command accepted', + 'ED2B4': 'Slave CM: Error occurred in receiving data from Master CM', + 'ED2B5': 'Master CM: Error occurred in sending data from Slave CM', + 'ED2B6': 'Master CM: Error occurred in receiving data from Slave CM', + 'ED2B7': 'Bind-in-Cache Memory Size has already been set. ' + 'Cache Parameters cannot be changed', + 'ED2B8': 'The specified resource number exceeds the maximum value for ' + 'the allowed range', + 'ED2B9': 'Incorrect parameter combination', + 'ED2BA': 'The specified license key is incorrect', + 'ED2BB': 'The specified User Public Key file is not correct', + 'ED2BC': 'The specified SSL Server Key file does not match the SSL Server ' + 'Certificate file', + 'ED2BD': 'No session is running', + 'ED2BE': 'Access to the BUD is being suppressed', + 'ED2BF': 'The pool capacity that can be created in the device exceeds ' + 'the maximum pool capacity', + 'ED2C0': 'The number of unused disks is insufficient', + 'ED2C1': 'RLU/DLU/SLU are insufficient', + 'ED2C2': 'The Flexible Tier function is disabled', + 'ED2C6': 'The SSL/KMIP certificate file is not normal', + 'ED2C7': 'The process has failed. It failed in some CA port(s)', + 'ED2C8': 'The process has failed. It failed in all CA ports', + 'ED2C9': 'The specified TPPE ID does not exist', + 'ED2CA': 'The trial license key is incorrect', + 'ED2CB': 'The trial license key has reached the registration ' + 'limit number of times', + 'ED2CC': 'Competing with AIS connect operation in background process', + 'ED2CD': 'Competing with AIS connect send log operation in ' + 'background process', + 'ED2CE': 'Volume Type which is the Migration destination is different', + 'ED2CF': 'Another Deduplication/Compression check already in progress', + 'ED2D0': 'Displaying Snap OPC restore size is not supported', + 'ED2D1': 'Recovery process is running. Wait for a while and try again', + 'ED2D2': 'The installed memory is insufficient', + 'ED2D3': 'The VVOL function is not disabled', + 'ED2D4': 'Drives are not installed on the required slots for using the ' + 'specified maximum pool capacity', + 'ED2D5': 'The total volume capacity which can be created or expanded by ' + 'one operation is up to 2PB', + 'ED2D6': 'There are one or more PFMs which can be downgraded', + 'ED500': 'An error occurred in the Deduplication/Compression Process', + 'ED501': 'Master link local IP conflicted', + 'ED502': 'Slave link local IP conflicted', + 'ED503': 'Global/gateway IP cannot be obtained', + 'ED504': 'Duplication check of link local IP failed', + 'ED505': 'Prefix length is incorrect', + 'ED506': 'The usable capacity of the Deduplication/Compression Map volume ' + 'is insufficient temporarily. Please wait for a while and retry', + 'ED507': 'The system is in high-load state. Please wait for a while', + 'ED508': 'The specified external LU has already been registered', + 'ED509': 'The access path of the external storage device is not normal', + 'ED50A': 'The number of drives that is used exceeds the maximum number', + 'ED50B': 'The target mapping table number exceeds the maximum number in ' + 'the allowed range', + 'ED50C': 'The target OLU already exists in the same mapping table', + 'ED50D': 'Incorrect parameter combination', + 'ED50E': 'The specified host number exceeds the maximum number in ' + 'the allowed range', + 'ED50F': 'The WWN that is to be registered is duplicated', + 'ED510': 'The specified external RAID group cannot be recovered', + 'ED511': 'CA port is overlapping in group', + 'ED512': 'The external LU information is not consistent. Please ' + 'refer to ETERNUS CLI User\'s Guide for more details', + 'ED513': 'The specified LCU number exceeds the maximum number in ' + 'the allowed range', + 'ED514': 'The specified host response number exceeds the maximum number ' + 'in the allowed range', + 'ED515': 'The external storage device responded with an error', + 'ED516': 'An error occurred in accessing the external storage device', + 'ED517': 'A copy session is running', + 'ED518': 'The connected device does not support this function', + 'ED519': 'The forwarding interval cannot be specified when the ' + 'ETERNUS6000 is connected', + 'ED51A': 'The buffer size exceeds the maximum size for the device', + 'ED51B': 'REC Buffer has already been configured. The process was aborted', + 'ED51C': 'The storage is in "Not Ready" state. The process was aborted', + 'ED51D': 'The REC disk buffer contains some data', + 'ED51E': 'Some REC Consistency sessions are not in Suspend status', + 'ED51F': 'There is no Pinned Data or Bad Data in the specified volume', + 'ED520': 'The specified volume has too many Pinned Data or ' + 'Bad Data for checking', + 'ED523': 'The number of migration sessions has reached ' + 'the maximum number for operations in the device', + 'ED524': 'The migration source LUN is being used by ' + 'another migration process', + 'ED525': 'The migration source LUN is being used by another copy session', + 'ED526': 'All of the internal resources have already been used', + 'ED527': 'The status of the volume in the migration source or ' + 'the migration destination is not normal', + 'ED528': 'Migration session(s) are not running for ' + 'the specified volume(s)', + 'ED529': 'Bind-in-Cache is set for the specified OLU', + 'ED52A': 'The migration capacity exceeds the maximum logical ' + 'capacity that can be migrated', + 'ED52B': 'There is not enough free space in the specified destination ' + 'pool', + 'ED52C': 'The total capacity of pool is not enough in the storage system. ' + 'The process was aborted', + 'ED52D': 'There are one or more volumes whose migration status is ' + 'not normal', + 'ED52F': 'Enough work capacity for Balancing Thin Provisioning Volume or ' + 'Balancing Flexible Tier Pool does not exist. This function ' + 'cannot be executed', + 'ED531': 'The necessary LU resources are insufficient', + 'ED53A': 'Communication to other device is failure', + 'ED53B': 'TFO group status is inconsistent', + 'ED53C': 'TFO group phase is inconsistent', + 'ED53D': 'The specified TFO group has no volume', + 'ED53E': 'Capacity of volume differs with in the secondary and primary', + 'ED53F': 'The volume has already been used in the TFO group', + 'ED540': 'Firmware of the other storage does not support ' + 'the Storage Cluster', + 'ED541': 'The specified type of TFO group is already registered', + 'ED542': 'Box ID is inconsistent', + 'ED543': 'The TFO group is inconsistent of pair port configuration ' + 'between primary and secondary', + 'ED544': 'Volume that cannot be used in TFO pair port exists', + 'ED545': 'Failover mode or Split mode does not match between ' + 'the secondary and primary', + 'ED546': 'Copy session exists in the volume', + 'ED548': 'Volume UID differs with in the secondary and primary', + 'ED549': 'Cannot delete the specified TFO group because the specified ' + 'port WWN mode is incorrect', + 'ED54A': 'Volume of primary paired with specified volume is not exist', + 'ED54B': 'TFO group activation was specified for incorrect device', + 'ED54C': 'Port of primary paired is not affinity setting', + 'ED54D': 'Storage Cluster data transfer feature is disabled in all RA ' + 'ports constituting the copy path', + 'ED54E': 'TFO pair is active', + 'ED54F': 'Incorrect TFO group condition', + 'ED550': 'The volume cannot be set the copy', + 'ED551': 'There is "Bad Sector" in the copy source volume', + 'ED552': 'The number of copy sessions exceeds the allowable maximum ' + 'copy sessions for this storage', + 'ED553': 'The number of copy sessions exceeds the allowable maximum ' + 'copy sessions for each copy source volume', + 'ED554': 'The number of copy sessions exceeds the allowable maximum ' + 'copy sessions for each copy destination volume', + 'ED555': 'Firmware update is in progress. The specified operation ' + 'cannot be done', + 'ED556': 'VVOL session is active', + 'ED557': 'The free capacity of the pool is insufficient', + 'ED558': 'Process to free up space in the TPP from a host is running', + 'ED700': 'The free capacity of the NAS volumes is insufficient', + 'ED701': 'The free capacity of the NAS system volumes is insufficient', + 'ED702': 'Filesystem check is required', + 'ED703': 'Full filesystem check is required', + 'ED704': 'The mounting status of the NAS file system is incorrect', + 'ED705': 'Maintenance of the filesystem is required', + 'ED706': 'DNS lookup failure', + 'ED707': 'The VLAN setting for the NAS is incorrect', + 'ED708': 'The NAS bonding setting is incorrect', + 'ED709': 'The network setting for the NAS is incorrect', + 'ED70A': 'An I/O error occurs in the NAS system', + 'ED70B': 'The authentication process via the authentication server failed', + 'ED70C': 'Updating file system version is required', + 'ED70D': 'NAS interface failover is currently active', + 'ED70E': 'Updating file system version is required', + 'ED710': 'An internal error occurs in the NAS system', + 'ED711 ': 'NAS internal error', + 'ED712 ': 'NAS internal error', + 'ED713 ': 'NAS internal error', + 'ED714 ': 'NAS internal error', + 'ED715 ': 'NAS internal error', + 'ED716 ': 'NAS internal error', + 'ED717 ': 'NAS internal error', + 'ED718 ': 'NAS internal error', + 'ED719 ': 'NAS internal error', + 'ED71A ': 'NAS internal error', + 'ED71B ': 'NAS internal error', + 'ED71C ': 'NAS internal error', + 'ED71D ': 'NAS internal error', + 'ED71E ': 'NAS internal error', + 'ED71F ': 'NAS internal error', + 'ED720': 'Filesystem check is already running', + 'ED721': 'Invalid operation', + 'ED722': 'NAS engine is not started', + 'ED723': 'The Volume not mounted', + 'ED724': 'Failed to connect to the other CM', + 'ED725': 'The NAS Snapshot is currently busy', + 'ED726': 'The free capacity of the storage pool is insufficient', + 'ED727': 'Domain join error', + 'ED728': 'Server connection error', + 'ED729': 'Clock skew too great', + 'ED72A': 'Improper user or group', + 'ED72B': 'User or group does not exists', + 'ED72C': 'Improper allow host address', + 'ED72D': 'Authority error', + 'ED72E': 'Filesystem is being accessed', + 'ED72F': 'NAS quota setting failed partially', + 'ED730': 'LDAPS certificate is not registered', + 'ED731': 'LDAPS certificate is invalid', + 'ED732': 'The specified domain name is incorrect', + 'ED733': 'The shared folder is not empty. Before deleting ' + 'the share folder, delete all files/folders inside the folder. ' + 'Please refer to "clear nas-data"', + 'ED734': 'NAS data deletion process is running', + 'ED735': 'NAS extension system volume does not exist', + 'ED736': 'The snap data volume is being used', + 'ED737': 'Consistency check of NAS extension system volume is in progress', + 'ED738': 'NAS extension system volume is not normal', + 'ED739': 'One or more clients have connected to this shared folder. ' + 'Please disconnect it first.', + 'ED73A': 'Improper path', + 'ED73B': 'Path does not exist', + 'ED73C': 'Packet capture is in progress at the specified NAS interface', + 'ED73D': 'Specified user name is incorrect', + 'ED73E': 'FTP connection session exists', + 'ED73F': 'The Access Control List is being initialized', + 'ED740': 'The free file system space is insufficient', + 'ED741': 'The specified file has non-empty data. Overwriting is required', + 'ED742': 'The file inflating process is running', + 'ED743': 'Specified group name is incorrect', + 'ED744': 'Snapshot or NAS cache distribution process is running', + 'ED745': 'The user is already registered', + 'ED746': 'The group is already registered', + 'ED747': 'The provisioned file size is too small to inflate', + 'ED748': 'The user cannot be deleted because it is currently being ' + 'used to access to a shared folder', + 'ED749': 'User home directory deletion process is running', + 'ED74A': 'Cannot start to inflate the specified file because it is in use', + 'ED74B': 'Firewall setting for secure connection to change local user ' + 'password is configured as "open" for some NAS ports. ' + 'Please change the setting of these ports to "close"', + 'ED74C': 'Initializing NAS cache distribution failed. ' + 'The storage system might be in high-load temporarily. ' + 'Please wait for a while and retry', + 'ED800': 'Stack suspend timeout', + 'ED801': 'Cascade copy session exist', + 'ED802': 'Cascade local copy session exist', + 'ED803': 'Cascade EC/REC session is not suspended', + 'ED805': 'Advanced copy operations for TFOV are not supported', + 'ED806': 'Copy of an illegal combination with TFO pair', + 'ED807': 'Copy of an illegal combination with storage cluster continuous ' + 'copy session', + 'ED808': 'Illegal copy session has been specified for the TFO port', + 'ED809': 'Illegal combination with Online Storage Migration', +} diff --git a/cinder/volume/drivers/fujitsu/eternus_dx/eternus_dx_cli.py b/cinder/volume/drivers/fujitsu/eternus_dx/eternus_dx_cli.py index 85ad167d1ef..94ca78dfa34 100644 --- a/cinder/volume/drivers/fujitsu/eternus_dx/eternus_dx_cli.py +++ b/cinder/volume/drivers/fujitsu/eternus_dx/eternus_dx_cli.py @@ -18,6 +18,7 @@ from cinder.i18n import _ from cinder import ssh_utils +from cinder.volume.drivers.fujitsu.eternus_dx import constants as CONSTANTS class FJDXCLI(object): @@ -59,12 +60,6 @@ class FJDXCLI(object): 'delete_volume': self._delete_volume } - self.SMIS_dic = { - '0000': '0', # Success. - '0060': '32787', # The device is in busy state. - '0100': '4097' - } # Size not supported. - def done(self, command, **option): func = self.CMD_dic.get(command, self._default_func) return func(**option) @@ -105,7 +100,7 @@ class FJDXCLI(object): 'stdoutlist': stdoutlist}) if status == 0: - rc = '0' + rc = str(CONSTANTS.RC_OK) for outline in stdoutlist[lineno:]: if 0 <= outline.find('CLI>'): continue @@ -124,8 +119,11 @@ class FJDXCLI(object): if outline is None: continue output.append(outline) - - rc, message = self._create_error_message(code, output) + if cmd != "show cli-error-code": + rc, message = self._create_error_message(code, output) + else: + rc = 'E' + code + message = output return {'result': 0, 'rc': rc, 'message': message} @@ -160,22 +158,29 @@ class FJDXCLI(object): self.ssh_pool.remove(ssh) return stdoutdata + def _show_cli_error_message(self, **option): + """Get error messages by error code.""" + output = self._exec_cli("show cli-error-code", + **option) + rc = output['rc'] + if rc != str(CONSTANTS.RC_OK): + raise Exception(_('_show_cli_error_message failed. ' + 'Return code: %lu') % rc) + message = output['message'][1] + output['message'] = message.split('\t')[1] + return output + def _create_error_message(self, code, msg): """Create error code and message using arguements.""" message = None - if code in self.SMIS_dic: - rc = self.SMIS_dic[code] - else: - rc = 'E' + code - - # TODO(whfnst): we will have a dic to store errors. - if rc == "E0001": - message = "Bad value: %s" % msg - elif rc == "ED184": - message = "Because OPC is being executed, " - "the processing was discontinued." - else: - message = msg + rc = 'E' + code + try: + option = { + 'error-code': code + } + message = self._show_cli_error_message(**option)['message'] + except Exception: + message = CONSTANTS.CLIRETCODE_dic.get(rc, msg) return rc, message @@ -214,7 +219,7 @@ class FJDXCLI(object): **option) # Return error. rc = output['rc'] - if rc != "0": + if rc != str(CONSTANTS.RC_OK): return output userlist = output.get('message') @@ -237,7 +242,7 @@ class FJDXCLI(object): msg = str(ex) output = { 'result': 0, - 'rc': '4', + 'rc': str(CONSTANTS.RC_FAILED), 'message': msg } return output @@ -257,7 +262,7 @@ class FJDXCLI(object): rc = output['rc'] - if rc != "0": + if rc != str(CONSTANTS.RC_OK): return output clidatalist = output.get('message') @@ -274,7 +279,7 @@ class FJDXCLI(object): except Exception as ex: output = { 'result': 0, - 'rc': '4', + 'rc': str(CONSTANTS.RC_FAILED), 'message': "show pool provision capacity error: %s" % ex } @@ -288,7 +293,7 @@ class FJDXCLI(object): # return error rc = output['rc'] - if rc != "0": + if rc != str(CONSTANTS.RC_OK): return output cpsdatalist = [] @@ -360,7 +365,7 @@ class FJDXCLI(object): output['message'] = cpsdatalist except Exception as ex: output = {'result': 0, - 'rc': '4', + 'rc': str(CONSTANTS.RC_FAILED), 'message': "Show copy sessions error: %s" % str(ex)} @@ -375,7 +380,7 @@ class FJDXCLI(object): # return error rc = output['rc'] - if rc != "0": + if rc != str(CONSTANTS.RC_OK): return output qoslist = [] @@ -399,13 +404,13 @@ class FJDXCLI(object): msg = ('The results returned by cli are not as expected. ' 'Exception string: %s' % clidata) output = {'result': 0, - 'rc': '4', + 'rc': str(CONSTANTS.RC_FAILED), 'message': "Show qos bandwidth limit error: %s. %s" % (ex, msg)} except Exception as ex: output = {'result': 0, - 'rc': '4', + 'rc': str(CONSTANTS.RC_FAILED), 'message': "Show qos bandwidth limit error: %s" % ex} return output @@ -423,7 +428,7 @@ class FJDXCLI(object): # return error rc = output['rc'] - if rc != "0": + if rc != str(CONSTANTS.RC_OK): return output vqosdatalist = [] @@ -441,12 +446,12 @@ class FJDXCLI(object): msg = ('The results returned by cli are not as expected. ' 'Exception string: %s' % clidata) output = {'result': 0, - 'rc': '4', + 'rc': str(CONSTANTS.RC_FAILED), 'message': "Show volume qos error: %s. %s" % (ex, msg)} except Exception as ex: output = {'result': 0, - 'rc': '4', + 'rc': str(CONSTANTS.RC_FAILED), 'message': "Show volume qos error: %s" % ex} return output @@ -460,7 +465,7 @@ class FJDXCLI(object): # return error rc = output['rc'] - if rc != "0": + if rc != str(CONSTANTS.RC_OK): return output clidatalist = output.get('message') @@ -473,13 +478,13 @@ class FJDXCLI(object): msg = ('The results returned by cli are not as expected. ' 'Exception string: %s' % clidata) output = {'result': 0, - 'rc': '4', + 'rc': str(CONSTANTS.RC_FAILED), 'message': "Show enclosure status error: %s. %s" % (ex, msg)} except Exception as ex: output = {'result': 0, - 'rc': '4', + 'rc': str(CONSTANTS.RC_FAILED), 'message': "Show enclosure status error: %s" % ex} return output diff --git a/cinder/volume/drivers/fujitsu/eternus_dx/eternus_dx_common.py b/cinder/volume/drivers/fujitsu/eternus_dx/eternus_dx_common.py index 72576e605a1..a9d437ba918 100644 --- a/cinder/volume/drivers/fujitsu/eternus_dx/eternus_dx_common.py +++ b/cinder/volume/drivers/fujitsu/eternus_dx/eternus_dx_common.py @@ -53,6 +53,14 @@ FJ_ETERNUS_DX_OPT_opts = [ cfg.StrOpt('cinder_eternus_config_file', default='/etc/cinder/cinder_fujitsu_eternus_dx.xml', help='Config file for cinder eternus_dx volume driver.'), + cfg.BoolOpt('fujitsu_passwordless', + default=True, + help='Use SSH key to connect to storage.'), + cfg.StrOpt('fujitsu_private_key_path', + default='$state_path/eternus', + help='Filename of private key for ETERNUS CLI. ' + 'This option must be set when ' + 'the fujitsu_passwordless is True.'), cfg.BoolOpt('fujitsu_use_cli_copy', default=False, help='If True use CLI command to create snapshot.'), @@ -76,10 +84,12 @@ class FJDXCommon(object): 1.4.5 - Add metadata for snapshot. 1.4.6 - Add parameter fujitsu_use_cli_copy. 1.4.7 - Add support for revert-to-snapshot. + 1.4.8 - Improve the processing flow of CLI error messages.(bug #2048850) + - Add support connect to storage using SSH key. """ - VERSION = "1.4.7" + VERSION = "1.4.8" stats = { 'driver_version': VERSION, 'storage_protocol': None, @@ -97,6 +107,8 @@ class FJDXCommon(object): self.configuration.append_config_values(FJ_ETERNUS_DX_OPT_opts) self.conn = None + self.passwordless = self.configuration.fujitsu_passwordless + self.private_key_path = self.configuration.fujitsu_private_key_path self.use_cli_copy = self.configuration.fujitsu_use_cli_copy self.fjdxcli = {} self.model_name = self._get_eternus_model() @@ -222,7 +234,7 @@ class FJDXCommon(object): 'Element Name is in use.', {'volumename': volumename}) element = self._find_lun(volume) - elif rc != 0: + elif rc != CONSTANTS.RC_OK: msg = (_('_create_volume, ' 'volumename: %(volumename)s, ' 'poolname: %(eternus_pool)s, ' @@ -440,7 +452,7 @@ class FJDXCommon(object): SourceElement=src_vol_instance.path, TargetElement=tgt_vol_instance.path) - if rc != 0: + if rc != CONSTANTS.RC_OK: msg = (_('_create_local_cloned_volume, ' 'volumename: %(volumename)s, ' 'sourcevolumename: %(sourcevolumename)s, ' @@ -546,7 +558,7 @@ class FJDXCommon(object): 'stop_copy_session', **param_dict) - if rc != 0: + if rc != CONSTANTS.RC_OK: msg = (_('_delete_volume_setting, ' 'stop_copy_session failed. ' 'Return code: %(rc)lu, ' @@ -601,7 +613,7 @@ class FJDXCommon(object): configservice, TheElement=vol_instance.path) - if rc != 0: + if rc != CONSTANTS.RC_OK: msg = (_('_delete_volume, volumename: %(volumename)s, ' 'Return code: %(rc)lu, ' 'Error: %(errordesc)s.') @@ -630,7 +642,7 @@ class FJDXCommon(object): 'delete_volume', **param_dict) - if rc == 0: + if rc == CONSTANTS.RC_OK: msg = (_('_delete_volume_after_error, ' 'volumename: %(volumename)s, ' 'Delete Successed.') @@ -774,7 +786,7 @@ class FJDXCommon(object): smis_method, smis_service, **params) - if rc != 0: + if rc != CONSTANTS.RC_OK: LOG.warning('_create_snapshot, ' 'snapshotname: %(snapshotname)s, ' 'source volume name: %(volumename)s, ' @@ -826,14 +838,14 @@ class FJDXCommon(object): ElementType=self._pywbem_uint(pooltype, '16'), Size=self._pywbem_uint(vol_size, '64')) - if rc == 32769: + if rc == CONSTANTS.RG_VOLNUM_MAX: LOG.warning('_create_snapshot, RAID Group pool: %s. ' 'Maximum number of Logical Volume in a ' 'RAID Group has been reached. ' 'Try other pool.', pool) continue - elif rc != 0: + elif rc != CONSTANTS.RC_OK: msg = (_('_create_volume, ' 'volumename: %(volumename)s, ' 'poolname: %(eternus_pool)s, ' @@ -862,7 +874,7 @@ class FJDXCommon(object): 'start_copy_snap_opc', **param_dict) - if rc != 0: + if rc != CONSTANTS.RC_OK: msg = (_('_create_snapshot, ' 'create_volume failed. ' 'Return code: %(rc)lu, ' @@ -1079,7 +1091,7 @@ class FJDXCommon(object): 'expand_volume', **param_dict) - if rc != 0: + if rc != CONSTANTS.RC_OK: msg = (_('extend_volume, ' 'volumename: %(volumename)s, ' 'Return code: %(rc)lu, ' @@ -1133,7 +1145,7 @@ class FJDXCommon(object): Size=self._pywbem_uint(volumesize, '64'), TheElement=volume_instance.path) - if rc != 0: + if rc != CONSTANTS.RC_OK: msg = (_('extend_volume, ' 'volumename: %(volumename)s, ' 'Return code: %(rc)lu, ' @@ -1543,7 +1555,7 @@ class FJDXCommon(object): 'show_pool_provision', **param_dict) - if rc != 0: + if rc != CONSTANTS.RC_OK: msg = (_('_find_pools, show_pool_provision, ' 'pool name: %(pool_name)s, ' 'Return code: %(rc)lu, ' @@ -2047,7 +2059,7 @@ class FJDXCommon(object): % {'cpsession': cpsession, 'operation': operation}) raise exception.VolumeIsBusy(msg) - elif rc != 0: + elif rc != CONSTANTS.RC_OK: msg = (_('_delete_copysession, ' 'copysession: %(cpsession)s, ' 'operation: %(operation)s, ' @@ -2188,7 +2200,7 @@ class FJDXCommon(object): {'errordesc': errordesc, 'rc': rc}) - if rc != 0 and rc != CONSTANTS.LUNAME_IN_USE: + if rc != CONSTANTS.RC_OK and rc != CONSTANTS.LUNAME_IN_USE: LOG.warning('_map_lun, ' 'lun_name: %(volume_uid)s, ' 'Initiator: %(initiator)s, ' @@ -2221,7 +2233,7 @@ class FJDXCommon(object): {'errordesc': errordesc, 'rc': rc}) - if rc != 0 and rc != CONSTANTS.LUNAME_IN_USE: + if rc != CONSTANTS.RC_OK and rc != CONSTANTS.LUNAME_IN_USE: LOG.warning('_map_lun, ' 'lun_name: %(volume_uid)s, ' 'Initiator: %(initiator)s, ' @@ -2428,7 +2440,7 @@ class FJDXCommon(object): 'volumename: %(volumename)s, ' 'Invalid LUNames.', {'volumename': volumename}) - elif rc != 0: + elif rc != CONSTANTS.RC_OK: msg = (_('_unmap_lun, ' 'volumename: %(volumename)s, ' 'volume_uid: %(volume_uid)s, ' @@ -2847,7 +2859,7 @@ class FJDXCommon(object): """Check whether user's role is accessible to ETERNUS and Software.""" ret = True rc, errordesc, job = self._exec_eternus_cli('check_user_role') - if rc != 0: + if rc != CONSTANTS.RC_OK: msg = (_('_check_user, ' 'Return code: %(rc)lu, ' 'Error: %(errordesc)s, ' @@ -2871,100 +2883,79 @@ class FJDXCommon(object): def _exec_eternus_cli(self, command, retry=CONSTANTS.TIMES_MIN, retry_interval=CONSTANTS.RETRY_INTERVAL, - retry_code=[32787], filename=None, timeout=None, + retry_code=['E0060'], filename=None, **param_dict): """Execute ETERNUS CLI.""" LOG.debug('_exec_eternus_cli, ' 'command: %(a)s, ' 'filename: %(f)s, ' - 'timeout: %(t)s, ' 'parameters: %(b)s.', {'a': command, 'f': filename, - 't': timeout, 'b': param_dict}) - result = None + out = None rc = None retdata = None errordesc = None filename = self.configuration.cinder_eternus_config_file - storage_ip = self._get_drvcfg('EternusIP') + storage_ip = self._get_drvcfg('EternusIP', filename) if not self.fjdxcli.get(filename): - user = self._get_drvcfg('EternusUser') - password = self._get_drvcfg('EternusPassword') - self.fjdxcli[filename] = ( - eternus_dx_cli.FJDXCLI(user, storage_ip, - password=password)) + user = self._get_drvcfg('EternusUser', filename) + if self.passwordless: + self.fjdxcli[filename] = ( + eternus_dx_cli.FJDXCLI(user, + storage_ip, + keyfile=self.private_key_path)) + else: + password = self._get_drvcfg('EternusPassword', filename) + self.fjdxcli[filename] = ( + eternus_dx_cli.FJDXCLI(user, storage_ip, + password=password)) for retry_num in range(retry): # Execute ETERNUS CLI and get return value. try: - out_dict = self.fjdxcli[filename].done(command, **param_dict) - result = out_dict.get('result') + out = self.fjdxcli[filename].done(command, **param_dict) + out_dict = out rc_str = out_dict.get('rc') retdata = out_dict.get('message') except Exception as ex: msg = (_('_exec_eternus_cli, ' + 'stdout: %(out)s, ' 'unexpected error: %(ex)s.') - % {'ex': ex}) + % {'out': out, + 'ex': ex}) LOG.error(msg) raise exception.VolumeBackendAPIException(data=msg) - # Check ssh result. - if result == 255: - LOG.info('_exec_eternus_cli, retry, ' - 'command: %(command)s, ' - 'option: %(option)s, ' - 'ip: %(ip)s, ' - 'SSH Result: %(result)s, ' - 'retdata: %(retdata)s, ' - 'TryNum: %(rn)s.', - {'command': command, - 'option': param_dict, - 'ip': storage_ip, - 'result': result, - 'retdata': retdata, - 'rn': (retry_num + 1)}) - time.sleep(retry_interval) - continue - elif result != 0: - msg = (_('_exec_eternus_cli, ' - 'unexpected error, ' - 'command: %(command)s, ' - 'option: %(option)s, ' - 'ip: %(ip)s, ' - 'resuslt: %(result)s, ' - 'retdata: %(retdata)s.') - % {'command': command, - 'option': param_dict, - 'ip': storage_ip, - 'result': result, - 'retdata': retdata}) - LOG.error(msg) - raise exception.VolumeBackendAPIException(data=msg) - - # Check CLI return code. - if rc_str.isdigit(): - # SMI-S style return code. - rc = int(rc_str) - - try: - errordesc = CONSTANTS.RETCODE_dic[str(rc)] - except Exception: - errordesc = 'Undefined Error!!' - - if rc in retry_code: + if rc_str.startswith('E'): + errordesc = rc_str + rc = CONSTANTS.RC_FAILED + if rc_str in retry_code: LOG.info('_exec_eternus_cli, retry, ' 'ip: %(ip)s, ' 'RetryCode: %(rc)s, ' 'TryNum: %(rn)s.', {'ip': storage_ip, - 'rc': rc, + 'rc': rc_str, 'rn': (retry_num + 1)}) time.sleep(retry_interval) continue - if rc == 4: + else: + LOG.warning('_exec_eternus_cli, ' + 'WARNING!! ' + 'ip: %(ip)s, ' + 'ReturnCode: %(rc_str)s, ' + 'ReturnData: %(retdata)s.', + {'ip': storage_ip, + 'rc_str': rc_str, + 'retdata': retdata}) + break + else: + if rc_str == str(CONSTANTS.RC_FAILED): + errordesc = rc_str + rc = CONSTANTS.RC_FAILED if ('Authentication failed' in retdata and retry_num + 1 < retry): LOG.warning('_exec_eternus_cli, retry, ip: %(ip)s, ' @@ -2975,35 +2966,12 @@ class FJDXCommon(object): 'rn': (retry_num + 1)}) time.sleep(1) continue - - break - else: - # CLI style return code. - LOG.warning('_exec_eternus_cli, ' - 'WARNING!! ' - 'ip: %(ip)s, ' - 'ReturnCode: %(rc_str)s, ' - 'ReturnData: %(retdata)s.', - {'ip': storage_ip, - 'rc_str': rc_str, - 'retdata': retdata}) - - errordesc = rc_str - rc = 4 # Failed. + else: + errordesc = None + rc = CONSTANTS.RC_OK break else: - if 0 < result: - msg = (_('_exec_eternus_cli, ' - 'cannot connect to ETERNUS. ' - 'SSH Result: %(result)s, ' - 'retdata: %(retdata)s.') - % {'result': result, - 'retdata': retdata}) - - LOG.error(msg) - raise exception.VolumeBackendAPIException(data=msg) - else: - LOG.warning('_exec_eternus_cli, Retry was exceeded.') + LOG.warning('_exec_eternus_cli, Retry was exceeded.') ret = (rc, errordesc, retdata) @@ -3062,7 +3030,7 @@ class FJDXCommon(object): # Get storage version information. rc, emsg, clidata = self._exec_eternus_cli('show_enclosure_status') - if rc != 0: + if rc != CONSTANTS.RC_OK: msg = (_('_set_qos, ' 'show_enclosure_status failed. ' 'Return code: %(rc)lu, ' @@ -3115,7 +3083,7 @@ class FJDXCommon(object): rc, errordesc, job = self._exec_eternus_cli( 'set_volume_qos', **category_dict) - if rc != 0: + if rc != CONSTANTS.RC_OK: msg = (_('_set_qos, ' 'set_volume_qos failed. ' 'Return code: %(rc)lu, ' @@ -3302,7 +3270,7 @@ class FJDXCommon(object): # Get all the bandwidth limits. rc, errordesc, bandwidthlist = self._exec_eternus_cli( 'show_qos_bandwidth_limit') - if rc != 0: + if rc != CONSTANTS.RC_OK: msg = (_('_get_qos_category, ' 'show_qos_bandwidth_limit failed. ' 'Return code: %(rc)lu, ' @@ -3335,7 +3303,7 @@ class FJDXCommon(object): return ret_dict rc, errordesc, vqosdatalist = self._exec_eternus_cli('show_volume_qos') - if rc != 0: + if rc != CONSTANTS.RC_OK: msg = (_('_get_qos_category, ' 'show_volume_qos failed. ' 'Return code: %(rc)lu, ' @@ -3427,7 +3395,7 @@ class FJDXCommon(object): rc, emsg, clidata = self._exec_eternus_cli( 'set_qos_bandwidth_limit', **param_dict) - if rc != 0: + if rc != CONSTANTS.RC_OK: msg = (_('_set_limit, ' 'set_qos_bandwidth_limit failed. ' 'Return code: %(rc)lu, ' @@ -3506,7 +3474,7 @@ class FJDXCommon(object): WaitForCopyState=self._pywbem_uint(8, '16'), Synchronization=sdvsession) - if rc != 0: + if rc != CONSTANTS.RC_OK: msg = (_('revert_to_snapshot, ' '_exec_eternus_service error, ' 'volume: %(volume)s, ' @@ -3541,7 +3509,7 @@ class FJDXCommon(object): 'start_copy_opc', **param_dict) - if rc != 0: + if rc != CONSTANTS.RC_OK: msg = (_('revert_to_snapshot, ' 'start_copy_opc failed. ' 'Return code: %(rc)lu, ' @@ -3571,7 +3539,7 @@ class FJDXCommon(object): **param ) - if rc != 0: + if rc != CONSTANTS.RC_OK: msg = (_('_get_copy_sessions_list, ' 'get copy sessions failed. ' 'Return code: %(rc)lu, ' diff --git a/doc/source/configuration/block-storage/drivers/fujitsu-eternus-dx-driver.rst b/doc/source/configuration/block-storage/drivers/fujitsu-eternus-dx-driver.rst index f1c4d8fc294..e3cbb800809 100644 --- a/doc/source/configuration/block-storage/drivers/fujitsu-eternus-dx-driver.rst +++ b/doc/source/configuration/block-storage/drivers/fujitsu-eternus-dx-driver.rst @@ -102,6 +102,25 @@ Perform the following steps using ETERNUS Web GUI or ETERNUS CLI. #. Ensure LAN connection between cinder controller and MNT port of ETERNUS DX and SAN connection between Compute nodes and CA ports of ETERNUS DX. +#. (Optional) If you want to use a public key to SSH to the ETERNUS DX storage, + generate the SSH key, and upload the ``eternus.ietf`` file to the ETERNUS + storage. + + For information about how to set the public key, refer to the ETERNUS Web + GUI manuals. + + .. code-block:: console + + $ ssh-keygen -t rsa -N "" -f ./eternus -m PEM + $ ssh-keygen -e -f ./eternus.pub > ./eternus.ietf + + If the public key(eternus.ietf) that was created is deleted by mistake, use + the following command to recreate the key. + + .. code-block:: console + + $ ssh-keygen -e -f /root/.ssh/eternus.pub > ./eternus.ietf + Configuration ~~~~~~~~~~~~~ @@ -219,11 +238,14 @@ Configuration example volume_driver = cinder.volume.drivers.fujitsu.eternus_dx.eternus_dx_fc.FJDXFCDriver cinder_eternus_config_file = /etc/cinder/fc.xml volume_backend_name = FC + fujitsu_passwordless = False [DXISCSI] volume_driver = cinder.volume.drivers.fujitsu.eternus_dx.eternus_dx_iscsi.FJDXISCSIDriver cinder_eternus_config_file = /etc/cinder/iscsi.xml volume_backend_name = ISCSI + fujitsu_passwordless = True + fujitsu_private_key_path = /etc/cinder/eternus #. Create the driver configuration files ``fc.xml`` and ``iscsi.xml``. diff --git a/releasenotes/notes/fujitsu-improve-cli-function-6cabf36ffc6d44d6.yaml b/releasenotes/notes/fujitsu-improve-cli-function-6cabf36ffc6d44d6.yaml new file mode 100644 index 00000000000..678ead12f06 --- /dev/null +++ b/releasenotes/notes/fujitsu-improve-cli-function-6cabf36ffc6d44d6.yaml @@ -0,0 +1,40 @@ +--- +features: + - | + Fujitsu Eternus DX driver: Added support SSH key. + + Added the method for connecting to Eternus Storage using SSH key. + The connection method can be selected by setting the value of parameter + ``fujitsu_passwordless``, which has a default value of ``True``. + + * When ``fujitsu_passwordless`` is set to ``True``, SSH key is used for + connecting to the storage. Additionally, ``fujitsu_private_key_path`` + needs to be set to the path of the SSH private key. + + * When ``fujitsu_passwordless`` is set to ``False``, password is used for + SSH connection to the storage. + + See the `Fujitsu ETERNUS DX driver documentation + `_ + for details. +upgrade: + - | + Fujitsu Eternus DX driver: Added SSH key and password connection switching + + Added the method for connecting to Eternus Storage using SSH key. + The connection method can be selected by setting the value of parameter + ``fujitsu_passwordless``, which has a default value of ``True``. + + For upgrading from previous versions that relied on password authentication, + you must explicitly set ``fujitsu_passwordless = False`` in the + configuration. This ensures backward compatibility with the legacy + password-based workflow. + + The default True value enforces key-based auth for new deployments, aligning + with security best practices at the cost of a minor configuration adjustment + for existing users. +fixes: + - | + Fujitsu Eternus DX driver `bug #2048850 + `_: + Added parsing of error messages when CLI execution fails.