Fixes get_network_adapters issue on Windows 2003

The "PhysicalAdapter" property of the WMI class "Win32_NetworkAdapter"
has been introduced with Windows Vista / 2008.

This patch avoids using the property in WQL queries based on
the current os.
This commit is contained in:
Alessandro Pilotti 2014-02-06 22:55:58 +02:00
parent 889a5f8e8c
commit 075a157927
2 changed files with 27 additions and 7 deletions

View File

@ -341,9 +341,13 @@ class WindowsUtils(base.BaseOSUtils):
l = []
conn = wmi.WMI(moniker='//./root/cimv2')
# Get Ethernet adapters only
q = conn.query('SELECT * FROM Win32_NetworkAdapter WHERE '
'AdapterTypeId = 0 AND PhysicalAdapter = True AND '
'MACAddress IS NOT NULL')
wql = ('SELECT * FROM Win32_NetworkAdapter WHERE '
'AdapterTypeId = 0 AND MACAddress IS NOT NULL')
if self.check_os_version(6, 0):
wql += ' AND PhysicalAdapter = True'
q = conn.query(wql)
for r in q:
l.append(r.Name)
return l

View File

@ -444,17 +444,33 @@ class WindowsUtilsTest(unittest.TestCase):
def test_get_user_home_fail(self):
self._test_get_user_home(user_sid=None)
@mock.patch('cloudbaseinit.osutils.windows.WindowsUtils'
'.check_os_version')
@mock.patch('wmi.WMI')
def test_get_network_adapters(self, mock_WMI):
def _test_get_network_adapters(self, is_xp_2003, mock_WMI,
mock_check_os_version):
mock_WMI.return_value = self._conn
mock_response = mock.MagicMock()
self._conn.query.return_value = [mock_response]
mock_check_os_version.return_value = not is_xp_2003
wql = ('SELECT * FROM Win32_NetworkAdapter WHERE '
'AdapterTypeId = 0 AND MACAddress IS NOT NULL')
if not is_xp_2003:
wql += ' AND PhysicalAdapter = True'
response = self._winutils.get_network_adapters()
self._conn.query.assert_called_with(
'SELECT * FROM Win32_NetworkAdapter WHERE AdapterTypeId = 0 AND '
'PhysicalAdapter = True AND MACAddress IS NOT NULL')
self._conn.query.assert_called_with(wql)
self.assertEqual(response, [mock_response.Name])
def test_get_network_adapters(self):
self._test_get_network_adapters(False)
def test_get_network_adapters_xp_2003(self):
self._test_get_network_adapters(True)
@mock.patch('cloudbaseinit.osutils.windows.WindowsUtils'
'._sanitize_wmi_input')
def _test_set_static_network_config(self, mock_sanitize_wmi_input,