Skip to content

Commit 300dabb

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "windows: network: fix DHCP setting"
2 parents 2f4f315 + 8a6f478 commit 300dabb

File tree

2 files changed

+49
-13
lines changed

2 files changed

+49
-13
lines changed

cloudbaseinit/osutils/windows.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -912,19 +912,21 @@ def _set_static_network_config_legacy(name, address, netmask, gateway,
912912
return reboot_required
913913

914914
@staticmethod
915-
def _fix_network_adapter_dhcp(interface_name, enable_dhcp, address_family):
916-
interface_id = WindowsUtils._get_network_adapter(interface_name).GUID
917-
tcpip_key = "Tcpip6" if address_family == AF_INET6 else "Tcpip"
918-
919-
with winreg.OpenKey(
920-
winreg.HKEY_LOCAL_MACHINE,
921-
"SYSTEM\\CurrentControlSet\\services\\%(tcpip_key)s\\"
922-
"Parameters\\Interfaces\\%(interface_id)s" %
923-
{"tcpip_key": tcpip_key, "interface_id": interface_id},
924-
0, winreg.KEY_SET_VALUE) as key:
925-
winreg.SetValueEx(
926-
key, 'EnableDHCP', 0, winreg.REG_DWORD,
927-
1 if enable_dhcp else 0)
915+
def _fix_network_adapter_dhcp(interface_name,
916+
enable_dhcp,
917+
address_family):
918+
enable_dhcp_value = 1 if enable_dhcp else 0
919+
920+
conn = wmi.WMI(moniker='//./root/standardcimv2')
921+
net_interface = conn.MSFT_NetIPInterface(
922+
InterfaceAlias=interface_name, AddressFamily=address_family)
923+
if not len(net_interface):
924+
raise exception.ItemNotFoundException(
925+
'Network interface with name "%s" not found' %
926+
interface_name)
927+
net_interface = net_interface[0]
928+
net_interface.Dhcp = enable_dhcp_value
929+
net_interface.put()
928930

929931
@staticmethod
930932
def _set_interface_dns(interface_name, dnsnameservers):

cloudbaseinit/tests/osutils/test_windows.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2000,6 +2000,40 @@ def test_get_dhcp_hosts_in_use(self, mock_get_adapter_addresses):
20002000
mock.sentinel.mac_address,
20012001
mock.sentinel.dhcp_server)], response)
20022002

2003+
def test_fix_network_adapter_dhcp(self):
2004+
self._test_fix_network_adapter_dhcp(True)
2005+
2006+
def test_fix_network_adapter_dhcp_no_network_adapter(self):
2007+
self._test_fix_network_adapter_dhcp(False)
2008+
2009+
def _test_fix_network_adapter_dhcp(self, no_net_interface_found):
2010+
mock_interface_name = "eth12"
2011+
mock_enable_dhcp = True
2012+
mock_address_family = self.windows_utils.AF_INET
2013+
2014+
conn = self._wmi_mock.WMI.return_value
2015+
existing_net_interface = mock.Mock()
2016+
existing_net_interface.Dhcp = 0
2017+
2018+
if not no_net_interface_found:
2019+
conn.MSFT_NetIPInterface.return_value = [existing_net_interface]
2020+
2021+
if no_net_interface_found:
2022+
with self.assertRaises(exception.ItemNotFoundException):
2023+
self._winutils._fix_network_adapter_dhcp(
2024+
mock_interface_name, mock_enable_dhcp,
2025+
mock_address_family)
2026+
else:
2027+
self._winutils._fix_network_adapter_dhcp(
2028+
mock_interface_name, mock_enable_dhcp,
2029+
mock_address_family)
2030+
2031+
conn.MSFT_NetIPInterface.assert_called_once_with(
2032+
InterfaceAlias=mock_interface_name,
2033+
AddressFamily=mock_address_family)
2034+
self.assertEqual(existing_net_interface.Dhcp, 1)
2035+
existing_net_interface.put.assert_called_once()
2036+
20032037
@mock.patch('cloudbaseinit.osutils.windows.WindowsUtils'
20042038
'.check_sysnative_dir_exists')
20052039
@mock.patch('cloudbaseinit.osutils.windows.WindowsUtils'

0 commit comments

Comments
 (0)