cloudbase / cloudbase-init

Cross-platform instance initialization
http://openstack.org
Apache License 2.0
414 stars 150 forks source link

NetworkConfigPlugin static IP address WMI Invalid Parameter exception #90

Open motoshkov opened 2 years ago

motoshkov commented 2 years ago

Working with Win2K12R2 server image and Cloubase-Init 1.1.3dev16. Got WMI exception while configuring static IP address. Log snippet:

2022-03-08 15:21:26.700 1908 INFO cloudbaseinit.utils.debiface [-] Parsing Debian config...
iface nic0 inet static
address 10.10.0.100
netmask 255.255.255.0
gateway 10.10.0.1
hwaddress ether 52:54:00:e1:c9:22

2022-03-08 15:21:26.700 1908 DEBUG cloudbaseinit.utils.debiface [-] Found new interface: {'name': 'nic0', 'mac': '52:54:00:E1:C9:22', 'address': '10.10.0.100', 'address6': None, 'netmask': '255.255.255.0', 'netmask6': None, 'broadcast': None, 'gateway': '10.10.0.1', 'gateway6': None, 'dnsnameservers': None} _add_nic C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\cloudbaseinit\utils\debiface.py:104
2022-03-08 15:21:26.700 1908 DEBUG cloudbaseinit.utils.classloader [-] Loading class 'cloudbaseinit.osutils.windows.WindowsUtils' load_class C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\cloudbaseinit\utils\classloader.py:27
2022-03-08 15:21:26.747 1908 INFO cloudbaseinit.plugins.common.networkconfig [-] Configuring network adapter: Ethernet Instance 0
2022-03-08 15:21:26.794 1908 DEBUG cloudbaseinit.osutils.windows [-] Removing existing route "255.255.255.255/32" from adapter "Ethernet Instance 0" _set_static_network_config C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\cloudbaseinit\osutils\windows.py:996
2022-03-08 15:21:26.810 1908 DEBUG cloudbaseinit.osutils.windows [-] Removing existing route "224.0.0.0/4" from adapter "Ethernet Instance 0" _set_static_network_config C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\cloudbaseinit\osutils\windows.py:996
2022-03-08 15:21:26.810 1908 DEBUG cloudbaseinit.osutils.windows [-] Adding IP address "10.10.0.100/24", gateway "10.10.0.1" to adapter "Ethernet Instance 0" _set_static_network_config C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\cloudbaseinit\osutils\windows.py:1002
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init [-] plugin 'NetworkConfigPlugin' failed with error '<x_wmi: Unexpected COM Error (-2147352567, 'Exception occurred.', (0, 'SWbemObjectEx', 'Invalid parameter ', None, 0, -2147217400), None)>': wmi.x_wmi: <x_wmi: Unexpected COM Error (-2147352567, 'Exception occurred.', (0, 'SWbemObjectEx', 'Invalid parameter ', None, 0, -2147217400), None)>
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init [-] <x_wmi: Unexpected COM Error (-2147352567, 'Exception occurred.', (0, 'SWbemObjectEx', 'Invalid parameter ', None, 0, -2147217400), None)>: wmi.x_wmi: <x_wmi: Unexpected COM Error (-2147352567, 'Exception occurred.', (0, 'SWbemObjectEx', 'Invalid parameter ', None, 0, -2147217400), None)>
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init Traceback (most recent call last):
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init   File "C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\wmi.py", line 603, in __getattr__
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init     return getattr(self.ole_object, attribute)
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init   File "C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\win32com\client\dynamic.py", line 543, in __getattr__
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init     ret = self._oleobj_.Invoke(retEntry.dispid,0,invoke_type,1)
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, 'SWbemObjectEx', 'Invalid parameter ', None, 0, -2147217400), None)
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init During handling of the above exception, another exception occurred:
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init Traceback (most recent call last):
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init   File "C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\cloudbaseinit\init.py", line 67, in _exec_plugin
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init     shared_data)
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init   File "C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\cloudbaseinit\plugins\common\networkconfig.py", line 311, in execute
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init     return self._process_network_details(network_details)
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init   File "C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\cloudbaseinit\plugins\common\networkconfig.py", line 156, in _process_network_details
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init     nic.dnsnameservers or []
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init   File "C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\cloudbaseinit\osutils\windows.py", line 1016, in set_static_network_config
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init     name, address, prefix_len, gateway)
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init   File "C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\cloudbaseinit\osutils\windows.py", line 1003, in _set_static_network_config
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init     conn.MSFT_NetIPAddress.create(
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init   File "C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\wmi.py", line 841, in __getattr__
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init     return _wmi_object.__getattr__(self, attribute)
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init   File "C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\wmi.py", line 605, in __getattr__
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init     handle_com_error()
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init   File "C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\wmi.py", line 258, in handle_com_error
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init     raise klass(com_error=err)
2022-03-08 15:21:26.810 1908 ERROR cloudbaseinit.init wmi.x_wmi: <x_wmi: Unexpected COM Error (-2147352567, 'Exception occurred.', (0, 'SWbemObjectEx', 'Invalid parameter ', None, 0, -2147217400), None)>

Direct Command right after boot works:

import wmi
conn = wmi.WMI(moniker='//./root/standardcimv2')
conn.MSFT_NetIPAddress.create(AddressFamily=2,InterfaceAlias='Ethernet Instance 0',IPAddress='10.10.0.100',PrefixLength=24,DefaultGateway='10.10.0.1')
motoshkov commented 2 years ago

After digging further:

2022-03-09 10:30:13.280 1776 DEBUG cloudbaseinit.utils.windows.wmi_loader [-] Couldn't load PyMI module, using legacy WMI wmi C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\cloudbaseinit\utils\windows\wmi_loader.py:34
2022-03-09 10:30:13.295 1776 DEBUG cloudbaseinit.utils.windows.wmi_loader [-] Traceback (most recent call last): 
  File "C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\cloudbaseinit\utils\windows\wmi_loader.py", line 31, in wmi 
    import wmi 
  File "C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\wmi\__init__.py", line 25, in <module> 
    import mi
ImportError: DLL load failed: The specified module could not be found. 
 wmi C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\cloudbaseinit\utils\windows\wmi_loader.py:35

So I assumed it can be the same as #84, so I split configuration and moved NetworkConfigPlugin into cloudbase-init.conf. And nothing changed.

motoshkov commented 2 years ago

Running python from outside gives import error:

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.
C:\Users\Administrator>"c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\python.exe"
Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print('\n'.join(sys.path))

c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\python36.zip
c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\DLLs
c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib
c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python
c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages
c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\win32
c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\win32\lib
c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\Pythonwin
>>> import mi
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module>
ImportError: DLL load failed: The specified module could not be found.
>>>

Running python from Python dir has no import error:

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.
C:\Users\Administrator>cd "c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python"
c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python>python.exe
Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print('\n'.join(sys.path))

c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\python36.zip
c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\DLLs
c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib
c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python
c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages
c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\win32
c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\win32\lib
c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\Pythonwin
>>> import mi
>>> dir(mi)
['Application', 'Class', 'DestinationOptions', 'Instance', 'MI_ARRAY', 'MI_AUTH_TYPE_BASIC',
motoshkov commented 2 years ago

Fixed with WA: os.chdir('c:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python') before import wmi in wmi_loader.py