diff --git a/setup.cfg b/setup.cfg index 75fec4cf..c97b6be8 100644 --- a/setup.cfg +++ b/setup.cfg @@ -30,7 +30,7 @@ include_package_data = True package_dir = =src packages = find_namespace: -python_requires = >= 3.10 +python_requires = >= 3.9 setup_requires = wheel setuptools<69.0,>=65.6.3 diff --git a/src/saltext/vmware/grains/esxi.py b/src/saltext/vmware/grains/esxi.py index ebd567aa..f84bcce1 100644 --- a/src/saltext/vmware/grains/esxi.py +++ b/src/saltext/vmware/grains/esxi.py @@ -19,13 +19,14 @@ def __virtual__(): - # import salt.utils.proxy again # so it is available for tests. import salt.utils.proxy try: if salt.utils.proxy.is_proxytype(__opts__, "esxi"): + import salt.modules.vsphere + return __virtualname__ except KeyError: pass @@ -37,6 +38,12 @@ def esxi(): return _grains() +def osfinger(): + if not GRAINS_CACHE: + GRAINS_CACHE.update(_grains()) + return {"osfinger": f'{GRAINS_CACHE["name"]}-{GRAINS_CACHE["version"]}'} + + def kernel(): return {"kernel": "proxy"} @@ -72,7 +79,7 @@ def _find_credentials(host): for password in passwords: try: # Try to authenticate with the given user/password combination - ret = __salt__["vmware_info.system_info"]( + ret = salt.modules.vsphere.system_info( host=host, username=user, password=password, verify_ssl=verify_ssl ) except SaltSystemExit: @@ -96,7 +103,7 @@ def _grains(): protocol = __pillar__["proxy"].get("protocol") port = __pillar__["proxy"].get("port") verify_ssl = __pillar__["proxy"].get("verify_ssl") - ret = __salt__["vmware_info.system_info"]( + ret = salt.modules.vsphere.system_info( host=host, username=username, password=password, diff --git a/src/saltext/vmware/modules/compliance_control.py b/src/saltext/vmware/modules/compliance_control.py index a14afcdb..2ad030fa 100644 --- a/src/saltext/vmware/modules/compliance_control.py +++ b/src/saltext/vmware/modules/compliance_control.py @@ -3,7 +3,6 @@ import salt.exceptions import saltext.vmware.utils.compliance_control as compliance_control_util -from config_modules_vmware.interfaces.controller_interface import ControllerInterface log = logging.getLogger(__name__) @@ -11,7 +10,11 @@ def __virtual__(): - return __virtualname__ + try: + from config_modules_vmware.interfaces.controller_interface import ControllerInterface + return __virtualname__ + except ImportError: + return False def control_config_compliance_check(control_config, product, auth_context=None): diff --git a/src/saltext/vmware/modules/controller_metadata.py b/src/saltext/vmware/modules/controller_metadata.py index 6c6a378a..5d9b92b2 100644 --- a/src/saltext/vmware/modules/controller_metadata.py +++ b/src/saltext/vmware/modules/controller_metadata.py @@ -2,7 +2,6 @@ import logging import salt.exceptions -from config_modules_vmware.interfaces.metadata_interface import ControllerMetadataInterface log = logging.getLogger(__name__) @@ -10,7 +9,11 @@ def __virtual__(): - return __virtualname__ + try: + from config_modules_vmware.interfaces.metadata_interface import ControllerMetadataInterface + return __virtualname__ + except ImportError: + return False def validate(controller_metadata): diff --git a/src/saltext/vmware/modules/esxi.py b/src/saltext/vmware/modules/esxi.py index aa518b4a..64a31e25 100644 --- a/src/saltext/vmware/modules/esxi.py +++ b/src/saltext/vmware/modules/esxi.py @@ -21,6 +21,7 @@ HAS_PYVMOMI = False +__proxyenabled__ = ["vmware_esxi", "esxi"] __virtualname__ = "vmware_esxi" DEFAULT_EXCEPTIONS = ( diff --git a/src/saltext/vmware/modules/vsphere.py b/src/saltext/vmware/modules/vsphere.py index 736e76e1..94886b5e 100644 --- a/src/saltext/vmware/modules/vsphere.py +++ b/src/saltext/vmware/modules/vsphere.py @@ -4,6 +4,7 @@ import os import salt.exceptions +import salt.utils.dictupdate as dictupdate import saltext.vmware.utils.common as utils_common import saltext.vmware.utils.connect as utils_connect import saltext.vmware.utils.esxi as utils_esxi @@ -20,6 +21,7 @@ HAS_PYVMOMI = False +__proxyenabled__ = ["vmware_esxi", "esxi"] __virtualname__ = "vmware_vsphere" DEFAULT_EXCEPTIONS = ( diff --git a/src/saltext/vmware/proxy/esxi.py b/src/saltext/vmware/proxy/esxi.py index 80f24ae5..40e1ca25 100644 --- a/src/saltext/vmware/proxy/esxi.py +++ b/src/saltext/vmware/proxy/esxi.py @@ -264,11 +264,15 @@ """ import logging import os +import ssl from salt.exceptions import InvalidConfigError from salt.exceptions import SaltSystemExit from salt.utils.dictupdate import merge from saltext.vmware.config.schemas.esxi import EsxiProxySchema +import saltext.vmware.modules.vsphere + +from pyVim import connect # This must be present or the Salt loader won't load this module. __proxyenabled__ = ["esxi"] @@ -443,7 +447,6 @@ def ping(): salt esxi-host test.ping """ - log.debug("==== details %s ====", DETAILS) if DETAILS.get("esxi_host"): return True else: @@ -451,12 +454,7 @@ def ping(): if DETAILS["mechanism"] == "userpass": find_credentials(DETAILS["host"]) try: - __salt__["vmware_info.system_info"]( - host=DETAILS["host"], - username=DETAILS["username"], - password=DETAILS["password"], - verify_ssl=DETAILS["verify_ssl"], - ) + saltext.vmware.modules.vsphere.system_info(service_instance=DETAILS["service_instance"]) except SaltSystemExit as err: log.warning(err) return False @@ -508,6 +506,19 @@ def ch_config(cmd, *args, **kwargs): return __salt__["vsphere." + cmd](*args, **kwargs) +def _get_service_instance(host, user, password, verify_ssl=False): + ssl_ctx = None + if not verify_ssl: + ssl_ctx = ssl._create_unverified_context() + service_instance = connect.SmartConnect( + host=host, + user=user, + pwd=password, + sslContext=ssl_ctx, + ) + return service_instance + + def find_credentials(host): """ Cycle through all the possible credentials and return the first one that @@ -520,9 +531,8 @@ def find_credentials(host): for password in passwords: try: # Try to authenticate with the given user/password combination - ret = __salt__["vmware_info.system_info"]( - host=host, username=user, password=password, verify_ssl=verify_ssl - ) + service_instance = _get_service_instance(host=host, user=user, password=password, verify_ssl=verify_ssl) + ret = saltext.vmware.modules.vsphere.system_info(service_instance=service_instance) except SaltSystemExit: # If we can't authenticate, continue on to try the next password. continue @@ -530,6 +540,7 @@ def find_credentials(host): if ret: DETAILS["username"] = user DETAILS["password"] = password + DETAILS["service_instance"] = service_instance return user, password # We've reached the end of the list without successfully authenticating. raise SaltSystemExit("Cannot complete login due to an incorrect user name or password.") @@ -539,17 +550,7 @@ def _grains(host, protocol=None, port=None, verify_ssl=None): """ Helper function to the grains from the proxied device. """ - username, password = find_credentials(DETAILS["host"]) - verify_ssl = DETAILS["verify_ssl"] - - ret = __salt__["vmware_info.system_info"]( - host=host, - username=username, - password=password, - protocol=protocol, - port=port, - verify_ssl=verify_ssl, - ) + ret = saltext.vmware.modules.vsphere.system_info(service_instance=DETAILS["service_instance"]) GRAINS_CACHE.update(ret) return GRAINS_CACHE diff --git a/src/saltext/vmware/utils/connect.py b/src/saltext/vmware/utils/connect.py index b4488c73..0267ceb9 100644 --- a/src/saltext/vmware/utils/connect.py +++ b/src/saltext/vmware/utils/connect.py @@ -28,6 +28,7 @@ def get_config(config, profile=None, esxi_host=None): config.get("saltext.vmware") or config.get("grains", {}).get("saltext.vmware") or config.get("pillar", {}).get("saltext.vmware") + or config.get("proxy", {}) or {} ) if not conf: @@ -54,8 +55,8 @@ def get_config(config, profile=None, esxi_host=None): ssl_thumbprint = credentials.get("ssl_thumbprint") else: host = os.environ.get("SALTEXT_VMWARE_HOST") or credentials.get("host") - password = os.environ.get("SALTEXT_VMWARE_PASSWORD") or credentials.get("password") - user = os.environ.get("SALTEXT_VMWARE_USER") or credentials.get("user") + password = os.environ.get("SALTEXT_VMWARE_PASSWORD") or credentials.get("password") or credentials.get("passwords")[0] + user = os.environ.get("SALTEXT_VMWARE_USER") or credentials.get("user") or credentials.get("username") ssl_thumbprint = credentials.get("ssl_thumbprint") if host is None or password is None or user is None: @@ -132,9 +133,7 @@ def get_service_instance(*, config, esxi_host=None, profile=None): """ ctx = ssl._create_unverified_context() config = config or {} - config = get_config(config=config, profile=profile, esxi_host=esxi_host) - service_instance = connect.SmartConnect( host=config.get("host"), user=config.get("user"), diff --git a/src/saltext/vmware/version.py b/src/saltext/vmware/version.py new file mode 100644 index 00000000..4999d019 --- /dev/null +++ b/src/saltext/vmware/version.py @@ -0,0 +1,3 @@ +# pylint: skip-file + +__version__ = "24.10.9.0rc2.dev1+gcb32a1f.d20250327"