Skip to content

Commit 04c6424

Browse files
Lukas Kranzader1990
authored andcommitted
Use MSFT_NetAdapter to rename adapter
Currently renaming the adapter on windows 22 core does not cause an error but also has no effect INFO cloudbaseinit.plugins.common.networkconfig [-] Renaming network adapter "Ethernet" to "some-adapter-name" ... ERROR cloudbaseinit.init cloudbaseinit.exception.ItemNotFoundException: Network interface with name "some-adapter-name" not found Using Win32_NetworkAdapter or netsh for renaming network adapters does not work, although they do not fail, but do no-operation (probably a Windows bug). Fixes: #101 Change-Id: I6b05b313742dd6ff2553dd67b374a8aa4fefd0a7 Signed-off-by: Adrian Vladu <[email protected]>
1 parent c9eaf6a commit 04c6424

File tree

2 files changed

+33
-21
lines changed

2 files changed

+33
-21
lines changed

cloudbaseinit/osutils/windows.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -858,17 +858,24 @@ def set_network_adapter_mtu(self, name, mtu):
858858
'value "%(mtu)s" failed' % {'name': name, 'mtu': mtu})
859859

860860
def rename_network_adapter(self, old_name, new_name):
861-
base_dir = self._get_system_dir()
862-
netsh_path = os.path.join(base_dir, 'netsh.exe')
863-
864-
args = [netsh_path, "interface", "set", "interface",
865-
'name=%s' % old_name, 'newname=%s' % new_name]
866-
(out, err, ret_val) = self.execute_process(args, shell=False)
867-
if ret_val:
861+
net_adapter = self._get_network_msft_adapter(old_name)
862+
try:
863+
net_adapter.rename(new_name)
864+
self._get_network_msft_adapter(new_name)
865+
except Exception:
868866
raise exception.CloudbaseInitException(
869867
'Renaming interface "%(old_name)s" to "%(new_name)s" '
870868
'failed' % {'old_name': old_name, 'new_name': new_name})
871869

870+
@staticmethod
871+
def _get_network_msft_adapter(name):
872+
conn = wmi.WMI(moniker='//./root/standardcimv2')
873+
query = conn.MSFT_NetAdapter(Name=name)
874+
if not len(query):
875+
raise exception.CloudbaseInitException(
876+
"MSFT network adapter not found: %s" % name)
877+
return query[0]
878+
872879
@staticmethod
873880
def _get_network_adapter(name):
874881
conn = wmi.WMI(moniker='//./root/cimv2')

cloudbaseinit/tests/osutils/test_windows.py

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -839,28 +839,33 @@ def test_set_static_network_config_ipv6(self):
839839
self._test_set_static_network_config(ipv6=True)
840840

841841
@mock.patch('cloudbaseinit.osutils.windows.WindowsUtils'
842-
'.execute_process')
843-
@mock.patch('cloudbaseinit.osutils.windows.WindowsUtils'
844-
'._get_system_dir')
845-
def _test_rename_network_adapter(self, should_fail, mock_get_system_dir,
846-
mock_execute_process):
847-
base_dir = "fake path"
842+
'._get_network_msft_adapter')
843+
def _test_rename_network_adapter(self, rename_exception,
844+
mock_get_network_adapter):
848845
old_name = "fake_old"
849846
new_name = "fake_new"
850-
mock_get_system_dir.return_value = base_dir
851-
ret_val = 1 if should_fail else 0
852-
mock_execute_process.return_value = (None, None, ret_val)
853847

854-
if should_fail:
848+
adapter = mock.Mock()
849+
adapter.Name = mock.sentinel.old_name
850+
mock_get_network_adapter.return_value = adapter
851+
get_network_adapter_called = 1
852+
if rename_exception:
853+
adapter.rename.side_effect = Exception("fake exception")
855854
with self.assertRaises(exception.CloudbaseInitException):
856855
self._winutils.rename_network_adapter(old_name, new_name)
857856
else:
857+
get_network_adapter_called = 2
858858
self._winutils.rename_network_adapter(old_name, new_name)
859859

860-
mock_get_system_dir.assert_called_once_with()
861-
args = [os.path.join(base_dir, "netsh.exe"), "interface", "set",
862-
"interface", 'name=%s' % old_name, 'newname=%s' % new_name]
863-
mock_execute_process.assert_called_once_with(args, shell=False)
860+
adapter.rename.assert_called()
861+
862+
self.assertEqual(mock_get_network_adapter.call_count,
863+
get_network_adapter_called)
864+
self.assertEqual(mock_get_network_adapter.call_args_list[0].args,
865+
(old_name,))
866+
if not exception:
867+
self.assertEqual(mock_get_network_adapter.call_args_list[1].args,
868+
(new_name,))
864869

865870
def _test_get_config_key_name(self, section):
866871
response = self._winutils._get_config_key_name(section)

0 commit comments

Comments
 (0)