diff --git a/src/azure-cli/azure/cli/command_modules/network/custom.py b/src/azure-cli/azure/cli/command_modules/network/custom.py index e290a326179..544dc95289e 100644 --- a/src/azure-cli/azure/cli/command_modules/network/custom.py +++ b/src/azure-cli/azure/cli/command_modules/network/custom.py @@ -2046,11 +2046,17 @@ def import_zone(cmd, resource_group_name, zone_name, file_name): logger.warning("In the future, zone name will be case insensitive.") RecordSet = cmd.get_models('RecordSet', resource_type=ResourceType.MGMT_NETWORK_DNS) - from azure.cli.core.azclierror import FileOperationError + from azure.cli.core.azclierror import FileOperationError, UnknownError try: file_text = read_file_content(file_name) - except FileNotFoundError as e: - raise FileOperationError(e) + except FileNotFoundError: + raise FileOperationError("No such file: " + str(file_name)) + except IsADirectoryError: + raise FileOperationError("Is a directory: " + str(file_name)) + except PermissionError: + raise FileOperationError("Permission denied: " + str(file_name)) + except OSError as e: + raise UnknownError(e) zone_obj = parse_zone_file(file_text, zone_name) diff --git a/src/azure-cli/azure/cli/command_modules/network/tests/latest/test_dns_commands.py b/src/azure-cli/azure/cli/command_modules/network/tests/latest/test_dns_commands.py index 5f57c925653..f29540d050a 100644 --- a/src/azure-cli/azure/cli/command_modules/network/tests/latest/test_dns_commands.py +++ b/src/azure-cli/azure/cli/command_modules/network/tests/latest/test_dns_commands.py @@ -61,12 +61,41 @@ def _test_zone(self, zone_name, filename): @live_only() @ResourceGroupPreparer(name_prefix='test_dns_import_file_not_found') - def test_dns_import_file_not_found(self, resource_group): + def test_dns_import_file_operation_error(self, resource_group): + import sys + if sys.platform != 'linux': + self.skip('This test should run on Linux platform') + from azure.cli.core.azclierror import FileOperationError - with self.assertRaises(FileOperationError) as e: + with self.assertRaisesRegexp(FileOperationError, 'No such file: ') as e: self._test_zone('404zone.com', 'non_existing_zone_description_file.txt') self.assertEqual(e.errno, 1) + with self.assertRaisesRegexp(FileOperationError, 'Is a directory: ') as e: + self._test_zone('404zone.com', '') + self.assertEqual(e.errno, 1) + + with self.assertRaisesRegexp(FileOperationError, 'Permission denied: ') as e: + self._test_zone('404zone.com', '/root/') + self.assertEqual(e.errno, 1) + + @live_only() + @ResourceGroupPreparer(name_prefix='test_dns_import_file_operation_error_windows') + def test_dns_import_file_operation_error_windows(self, resource_group): + import sys + if sys.platform != 'win32': + self.skip('This test should run on Windows platform') + + from azure.cli.core.azclierror import FileOperationError + with self.assertRaisesRegexp(FileOperationError, 'No such file: ') as e: + self._test_zone('404zone.com', 'non_existing_zone_description_file.txt') + self.assertEqual(e.errno, 1) + + # Difference with Linux platform while reading a directory + with self.assertRaisesRegexp(FileOperationError, 'Permission denied:') as e: + self._test_zone('404zone.com', '.') + self.assertEqual(e.errno, 1) + @ResourceGroupPreparer(name_prefix='cli_dns_zone1_import') def test_dns_zone1_import(self, resource_group): self._test_zone('zone1.com', 'zone1.txt') diff --git a/src/azure-cli/azure/cli/command_modules/privatedns/custom.py b/src/azure-cli/azure/cli/command_modules/privatedns/custom.py index bfa22bbc177..6861ec3f31b 100644 --- a/src/azure-cli/azure/cli/command_modules/privatedns/custom.py +++ b/src/azure-cli/azure/cli/command_modules/privatedns/custom.py @@ -27,13 +27,24 @@ def list_privatedns_zones(cmd, resource_group_name=None): return client.list() -# pylint: disable=too-many-statements, too-many-locals +# pylint: disable=too-many-statements, too-many-locals, too-many-branches def import_zone(cmd, resource_group_name, private_zone_name, file_name): from azure.cli.core.util import read_file_content import sys from azure.mgmt.privatedns.models import RecordSet - file_text = read_file_content(file_name) + from azure.cli.core.azclierror import FileOperationError, UnknownError + try: + file_text = read_file_content(file_name) + except FileNotFoundError: + raise FileOperationError("No such file: " + str(file_name)) + except IsADirectoryError: + raise FileOperationError("Is a directory: " + str(file_name)) + except PermissionError: + raise FileOperationError("Permission denied: " + str(file_name)) + except OSError as e: + raise UnknownError(e) + zone_obj = parse_zone_file(file_text, private_zone_name) origin = private_zone_name record_sets = {} diff --git a/src/azure-cli/azure/cli/command_modules/privatedns/tests/latest/test_privatedns_commands.py b/src/azure-cli/azure/cli/command_modules/privatedns/tests/latest/test_privatedns_commands.py index 36fafb7c253..0c1f455932b 100644 --- a/src/azure-cli/azure/cli/command_modules/privatedns/tests/latest/test_privatedns_commands.py +++ b/src/azure-cli/azure/cli/command_modules/privatedns/tests/latest/test_privatedns_commands.py @@ -955,6 +955,41 @@ def _test_PrivateDnsZone(self, zone_name, filename): # verify that each record in the original import is unchanged after export/re-import self._check_records(records1, records2) + @ResourceGroupPreparer(name_prefix='test_Private_Dns_import_file_not_found') + def test_Private_Dns_import_file_operation_error_linux(self, resource_group): + import sys + if sys.platform != 'linux': + self.skip('This test should run on Linux platform') + + from azure.cli.core.azclierror import FileOperationError + with self.assertRaisesRegexp(FileOperationError, 'No such file: ') as e: + self._test_PrivateDnsZone('404zone.com', 'non_existing_zone_description_file.txt') + self.assertEqual(e.errno, 1) + + with self.assertRaisesRegexp(FileOperationError, 'Is a directory: ') as e: + self._test_PrivateDnsZone('404zone.com', '') + self.assertEqual(e.errno, 1) + + with self.assertRaisesRegexp(FileOperationError, 'Permission denied: ') as e: + self._test_PrivateDnsZone('404zone.com', '/root/') + self.assertEqual(e.errno, 1) + + @ResourceGroupPreparer(name_prefix='test_dns_import_file_operation_error_windows') + def test_Private_Dns_import_file_operation_error_windows(self, resource_group): + import sys + if sys.platform != 'win32': + self.skip('This test should run on Windows platform') + + from azure.cli.core.azclierror import FileOperationError + with self.assertRaisesRegexp(FileOperationError, 'No such file: ') as e: + self._test_PrivateDnsZone('404zone.com', 'non_existing_zone_description_file.txt') + self.assertEqual(e.errno, 1) + + # Difference with Linux platform while reading a directory + with self.assertRaisesRegexp(FileOperationError, 'Permission denied:') as e: + self._test_PrivateDnsZone('404zone.com', '.') + self.assertEqual(e.errno, 1) + @ResourceGroupPreparer(name_prefix='cli_private_dns_zone1_import') def test_Private_Dns_Zone1_Import(self, resource_group): self._test_PrivateDnsZone('zone1.com', 'zone1.txt')