diff --git a/os_brick/initiator/host_driver.py b/os_brick/initiator/host_driver.py index 5de57cc..d33517b 100644 --- a/os_brick/initiator/host_driver.py +++ b/os_brick/initiator/host_driver.py @@ -13,6 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. +import errno import os @@ -20,10 +21,15 @@ class HostDriver(object): def get_all_block_devices(self): """Get the list of all block devices seen in /dev/disk/by-path/.""" - files = [] dir = "/dev/disk/by-path/" - if os.path.isdir(dir): + try: files = os.listdir(dir) + except OSError as e: + if e.errno == errno.ENOENT: + files = [] + else: + raise + devices = [] for file in files: devices.append(dir + file) diff --git a/os_brick/tests/initiator/test_connector.py b/os_brick/tests/initiator/test_connector.py index e0945e2..16aa3ba 100644 --- a/os_brick/tests/initiator/test_connector.py +++ b/os_brick/tests/initiator/test_connector.py @@ -193,22 +193,6 @@ class ConnectorTestCase(base.TestCase): self.assertFalse(self.connector.check_valid_device('/dev')) -class HostDriverTestCase(base.TestCase): - - def setUp(self): - super(HostDriverTestCase, self).setUp() - self.devlist = ['device1', 'device2'] - mock.patch.object(os.path, 'isdir', return_value=True).start() - mock.patch.object(os, 'listdir', return_value=self.devlist).start() - self.addCleanup(mock.patch.stopall) - - def test_host_driver(self): - expected = ['/dev/disk/by-path/' + dev for dev in self.devlist] - driver = host_driver.HostDriver() - actual = driver.get_all_block_devices() - self.assertEqual(expected, actual) - - class ISCSIConnectorTestCase(ConnectorTestCase): def setUp(self): diff --git a/os_brick/tests/initiator/test_host_driver.py b/os_brick/tests/initiator/test_host_driver.py new file mode 100644 index 0000000..e1576ee --- /dev/null +++ b/os_brick/tests/initiator/test_host_driver.py @@ -0,0 +1,47 @@ +# Copyright (c) 2015 Scality +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import errno + +import mock + +from os_brick.initiator import host_driver +from os_brick.tests import base + + +class HostDriverTestCase(base.TestCase): + + def test_get_all_block_devices(self): + fake_dev = ['device1', 'device2'] + expected = ['/dev/disk/by-path/' + dev for dev in fake_dev] + + driver = host_driver.HostDriver() + with mock.patch('os.listdir', return_value=fake_dev): + actual = driver.get_all_block_devices() + + self.assertEqual(expected, actual) + + def test_get_all_block_devices_when_oserror_is_enoent(self): + driver = host_driver.HostDriver() + oserror = OSError(errno.ENOENT, "") + with mock.patch('os.listdir', side_effect=oserror): + block_devices = driver.get_all_block_devices() + + self.assertEqual([], block_devices) + + def test_get_all_block_devices_when_oserror_is_not_enoent(self): + driver = host_driver.HostDriver() + oserror = OSError(errno.ENOMEM, "") + with mock.patch('os.listdir', side_effect=oserror): + self.assertRaises(OSError, driver.get_all_block_devices)