salt/fix-for-some-cves-bsc1181550.patch

5285 lines
199 KiB
Diff

From a74b74a640da563618783f309fe1eef391a98f41 Mon Sep 17 00:00:00 2001
From: "Daniel A. Wozniak" <dwozniak@vmware.com>
Date: Fri, 29 Jan 2021 14:30:27 -0700
Subject: [PATCH] Fix for some cves bsc1181550
CVE-2020-28243 CVE-2020-28972 CVE-2020-35662 CVE-2021-3148 CVE-2021-3144
CVE-2021-25281 CVE-2021-25282 CVE-2021-25283 CVE-2021-25284
CVE-2021-3197
---
salt/auth/__init__.py | 1 +
salt/client/mixins.py | 71 ++--
salt/client/ssh/client.py | 46 +++
salt/cloud/clouds/qingcloud.py | 57 +--
salt/cloud/clouds/vmware.py | 158 ++++----
salt/config/schemas/vcenter.py | 8 +-
salt/master.py | 2 +-
salt/modules/bigip.py | 25 +-
salt/modules/cmdmod.py | 29 +-
salt/modules/glassfish.py | 32 +-
salt/modules/keystone.py | 148 ++++----
salt/modules/restartcheck.py | 4 +-
salt/modules/vsphere.py | 660 ++++++++++++++++++++++++++++-----
salt/modules/zenoss.py | 26 +-
salt/pillar/vmware_pillar.py | 26 +-
salt/proxy/cimc.py | 31 +-
salt/proxy/panos.py | 28 +-
salt/proxy/vcenter.py | 6 +-
salt/returners/splunk.py | 34 +-
salt/runners/asam.py | 19 +-
salt/states/esxi.py | 228 ++++++------
salt/utils/http.py | 20 +
salt/utils/thin.py | 4 +-
salt/utils/vmware.py | 128 ++++---
salt/wheel/__init__.py | 12 +-
salt/wheel/pillar_roots.py | 21 +-
26 files changed, 1201 insertions(+), 623 deletions(-)
diff --git a/salt/auth/__init__.py b/salt/auth/__init__.py
index 22c54e8048..56f8bd57c8 100644
--- a/salt/auth/__init__.py
+++ b/salt/auth/__init__.py
@@ -270,6 +270,7 @@ class LoadAuth:
if rm_tok:
self.rm_token(tok)
+ return {}
return tdata
diff --git a/salt/client/mixins.py b/salt/client/mixins.py
index b33ee54f27..6f408adbba 100644
--- a/salt/client/mixins.py
+++ b/salt/client/mixins.py
@@ -1,10 +1,7 @@
-# coding: utf-8
"""
A collection of mixins useful for the various *Client interfaces
"""
-# Import Python libs
-from __future__ import absolute_import, print_function, unicode_literals, with_statement
import copy as pycopy
import fnmatch
@@ -14,10 +11,7 @@ import traceback
import weakref
from collections.abc import Mapping, MutableMapping
-# Import Salt libs
import salt.exceptions
-
-# Import 3rd-party libs
import salt.ext.tornado.stack_context
import salt.log.setup
import salt.minion
@@ -122,7 +116,7 @@ class ClientFuncsDict(MutableMapping):
return iter(self.client.functions)
-class SyncClientMixin(object):
+class SyncClientMixin:
"""
A mixin for *Client interfaces to abstract common function execution
"""
@@ -182,7 +176,7 @@ class SyncClientMixin(object):
)
if ret is None:
raise salt.exceptions.SaltClientTimeout(
- "RunnerClient job '{0}' timed out".format(job["jid"]),
+ "RunnerClient job '{}' timed out".format(job["jid"]),
jid=job["jid"],
)
@@ -281,7 +275,7 @@ class SyncClientMixin(object):
return True
try:
- return self.opts["{0}_returns".format(class_name)]
+ return self.opts["{}_returns".format(class_name)]
except KeyError:
# No such option, assume this isn't one we care about gating and
# just return True.
@@ -308,7 +302,7 @@ class SyncClientMixin(object):
tag = low.get("__tag__", salt.utils.event.tagify(jid, prefix=self.tag_prefix))
data = {
- "fun": "{0}.{1}".format(self.client, fun),
+ "fun": "{}.{}".format(self.client, fun),
"jid": jid,
"user": low.get("__user__", "UNKNOWN"),
}
@@ -353,14 +347,14 @@ class SyncClientMixin(object):
# namespace only once per module-- not per func
completed_funcs = []
- for mod_name in six.iterkeys(self_functions):
+ for mod_name in self_functions.keys():
if "." not in mod_name:
continue
mod, _ = mod_name.split(".", 1)
if mod in completed_funcs:
continue
completed_funcs.append(mod)
- for global_key, value in six.iteritems(func_globals):
+ for global_key, value in func_globals.items():
self.functions[mod_name].__globals__[global_key] = value
# There are some discrepancies of what a "low" structure is in the
@@ -398,7 +392,7 @@ class SyncClientMixin(object):
except TypeError as exc:
data[
"return"
- ] = "\nPassed invalid arguments: {0}\n\nUsage:\n{1}".format(
+ ] = "\nPassed invalid arguments: {}\n\nUsage:\n{}".format(
exc, func.__doc__
)
try:
@@ -413,9 +407,9 @@ class SyncClientMixin(object):
)
except (Exception, SystemExit) as ex: # pylint: disable=broad-except
if isinstance(ex, salt.exceptions.NotImplemented):
- data["return"] = six.text_type(ex)
+ data["return"] = str(ex)
else:
- data["return"] = "Exception occurred in {0} {1}: {2}".format(
+ data["return"] = "Exception occurred in {} {}: {}".format(
self.client, fun, traceback.format_exc(),
)
data["success"] = False
@@ -477,7 +471,7 @@ class SyncClientMixin(object):
return salt.utils.doc.strip_rst(docs)
-class AsyncClientMixin(object):
+class AsyncClientMixin:
"""
A mixin for *Client interfaces to enable easy asynchronous function execution
"""
@@ -485,10 +479,34 @@ class AsyncClientMixin(object):
client = None
tag_prefix = None
+ def _proc_function_remote(self, fun, low, user, tag, jid, daemonize=True):
+ """
+ Run this method in a multiprocess target to execute the function on the
+ master and fire the return data on the event bus
+ """
+ if daemonize and not salt.utils.platform.is_windows():
+ # Shutdown the multiprocessing before daemonizing
+ salt.log.setup.shutdown_multiprocessing_logging()
+
+ salt.utils.process.daemonize()
+
+ # Reconfigure multiprocessing logging after daemonizing
+ salt.log.setup.setup_multiprocessing_logging()
+
+ # pack a few things into low
+ low["__jid__"] = jid
+ low["__user__"] = user
+ low["__tag__"] = tag
+
+ try:
+ return self.cmd_sync(low)
+ except salt.exceptions.EauthAuthenticationError as exc:
+ log.error(exc)
+
def _proc_function(self, fun, low, user, tag, jid, daemonize=True):
"""
- Run this method in a multiprocess target to execute the function in a
- multiprocess and fire the return data on the event bus
+ Run this method in a multiprocess target to execute the function
+ locally and fire the return data on the event bus
"""
if daemonize and not salt.utils.platform.is_windows():
# Shutdown the multiprocessing before daemonizing
@@ -504,7 +522,7 @@ class AsyncClientMixin(object):
low["__user__"] = user
low["__tag__"] = tag
- return self.low(fun, low, full_return=False)
+ return self.low(fun, low)
def cmd_async(self, low):
"""
@@ -532,14 +550,18 @@ class AsyncClientMixin(object):
tag = salt.utils.event.tagify(jid, prefix=self.tag_prefix)
return {"tag": tag, "jid": jid}
- def asynchronous(self, fun, low, user="UNKNOWN", pub=None):
+ def asynchronous(self, fun, low, user="UNKNOWN", pub=None, local=True):
"""
Execute the function in a multiprocess and return the event tag to use
to watch for the return
"""
+ if local:
+ proc_func = self._proc_function
+ else:
+ proc_func = self._proc_function_remote
async_pub = pub if pub is not None else self._gen_async_pub()
proc = salt.utils.process.SignalHandlingProcess(
- target=self._proc_function,
+ target=proc_func,
name="ProcessFunc",
args=(fun, low, user, async_pub["tag"], async_pub["jid"]),
)
@@ -577,9 +599,10 @@ class AsyncClientMixin(object):
if suffix == "ret":
# Check if outputter was passed in the return data. If this is the case,
# then the return data will be a dict two keys: 'data' and 'outputter'
- if isinstance(event.get("return"), dict) and set(event["return"]) == set(
- ("data", "outputter")
- ):
+ if isinstance(event.get("return"), dict) and set(event["return"]) == {
+ "data",
+ "outputter",
+ }:
event_data = event["return"]["data"]
outputter = event["return"]["outputter"]
else:
diff --git a/salt/client/ssh/client.py b/salt/client/ssh/client.py
index d2dbdeb00e..2cf42f53e7 100644
--- a/salt/client/ssh/client.py
+++ b/salt/client/ssh/client.py
@@ -43,12 +43,58 @@ class SSHClient:
# Salt API should never offer a custom roster!
self.opts["__disable_custom_roster"] = disable_custom_roster
+ def sanitize_kwargs(self, kwargs):
+ roster_vals = [
+ ("host", str),
+ ("ssh_user", str),
+ ("ssh_passwd", str),
+ ("ssh_port", int),
+ ("ssh_sudo", bool),
+ ("ssh_sudo_user", str),
+ ("ssh_priv", str),
+ ("ssh_priv_passwd", str),
+ ("ssh_identities_only", bool),
+ ("ssh_remote_port_forwards", str),
+ ("ssh_options", list),
+ ("roster_file", str),
+ ("rosters", list),
+ ("ignore_host_keys", bool),
+ ("raw_shell", bool),
+ ]
+ sane_kwargs = {}
+ for name, kind in roster_vals:
+ if name not in kwargs:
+ continue
+ try:
+ val = kind(kwargs[name])
+ except ValueError:
+ log.warn("Unable to cast kwarg %s", name)
+ continue
+ if kind is bool or kind is int:
+ sane_kwargs[name] = val
+ elif kind is str:
+ if val.find("ProxyCommand") != -1:
+ log.warn("Filter unsafe value for kwarg %s", name)
+ continue
+ sane_kwargs[name] = val
+ elif kind is list:
+ sane_val = []
+ for item in val:
+ # This assumes the values are strings
+ if item.find("ProxyCommand") != -1:
+ log.warn("Filter unsafe value for kwarg %s", name)
+ continue
+ sane_val.append(item)
+ sane_kwargs[name] = sane_val
+ return sane_kwargs
+
def _prep_ssh(
self, tgt, fun, arg=(), timeout=None, tgt_type="glob", kwarg=None, **kwargs
):
"""
Prepare the arguments
"""
+ kwargs = self.sanitize_kwargs(kwargs)
opts = copy.deepcopy(self.opts)
opts.update(kwargs)
if timeout:
diff --git a/salt/cloud/clouds/qingcloud.py b/salt/cloud/clouds/qingcloud.py
index b388840dd5..f4632e167c 100644
--- a/salt/cloud/clouds/qingcloud.py
+++ b/salt/cloud/clouds/qingcloud.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""
QingCloud Cloud Module
======================
@@ -26,8 +25,6 @@ Set up the cloud configuration at ``/etc/salt/cloud.providers`` or
:depends: requests
"""
-# Import python libs
-from __future__ import absolute_import, print_function, unicode_literals
import base64
import hmac
@@ -46,13 +43,9 @@ from salt.exceptions import (
SaltCloudNotFound,
SaltCloudSystemExit,
)
-
-# Import Salt Libs
-from salt.ext import six
from salt.ext.six.moves import range
from salt.ext.six.moves.urllib.parse import quote as _quote
-# Import Third Party Libs
try:
import requests
@@ -110,12 +103,12 @@ def _compute_signature(parameters, access_key_secret, method, path):
"""
parameters["signature_method"] = "HmacSHA256"
- string_to_sign = "{0}\n{1}\n".format(method.upper(), path)
+ string_to_sign = "{}\n{}\n".format(method.upper(), path)
keys = sorted(parameters.keys())
pairs = []
for key in keys:
- val = six.text_type(parameters[key]).encode("utf-8")
+ val = str(parameters[key]).encode("utf-8")
pairs.append(_quote(key, safe="") + "=" + _quote(val, safe="-_~"))
qs = "&".join(pairs)
string_to_sign += qs
@@ -141,6 +134,14 @@ def query(params=None):
"secret_access_key", get_configured_provider(), __opts__, search_global=False
)
+ verify_ssl = config.get_cloud_config_value(
+ "verify_ssl",
+ get_configured_provider(),
+ __opts__,
+ default=True,
+ search_global=False,
+ )
+
# public interface parameters
real_parameters = {
"access_key_id": access_key_id,
@@ -158,9 +159,9 @@ def query(params=None):
for sk, sv in value[i - 1].items():
if isinstance(sv, dict) or isinstance(sv, list):
sv = salt.utils.json.dumps(sv, separators=(",", ":"))
- real_parameters["{0}.{1}.{2}".format(key, i, sk)] = sv
+ real_parameters["{}.{}.{}".format(key, i, sk)] = sv
else:
- real_parameters["{0}.{1}".format(key, i)] = value[i - 1]
+ real_parameters["{}.{}".format(key, i)] = value[i - 1]
else:
real_parameters[key] = value
@@ -171,15 +172,15 @@ def query(params=None):
# print('parameters:')
# pprint.pprint(real_parameters)
- request = requests.get(path, params=real_parameters, verify=False)
+ request = requests.get(path, params=real_parameters, verify=verify_ssl)
# print('url:')
# print(request.url)
if request.status_code != 200:
raise SaltCloudSystemExit(
- "An error occurred while querying QingCloud. HTTP Code: {0} "
- "Error: '{1}'".format(request.status_code, request.text)
+ "An error occurred while querying QingCloud. HTTP Code: {} "
+ "Error: '{}'".format(request.status_code, request.text)
)
log.debug(request.url)
@@ -222,7 +223,7 @@ def avail_locations(call=None):
for region in items["zone_set"]:
result[region["zone_id"]] = {}
for key in region:
- result[region["zone_id"]][key] = six.text_type(region[key])
+ result[region["zone_id"]][key] = str(region[key])
return result
@@ -233,7 +234,7 @@ def _get_location(vm_=None):
"""
locations = avail_locations()
- vm_location = six.text_type(
+ vm_location = str(
config.get_cloud_config_value("zone", vm_, __opts__, search_global=False)
)
@@ -244,7 +245,7 @@ def _get_location(vm_=None):
return vm_location
raise SaltCloudNotFound(
- "The specified location, '{0}', could not be found.".format(vm_location)
+ "The specified location, '{}', could not be found.".format(vm_location)
)
@@ -302,7 +303,7 @@ def _get_image(vm_):
Return the VM's image. Used by create().
"""
images = avail_images()
- vm_image = six.text_type(
+ vm_image = str(
config.get_cloud_config_value("image", vm_, __opts__, search_global=False)
)
@@ -313,7 +314,7 @@ def _get_image(vm_):
return vm_image
raise SaltCloudNotFound(
- "The specified image, '{0}', could not be found.".format(vm_image)
+ "The specified image, '{}', could not be found.".format(vm_image)
)
@@ -424,7 +425,7 @@ def _get_size(vm_):
"""
sizes = avail_sizes()
- vm_size = six.text_type(
+ vm_size = str(
config.get_cloud_config_value("size", vm_, __opts__, search_global=False)
)
@@ -435,7 +436,7 @@ def _get_size(vm_):
return vm_size
raise SaltCloudNotFound(
- "The specified size, '{0}', could not be found.".format(vm_size)
+ "The specified size, '{}', could not be found.".format(vm_size)
)
@@ -616,7 +617,7 @@ def show_instance(instance_id, call=None, kwargs=None):
if items["total_count"] == 0:
raise SaltCloudNotFound(
- "The specified instance, '{0}', could not be found.".format(instance_id)
+ "The specified instance, '{}', could not be found.".format(instance_id)
)
full_node = items["instance_set"][0]
@@ -668,7 +669,7 @@ def create(vm_):
__utils__["cloud.fire_event"](
"event",
"starting create",
- "salt/cloud/{0}/creating".format(vm_["name"]),
+ "salt/cloud/{}/creating".format(vm_["name"]),
args=__utils__["cloud.filter_event"](
"creating", vm_, ["name", "profile", "provider", "driver"]
),
@@ -693,7 +694,7 @@ def create(vm_):
__utils__["cloud.fire_event"](
"event",
"requesting instance",
- "salt/cloud/{0}/requesting".format(vm_["name"]),
+ "salt/cloud/{}/requesting".format(vm_["name"]),
args={
"kwargs": __utils__["cloud.filter_event"](
"requesting", params, list(params)
@@ -724,7 +725,7 @@ def create(vm_):
except SaltCloudSystemExit:
pass
finally:
- raise SaltCloudSystemExit(six.text_type(exc))
+ raise SaltCloudSystemExit(str(exc))
private_ip = data["private_ips"][0]
@@ -742,7 +743,7 @@ def create(vm_):
__utils__["cloud.fire_event"](
"event",
"created instance",
- "salt/cloud/{0}/created".format(vm_["name"]),
+ "salt/cloud/{}/created".format(vm_["name"]),
args=__utils__["cloud.filter_event"](
"created", vm_, ["name", "profile", "provider", "driver"]
),
@@ -868,7 +869,7 @@ def destroy(instance_id, call=None):
__utils__["cloud.fire_event"](
"event",
"destroying instance",
- "salt/cloud/{0}/destroying".format(name),
+ "salt/cloud/{}/destroying".format(name),
args={"name": name},
sock_dir=__opts__["sock_dir"],
transport=__opts__["transport"],
@@ -884,7 +885,7 @@ def destroy(instance_id, call=None):
__utils__["cloud.fire_event"](
"event",
"destroyed instance",
- "salt/cloud/{0}/destroyed".format(name),
+ "salt/cloud/{}/destroyed".format(name),
args={"name": name},
sock_dir=__opts__["sock_dir"],
transport=__opts__["transport"],
diff --git a/salt/cloud/clouds/vmware.py b/salt/cloud/clouds/vmware.py
index edaca9618b..851579bf74 100644
--- a/salt/cloud/clouds/vmware.py
+++ b/salt/cloud/clouds/vmware.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# pylint: disable=C0302
"""
VMware Cloud Module
@@ -114,8 +113,6 @@ To test the connection for ``my-vmware-config`` specified in the cloud
configuration, run :py:func:`test_vcenter_connection`
"""
-# Import python libs
-from __future__ import absolute_import, print_function, unicode_literals
import logging
import os.path
@@ -125,10 +122,7 @@ import subprocess
import time
from random import randint
-# Import salt cloud libs
import salt.config as config
-
-# Import salt libs
import salt.utils.cloud
import salt.utils.network
import salt.utils.stringutils
@@ -136,9 +130,6 @@ import salt.utils.vmware
import salt.utils.xmlutil
from salt.exceptions import SaltCloudSystemExit
-# Import 3rd-party libs
-from salt.ext import six
-
try:
# Attempt to import pyVmomi libs
from pyVmomi import vim # pylint: disable=no-name-in-module
@@ -230,7 +221,7 @@ def _str_to_bool(var):
if isinstance(var, bool):
return var
- if isinstance(var, six.string_types):
+ if isinstance(var, str):
return True if var.lower() == "true" else False
return None
@@ -260,9 +251,15 @@ def _get_si():
port = config.get_cloud_config_value(
"port", get_configured_provider(), __opts__, search_global=False, default=443
)
-
+ verify_ssl = config.get_cloud_config_value(
+ "verify_ssl",
+ get_configured_provider(),
+ __opts__,
+ search_global=False,
+ default=True,
+ )
return salt.utils.vmware.get_service_instance(
- url, username, password, protocol=protocol, port=port
+ url, username, password, protocol=protocol, port=port, verify_ssl=verify_ssl
)
@@ -299,7 +296,7 @@ def _add_new_hard_disk_helper(
disk_spec.device.key = random_key
disk_spec.device.deviceInfo = vim.Description()
disk_spec.device.deviceInfo.label = disk_label
- disk_spec.device.deviceInfo.summary = "{0} GB".format(size_gb)
+ disk_spec.device.deviceInfo.summary = "{} GB".format(size_gb)
disk_spec.device.backing = vim.vm.device.VirtualDisk.FlatVer2BackingInfo()
disk_spec.device.backing.thinProvisioned = thin_provision
@@ -320,7 +317,7 @@ def _add_new_hard_disk_helper(
if not datastore_cluster_ref:
# datastore/datastore cluster specified does not exist
raise SaltCloudSystemExit(
- "Specified datastore/datastore cluster ({0}) for disk ({1}) does not exist".format(
+ "Specified datastore/datastore cluster ({}) for disk ({}) does not exist".format(
datastore, disk_label
)
)
@@ -351,12 +348,12 @@ def _add_new_hard_disk_helper(
if not datastore_ref:
# datastore cluster specified does not have any accessible datastores
raise SaltCloudSystemExit(
- "Specified datastore cluster ({0}) for disk ({1}) does not have any accessible datastores available".format(
+ "Specified datastore cluster ({}) for disk ({}) does not have any accessible datastores available".format(
datastore, disk_label
)
)
- datastore_path = "[" + six.text_type(datastore_ref.name) + "] " + vm_name
+ datastore_path = "[" + str(datastore_ref.name) + "] " + vm_name
disk_spec.device.backing.fileName = datastore_path + "/" + disk_label + ".vmdk"
disk_spec.device.backing.datastore = datastore_ref
log.trace(
@@ -429,11 +426,11 @@ def _edit_existing_network_adapter(
else:
# If switch type not specified or does not match, show error and return
if not switch_type:
- err_msg = "The switch type to be used by '{0}' has not been specified".format(
+ err_msg = "The switch type to be used by '{}' has not been specified".format(
network_adapter.deviceInfo.label
)
else:
- err_msg = "Cannot create '{0}'. Invalid/unsupported switch type '{1}'".format(
+ err_msg = "Cannot create '{}'. Invalid/unsupported switch type '{}'".format(
network_adapter.deviceInfo.label, switch_type
)
raise SaltCloudSystemExit(err_msg)
@@ -516,11 +513,11 @@ def _add_new_network_adapter_helper(
else:
# If switch type not specified or does not match, show error and return
if not switch_type:
- err_msg = "The switch type to be used by '{0}' has not been specified".format(
+ err_msg = "The switch type to be used by '{}' has not been specified".format(
network_adapter_label
)
else:
- err_msg = "Cannot create '{0}'. Invalid/unsupported switch type '{1}'".format(
+ err_msg = "Cannot create '{}'. Invalid/unsupported switch type '{}'".format(
network_adapter_label, switch_type
)
raise SaltCloudSystemExit(err_msg)
@@ -572,11 +569,11 @@ def _add_new_scsi_controller_helper(scsi_controller_label, properties, bus_numbe
else:
# If type not specified or does not match, show error and return
if not adapter_type:
- err_msg = "The type of '{0}' has not been specified".format(
+ err_msg = "The type of '{}' has not been specified".format(
scsi_controller_label
)
else:
- err_msg = "Cannot create '{0}'. Invalid/unsupported type '{1}'".format(
+ err_msg = "Cannot create '{}'. Invalid/unsupported type '{}'".format(
scsi_controller_label, adapter_type
)
raise SaltCloudSystemExit(err_msg)
@@ -653,7 +650,7 @@ def _set_cd_or_dvd_backing_type(drive, device_type, mode, iso_path):
if datastore_ref:
drive.backing.datastore = datastore_ref
- drive.deviceInfo.summary = "ISO {0}".format(iso_path)
+ drive.deviceInfo.summary = "ISO {}".format(iso_path)
elif device_type == "client_device":
if mode == "passthrough":
@@ -735,8 +732,8 @@ def _set_network_adapter_mapping(adapter_specs):
gateway = adapter_specs["gateway"]
adapter_mapping.adapter.gateway = gateway
if "ip" in list(adapter_specs.keys()):
- ip = six.text_type(adapter_specs["ip"])
- subnet_mask = six.text_type(adapter_specs["subnet_mask"])
+ ip = str(adapter_specs["ip"])
+ subnet_mask = str(adapter_specs["subnet_mask"])
adapter_mapping.adapter.ip = vim.vm.customization.FixedIp(ipAddress=ip)
adapter_mapping.adapter.subnetMask = subnet_mask
else:
@@ -823,8 +820,8 @@ def _manage_devices(devices, vm=None, container_ref=None, new_vm_name=None):
if device.capacityInKB > size_kb:
raise SaltCloudSystemExit(
- "The specified disk size '{0}GB' for '{1}' is "
- "smaller than the disk image size '{2}GB'. It must "
+ "The specified disk size '{}GB' for '{}' is "
+ "smaller than the disk image size '{}GB'. It must "
"be equal to or greater than the disk image".format(
float(
devices["disk"][device.deviceInfo.label]["size"]
@@ -908,7 +905,7 @@ def _manage_devices(devices, vm=None, container_ref=None, new_vm_name=None):
else None
)
if bus_sharing and bus_sharing in ["virtual", "physical", "no"]:
- bus_sharing = "{0}Sharing".format(bus_sharing)
+ bus_sharing = "{}Sharing".format(bus_sharing)
if bus_sharing != device.sharedBus:
# Only edit the SCSI controller if bus_sharing is different
scsi_spec = _edit_existing_scsi_controller(
@@ -1112,7 +1109,7 @@ def _manage_devices(devices, vm=None, container_ref=None, new_vm_name=None):
ide_controllers[controller_key] = 0
break
else:
- for ide_controller_key, num_devices in six.iteritems(ide_controllers):
+ for ide_controller_key, num_devices in ide_controllers.items():
if num_devices < 2:
controller_key = ide_controller_key
break
@@ -1145,10 +1142,7 @@ def _wait_for_vmware_tools(vm_ref, max_wait):
vm_ref.name,
time_counter,
)
- if (
- six.text_type(vm_ref.summary.guest.toolsRunningStatus)
- == "guestToolsRunning"
- ):
+ if str(vm_ref.summary.guest.toolsRunningStatus) == "guestToolsRunning":
log.info(
"[ %s ] Successfully got VMware tools running on the guest in "
"%s seconds",
@@ -1314,23 +1308,21 @@ def _format_instance_info_select(vm, selection):
vm_select_info["id"] = vm["name"]
if "image" in selection:
- vm_select_info["image"] = "{0} (Detected)".format(
+ vm_select_info["image"] = "{} (Detected)".format(
defaultto(vm, "config.guestFullName")
)
if "size" in selection:
cpu = defaultto(vm, "config.hardware.numCPU")
- ram = "{0} MB".format(defaultto(vm, "config.hardware.memoryMB"))
- vm_select_info["size"] = "cpu: {0}\nram: {1}".format(cpu, ram)
+ ram = "{} MB".format(defaultto(vm, "config.hardware.memoryMB"))
+ vm_select_info["size"] = "cpu: {}\nram: {}".format(cpu, ram)
vm_select_info["size_dict"] = {
"cpu": cpu,
"memory": ram,
}
if "state" in selection:
- vm_select_info["state"] = six.text_type(
- defaultto(vm, "summary.runtime.powerState")
- )
+ vm_select_info["state"] = str(defaultto(vm, "summary.runtime.powerState"))
if "guest_id" in selection:
vm_select_info["guest_id"] = defaultto(vm, "config.guestId")
@@ -1342,9 +1334,7 @@ def _format_instance_info_select(vm, selection):
vm_select_info["path"] = defaultto(vm, "config.files.vmPathName")
if "tools_status" in selection:
- vm_select_info["tools_status"] = six.text_type(
- defaultto(vm, "guest.toolsStatus")
- )
+ vm_select_info["tools_status"] = str(defaultto(vm, "guest.toolsStatus"))
if "private_ips" in selection or "networks" in selection:
network_full_info = {}
@@ -1585,18 +1575,18 @@ def _format_instance_info(vm):
cpu = vm["config.hardware.numCPU"] if "config.hardware.numCPU" in vm else "N/A"
ram = (
- "{0} MB".format(vm["config.hardware.memoryMB"])
+ "{} MB".format(vm["config.hardware.memoryMB"])
if "config.hardware.memoryMB" in vm
else "N/A"
)
vm_full_info = {
- "id": six.text_type(vm["name"]),
- "image": "{0} (Detected)".format(vm["config.guestFullName"])
+ "id": str(vm["name"]),
+ "image": "{} (Detected)".format(vm["config.guestFullName"])
if "config.guestFullName" in vm
else "N/A",
- "size": "cpu: {0}\nram: {1}".format(cpu, ram),
+ "size": "cpu: {}\nram: {}".format(cpu, ram),
"size_dict": {"cpu": cpu, "memory": ram},
- "state": six.text_type(vm["summary.runtime.powerState"])
+ "state": str(vm["summary.runtime.powerState"])
if "summary.runtime.powerState" in vm
else "N/A",
"private_ips": ip_addresses,
@@ -1604,16 +1594,14 @@ def _format_instance_info(vm):
"devices": device_full_info,
"storage": storage_full_info,
"files": file_full_info,
- "guest_id": six.text_type(vm["config.guestId"])
- if "config.guestId" in vm
- else "N/A",
- "hostname": six.text_type(vm["object"].guest.hostName),
+ "guest_id": str(vm["config.guestId"]) if "config.guestId" in vm else "N/A",
+ "hostname": str(vm["object"].guest.hostName),
"mac_addresses": device_mac_addresses,
"networks": network_full_info,
- "path": six.text_type(vm["config.files.vmPathName"])
+ "path": str(vm["config.files.vmPathName"])
if "config.files.vmPathName" in vm
else "N/A",
- "tools_status": six.text_type(vm["guest.toolsStatus"])
+ "tools_status": str(vm["guest.toolsStatus"])
if "guest.toolsStatus" in vm
else "N/A",
}
@@ -1624,11 +1612,11 @@ def _format_instance_info(vm):
def _get_snapshots(snapshot_list, current_snapshot=None, parent_snapshot_path=""):
snapshots = {}
for snapshot in snapshot_list:
- snapshot_path = "{0}/{1}".format(parent_snapshot_path, snapshot.name)
+ snapshot_path = "{}/{}".format(parent_snapshot_path, snapshot.name)
snapshots[snapshot_path] = {
"name": snapshot.name,
"description": snapshot.description,
- "created": six.text_type(snapshot.createTime).split(".")[0],
+ "created": str(snapshot.createTime).split(".")[0],
"state": snapshot.state,
"path": snapshot_path,
}
@@ -1760,7 +1748,7 @@ def test_vcenter_connection(kwargs=None, call=None):
# Get the service instance object
_get_si()
except Exception as exc: # pylint: disable=broad-except
- return "failed to connect: {0}".format(exc)
+ return "failed to connect: {}".format(exc)
return "connection successful"
@@ -2000,18 +1988,18 @@ def list_nodes(kwargs=None, call=None):
for vm in vm_list:
cpu = vm["config.hardware.numCPU"] if "config.hardware.numCPU" in vm else "N/A"
ram = (
- "{0} MB".format(vm["config.hardware.memoryMB"])
+ "{} MB".format(vm["config.hardware.memoryMB"])
if "config.hardware.memoryMB" in vm
else "N/A"
)
vm_info = {
"id": vm["name"],
- "image": "{0} (Detected)".format(vm["config.guestFullName"])
+ "image": "{} (Detected)".format(vm["config.guestFullName"])
if "config.guestFullName" in vm
else "N/A",
- "size": "cpu: {0}\nram: {1}".format(cpu, ram),
+ "size": "cpu: {}\nram: {}".format(cpu, ram),
"size_dict": {"cpu": cpu, "memory": ram},
- "state": six.text_type(vm["summary.runtime.powerState"])
+ "state": str(vm["summary.runtime.powerState"])
if "summary.runtime.powerState" in vm
else "N/A",
"private_ips": [vm["guest.ipAddress"]] if "guest.ipAddress" in vm else [],
@@ -2660,7 +2648,7 @@ def destroy(name, call=None):
__utils__["cloud.fire_event"](
"event",
"destroying instance",
- "salt/cloud/{0}/destroying".format(name),
+ "salt/cloud/{}/destroying".format(name),
args={"name": name},
sock_dir=__opts__["sock_dir"],
transport=__opts__["transport"],
@@ -2706,7 +2694,7 @@ def destroy(name, call=None):
__utils__["cloud.fire_event"](
"event",
"destroyed instance",
- "salt/cloud/{0}/destroyed".format(name),
+ "salt/cloud/{}/destroyed".format(name),
args={"name": name},
sock_dir=__opts__["sock_dir"],
transport=__opts__["transport"],
@@ -2748,7 +2736,7 @@ def create(vm_):
__utils__["cloud.fire_event"](
"event",
"starting create",
- "salt/cloud/{0}/creating".format(vm_["name"]),
+ "salt/cloud/{}/creating".format(vm_["name"]),
args=__utils__["cloud.filter_event"](
"creating", vm_, ["name", "profile", "provider", "driver"]
),
@@ -2825,10 +2813,10 @@ def create(vm_):
"win_run_once", vm_, __opts__, search_global=False, default=None
)
cpu_hot_add = config.get_cloud_config_value(
- 'cpu_hot_add', vm_, __opts__, search_global=False, default=None
+ "cpu_hot_add", vm_, __opts__, search_global=False, default=None
)
mem_hot_add = config.get_cloud_config_value(
- 'mem_hot_add', vm_, __opts__, search_global=False, default=None
+ "mem_hot_add", vm_, __opts__, search_global=False, default=None
)
# Get service instance object
@@ -2988,7 +2976,7 @@ def create(vm_):
)
if not datastore_ref:
raise SaltCloudSystemExit(
- "Specified datastore: '{0}' does not exist".format(datastore)
+ "Specified datastore: '{}' does not exist".format(datastore)
)
if host:
@@ -3004,7 +2992,7 @@ def create(vm_):
# If the hardware version is specified and if it is different from the current
# hardware version, then schedule a hardware version upgrade
if hardware_version and object_ref is not None:
- hardware_version = "vmx-{0:02}".format(hardware_version)
+ hardware_version = "vmx-{:02}".format(hardware_version)
if hardware_version != object_ref.config.version:
log.debug(
"Scheduling hardware version upgrade from %s to %s",
@@ -3034,7 +3022,7 @@ def create(vm_):
elif memory_unit.lower() == "gb":
memory_mb = int(float(memory_num) * 1024.0)
else:
- err_msg = "Invalid memory type specified: '{0}'".format(memory_unit)
+ err_msg = "Invalid memory type specified: '{}'".format(memory_unit)
log.error(err_msg)
return {"Error": err_msg}
except (TypeError, ValueError):
@@ -3048,19 +3036,19 @@ def create(vm_):
)
config_spec.deviceChange = specs["device_specs"]
- if cpu_hot_add and hasattr(config_spec, 'cpuHotAddEnabled'):
+ if cpu_hot_add and hasattr(config_spec, "cpuHotAddEnabled"):
config_spec.cpuHotAddEnabled = bool(cpu_hot_add)
- if mem_hot_add and hasattr(config_spec, 'memoryHotAddEnabled'):
+ if mem_hot_add and hasattr(config_spec, "memoryHotAddEnabled"):
config_spec.memoryHotAddEnabled = bool(mem_hot_add)
if extra_config:
- for key, value in six.iteritems(extra_config):
+ for key, value in extra_config.items():
option = vim.option.OptionValue(key=key, value=value)
config_spec.extraConfig.append(option)
if annotation:
- config_spec.annotation = six.text_type(annotation)
+ config_spec.annotation = str(annotation)
if "clonefrom" in vm_:
clone_spec = handle_snapshot(config_spec, object_ref, reloc_spec, template, vm_)
@@ -3137,7 +3125,7 @@ def create(vm_):
__utils__["cloud.fire_event"](
"event",
"requesting instance",
- "salt/cloud/{0}/requesting".format(vm_["name"]),
+ "salt/cloud/{}/requesting".format(vm_["name"]),
args=__utils__["cloud.filter_event"](
"requesting", event_kwargs, list(event_kwargs)
),
@@ -3190,7 +3178,7 @@ def create(vm_):
task = folder_ref.CreateVM_Task(config_spec, resourcepool_ref)
salt.utils.vmware.wait_for_task(task, vm_name, "create", 15, "info")
except Exception as exc: # pylint: disable=broad-except
- err_msg = "Error creating {0}: {1}".format(vm_["name"], exc)
+ err_msg = "Error creating {}: {}".format(vm_["name"], exc)
log.error(
err_msg,
# Show the traceback if the debug logging level is enabled
@@ -3235,7 +3223,7 @@ def create(vm_):
__utils__["cloud.fire_event"](
"event",
"created instance",
- "salt/cloud/{0}/created".format(vm_["name"]),
+ "salt/cloud/{}/created".format(vm_["name"]),
args=__utils__["cloud.filter_event"](
"created", vm_, ["name", "profile", "provider", "driver"]
),
@@ -3267,7 +3255,7 @@ def handle_snapshot(config_spec, object_ref, reloc_spec, template, vm_):
raise SaltCloudSystemExit(
"Invalid disk move type specified"
" supported types are"
- " {0}".format(" ".join(allowed_types))
+ " {}".format(" ".join(allowed_types))
)
return clone_spec
@@ -3470,7 +3458,7 @@ def rescan_hba(kwargs=None, call=None):
if hba:
log.info("Rescanning HBA %s on host %s", hba, host_name)
host_ref.configManager.storageSystem.RescanHba(hba)
- ret = "rescanned HBA {0}".format(hba)
+ ret = "rescanned HBA {}".format(hba)
else:
log.info("Rescanning all HBAs on host %s", host_name)
host_ref.configManager.storageSystem.RescanAllHba()
@@ -3749,7 +3737,7 @@ def list_hbas(kwargs=None, call=None):
if hba_type and hba_type not in ["parallel", "block", "iscsi", "fibre"]:
raise SaltCloudSystemExit(
- "Specified hba type {0} currently not supported.".format(hba_type)
+ "Specified hba type {} currently not supported.".format(hba_type)
)
host_list = salt.utils.vmware.get_mors_with_properties(
@@ -4124,10 +4112,10 @@ def revert_to_snapshot(name, kwargs=None, call=None):
task = vm_ref.RevertToCurrentSnapshot(suppressPowerOn=suppress_power_on)
else:
log.debug("Reverting VM %s to snapshot %s", name, snapshot_name)
- msg = "reverted to snapshot {0}".format(snapshot_name)
+ msg = "reverted to snapshot {}".format(snapshot_name)
snapshot_ref = _get_snapshot_ref_by_name(vm_ref, snapshot_name)
if snapshot_ref is None:
- return "specified snapshot '{0}' does not exist".format(snapshot_name)
+ return "specified snapshot '{}' does not exist".format(snapshot_name)
task = snapshot_ref.snapshot.Revert(suppressPowerOn=suppress_power_on)
salt.utils.vmware.wait_for_task(task, name, "revert to snapshot", 5, "info")
@@ -4265,7 +4253,7 @@ def convert_to_template(name, kwargs=None, call=None):
vm_ref = salt.utils.vmware.get_mor_by_property(_get_si(), vim.VirtualMachine, name)
if vm_ref.config.template:
- raise SaltCloudSystemExit("{0} already a template".format(name))
+ raise SaltCloudSystemExit("{} already a template".format(name))
try:
vm_ref.MarkAsTemplate()
@@ -4279,7 +4267,7 @@ def convert_to_template(name, kwargs=None, call=None):
)
return "failed to convert to teamplate"
- return "{0} converted to template".format(name)
+ return "{} converted to template".format(name)
def add_host(kwargs=None, call=None):
@@ -4399,7 +4387,7 @@ def add_host(kwargs=None, call=None):
("echo", "-n"), stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
p2 = subprocess.Popen(
- ("openssl", "s_client", "-connect", "{0}:443".format(host_name)),
+ ("openssl", "s_client", "-connect", "{}:443".format(host_name)),
stdin=p1.stdout,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
@@ -4429,12 +4417,12 @@ def add_host(kwargs=None, call=None):
try:
if cluster_name:
task = cluster_ref.AddHost(spec=spec, asConnected=True)
- ret = "added host system to cluster {0}".format(cluster_name)
+ ret = "added host system to cluster {}".format(cluster_name)
if datacenter_name:
task = datacenter_ref.hostFolder.AddStandaloneHost(
spec=spec, addConnected=True
)
- ret = "added host system to datacenter {0}".format(datacenter_name)
+ ret = "added host system to datacenter {}".format(datacenter_name)
salt.utils.vmware.wait_for_task(task, host_name, "add host system", 5, "info")
except Exception as exc: # pylint: disable=broad-except
if isinstance(exc, vim.fault.SSLVerifyFault):
diff --git a/salt/config/schemas/vcenter.py b/salt/config/schemas/vcenter.py
index 7db8b67c41..bd82bd1761 100644
--- a/salt/config/schemas/vcenter.py
+++ b/salt/config/schemas/vcenter.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""
:codeauthor: :email:`Rod McKenzie (roderick.mckenzie@morganstanley.com)`
:codeauthor: :email:`Alexandru Bleotu (alexandru.bleotu@morganstanley.com)`
@@ -9,11 +8,8 @@
VCenter configuration schemas
"""
-# Import Python libs
-from __future__ import absolute_import, print_function, unicode_literals
-# Import Salt libs
-from salt.utils.schema import ArrayItem, IntegerItem, Schema, StringItem
+from salt.utils.schema import ArrayItem, BooleanItem, IntegerItem, Schema, StringItem
class VCenterEntitySchema(Schema):
@@ -48,6 +44,8 @@ class VCenterProxySchema(Schema):
mechanism = StringItem(required=True, enum=["userpass", "sspi"])
username = StringItem()
passwords = ArrayItem(min_items=1, items=StringItem(), unique_items=True)
+ verify_ssl = BooleanItem()
+ ca_bundle = StringItem()
domain = StringItem()
principal = StringItem(default="host")
diff --git a/salt/master.py b/salt/master.py
index 59bb19ce75..fc103ac489 100644
--- a/salt/master.py
+++ b/salt/master.py
@@ -2126,7 +2126,7 @@ class ClearFuncs(TransportMethods):
fun = clear_load.pop("fun")
runner_client = salt.runner.RunnerClient(self.opts)
return runner_client.asynchronous(
- fun, clear_load.get("kwarg", {}), username
+ fun, clear_load.get("kwarg", {}), username, local=True
)
except Exception as exc: # pylint: disable=broad-except
log.error("Exception occurred while introspecting %s: %s", fun, exc)
diff --git a/salt/modules/bigip.py b/salt/modules/bigip.py
index 2b54e4d27c..36168d66b4 100644
--- a/salt/modules/bigip.py
+++ b/salt/modules/bigip.py
@@ -1,21 +1,14 @@
-# -*- coding: utf-8 -*-
"""
An execution module which can manipulate an f5 bigip via iControl REST
:maturity: develop
:platform: f5_bigip_11.6
"""
-# Import python libs
-from __future__ import absolute_import, print_function, unicode_literals
-# Import salt libs
import salt.exceptions
import salt.utils.json
-
-# Import 3rd-party libs
from salt.ext import six
-# Import third party libs
try:
import requests
import requests.exceptions
@@ -52,7 +45,7 @@ def _build_session(username, password, trans_label=None):
bigip = requests.session()
bigip.auth = (username, password)
- bigip.verify = False
+ bigip.verify = True
bigip.headers.update({"Content-Type": "application/json"})
if trans_label:
@@ -109,7 +102,7 @@ def _loop_payload(params):
payload = {}
# set the payload
- for param, value in six.iteritems(params):
+ for param, value in params.items():
if value is not None:
payload[param] = value
@@ -153,7 +146,7 @@ def _determine_toggles(payload, toggles):
Figure out what it likes to hear without confusing the user.
"""
- for toggle, definition in six.iteritems(toggles):
+ for toggle, definition in toggles.items():
# did the user specify anything?
if definition["value"] is not None:
# test for yes_no toggle
@@ -1046,7 +1039,7 @@ def replace_pool_members(hostname, username, password, name, members):
# specify members if provided
if members is not None:
- if isinstance(members, six.string_types):
+ if isinstance(members, str):
members = members.split(",")
pool_members = []
@@ -1583,7 +1576,7 @@ def create_virtual(
payload["vlans"] = "none"
elif vlans == "default":
payload["vlans"] = "default"
- elif isinstance(vlans, six.string_types) and (
+ elif isinstance(vlans, str) and (
vlans.startswith("enabled") or vlans.startswith("disabled")
):
try:
@@ -2016,7 +2009,7 @@ def create_monitor(hostname, username, password, monitor_type, name, **kwargs):
# there's a ton of different monitors and a ton of options for each type of monitor.
# this logic relies that the end user knows which options are meant for which monitor types
- for key, value in six.iteritems(kwargs):
+ for key, value in kwargs.items():
if not key.startswith("__"):
if key not in ["hostname", "username", "password", "type"]:
key = key.replace("_", "-")
@@ -2067,7 +2060,7 @@ def modify_monitor(hostname, username, password, monitor_type, name, **kwargs):
# there's a ton of different monitors and a ton of options for each type of monitor.
# this logic relies that the end user knows which options are meant for which monitor types
- for key, value in six.iteritems(kwargs):
+ for key, value in kwargs.items():
if not key.startswith("__"):
if key not in ["hostname", "username", "password", "type", "name"]:
key = key.replace("_", "-")
@@ -2231,7 +2224,7 @@ def create_profile(hostname, username, password, profile_type, name, **kwargs):
# there's a ton of different profiles and a ton of options for each type of profile.
# this logic relies that the end user knows which options are meant for which profile types
- for key, value in six.iteritems(kwargs):
+ for key, value in kwargs.items():
if not key.startswith("__"):
if key not in ["hostname", "username", "password", "profile_type"]:
key = key.replace("_", "-")
@@ -2322,7 +2315,7 @@ def modify_profile(hostname, username, password, profile_type, name, **kwargs):
# there's a ton of different profiles and a ton of options for each type of profile.
# this logic relies that the end user knows which options are meant for which profile types
- for key, value in six.iteritems(kwargs):
+ for key, value in kwargs.items():
if not key.startswith("__"):
if key not in ["hostname", "username", "password", "profile_type"]:
key = key.replace("_", "-")
diff --git a/salt/modules/cmdmod.py b/salt/modules/cmdmod.py
index c8eb4d2305..bbc303c3f8 100644
--- a/salt/modules/cmdmod.py
+++ b/salt/modules/cmdmod.py
@@ -77,6 +77,12 @@ def __virtual__():
return __virtualname__
+def _log_cmd(cmd):
+ if not isinstance(cmd, list):
+ return cmd.split()[0].strip()
+ return cmd[0].strip()
+
+
def _check_cb(cb_):
"""
If the callback is None or is not callable, return a lambda that returns
@@ -386,22 +392,13 @@ def _run(
)
env[bad_env_key] = ""
- def _get_stripped(cmd):
- # Return stripped command string copies to improve logging.
- if isinstance(cmd, list):
- return [x.strip() if isinstance(x, str) else x for x in cmd]
- elif isinstance(cmd, str):
- return cmd.strip()
- else:
- return cmd
-
if output_loglevel is not None:
# Always log the shell commands at INFO unless quiet logging is
# requested. The command output is what will be controlled by the
# 'loglevel' parameter.
msg = "Executing command {}{}{} {}{}in directory '{}'{}".format(
"'" if not isinstance(cmd, list) else "",
- _get_stripped(cmd),
+ _log_cmd(cmd),
"'" if not isinstance(cmd, list) else "",
"as user '{}' ".format(runas) if runas else "",
"in group '{}' ".format(group) if group else "",
@@ -723,7 +720,7 @@ def _run(
log.error(
"Failed to decode stdout from command %s, non-decodable "
"characters have been replaced",
- cmd,
+ _log_cmd(cmd),
)
try:
@@ -741,7 +738,7 @@ def _run(
log.error(
"Failed to decode stderr from command %s, non-decodable "
"characters have been replaced",
- cmd,
+ _log_cmd(cmd),
)
if rstrip:
@@ -841,7 +838,9 @@ def _run(
if not ignore_retcode and ret["retcode"] != 0:
if output_loglevel < LOG_LEVELS["error"]:
output_loglevel = LOG_LEVELS["error"]
- msg = "Command '{}' failed with return code: {}".format(cmd, ret["retcode"])
+ msg = "Command '{}' failed with return code: {}".format(
+ _log_cmd(cmd), ret["retcode"]
+ )
log.error(log_callback(msg))
if ret["stdout"]:
log.log(output_loglevel, "stdout: %s", log_callback(ret["stdout"]))
@@ -1211,7 +1210,9 @@ def run(
if not ignore_retcode and ret["retcode"] != 0:
if lvl < LOG_LEVELS["error"]:
lvl = LOG_LEVELS["error"]
- msg = "Command '{}' failed with return code: {}".format(cmd, ret["retcode"])
+ msg = "Command '{}' failed with return code: {}".format(
+ _log_cmd(cmd), ret["retcode"]
+ )
log.error(log_callback(msg))
if raise_err:
raise CommandExecutionError(
diff --git a/salt/modules/glassfish.py b/salt/modules/glassfish.py
index 44df1d3cbb..59a171d2e6 100644
--- a/salt/modules/glassfish.py
+++ b/salt/modules/glassfish.py
@@ -1,10 +1,8 @@
-# -*- coding: utf-8 -*-
"""
Module for working with the Glassfish/Payara 4.x management API
.. versionadded:: Carbon
:depends: requests
"""
-from __future__ import absolute_import, print_function, unicode_literals
import salt.defaults.exitcodes
import salt.utils.json
@@ -42,7 +40,7 @@ def __virtual__():
else:
return (
False,
- 'The "{0}" module could not be loaded: '
+ 'The "{}" module could not be loaded: '
'"requests" is not installed.'.format(__virtualname__),
)
@@ -73,9 +71,9 @@ def _get_url(ssl, url, port, path):
Returns the URL of the endpoint
"""
if ssl:
- return "https://{0}:{1}/management/domain/{2}".format(url, port, path)
+ return "https://{}:{}/management/domain/{}".format(url, port, path)
else:
- return "http://{0}:{1}/management/domain/{2}".format(url, port, path)
+ return "http://{}:{}/management/domain/{}".format(url, port, path)
def _get_server(server):
@@ -128,7 +126,7 @@ def _api_get(path, server=None):
url=_get_url(server["ssl"], server["url"], server["port"], path),
auth=_get_auth(server["user"], server["password"]),
headers=_get_headers(),
- verify=False,
+ verify=True,
)
return _api_response(response)
@@ -143,7 +141,7 @@ def _api_post(path, data, server=None):
auth=_get_auth(server["user"], server["password"]),
headers=_get_headers(),
data=salt.utils.json.dumps(data),
- verify=False,
+ verify=True,
)
return _api_response(response)
@@ -158,7 +156,7 @@ def _api_delete(path, data, server=None):
auth=_get_auth(server["user"], server["password"]),
headers=_get_headers(),
params=data,
- verify=False,
+ verify=True,
)
return _api_response(response)
@@ -183,7 +181,7 @@ def _get_element_properties(name, element_type, server=None):
Get an element's properties
"""
properties = {}
- data = _api_get("{0}/{1}/property".format(element_type, name), server)
+ data = _api_get("{}/{}/property".format(element_type, name), server)
# Get properties into a dict
if any(data["extraProperties"]["properties"]):
@@ -199,7 +197,7 @@ def _get_element(name, element_type, server=None, with_properties=True):
"""
element = {}
name = quote(name, safe="")
- data = _api_get("{0}/{1}".format(element_type, name), server)
+ data = _api_get("{}/{}".format(element_type, name), server)
# Format data, get properties if asked, and return the whole thing
if any(data["extraProperties"]["entity"]):
@@ -220,9 +218,9 @@ def _create_element(name, element_type, data, server=None):
data["property"] = ""
for key, value in data["properties"].items():
if not data["property"]:
- data["property"] += "{0}={1}".format(key, value.replace(":", "\\:"))
+ data["property"] += "{}={}".format(key, value.replace(":", "\\:"))
else:
- data["property"] += ":{0}={1}".format(key, value.replace(":", "\\:"))
+ data["property"] += ":{}={}".format(key, value.replace(":", "\\:"))
del data["properties"]
# Send request
@@ -242,7 +240,7 @@ def _update_element(name, element_type, data, server=None):
properties = []
for key, value in data["properties"].items():
properties.append({"name": key, "value": value})
- _api_post("{0}/{1}/property".format(element_type, name), properties, server)
+ _api_post("{}/{}/property".format(element_type, name), properties, server)
del data["properties"]
# If the element only contained properties
@@ -255,10 +253,10 @@ def _update_element(name, element_type, data, server=None):
update_data.update(data)
else:
__context__["retcode"] = salt.defaults.exitcodes.SALT_BUILD_FAIL
- raise CommandExecutionError("Cannot update {0}".format(name))
+ raise CommandExecutionError("Cannot update {}".format(name))
# Finally, update the element
- _api_post("{0}/{1}".format(element_type, name), _clean_data(update_data), server)
+ _api_post("{}/{}".format(element_type, name), _clean_data(update_data), server)
return unquote(name)
@@ -266,7 +264,7 @@ def _delete_element(name, element_type, data, server=None):
"""
Delete an element
"""
- _api_delete("{0}/{1}".format(element_type, quote(name, safe="")), data, server)
+ _api_delete("{}/{}".format(element_type, quote(name, safe="")), data, server)
return name
@@ -692,4 +690,4 @@ def delete_system_properties(name, server=None):
"""
Delete a system property
"""
- _api_delete("system-properties/{0}".format(name), None, server)
+ _api_delete("system-properties/{}".format(name), None, server)
diff --git a/salt/modules/keystone.py b/salt/modules/keystone.py
index 52cb461339..e8dd2fd99d 100644
--- a/salt/modules/keystone.py
+++ b/salt/modules/keystone.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""
Module for handling openstack keystone calls.
@@ -13,6 +12,7 @@ Module for handling openstack keystone calls.
keystone.tenant: admin
keystone.tenant_id: f80919baedab48ec8931f200c65a50df
keystone.auth_url: 'http://127.0.0.1:5000/v2.0/'
+ keystone.verify_ssl: True
OR (for token based authentication)
@@ -32,6 +32,7 @@ Module for handling openstack keystone calls.
keystone.tenant: admin
keystone.tenant_id: f80919baedab48ec8931f200c65a50df
keystone.auth_url: 'http://127.0.0.1:5000/v2.0/'
+ keystone.verify_ssl: True
openstack2:
keystone.user: admin
@@ -39,6 +40,7 @@ Module for handling openstack keystone calls.
keystone.tenant: admin
keystone.tenant_id: f80919baedab48ec8931f200c65a50df
keystone.auth_url: 'http://127.0.0.2:5000/v2.0/'
+ keystone.verify_ssl: True
With this configuration in place, any of the keystone functions can make use
of a configuration profile by declaring it explicitly.
@@ -49,17 +51,11 @@ Module for handling openstack keystone calls.
salt '*' keystone.tenant_list profile=openstack1
"""
-# Import Python libs
-from __future__ import absolute_import, print_function, unicode_literals
import logging
-# Import Salt Libs
import salt.utils.http
-# Import 3rd-party libs
-from salt.ext import six
-
HAS_KEYSTONE = False
try:
# pylint: disable=import-error
@@ -125,6 +121,7 @@ def _get_kwargs(profile=None, **connection_args):
endpoint = get("endpoint", "http://127.0.0.1:35357/v2.0")
user_domain_name = get("user_domain_name", "Default")
project_domain_name = get("project_domain_name", "Default")
+ verify_ssl = get("verify_ssl", True)
if token:
kwargs = {"token": token, "endpoint": endpoint}
else:
@@ -141,6 +138,7 @@ def _get_kwargs(profile=None, **connection_args):
# this ensures it's only passed in when defined
if insecure:
kwargs["insecure"] = True
+ kwargs["verify_ssl"] = verify_ssl
return kwargs
@@ -158,7 +156,7 @@ def api_version(profile=None, **connection_args):
auth_url = kwargs.get("auth_url", kwargs.get("endpoint", None))
try:
return salt.utils.http.query(
- auth_url, decode=True, decode_type="json", verify_ssl=False
+ auth_url, decode=True, decode_type="json", verify_ssl=kwargs["verify_ssl"]
)["dict"]["version"]["id"]
except KeyError:
return None
@@ -269,7 +267,7 @@ def ec2_credentials_delete(
if not user_id:
return {"Error": "Could not resolve User ID"}
kstone.ec2.delete(user_id, access_key)
- return 'ec2 key "{0}" deleted under user id "{1}"'.format(access_key, user_id)
+ return 'ec2 key "{}" deleted under user id "{}"'.format(access_key, user_id)
def ec2_credentials_get(
@@ -373,7 +371,7 @@ def endpoint_get(service, region=None, profile=None, interface=None, **connectio
]
if len(e) > 1:
return {
- "Error": "Multiple endpoints found ({0}) for the {1} service. Please specify region.".format(
+ "Error": "Multiple endpoints found ({}) for the {} service. Please specify region.".format(
e, service
)
}
@@ -396,12 +394,12 @@ def endpoint_list(profile=None, **connection_args):
ret = {}
for endpoint in kstone.endpoints.list():
- ret[endpoint.id] = dict(
- (value, getattr(endpoint, value))
+ ret[endpoint.id] = {
+ value: getattr(endpoint, value)
for value in dir(endpoint)
if not value.startswith("_")
- and isinstance(getattr(endpoint, value), (six.string_types, dict, bool))
- )
+ and isinstance(getattr(endpoint, value), (str, dict, bool))
+ }
return ret
@@ -487,7 +485,7 @@ def role_create(name, profile=None, **connection_args):
kstone = auth(profile, **connection_args)
if "Error" not in role_get(name=name, profile=profile, **connection_args):
- return {"Error": 'Role "{0}" already exists'.format(name)}
+ return {"Error": 'Role "{}" already exists'.format(name)}
kstone.roles.create(name)
return role_get(name=name, profile=profile, **connection_args)
@@ -518,9 +516,9 @@ def role_delete(role_id=None, name=None, profile=None, **connection_args):
role = kstone.roles.get(role_id)
kstone.roles.delete(role)
- ret = "Role ID {0} deleted".format(role_id)
+ ret = "Role ID {} deleted".format(role_id)
if name:
- ret += " ({0})".format(name)
+ ret += " ({})".format(name)
return ret
@@ -564,12 +562,12 @@ def role_list(profile=None, **connection_args):
kstone = auth(profile, **connection_args)
ret = {}
for role in kstone.roles.list():
- ret[role.name] = dict(
- (value, getattr(role, value))
+ ret[role.name] = {
+ value: getattr(role, value)
for value in dir(role)
if not value.startswith("_")
- and isinstance(getattr(role, value), (six.string_types, dict, bool))
- )
+ and isinstance(getattr(role, value), (str, dict, bool))
+ }
return ret
@@ -608,7 +606,7 @@ def service_delete(service_id=None, name=None, profile=None, **connection_args):
"id"
]
kstone.services.delete(service_id)
- return 'Keystone service ID "{0}" deleted'.format(service_id)
+ return 'Keystone service ID "{}" deleted'.format(service_id)
def service_get(service_id=None, name=None, profile=None, **connection_args):
@@ -633,12 +631,12 @@ def service_get(service_id=None, name=None, profile=None, **connection_args):
if not service_id:
return {"Error": "Unable to resolve service id"}
service = kstone.services.get(service_id)
- ret[service.name] = dict(
- (value, getattr(service, value))
+ ret[service.name] = {
+ value: getattr(service, value)
for value in dir(service)
if not value.startswith("_")
- and isinstance(getattr(service, value), (six.string_types, dict, bool))
- )
+ and isinstance(getattr(service, value), (str, dict, bool))
+ }
return ret
@@ -655,12 +653,12 @@ def service_list(profile=None, **connection_args):
kstone = auth(profile, **connection_args)
ret = {}
for service in kstone.services.list():
- ret[service.name] = dict(
- (value, getattr(service, value))
+ ret[service.name] = {
+ value: getattr(service, value)
for value in dir(service)
if not value.startswith("_")
- and isinstance(getattr(service, value), (six.string_types, dict, bool))
- )
+ and isinstance(getattr(service, value), (str, dict, bool))
+ }
return ret
@@ -741,10 +739,10 @@ def tenant_delete(tenant_id=None, name=None, profile=None, **connection_args):
if not tenant_id:
return {"Error": "Unable to resolve tenant id"}
getattr(kstone, _TENANTS, None).delete(tenant_id)
- ret = "Tenant ID {0} deleted".format(tenant_id)
+ ret = "Tenant ID {} deleted".format(tenant_id)
if name:
- ret += " ({0})".format(name)
+ ret += " ({})".format(name)
return ret
@@ -805,12 +803,12 @@ def tenant_get(tenant_id=None, name=None, profile=None, **connection_args):
if not tenant_id:
return {"Error": "Unable to resolve tenant id"}
tenant = getattr(kstone, _TENANTS, None).get(tenant_id)
- ret[tenant.name] = dict(
- (value, getattr(tenant, value))
+ ret[tenant.name] = {
+ value: getattr(tenant, value)
for value in dir(tenant)
if not value.startswith("_")
- and isinstance(getattr(tenant, value), (six.string_types, dict, bool))
- )
+ and isinstance(getattr(tenant, value), (str, dict, bool))
+ }
return ret
@@ -863,12 +861,12 @@ def tenant_list(profile=None, **connection_args):
ret = {}
for tenant in getattr(kstone, _TENANTS, None).list():
- ret[tenant.name] = dict(
- (value, getattr(tenant, value))
+ ret[tenant.name] = {
+ value: getattr(tenant, value)
for value in dir(tenant)
if not value.startswith("_")
- and isinstance(getattr(tenant, value), (six.string_types, dict, bool))
- )
+ and isinstance(getattr(tenant, value), (str, dict, bool))
+ }
return ret
@@ -938,12 +936,12 @@ def tenant_update(
tenant_id, name=name, description=description, enabled=enabled
)
- return dict(
- (value, getattr(updated, value))
+ return {
+ value: getattr(updated, value)
for value in dir(updated)
if not value.startswith("_")
- and isinstance(getattr(updated, value), (six.string_types, dict, bool))
- )
+ and isinstance(getattr(updated, value), (str, dict, bool))
+ }
def project_update(
@@ -1034,12 +1032,12 @@ def user_list(profile=None, **connection_args):
kstone = auth(profile, **connection_args)
ret = {}
for user in kstone.users.list():
- ret[user.name] = dict(
- (value, getattr(user, value, None))
+ ret[user.name] = {
+ value: getattr(user, value, None)
for value in dir(user)
if not value.startswith("_")
- and isinstance(getattr(user, value, None), (six.string_types, dict, bool))
- )
+ and isinstance(getattr(user, value, None), (str, dict, bool))
+ }
tenant_id = getattr(user, "tenantId", None)
if tenant_id:
ret[user.name]["tenant_id"] = tenant_id
@@ -1070,16 +1068,16 @@ def user_get(user_id=None, name=None, profile=None, **connection_args):
try:
user = kstone.users.get(user_id)
except keystoneclient.exceptions.NotFound:
- msg = "Could not find user '{0}'".format(user_id)
+ msg = "Could not find user '{}'".format(user_id)
log.error(msg)
return {"Error": msg}
- ret[user.name] = dict(
- (value, getattr(user, value, None))
+ ret[user.name] = {
+ value: getattr(user, value, None)
for value in dir(user)
if not value.startswith("_")
- and isinstance(getattr(user, value, None), (six.string_types, dict, bool))
- )
+ and isinstance(getattr(user, value, None), (str, dict, bool))
+ }
tenant_id = getattr(user, "tenantId", None)
if tenant_id:
@@ -1153,10 +1151,10 @@ def user_delete(user_id=None, name=None, profile=None, **connection_args):
if not user_id:
return {"Error": "Unable to resolve user id"}
kstone.users.delete(user_id)
- ret = "User ID {0} deleted".format(user_id)
+ ret = "User ID {} deleted".format(user_id)
if name:
- ret += " ({0})".format(name)
+ ret += " ({})".format(name)
return ret
@@ -1204,7 +1202,7 @@ def user_update(
if description is None:
description = getattr(user, "description", None)
else:
- description = six.text_type(description)
+ description = str(description)
project_id = None
if project:
@@ -1235,7 +1233,7 @@ def user_update(
if tenant_id:
kstone.users.update_tenant(user_id, tenant_id)
- ret = "Info updated for user ID {0}".format(user_id)
+ ret = "Info updated for user ID {}".format(user_id)
return ret
@@ -1313,9 +1311,9 @@ def user_password_update(
kstone.users.update(user=user_id, password=password)
else:
kstone.users.update_password(user=user_id, password=password)
- ret = "Password updated for user ID {0}".format(user_id)
+ ret = "Password updated for user ID {}".format(user_id)
if name:
- ret += " ({0})".format(name)
+ ret += " ({})".format(name)
return ret
@@ -1356,9 +1354,9 @@ role_id=ce377245c4ec9b70e1c639c89e8cead4
"id"
)
else:
- user = next(
- six.iterkeys(user_get(user_id, profile=profile, **connection_args))
- )["name"]
+ user = next(iter(user_get(user_id, profile=profile, **connection_args).keys()))[
+ "name"
+ ]
if not user_id:
return {"Error": "Unable to resolve user id"}
@@ -1368,7 +1366,7 @@ role_id=ce377245c4ec9b70e1c639c89e8cead4
].get("id")
else:
tenant = next(
- six.iterkeys(tenant_get(tenant_id, profile=profile, **connection_args))
+ iter(tenant_get(tenant_id, profile=profile, **connection_args).keys())
)["name"]
if not tenant_id:
return {"Error": "Unable to resolve tenant/project id"}
@@ -1376,9 +1374,9 @@ role_id=ce377245c4ec9b70e1c639c89e8cead4
if role:
role_id = role_get(name=role, profile=profile, **connection_args)[role]["id"]
else:
- role = next(
- six.iterkeys(role_get(role_id, profile=profile, **connection_args))
- )["name"]
+ role = next(iter(role_get(role_id, profile=profile, **connection_args).keys()))[
+ "name"
+ ]
if not role_id:
return {"Error": "Unable to resolve role id"}
@@ -1427,9 +1425,9 @@ role_id=ce377245c4ec9b70e1c639c89e8cead4
"id"
)
else:
- user = next(
- six.iterkeys(user_get(user_id, profile=profile, **connection_args))
- )["name"]
+ user = next(iter(user_get(user_id, profile=profile, **connection_args).keys()))[
+ "name"
+ ]
if not user_id:
return {"Error": "Unable to resolve user id"}
@@ -1439,7 +1437,7 @@ role_id=ce377245c4ec9b70e1c639c89e8cead4
].get("id")
else:
tenant = next(
- six.iterkeys(tenant_get(tenant_id, profile=profile, **connection_args))
+ iter(tenant_get(tenant_id, profile=profile, **connection_args).keys())
)["name"]
if not tenant_id:
return {"Error": "Unable to resolve tenant/project id"}
@@ -1447,7 +1445,7 @@ role_id=ce377245c4ec9b70e1c639c89e8cead4
if role:
role_id = role_get(name=role, profile=profile, **connection_args)[role]["id"]
else:
- role = next(six.iterkeys(role_get(role_id)))["name"]
+ role = next(iter(role_get(role_id).keys()))["name"]
if not role_id:
return {"Error": "Unable to resolve role id"}
@@ -1504,12 +1502,12 @@ tenant_id=7167a092ece84bae8cead4bf9d15bb3b
if _OS_IDENTITY_API_VERSION > 2:
for role in kstone.roles.list(user=user_id, project=tenant_id):
- ret[role.name] = dict(
- (value, getattr(role, value))
+ ret[role.name] = {
+ value: getattr(role, value)
for value in dir(role)
if not value.startswith("_")
- and isinstance(getattr(role, value), (six.string_types, dict, bool))
- )
+ and isinstance(getattr(role, value), (str, dict, bool))
+ }
else:
for role in kstone.roles.roles_for_user(user=user_id, tenant=tenant_id):
ret[role.name] = {
diff --git a/salt/modules/restartcheck.py b/salt/modules/restartcheck.py
index 4d541da357..c996e39dc7 100644
--- a/salt/modules/restartcheck.py
+++ b/salt/modules/restartcheck.py
@@ -11,6 +11,7 @@ https://packages.debian.org/debian-goodies) and psdel by Sam Morris.
"""
import os
import re
+import shlex
import subprocess
import sys
import time
@@ -612,7 +613,8 @@ def restartcheck(ignorelist=None, blacklist=None, excludepid=None, **kwargs):
for package in packages:
_check_timeout(start_time, timeout)
cmd = cmd_pkg_query + package
- paths = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
+ cmd = shlex.split(cmd)
+ paths = subprocess.Popen(cmd, stdout=subprocess.PIPE)
while True:
_check_timeout(start_time, timeout)
diff --git a/salt/modules/vsphere.py b/salt/modules/vsphere.py
index b3de8afb64..8fc2c410f2 100644
--- a/salt/modules/vsphere.py
+++ b/salt/modules/vsphere.py
@@ -336,7 +336,7 @@ def _get_proxy_connection_details():
details = __salt__["esxvm.get_details"]()
else:
raise CommandExecutionError("'{}' proxy is not supported" "".format(proxytype))
- return (
+ proxy_details = [
details.get("vcenter") if "vcenter" in details else details.get("host"),
details.get("username"),
details.get("password"),
@@ -345,7 +345,10 @@ def _get_proxy_connection_details():
details.get("mechanism"),
details.get("principal"),
details.get("domain"),
- )
+ ]
+ if "verify_ssl" in details:
+ proxy_details.append(details.get("verify_ssl"))
+ return tuple(proxy_details)
def supports_proxies(*proxy_types):
@@ -429,7 +432,7 @@ def gets_service_instance_via_proxy(fn):
# case 1: The call was made with enough positional
# parameters to include 'service_instance'
if not args[idx]:
- local_service_instance = salt.utils.vmware.get_service_instance(
+ local_service_instance = salt.utils.vmware.get_service_instance( # pylint: disable=no-value-for-parameter
*connection_details
)
# Tuples are immutable, so if we want to change what
@@ -440,7 +443,7 @@ def gets_service_instance_via_proxy(fn):
# case 2: Not enough positional parameters so
# 'service_instance' must be a named parameter
if not kwargs.get("service_instance"):
- local_service_instance = salt.utils.vmware.get_service_instance(
+ local_service_instance = salt.utils.vmware.get_service_instance( # pylint: disable=no-value-for-parameter
*connection_details
)
kwargs["service_instance"] = local_service_instance
@@ -448,7 +451,7 @@ def gets_service_instance_via_proxy(fn):
# 'service_instance' is not a paremter in the function definition
# but it will be caught by the **kwargs parameter
if not kwargs.get("service_instance"):
- local_service_instance = salt.utils.vmware.get_service_instance(
+ local_service_instance = salt.utils.vmware.get_service_instance( # pylint: disable=no-value-for-parameter
*connection_details
)
kwargs["service_instance"] = local_service_instance
@@ -485,7 +488,9 @@ def get_service_instance_via_proxy(service_instance=None):
See note above
"""
connection_details = _get_proxy_connection_details()
- return salt.utils.vmware.get_service_instance(*connection_details)
+ return salt.utils.vmware.get_service_instance( # pylint: disable=no-value-for-parameter
+ *connection_details
+ )
@depends(HAS_PYVMOMI)
@@ -1587,7 +1592,7 @@ def upload_ssh_key(
ssh_key_file=None,
protocol=None,
port=None,
- certificate_verify=False,
+ certificate_verify=None,
):
"""
Upload an ssh key for root to an ESXi host via http PUT.
@@ -1604,7 +1609,7 @@ def upload_ssh_key(
:param protocol: defaults to https, can be http if ssl is disabled on ESXi
:param port: defaults to 443 for https
:param certificate_verify: If true require that the SSL connection present
- a valid certificate
+ a valid certificate. Default: True
:return: Dictionary with a 'status' key, True if upload is successful.
If upload is unsuccessful, 'status' key will be False and
an 'Error' key will have an informative message.
@@ -1620,6 +1625,8 @@ def upload_ssh_key(
protocol = "https"
if port is None:
port = 443
+ if certificate_verify is None:
+ certificate_verify = True
url = "{}://{}:{}/host/ssh_root_authorized_keys".format(protocol, host, port)
ret = {}
@@ -1662,7 +1669,7 @@ def upload_ssh_key(
@ignores_kwargs("credstore")
def get_ssh_key(
- host, username, password, protocol=None, port=None, certificate_verify=False
+ host, username, password, protocol=None, port=None, certificate_verify=None
):
"""
Retrieve the authorized_keys entry for root.
@@ -1674,7 +1681,7 @@ def get_ssh_key(
:param protocol: defaults to https, can be http if ssl is disabled on ESXi
:param port: defaults to 443 for https
:param certificate_verify: If true require that the SSL connection present
- a valid certificate
+ a valid certificate. Default: True
:return: True if upload is successful
CLI Example:
@@ -1688,6 +1695,8 @@ def get_ssh_key(
protocol = "https"
if port is None:
port = 443
+ if certificate_verify is None:
+ certificate_verify = True
url = "{}://{}:{}/host/ssh_root_authorized_keys".format(protocol, host, port)
ret = {}
@@ -1717,7 +1726,7 @@ def get_ssh_key(
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
def get_host_datetime(
- host, username, password, protocol=None, port=None, host_names=None
+ host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True
):
"""
Get the date/time information for a given host or list of host_names.
@@ -1748,6 +1757,9 @@ def get_host_datetime(
``host`` location instead. This is useful for when service instance connection
information is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -1760,7 +1772,12 @@ def get_host_datetime(
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
host_names = _check_hosts(service_instance, host, host_names)
ret = {}
@@ -1775,7 +1792,9 @@ def get_host_datetime(
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def get_ntp_config(host, username, password, protocol=None, port=None, host_names=None):
+def get_ntp_config(
+ host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True
+):
"""
Get the NTP configuration information for a given host or list of host_names.
@@ -1805,6 +1824,9 @@ def get_ntp_config(host, username, password, protocol=None, port=None, host_name
``host`` location instead. This is useful for when service instance connection
information is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -1817,7 +1839,12 @@ def get_ntp_config(host, username, password, protocol=None, port=None, host_name
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
host_names = _check_hosts(service_instance, host, host_names)
ret = {}
@@ -1832,7 +1859,14 @@ def get_ntp_config(host, username, password, protocol=None, port=None, host_name
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
def get_service_policy(
- host, username, password, service_name, protocol=None, port=None, host_names=None
+ host,
+ username,
+ password,
+ service_name,
+ protocol=None,
+ port=None,
+ host_names=None,
+ verify_ssl=True,
):
"""
Get the service name's policy for a given host or list of hosts.
@@ -1879,6 +1913,9 @@ def get_service_policy(
for the ``host`` location instead. This is useful for when service instance
connection information is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -1891,7 +1928,12 @@ def get_service_policy(
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
valid_services = [
"DCUI",
@@ -1959,7 +2001,14 @@ def get_service_policy(
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
def get_service_running(
- host, username, password, service_name, protocol=None, port=None, host_names=None
+ host,
+ username,
+ password,
+ service_name,
+ protocol=None,
+ port=None,
+ host_names=None,
+ verify_ssl=True,
):
"""
Get the service name's running state for a given host or list of hosts.
@@ -2006,6 +2055,9 @@ def get_service_running(
for the ``host`` location instead. This is useful for when service instance
connection information is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2018,7 +2070,12 @@ def get_service_running(
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
valid_services = [
"DCUI",
@@ -2086,7 +2143,13 @@ def get_service_running(
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
def get_vmotion_enabled(
- host, username, password, protocol=None, port=None, host_names=None
+ host,
+ username,
+ password,
+ protocol=None,
+ port=None,
+ host_names=None,
+ verify_ssl=True,
):
"""
Get the VMotion enabled status for a given host or a list of host_names. Returns ``True``
@@ -2118,6 +2181,9 @@ def get_vmotion_enabled(
``host`` location instead. This is useful for when service instance
connection information is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2130,7 +2196,12 @@ def get_vmotion_enabled(
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
host_names = _check_hosts(service_instance, host, host_names)
ret = {}
@@ -2148,7 +2219,13 @@ def get_vmotion_enabled(
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
def get_vsan_enabled(
- host, username, password, protocol=None, port=None, host_names=None
+ host,
+ username,
+ password,
+ protocol=None,
+ port=None,
+ host_names=None,
+ verify_ssl=True,
):
"""
Get the VSAN enabled status for a given host or a list of host_names. Returns ``True``
@@ -2181,6 +2258,9 @@ def get_vsan_enabled(
``host`` location instead. This is useful for when service instance
connection information is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2193,7 +2273,12 @@ def get_vsan_enabled(
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
host_names = _check_hosts(service_instance, host, host_names)
ret = {}
@@ -2215,7 +2300,13 @@ def get_vsan_enabled(
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
def get_vsan_eligible_disks(
- host, username, password, protocol=None, port=None, host_names=None
+ host,
+ username,
+ password,
+ protocol=None,
+ port=None,
+ host_names=None,
+ verify_ssl=True,
):
"""
Returns a list of VSAN-eligible disks for a given host or list of host_names.
@@ -2246,6 +2337,9 @@ def get_vsan_eligible_disks(
for the ``host`` location instead. This is useful for when service instance
connection information is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2258,7 +2352,12 @@ def get_vsan_eligible_disks(
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
host_names = _check_hosts(service_instance, host, host_names)
response = _get_vsan_eligible_disks(service_instance, host, host_names)
@@ -2310,7 +2409,9 @@ def test_vcenter_connection(service_instance=None):
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def system_info(host, username, password, protocol=None, port=None):
+def system_info(
+ host, username, password, protocol=None, port=None, verify_ssl=True,
+):
"""
Return system information about a VMware environment.
@@ -2331,6 +2432,9 @@ def system_info(host, username, password, protocol=None, port=None):
Optionally set to alternate port if the host is not using the default
port. Default port is ``443``.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2338,7 +2442,12 @@ def system_info(host, username, password, protocol=None, port=None):
salt '*' vsphere.system_info 1.2.3.4 root bad-password
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
ret = salt.utils.vmware.get_inventory(service_instance).about.__dict__
if "apiType" in ret:
@@ -2351,7 +2460,9 @@ def system_info(host, username, password, protocol=None, port=None):
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def list_datacenters(host, username, password, protocol=None, port=None):
+def list_datacenters(
+ host, username, password, protocol=None, port=None, verify_ssl=True
+):
"""
Returns a list of datacenters for the specified host.
@@ -2372,6 +2483,9 @@ def list_datacenters(host, username, password, protocol=None, port=None):
Optionally set to alternate port if the host is not using the default
port. Default port is ``443``.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2380,14 +2494,19 @@ def list_datacenters(host, username, password, protocol=None, port=None):
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
return salt.utils.vmware.list_datacenters(service_instance)
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def list_clusters(host, username, password, protocol=None, port=None):
+def list_clusters(host, username, password, protocol=None, port=None, verify_ssl=True):
"""
Returns a list of clusters for the specified host.
@@ -2408,6 +2527,9 @@ def list_clusters(host, username, password, protocol=None, port=None):
Optionally set to alternate port if the host is not using the default
port. Default port is ``443``.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2416,14 +2538,21 @@ def list_clusters(host, username, password, protocol=None, port=None):
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
return salt.utils.vmware.list_clusters(service_instance)
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def list_datastore_clusters(host, username, password, protocol=None, port=None):
+def list_datastore_clusters(
+ host, username, password, protocol=None, port=None, verify_ssl=True
+):
"""
Returns a list of datastore clusters for the specified host.
@@ -2444,6 +2573,9 @@ def list_datastore_clusters(host, username, password, protocol=None, port=None):
Optionally set to alternate port if the host is not using the default
port. Default port is ``443``.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2451,14 +2583,21 @@ def list_datastore_clusters(host, username, password, protocol=None, port=None):
salt '*' vsphere.list_datastore_clusters 1.2.3.4 root bad-password
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
return salt.utils.vmware.list_datastore_clusters(service_instance)
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def list_datastores(host, username, password, protocol=None, port=None):
+def list_datastores(
+ host, username, password, protocol=None, port=None, verify_ssl=True
+):
"""
Returns a list of datastores for the specified host.
@@ -2479,6 +2618,9 @@ def list_datastores(host, username, password, protocol=None, port=None):
Optionally set to alternate port if the host is not using the default
port. Default port is ``443``.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2486,14 +2628,19 @@ def list_datastores(host, username, password, protocol=None, port=None):
salt '*' vsphere.list_datastores 1.2.3.4 root bad-password
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
return salt.utils.vmware.list_datastores(service_instance)
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def list_hosts(host, username, password, protocol=None, port=None):
+def list_hosts(host, username, password, protocol=None, port=None, verify_ssl=True):
"""
Returns a list of hosts for the specified VMware environment.
@@ -2514,6 +2661,9 @@ def list_hosts(host, username, password, protocol=None, port=None):
Optionally set to alternate port if the host is not using the default
port. Default port is ``443``.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2521,14 +2671,21 @@ def list_hosts(host, username, password, protocol=None, port=None):
salt '*' vsphere.list_hosts 1.2.3.4 root bad-password
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
return salt.utils.vmware.list_hosts(service_instance)
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def list_resourcepools(host, username, password, protocol=None, port=None):
+def list_resourcepools(
+ host, username, password, protocol=None, port=None, verify_ssl=True
+):
"""
Returns a list of resource pools for the specified host.
@@ -2549,6 +2706,9 @@ def list_resourcepools(host, username, password, protocol=None, port=None):
Optionally set to alternate port if the host is not using the default
port. Default port is ``443``.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2556,14 +2716,19 @@ def list_resourcepools(host, username, password, protocol=None, port=None):
salt '*' vsphere.list_resourcepools 1.2.3.4 root bad-password
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
return salt.utils.vmware.list_resourcepools(service_instance)
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def list_networks(host, username, password, protocol=None, port=None):
+def list_networks(host, username, password, protocol=None, port=None, verify_ssl=True):
"""
Returns a list of networks for the specified host.
@@ -2584,6 +2749,9 @@ def list_networks(host, username, password, protocol=None, port=None):
Optionally set to alternate port if the host is not using the default
port. Default port is ``443``.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2591,14 +2759,19 @@ def list_networks(host, username, password, protocol=None, port=None):
salt '*' vsphere.list_networks 1.2.3.4 root bad-password
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
return salt.utils.vmware.list_networks(service_instance)
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def list_vms(host, username, password, protocol=None, port=None):
+def list_vms(host, username, password, protocol=None, port=None, verify_ssl=True):
"""
Returns a list of VMs for the specified host.
@@ -2619,6 +2792,9 @@ def list_vms(host, username, password, protocol=None, port=None):
Optionally set to alternate port if the host is not using the default
port. Default port is ``443``.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2626,14 +2802,19 @@ def list_vms(host, username, password, protocol=None, port=None):
salt '*' vsphere.list_vms 1.2.3.4 root bad-password
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
return salt.utils.vmware.list_vms(service_instance)
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def list_folders(host, username, password, protocol=None, port=None):
+def list_folders(host, username, password, protocol=None, port=None, verify_ssl=True):
"""
Returns a list of folders for the specified host.
@@ -2654,6 +2835,9 @@ def list_folders(host, username, password, protocol=None, port=None):
Optionally set to alternate port if the host is not using the default
port. Default port is ``443``.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2661,14 +2845,19 @@ def list_folders(host, username, password, protocol=None, port=None):
salt '*' vsphere.list_folders 1.2.3.4 root bad-password
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
return salt.utils.vmware.list_folders(service_instance)
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def list_dvs(host, username, password, protocol=None, port=None):
+def list_dvs(host, username, password, protocol=None, port=None, verify_ssl=True):
"""
Returns a list of distributed virtual switches for the specified host.
@@ -2689,6 +2878,9 @@ def list_dvs(host, username, password, protocol=None, port=None):
Optionally set to alternate port if the host is not using the default
port. Default port is ``443``.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2696,14 +2888,19 @@ def list_dvs(host, username, password, protocol=None, port=None):
salt '*' vsphere.list_dvs 1.2.3.4 root bad-password
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
return salt.utils.vmware.list_dvs(service_instance)
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def list_vapps(host, username, password, protocol=None, port=None):
+def list_vapps(host, username, password, protocol=None, port=None, verify_ssl=True):
"""
Returns a list of vApps for the specified host.
@@ -2724,6 +2921,9 @@ def list_vapps(host, username, password, protocol=None, port=None):
Optionally set to alternate port if the host is not using the default
port. Default port is ``443``.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2732,14 +2932,21 @@ def list_vapps(host, username, password, protocol=None, port=None):
salt '*' vsphere.list_vapps 1.2.3.4 root bad-password
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
return salt.utils.vmware.list_vapps(service_instance)
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def list_ssds(host, username, password, protocol=None, port=None, host_names=None):
+def list_ssds(
+ host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True
+):
"""
Returns a list of SSDs for the given host or list of host_names.
@@ -2769,6 +2976,9 @@ def list_ssds(host, username, password, protocol=None, port=None, host_names=Non
``host`` location instead. This is useful for when service instance
connection information is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2781,7 +2991,12 @@ def list_ssds(host, username, password, protocol=None, port=None, host_names=Non
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
host_names = _check_hosts(service_instance, host, host_names)
ret = {}
@@ -2798,7 +3013,9 @@ def list_ssds(host, username, password, protocol=None, port=None, host_names=Non
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def list_non_ssds(host, username, password, protocol=None, port=None, host_names=None):
+def list_non_ssds(
+ host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True
+):
"""
Returns a list of Non-SSD disks for the given host or list of host_names.
@@ -2835,6 +3052,9 @@ def list_non_ssds(host, username, password, protocol=None, port=None, host_names
``host`` location instead. This is useful for when service instance
connection information is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2847,7 +3067,12 @@ def list_non_ssds(host, username, password, protocol=None, port=None, host_names
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
host_names = _check_hosts(service_instance, host, host_names)
ret = {}
@@ -2865,7 +3090,14 @@ def list_non_ssds(host, username, password, protocol=None, port=None, host_names
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
def set_ntp_config(
- host, username, password, ntp_servers, protocol=None, port=None, host_names=None
+ host,
+ username,
+ password,
+ ntp_servers,
+ protocol=None,
+ port=None,
+ host_names=None,
+ verify_ssl=True,
):
"""
Set NTP configuration for a given host of list of host_names.
@@ -2900,6 +3132,9 @@ def set_ntp_config(
``host`` location instead. This is useful for when service instance connection
information is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -2912,7 +3147,12 @@ def set_ntp_config(
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
if not isinstance(ntp_servers, list):
raise CommandExecutionError("'ntp_servers' must be a list.")
@@ -2947,7 +3187,14 @@ def set_ntp_config(
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
def service_start(
- host, username, password, service_name, protocol=None, port=None, host_names=None
+ host,
+ username,
+ password,
+ service_name,
+ protocol=None,
+ port=None,
+ host_names=None,
+ verify_ssl=True,
):
"""
Start the named service for the given host or list of hosts.
@@ -2994,6 +3241,9 @@ def service_start(
location instead. This is useful for when service instance connection information
is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -3006,7 +3256,12 @@ def service_start(
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
host_names = _check_hosts(service_instance, host, host_names)
valid_services = [
@@ -3074,7 +3329,14 @@ def service_start(
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
def service_stop(
- host, username, password, service_name, protocol=None, port=None, host_names=None
+ host,
+ username,
+ password,
+ service_name,
+ protocol=None,
+ port=None,
+ host_names=None,
+ verify_ssl=True,
):
"""
Stop the named service for the given host or list of hosts.
@@ -3121,6 +3383,9 @@ def service_stop(
location instead. This is useful for when service instance connection information
is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -3133,7 +3398,12 @@ def service_stop(
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
host_names = _check_hosts(service_instance, host, host_names)
valid_services = [
@@ -3199,7 +3469,14 @@ def service_stop(
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
def service_restart(
- host, username, password, service_name, protocol=None, port=None, host_names=None
+ host,
+ username,
+ password,
+ service_name,
+ protocol=None,
+ port=None,
+ host_names=None,
+ verify_ssl=True,
):
"""
Restart the named service for the given host or list of hosts.
@@ -3246,6 +3523,9 @@ def service_restart(
location instead. This is useful for when service instance connection information
is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -3258,7 +3538,12 @@ def service_restart(
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
host_names = _check_hosts(service_instance, host, host_names)
valid_services = [
@@ -3334,6 +3619,7 @@ def set_service_policy(
protocol=None,
port=None,
host_names=None,
+ verify_ssl=True,
):
"""
Set the service name's policy for a given host or list of hosts.
@@ -3383,6 +3669,9 @@ def set_service_policy(
for the ``host`` location instead. This is useful for when service instance
connection information is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -3395,7 +3684,12 @@ def set_service_policy(
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
host_names = _check_hosts(service_instance, host, host_names)
valid_services = [
@@ -3481,7 +3775,7 @@ def set_service_policy(
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
def update_host_datetime(
- host, username, password, protocol=None, port=None, host_names=None
+ host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True
):
"""
Update the date/time on the given host or list of host_names. This function should be
@@ -3513,6 +3807,9 @@ def update_host_datetime(
location instead. This is useful for when service instance connection
information is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -3525,7 +3822,12 @@ def update_host_datetime(
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
host_names = _check_hosts(service_instance, host, host_names)
ret = {}
@@ -3550,7 +3852,7 @@ def update_host_datetime(
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
def update_host_password(
- host, username, password, new_password, protocol=None, port=None
+ host, username, password, new_password, protocol=None, port=None, verify_ssl=True
):
"""
Update the password for a given host.
@@ -3577,6 +3879,9 @@ def update_host_password(
Optionally set to alternate port if the host is not using the default
port. Default port is ``443``.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -3585,7 +3890,12 @@ def update_host_password(
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
# Get LocalAccountManager object
account_manager = salt.utils.vmware.get_inventory(service_instance).accountManager
@@ -3615,7 +3925,7 @@ def update_host_password(
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
def vmotion_disable(
- host, username, password, protocol=None, port=None, host_names=None
+ host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True
):
"""
Disable vMotion for a given host or list of host_names.
@@ -3646,6 +3956,9 @@ def vmotion_disable(
location instead. This is useful for when service instance connection
information is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -3658,7 +3971,12 @@ def vmotion_disable(
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
host_names = _check_hosts(service_instance, host, host_names)
ret = {}
@@ -3683,7 +4001,14 @@ def vmotion_disable(
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
def vmotion_enable(
- host, username, password, protocol=None, port=None, host_names=None, device="vmk0"
+ host,
+ username,
+ password,
+ protocol=None,
+ port=None,
+ host_names=None,
+ device="vmk0",
+ verify_ssl=True,
):
"""
Enable vMotion for a given host or list of host_names.
@@ -3718,6 +4043,9 @@ def vmotion_enable(
The device that uniquely identifies the VirtualNic that will be used for
VMotion for each host. Defaults to ``vmk0``.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -3730,7 +4058,12 @@ def vmotion_enable(
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
host_names = _check_hosts(service_instance, host, host_names)
ret = {}
@@ -3754,7 +4087,9 @@ def vmotion_enable(
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def vsan_add_disks(host, username, password, protocol=None, port=None, host_names=None):
+def vsan_add_disks(
+ host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True
+):
"""
Add any VSAN-eligible disks to the VSAN System for the given host or list of host_names.
@@ -3785,6 +4120,9 @@ def vsan_add_disks(host, username, password, protocol=None, port=None, host_name
VSAN system for the ``host`` location instead. This is useful for when service
instance connection information is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -3797,7 +4135,12 @@ def vsan_add_disks(host, username, password, protocol=None, port=None, host_name
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
host_names = _check_hosts(service_instance, host, host_names)
response = _get_vsan_eligible_disks(service_instance, host, host_names)
@@ -3872,7 +4215,9 @@ def vsan_add_disks(host, username, password, protocol=None, port=None, host_name
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def vsan_disable(host, username, password, protocol=None, port=None, host_names=None):
+def vsan_disable(
+ host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True
+):
"""
Disable VSAN for a given host or list of host_names.
@@ -3902,6 +4247,9 @@ def vsan_disable(host, username, password, protocol=None, port=None, host_names=
location instead. This is useful for when service instance connection
information is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -3914,7 +4262,12 @@ def vsan_disable(host, username, password, protocol=None, port=None, host_names=
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
# Create a VSAN Configuration Object and set the enabled attribute to True
vsan_config = vim.vsan.host.ConfigInfo()
@@ -3961,7 +4314,9 @@ def vsan_disable(host, username, password, protocol=None, port=None, host_names=
@depends(HAS_PYVMOMI)
@ignores_kwargs("credstore")
-def vsan_enable(host, username, password, protocol=None, port=None, host_names=None):
+def vsan_enable(
+ host, username, password, protocol=None, port=None, host_names=None, verify_ssl=True
+):
"""
Enable VSAN for a given host or list of host_names.
@@ -3991,6 +4346,9 @@ def vsan_enable(host, username, password, protocol=None, port=None, host_names=N
location instead. This is useful for when service instance connection
information is used for a single ESXi host.
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -4003,7 +4361,12 @@ def vsan_enable(host, username, password, protocol=None, port=None, host_names=N
host_names='[esxi-1.host.com, esxi-2.host.com]'
"""
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
# Create a VSAN Configuration Object and set the enabled attribute to True
vsan_config = vim.vsan.host.ConfigInfo()
@@ -7489,6 +7852,7 @@ def add_host_to_dvs(
protocol=None,
port=None,
host_names=None,
+ verify_ssl=True,
):
"""
Adds an ESXi host to a vSphere Distributed Virtual Switch and migrates
@@ -7531,6 +7895,9 @@ def add_host_to_dvs(
host_names:
An array of VMware host names to migrate
+ verify_ssl
+ Verify the SSL certificate. Default: True
+
CLI Example:
.. code-block:: bash
@@ -7658,7 +8025,12 @@ def add_host_to_dvs(
ret["success"] = True
ret["message"] = []
service_instance = salt.utils.vmware.get_service_instance(
- host=host, username=username, password=password, protocol=protocol, port=port
+ host=host,
+ username=username,
+ password=password,
+ protocol=protocol,
+ port=port,
+ verify_ssl=verify_ssl,
)
dvs = salt.utils.vmware._get_dvs(service_instance, dvs_name)
if not dvs:
@@ -9926,7 +10298,7 @@ def _delete_device(device):
return device_spec
-def _get_client(server, username, password):
+def _get_client(server, username, password, verify_ssl=None, ca_bundle=None):
"""
Establish client through proxy or with user provided credentials.
@@ -9936,12 +10308,17 @@ def _get_client(server, username, password):
Username associated with the vCenter center.
:param basestring password:
Password associated with the vCenter center.
+ :param boolean verify_ssl:
+ Verify the SSL certificate. Default: True
+ :param basestring ca_bundle:
+ Path to the ca bundle to use when verifying SSL certificates.
:returns:
vSphere Client instance.
:rtype:
vSphere.Client
"""
# Get salted vSphere Client
+ details = None
if not (server and username and password):
# User didn't provide CLI args so use proxy information
details = __salt__["vcenter.get_details"]()
@@ -9949,9 +10326,32 @@ def _get_client(server, username, password):
username = details["username"]
password = details["password"]
+ if verify_ssl is None:
+ if details is None:
+ details = __salt__["vcenter.get_details"]()
+ verify_ssl = details.get("verify_ssl", True)
+ if verify_ssl is None:
+ verify_ssl = True
+
+ if ca_bundle is None:
+ if details is None:
+ details = __salt__["vcenter.get_details"]()
+ ca_bundle = details.get("ca_bundle", None)
+
+ if verify_ssl is False and ca_bundle is not None:
+ log.error("Cannot set verify_ssl to False and ca_bundle together")
+ return False
+
+ if ca_bundle:
+ ca_bundle = salt.utils.http.get_ca_bundle({"ca_bundle": ca_bundle})
+
# Establish connection with client
client = salt.utils.vmware.get_vsphere_client(
- server=server, username=username, password=password
+ server=server,
+ username=username,
+ password=password,
+ verify_ssl=verify_ssl,
+ ca_bundle=ca_bundle,
)
# Will return None if utility function causes Unauthenticated error
return client
@@ -9961,7 +10361,12 @@ def _get_client(server, username, password):
@supports_proxies("vcenter")
@gets_service_instance_via_proxy
def list_tag_categories(
- server=None, username=None, password=None, service_instance=None
+ server=None,
+ username=None,
+ password=None,
+ service_instance=None,
+ verify_ssl=None,
+ ca_bundle=None,
):
"""
List existing categories a user has access to.
@@ -9978,13 +10383,19 @@ def list_tag_categories(
Username associated with the vCenter center.
:param basestring password:
Password associated with the vCenter center.
+ :param boolean verify_ssl:
+ Verify the SSL certificate. Default: True
+ :param basestring ca_bundle:
+ Path to the ca bundle to use when verifying SSL certificates.
:returns:
Value(s) of category_id.
:rtype:
list of str
"""
categories = None
- client = _get_client(server, username, password)
+ client = _get_client(
+ server, username, password, verify_ssl=verify_ssl, ca_bundle=ca_bundle
+ )
if client:
categories = client.tagging.Category.list()
@@ -9994,7 +10405,14 @@ def list_tag_categories(
@depends(HAS_PYVMOMI, HAS_VSPHERE_SDK)
@supports_proxies("vcenter")
@gets_service_instance_via_proxy
-def list_tags(server=None, username=None, password=None, service_instance=None):
+def list_tags(
+ server=None,
+ username=None,
+ password=None,
+ service_instance=None,
+ verify_ssl=None,
+ ca_bundle=None,
+):
"""
List existing tags a user has access to.
@@ -10010,13 +10428,19 @@ def list_tags(server=None, username=None, password=None, service_instance=None):
Username associated with the vCenter center.
:param basestring password:
Password associated with the vCenter center.
+ :param boolean verify_ssl:
+ Verify the SSL certificate. Default: True
+ :param basestring ca_bundle:
+ Path to the ca bundle to use when verifying SSL certificates.
:return:
Value(s) of tag_id.
:rtype:
list of str
"""
tags = None
- client = _get_client(server, username, password)
+ client = _get_client(
+ server, username, password, verify_ssl=verify_ssl, ca_bundle=ca_bundle
+ )
if client:
tags = client.tagging.Tag.list()
@@ -10034,6 +10458,8 @@ def attach_tag(
username=None,
password=None,
service_instance=None,
+ verify_ssl=None,
+ ca_bundle=None,
):
"""
Attach an existing tag to an input object.
@@ -10066,6 +10492,10 @@ def attach_tag(
Username associated with the vCenter center.
:param basestring password:
Password associated with the vCenter center.
+ :param boolean verify_ssl:
+ Verify the SSL certificate. Default: True
+ :param basestring ca_bundle:
+ Path to the ca bundle to use when verifying SSL certificates.
:return:
The list of all tag identifiers that correspond to the
tags attached to the given object.
@@ -10077,7 +10507,9 @@ def attach_tag(
if the user can not be authenticated.
"""
tag_attached = None
- client = _get_client(server, username, password)
+ client = _get_client(
+ server, username, password, verify_ssl=verify_ssl, ca_bundle=ca_bundle
+ )
if client:
# Create dynamic id object associated with a type and an id.
@@ -10110,6 +10542,8 @@ def list_attached_tags(
username=None,
password=None,
service_instance=None,
+ verify_ssl=None,
+ ca_bundle=None,
):
"""
List existing tags a user has access to.
@@ -10132,6 +10566,10 @@ def list_attached_tags(
Username associated with the vCenter center.
:param basestring password:
Password associated with the vCenter center.
+ :param boolean verify_ssl:
+ Verify the SSL certificate. Default: True
+ :param basestring ca_bundle:
+ Path to the ca bundle to use when verifying SSL certificates.
:return:
The list of all tag identifiers that correspond to the
tags attached to the given object.
@@ -10143,7 +10581,9 @@ def list_attached_tags(
if the user can not be authenticated.
"""
attached_tags = None
- client = _get_client(server, username, password)
+ client = _get_client(
+ server, username, password, verify_ssl=verify_ssl, ca_bundle=ca_bundle
+ )
if client:
# Create dynamic id object associated with a type and an id.
@@ -10175,6 +10615,8 @@ def create_tag_category(
username=None,
password=None,
service_instance=None,
+ verify_ssl=None,
+ ca_bundle=None,
):
"""
Create a category with given cardinality.
@@ -10197,6 +10639,10 @@ def create_tag_category(
Username associated with the vCenter center.
:param basestring password:
Password associated with the vCenter center.
+ :param boolean verify_ssl:
+ Verify the SSL certificate. Default: True
+ :param basestring ca_bundle:
+ Path to the ca bundle to use when verifying SSL certificates.
:return:
Identifier of the created category.
:rtype:
@@ -10210,7 +10656,9 @@ def create_tag_category(
if you do not have the privilege to create a category.
"""
category_created = None
- client = _get_client(server, username, password)
+ client = _get_client(
+ server, username, password, verify_ssl=verify_ssl, ca_bundle=ca_bundle
+ )
if client:
if cardinality == "SINGLE":
@@ -10241,7 +10689,13 @@ def create_tag_category(
@supports_proxies("vcenter")
@gets_service_instance_via_proxy
def delete_tag_category(
- category_id, server=None, username=None, password=None, service_instance=None
+ category_id,
+ server=None,
+ username=None,
+ password=None,
+ service_instance=None,
+ verify_ssl=None,
+ ca_bundle=None,
):
"""
Delete a category.
@@ -10262,6 +10716,10 @@ def delete_tag_category(
Username associated with the vCenter center.
:param basestring password:
Password associated with the vCenter center.
+ :param boolean verify_ssl:
+ Verify the SSL certificate. Default: True
+ :param basestring ca_bundle:
+ Path to the ca bundle to use when verifying SSL certificates.
:raise: NotFound
if the tag for the given tag_id does not exist in the system.
:raise: Unauthorized
@@ -10270,7 +10728,9 @@ def delete_tag_category(
if the user can not be authenticated.
"""
category_deleted = None
- client = _get_client(server, username, password)
+ client = _get_client(
+ server, username, password, verify_ssl=verify_ssl, ca_bundle=ca_bundle
+ )
if client:
try:
@@ -10294,6 +10754,8 @@ def create_tag(
username=None,
password=None,
service_instance=None,
+ verify_ssl=None,
+ ca_bundle=None,
):
"""
Create a tag under a category with given description.
@@ -10316,6 +10778,10 @@ def create_tag(
Given description of tag category.
:param str category_id:
Value of category_id representative of the category created previously.
+ :param boolean verify_ssl:
+ Verify the SSL certificate. Default: True
+ :param basestring ca_bundle:
+ Path to the ca bundle to use when verifying SSL certificates.
:return:
The identifier of the created tag.
:rtype:
@@ -10332,7 +10798,9 @@ def create_tag(
if you do not have the privilege to create tag.
"""
tag_created = None
- client = _get_client(server, username, password)
+ client = _get_client(
+ server, username, password, verify_ssl=verify_ssl, ca_bundle=ca_bundle
+ )
if client:
create_spec = client.tagging.Tag.CreateSpec()
@@ -10353,7 +10821,13 @@ def create_tag(
@supports_proxies("vcenter")
@gets_service_instance_via_proxy
def delete_tag(
- tag_id, server=None, username=None, password=None, service_instance=None
+ tag_id,
+ server=None,
+ username=None,
+ password=None,
+ service_instance=None,
+ verify_ssl=None,
+ ca_bundle=None,
):
"""
Delete a tag.
@@ -10374,6 +10848,10 @@ def delete_tag(
Username associated with the vCenter center.
:param basestring password:
Password associated with the vCenter center.
+ :param boolean verify_ssl:
+ Verify the SSL certificate. Default: True
+ :param basestring ca_bundle:
+ Path to the ca bundle to use when verifying SSL certificates.
:raise: AlreadyExists
if the name provided in the create_spec is the name of an already
existing category.
@@ -10383,7 +10861,9 @@ def delete_tag(
if you do not have the privilege to create a category.
"""
tag_deleted = None
- client = _get_client(server, username, password)
+ client = _get_client(
+ server, username, password, verify_ssl=verify_ssl, ca_bundle=ca_bundle
+ )
if client:
try:
diff --git a/salt/modules/zenoss.py b/salt/modules/zenoss.py
index 9c6b7de7b5..5cb64bed18 100644
--- a/salt/modules/zenoss.py
+++ b/salt/modules/zenoss.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""
Module for working with the Zenoss API
@@ -16,18 +15,19 @@ Module for working with the Zenoss API
hostname: https://zenoss.example.com
username: admin
password: admin123
+ verify_ssl: True
+ ca_bundle: /etc/ssl/certs/ca-certificates.crt
"""
-from __future__ import absolute_import, print_function, unicode_literals
-
import logging
import re
+import salt.utils.http
import salt.utils.json
try:
- import requests
+ import requests # pylint: disable=unused-import
HAS_LIBS = True
except ImportError:
@@ -53,7 +53,7 @@ def __virtual__():
else:
return (
False,
- "The '{0}' module could not be loaded: "
+ "The '{}' module could not be loaded: "
"'requests' is not installed.".format(__virtualname__),
)
@@ -79,11 +79,13 @@ def _session():
"""
config = __salt__["config.option"]("zenoss")
- session = requests.session()
- session.auth = (config.get("username"), config.get("password"))
- session.verify = False
- session.headers.update({"Content-type": "application/json; charset=utf-8"})
- return session
+ return salt.utils.http.session(
+ user=config.get("username"),
+ password=config.get("password"),
+ verify_ssl=config.get("verify_ssl", True),
+ ca_bundle=config.get("ca_bundle"),
+ headers={"Content-type": "application/json; charset=utf-8"},
+ )
def _router_request(router, method, data=None):
@@ -99,7 +101,7 @@ def _router_request(router, method, data=None):
config = __salt__["config.option"]("zenoss")
log.debug("Making request to router %s with method %s", router, method)
- url = "{0}/zport/dmd/{1}_router".format(config.get("hostname"), ROUTERS[router])
+ url = "{}/zport/dmd/{}_router".format(config.get("hostname"), ROUTERS[router])
response = _session().post(url, data=req_data)
# The API returns a 200 response code even whe auth is bad.
@@ -212,7 +214,7 @@ def set_prod_state(prod_state, device=None):
device_object = find_device(device)
if not device_object:
- return "Unable to find a device in Zenoss for {0}".format(device)
+ return "Unable to find a device in Zenoss for {}".format(device)
log.info("Setting prodState to %d on %s device", prod_state, device)
data = dict(
diff --git a/salt/pillar/vmware_pillar.py b/salt/pillar/vmware_pillar.py
index a33b394500..08bdb18e56 100644
--- a/salt/pillar/vmware_pillar.py
+++ b/salt/pillar/vmware_pillar.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""
Pillar data from vCenter or an ESXi host
@@ -142,18 +141,12 @@ Optionally, the following keyword arguments can be passed to the ext_pillar for
part of the pillar regardless of this setting.
"""
-from __future__ import absolute_import, print_function, unicode_literals
-# Import python libs
import logging
-# Import salt libs
import salt.utils.dictupdate as dictupdate
import salt.utils.vmware
-# Import 3rd-party libs
-from salt.ext import six
-
try:
# pylint: disable=no-name-in-module
from pyVmomi import vim
@@ -370,7 +363,12 @@ def ext_pillar(minion_id, pillar, **kwargs): # pylint: disable=W0613
vmware_pillar[pillar_key] = {}
try:
_conn = salt.utils.vmware.get_service_instance(
- host, username, password, protocol, port
+ host,
+ username,
+ password,
+ protocol,
+ port,
+ verify_ssl=kwargs.get("verify_ssl", True),
)
if _conn:
data = None
@@ -410,12 +408,10 @@ def ext_pillar(minion_id, pillar, **kwargs): # pylint: disable=W0613
)
except RuntimeError:
log.error(
- (
- "A runtime error occurred in the vmware_pillar, "
- "this is likely caused by an infinite recursion in "
- "a requested attribute. Verify your requested attributes "
- "and reconfigure the pillar."
- )
+ "A runtime error occurred in the vmware_pillar, "
+ "this is likely caused by an infinite recursion in "
+ "a requested attribute. Verify your requested attributes "
+ "and reconfigure the pillar."
)
return vmware_pillar
@@ -435,7 +431,7 @@ def _recurse_config_to_dict(t_data):
return t_list
elif isinstance(t_data, dict):
t_dict = {}
- for k, v in six.iteritems(t_data):
+ for k, v in t_data.items():
t_dict[k] = _recurse_config_to_dict(v)
return t_dict
else:
diff --git a/salt/proxy/cimc.py b/salt/proxy/cimc.py
index f302eaa6cc..a6002440ef 100644
--- a/salt/proxy/cimc.py
+++ b/salt/proxy/cimc.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""
Proxy Minion interface module for managing Cisco Integrated Management Controller devices
=========================================================================================
@@ -40,6 +39,7 @@ the ID.
host: <ip or dns name of cimc host>
username: <cimc username>
password: <cimc password>
+ verify_ssl: True
proxytype
^^^^^^^^^
@@ -66,13 +66,10 @@ password
The password used to login to the cimc host. Required.
"""
-from __future__ import absolute_import, print_function, unicode_literals
-# Import Python Libs
import logging
import re
-# Import Salt Libs
import salt.exceptions
from salt._compat import ElementTree as ET
@@ -102,9 +99,7 @@ def _validate_response_code(response_code_to_check, cookie_to_logout=None):
if formatted_response_code not in ["200", "201", "202", "204"]:
if cookie_to_logout:
logout(cookie_to_logout)
- log.error(
- "Received error HTTP status code: {0}".format(formatted_response_code)
- )
+ log.error("Received error HTTP status code: {}".format(formatted_response_code))
raise salt.exceptions.CommandExecutionError(
"Did not receive a valid response from host."
)
@@ -125,7 +120,7 @@ def init(opts):
log.critical("No 'passwords' key found in pillar for this proxy.")
return False
- DETAILS["url"] = "https://{0}/nuova".format(opts["proxy"]["host"])
+ DETAILS["url"] = "https://{}/nuova".format(opts["proxy"]["host"])
DETAILS["headers"] = {
"Content-Type": "application/x-www-form-urlencoded",
"Content-Length": 62,
@@ -136,6 +131,10 @@ def init(opts):
DETAILS["host"] = opts["proxy"]["host"]
DETAILS["username"] = opts["proxy"].get("username")
DETAILS["password"] = opts["proxy"].get("password")
+ verify_ssl = opts["proxy"].get("verify_ssl")
+ if verify_ssl is None:
+ verify_ssl = True
+ DETAILS["verify_ssl"] = verify_ssl
# Ensure connectivity to the device
log.debug("Attempting to connect to cimc proxy host.")
@@ -158,8 +157,8 @@ def set_config_modify(dn=None, inconfig=None, hierarchical=False):
h = "true"
payload = (
- '<configConfMo cookie="{0}" inHierarchical="{1}" dn="{2}">'
- "<inConfig>{3}</inConfig></configConfMo>".format(cookie, h, dn, inconfig)
+ '<configConfMo cookie="{}" inHierarchical="{}" dn="{}">'
+ "<inConfig>{}</inConfig></configConfMo>".format(cookie, h, dn, inconfig)
)
r = __utils__["http.query"](
DETAILS["url"],
@@ -167,7 +166,7 @@ def set_config_modify(dn=None, inconfig=None, hierarchical=False):
method="POST",
decode_type="plain",
decode=True,
- verify_ssl=False,
+ verify_ssl=DETAILS["verify_ssl"],
raise_error=True,
status=True,
headers=DETAILS["headers"],
@@ -195,7 +194,7 @@ def get_config_resolver_class(cid=None, hierarchical=False):
if hierarchical is True:
h = "true"
- payload = '<configResolveClass cookie="{0}" inHierarchical="{1}" classId="{2}"/>'.format(
+ payload = '<configResolveClass cookie="{}" inHierarchical="{}" classId="{}"/>'.format(
cookie, h, cid
)
r = __utils__["http.query"](
@@ -204,7 +203,7 @@ def get_config_resolver_class(cid=None, hierarchical=False):
method="POST",
decode_type="plain",
decode=True,
- verify_ssl=False,
+ verify_ssl=DETAILS["verify_ssl"],
raise_error=True,
status=True,
headers=DETAILS["headers"],
@@ -226,7 +225,7 @@ def logon():
Logs into the cimc device and returns the session cookie.
"""
content = {}
- payload = "<aaaLogin inName='{0}' inPassword='{1}'></aaaLogin>".format(
+ payload = "<aaaLogin inName='{}' inPassword='{}'></aaaLogin>".format(
DETAILS["username"], DETAILS["password"]
)
r = __utils__["http.query"](
@@ -235,7 +234,7 @@ def logon():
method="POST",
decode_type="plain",
decode=True,
- verify_ssl=False,
+ verify_ssl=DETAILS["verify_ssl"],
raise_error=False,
status=True,
headers=DETAILS["headers"],
@@ -265,7 +264,7 @@ def logout(cookie=None):
method="POST",
decode_type="plain",
decode=True,
- verify_ssl=False,
+ verify_ssl=DETAILS["verify_ssl"],
raise_error=True,
headers=DETAILS["headers"],
)
diff --git a/salt/proxy/panos.py b/salt/proxy/panos.py
index 5c298b4f7d..50a4639911 100644
--- a/salt/proxy/panos.py
+++ b/salt/proxy/panos.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""
Proxy Minion interface module for managing Palo Alto firewall devices
=====================================================================
@@ -53,6 +52,7 @@ the device with username and password.
host: <ip or dns name of panos host>
username: <panos username>
password: <panos password>
+ verify_ssl: True
proxytype
^^^^^^^^^
@@ -203,17 +203,12 @@ apikey
The generated XML API key for the Panorama server. Required.
"""
-from __future__ import absolute_import, print_function, unicode_literals
-# Import Python Libs
import logging
import salt.exceptions
import salt.utils.xmlutil as xml
-
-# Import Salt Libs
from salt._compat import ElementTree as ET
-from salt.ext import six
# This must be present or the Salt loader won't load this module.
__proxyenabled__ = ["panos"]
@@ -270,10 +265,11 @@ def init(opts):
log.critical("No 'passwords' key found in pillar for this proxy.")
return False
- DETAILS["url"] = "https://{0}/api/".format(opts["proxy"]["host"])
+ DETAILS["url"] = "https://{}/api/".format(opts["proxy"]["host"])
# Set configuration details
DETAILS["host"] = opts["proxy"]["host"]
+ DETAILS["verify_ssl"] = opts["proxy"].get("verify_ssl", True)
if "serial" in opts["proxy"]:
DETAILS["serial"] = opts["proxy"].get("serial")
if "apikey" in opts["proxy"]:
@@ -321,7 +317,7 @@ def call(payload=None):
method="POST",
decode_type="plain",
decode=True,
- verify_ssl=False,
+ verify_ssl=DETAILS["verify_ssl"],
status=True,
raise_error=True,
)
@@ -335,7 +331,7 @@ def call(payload=None):
method="POST",
decode_type="plain",
decode=True,
- verify_ssl=False,
+ verify_ssl=DETAILS["verify_ssl"],
status=True,
raise_error=True,
)
@@ -352,7 +348,7 @@ def call(payload=None):
method="POST",
decode_type="plain",
decode=True,
- verify_ssl=False,
+ verify_ssl=DETAILS["verify_ssl"],
status=True,
raise_error=True,
)
@@ -368,7 +364,7 @@ def call(payload=None):
method="POST",
decode_type="plain",
decode=True,
- verify_ssl=False,
+ verify_ssl=DETAILS["verify_ssl"],
status=True,
raise_error=True,
)
@@ -382,21 +378,21 @@ def call(payload=None):
"Did not receive a valid response from host."
)
- if six.text_type(r["status"]) not in ["200", "201", "204"]:
- if six.text_type(r["status"]) == "400":
+ if str(r["status"]) not in ["200", "201", "204"]:
+ if str(r["status"]) == "400":
raise salt.exceptions.CommandExecutionError(
"The server cannot process the request due to a client error."
)
- elif six.text_type(r["status"]) == "401":
+ elif str(r["status"]) == "401":
raise salt.exceptions.CommandExecutionError(
"The server cannot process the request because it lacks valid authentication "
"credentials for the target resource."
)
- elif six.text_type(r["status"]) == "403":
+ elif str(r["status"]) == "403":
raise salt.exceptions.CommandExecutionError(
"The server refused to authorize the request."
)
- elif six.text_type(r["status"]) == "404":
+ elif str(r["status"]) == "404":
raise salt.exceptions.CommandExecutionError(
"The requested resource could not be found."
)
diff --git a/salt/proxy/vcenter.py b/salt/proxy/vcenter.py
index fa1d090bd2..4bbdb0ee66 100644
--- a/salt/proxy/vcenter.py
+++ b/salt/proxy/vcenter.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""
Proxy Minion interface module for managing VMWare vCenters.
@@ -182,13 +181,10 @@ and that host would reach out over the network and communicate with the ESXi
host.
"""
-# Import Python Libs
-from __future__ import absolute_import, print_function, unicode_literals
import logging
import os
-# Import Salt Libs
import salt.exceptions
from salt.config.schemas.vcenter import VCenterProxySchema
from salt.utils.dictupdate import merge
@@ -277,6 +273,8 @@ def init(opts):
# Save optional
DETAILS["protocol"] = proxy_conf.get("protocol")
DETAILS["port"] = proxy_conf.get("port")
+ DETAILS["verify_ssl"] = proxy_conf.get("verify_ssl")
+ DETAILS["ca_bundle"] = proxy_conf.get("ca_bundle")
# Test connection
if DETAILS["mechanism"] == "userpass":
diff --git a/salt/returners/splunk.py b/salt/returners/splunk.py
index 509eab3cf7..fe4194485e 100644
--- a/salt/returners/splunk.py
+++ b/salt/returners/splunk.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""
Send json response data to Splunk via the HTTP Event Collector
@@ -11,29 +10,23 @@ Requires the following config values to be specified in config or pillar:
indexer: <hostname/IP of Splunk indexer>
sourcetype: <Destination sourcetype for data>
index: <Destination index for data>
+ verify_ssl: true
Run a test by using ``salt-call test.ping --return splunk``
Written by Scott Pack (github.com/scottjpack)
"""
-# Import Python libs
-from __future__ import absolute_import, print_function, unicode_literals
import logging
import socket
import time
import requests
-
-# Import salt libs
import salt.utils.json
-
-# Import 3rd-party libs
from salt.ext import six
_max_content_bytes = 100000
-http_event_collector_SSL_verify = False
http_event_collector_debug = False
log = logging.getLogger(__name__)
@@ -62,6 +55,9 @@ def _get_options():
indexer = __salt__["config.get"]("splunk_http_forwarder:indexer")
sourcetype = __salt__["config.get"]("splunk_http_forwarder:sourcetype")
index = __salt__["config.get"]("splunk_http_forwarder:index")
+ verify_ssl = __salt__["config.get"](
+ "splunk_http_forwarder:verify_ssl", default=True
+ )
except Exception: # pylint: disable=broad-except
log.error("Splunk HTTP Forwarder parameters not present in config.")
return None
@@ -70,6 +66,7 @@ def _get_options():
"indexer": indexer,
"sourcetype": sourcetype,
"index": index,
+ "verify_ssl": verify_ssl,
}
return splunk_opts
@@ -84,14 +81,17 @@ def _send_splunk(event, index_override=None, sourcetype_override=None):
# Get Splunk Options
opts = _get_options()
log.info(
- str("Options: %s"), # future lint: disable=blacklisted-function
+ "Options: %s", # future lint: disable=blacklisted-function
salt.utils.json.dumps(opts),
)
http_event_collector_key = opts["token"]
http_event_collector_host = opts["indexer"]
+ http_event_collector_verify_ssl = opts["verify_ssl"]
# Set up the collector
splunk_event = http_event_collector(
- http_event_collector_key, http_event_collector_host
+ http_event_collector_key,
+ http_event_collector_host,
+ verify_ssl=http_event_collector_verify_ssl,
)
# init the payload
payload = {}
@@ -109,7 +109,7 @@ def _send_splunk(event, index_override=None, sourcetype_override=None):
# Add the event
payload.update({"event": event})
log.info(
- str("Payload: %s"), # future lint: disable=blacklisted-function
+ "Payload: %s", # future lint: disable=blacklisted-function
salt.utils.json.dumps(payload),
)
# Fire it off
@@ -120,7 +120,7 @@ def _send_splunk(event, index_override=None, sourcetype_override=None):
# Thanks to George Starcher for the http_event_collector class (https://github.com/georgestarcher/)
-class http_event_collector(object):
+class http_event_collector:
def __init__(
self,
token,
@@ -129,11 +129,13 @@ class http_event_collector(object):
http_event_port="8088",
http_event_server_ssl=True,
max_bytes=_max_content_bytes,
+ verify_ssl=True,
):
self.token = token
self.batchEvents = []
self.maxByteLength = max_bytes
self.currentByteLength = 0
+ self.verify_ssl = verify_ssl
# Set host to specified value or default to localhostname if no value provided
if host:
@@ -164,7 +166,7 @@ class http_event_collector(object):
# If eventtime in epoch not passed as optional argument use current system time in epoch
if not eventtime:
- eventtime = six.text_type(int(time.time()))
+ eventtime = str(int(time.time()))
# Fill in local hostname if not manually populated
if "host" not in payload:
@@ -179,7 +181,7 @@ class http_event_collector(object):
self.server_uri,
data=salt.utils.json.dumps(data),
headers=headers,
- verify=http_event_collector_SSL_verify,
+ verify=self.verify_ssl,
)
# Print debug info if flag set
@@ -207,7 +209,7 @@ class http_event_collector(object):
# If eventtime in epoch not passed as optional argument use current system time in epoch
if not eventtime:
- eventtime = six.text_type(int(time.time()))
+ eventtime = str(int(time.time()))
# Update time value on payload if need to use system time
data = {"time": eventtime}
@@ -224,7 +226,7 @@ class http_event_collector(object):
self.server_uri,
data=" ".join(self.batchEvents),
headers=headers,
- verify=http_event_collector_SSL_verify,
+ verify=self.verify_ssl,
)
self.batchEvents = []
self.currentByteLength = 0
diff --git a/salt/runners/asam.py b/salt/runners/asam.py
index f53dfba69d..4c999d3ba2 100644
--- a/salt/runners/asam.py
+++ b/salt/runners/asam.py
@@ -17,9 +17,11 @@ master configuration at ``/etc/salt/master`` or ``/etc/salt/master.d/asam.conf``
prov1.domain.com
username: "testuser"
password: "verybadpass"
+ verify_ssl: true
prov2.domain.com
username: "testuser"
password: "verybadpass"
+ verify_ssl: true
.. note::
@@ -84,6 +86,10 @@ def _get_asam_configuration(driver_url=""):
password = service_config.get("password", None)
protocol = service_config.get("protocol", "https")
port = service_config.get("port", 3451)
+ verify_ssl = service_config.get("verify_ssl")
+
+ if verify_ssl is None:
+ verify_ssl = True
if not username or not password:
log.error(
@@ -108,6 +114,7 @@ def _get_asam_configuration(driver_url=""):
),
"username": username,
"password": password,
+ "verify_ssl": verify_ssl,
}
if (not driver_url) or (driver_url == asam_server):
@@ -206,7 +213,7 @@ def remove_platform(name, server_url):
auth = (config["username"], config["password"])
try:
- html_content = _make_post_request(url, data, auth, verify=False)
+ html_content = _make_post_request(url, data, auth, verify=config["verify_ssl"])
except Exception as exc: # pylint: disable=broad-except
err_msg = "Failed to look up existing platforms on {}".format(server_url)
log.error("%s:\n%s", err_msg, exc)
@@ -222,7 +229,9 @@ def remove_platform(name, server_url):
data["postType"] = "platformRemove"
data["Submit"] = "Yes"
try:
- html_content = _make_post_request(url, data, auth, verify=False)
+ html_content = _make_post_request(
+ url, data, auth, verify=config["verify_ssl"]
+ )
except Exception as exc: # pylint: disable=broad-except
err_msg = "Failed to delete platform from {}".format(server_url)
log.error("%s:\n%s", err_msg, exc)
@@ -261,7 +270,7 @@ def list_platforms(server_url):
auth = (config["username"], config["password"])
try:
- html_content = _make_post_request(url, data, auth, verify=False)
+ html_content = _make_post_request(url, data, auth, verify=config["verify_ssl"])
except Exception as exc: # pylint: disable=broad-except
err_msg = "Failed to look up existing platforms"
log.error("%s:\n%s", err_msg, exc)
@@ -299,7 +308,7 @@ def list_platform_sets(server_url):
auth = (config["username"], config["password"])
try:
- html_content = _make_post_request(url, data, auth, verify=False)
+ html_content = _make_post_request(url, data, auth, verify=config["verify_ssl"])
except Exception as exc: # pylint: disable=broad-except
err_msg = "Failed to look up existing platform sets"
log.error("%s:\n%s", err_msg, exc)
@@ -351,7 +360,7 @@ def add_platform(name, platform_set, server_url):
auth = (config["username"], config["password"])
try:
- html_content = _make_post_request(url, data, auth, verify=False)
+ html_content = _make_post_request(url, data, auth, verify=config["verify_ssl"])
except Exception as exc: # pylint: disable=broad-except
err_msg = "Failed to add platform on {}".format(server_url)
log.error("%s:\n%s", err_msg, exc)
diff --git a/salt/states/esxi.py b/salt/states/esxi.py
index 6f4d44306b..12a592dc29 100644
--- a/salt/states/esxi.py
+++ b/salt/states/esxi.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""
Manage VMware ESXi Hosts.
@@ -91,8 +90,6 @@ configuration examples, dependency installation instructions, how to run remote
execution functions against ESXi hosts via a Salt Proxy Minion, and a larger state
example.
"""
-# Import Python Libs
-from __future__ import absolute_import, print_function, unicode_literals
import logging
import re
@@ -108,8 +105,6 @@ from salt.exceptions import (
VMwareObjectRetrievalError,
VMwareSaltError,
)
-
-# Import Salt Libs
from salt.ext import six
from salt.utils.decorators import depends
@@ -201,7 +196,7 @@ def coredump_configured(name, enabled, dump_ip, host_vnic="vmk0", dump_port=6500
current_config = __salt__[esxi_cmd]("get_coredump_network_config").get(host)
error = current_config.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
current_config = current_config.get("Coredump Config")
@@ -217,7 +212,7 @@ def coredump_configured(name, enabled, dump_ip, host_vnic="vmk0", dump_port=6500
).get(host)
error = response.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
# Allow users to disable core dump, but then return since
@@ -252,9 +247,9 @@ def coredump_configured(name, enabled, dump_ip, host_vnic="vmk0", dump_port=6500
changes = True
current_port = current_config.get("port")
- if current_port != six.text_type(dump_port):
+ if current_port != str(dump_port):
ret["changes"].update(
- {"dump_port": {"old": current_port, "new": six.text_type(dump_port)}}
+ {"dump_port": {"old": current_port, "new": str(dump_port)}}
)
changes = True
@@ -270,7 +265,7 @@ def coredump_configured(name, enabled, dump_ip, host_vnic="vmk0", dump_port=6500
msg = response.get("stderr")
if not msg:
msg = response.get("stdout")
- ret["comment"] = "Error: {0}".format(msg)
+ ret["comment"] = "Error: {}".format(msg)
return ret
ret["result"] = True
@@ -328,7 +323,7 @@ def password_present(name, password):
__salt__[esxi_cmd]("update_host_password", new_password=password)
except CommandExecutionError as err:
ret["result"] = False
- ret["comment"] = "Error: {0}".format(err)
+ ret["comment"] = "Error: {}".format(err)
return ret
return ret
@@ -400,7 +395,7 @@ def ntp_configured(
ntp_running = __salt__[esxi_cmd]("get_service_running", service_name=ntpd).get(host)
error = ntp_running.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
ntp_running = ntp_running.get(ntpd)
@@ -413,7 +408,7 @@ def ntp_configured(
).get(host)
error = response.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
# Set changes dictionary for ntp_servers
ret["changes"].update({"ntp_servers": {"old": ntp_config, "new": ntp_servers}})
@@ -429,7 +424,7 @@ def ntp_configured(
)
error = response.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
# Stop ntpd if service_running=False
else:
@@ -438,7 +433,7 @@ def ntp_configured(
)
error = response.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
ret["changes"].update(
{"service_running": {"old": ntp_running, "new": service_running}}
@@ -451,7 +446,7 @@ def ntp_configured(
).get(host)
error = current_service_policy.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
current_service_policy = current_service_policy.get(ntpd)
@@ -465,7 +460,7 @@ def ntp_configured(
).get(host)
error = response.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
ret["changes"].update(
{
@@ -483,7 +478,7 @@ def ntp_configured(
response = __salt__[esxi_cmd]("update_host_datetime").get(host)
error = response.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
ret["changes"].update(
{"update_datetime": {"old": "", "new": "Host datetime was updated."}}
@@ -498,7 +493,7 @@ def ntp_configured(
)
error = response.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
ret["changes"].update(
{"service_restart": {"old": "", "new": "NTP Daemon Restarted."}}
@@ -559,14 +554,14 @@ def vmotion_configured(name, enabled, device="vmk0"):
response = __salt__[esxi_cmd]("vmotion_enable", device=device).get(host)
error = response.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
# Disable VMotion if enabled=False
else:
response = __salt__[esxi_cmd]("vmotion_disable").get(host)
error = response.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
ret["changes"].update(
{"enabled": {"old": current_vmotion_enabled, "new": enabled}}
@@ -618,7 +613,7 @@ def vsan_configured(name, enabled, add_disks_to_vsan=False):
current_vsan_enabled = __salt__[esxi_cmd]("get_vsan_enabled").get(host)
error = current_vsan_enabled.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
current_vsan_enabled = current_vsan_enabled.get("VSAN Enabled")
@@ -631,14 +626,14 @@ def vsan_configured(name, enabled, add_disks_to_vsan=False):
response = __salt__[esxi_cmd]("vsan_enable").get(host)
error = response.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
# Disable VSAN if enabled=False
else:
response = __salt__[esxi_cmd]("vsan_disable").get(host)
error = response.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
ret["changes"].update(
{"enabled": {"old": current_vsan_enabled, "new": enabled}}
@@ -649,7 +644,7 @@ def vsan_configured(name, enabled, add_disks_to_vsan=False):
current_eligible_disks = __salt__[esxi_cmd]("get_vsan_eligible_disks").get(host)
error = current_eligible_disks.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
disks = current_eligible_disks.get("Eligible")
@@ -659,7 +654,7 @@ def vsan_configured(name, enabled, add_disks_to_vsan=False):
response = __salt__[esxi_cmd]("vsan_add_disks").get(host)
error = response.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
ret["changes"].update({"add_disks_to_vsan": {"old": "", "new": disks}})
@@ -683,7 +678,7 @@ def ssh_configured(
ssh_key_file=None,
service_policy=None,
service_restart=False,
- certificate_verify=False,
+ certificate_verify=None,
):
"""
Manage the SSH configuration for a host including whether or not SSH is running or
@@ -724,7 +719,7 @@ def ssh_configured(
certificate_verify
If set to ``True``, the SSL connection must present a valid certificate.
- Default is ``False``.
+ Default is ``True``.
Example:
@@ -739,6 +734,8 @@ def ssh_configured(
- certificate_verify: True
"""
+ if certificate_verify is None:
+ certificate_verify = True
ret = {"name": name, "result": False, "changes": {}, "comment": ""}
esxi_cmd = "esxi.cmd"
host = __pillar__["proxy"]["host"]
@@ -747,7 +744,7 @@ def ssh_configured(
ssh_running = __salt__[esxi_cmd]("get_service_running", service_name=ssh).get(host)
error = ssh_running.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
ssh_running = ssh_running.get(ssh)
@@ -760,14 +757,14 @@ def ssh_configured(
enable = __salt__[esxi_cmd]("service_start", service_name=ssh).get(host)
error = enable.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
# Disable SSH if service_running=False
else:
disable = __salt__[esxi_cmd]("service_stop", service_name=ssh).get(host)
error = disable.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
ret["changes"].update(
@@ -783,7 +780,7 @@ def ssh_configured(
)
error = current_ssh_key.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
current_ssh_key = current_ssh_key.get("key")
if current_ssh_key:
@@ -822,7 +819,7 @@ def ssh_configured(
)
error = response.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
ret["changes"].update(
{
@@ -840,7 +837,7 @@ def ssh_configured(
).get(host)
error = current_service_policy.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
current_service_policy = current_service_policy.get(ssh)
@@ -854,7 +851,7 @@ def ssh_configured(
).get(host)
error = response.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
ret["changes"].update(
{
@@ -872,7 +869,7 @@ def ssh_configured(
response = __salt__[esxi_cmd]("service_restart", service_name=ssh).get(host)
error = response.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
ret["changes"].update(
{"service_restart": {"old": "", "new": "SSH service restarted."}}
@@ -965,17 +962,17 @@ def syslog_configured(
reset = __salt__[esxi_cmd](
"reset_syslog_config", syslog_config=reset_configs
).get(host)
- for key, val in six.iteritems(reset):
+ for key, val in reset.items():
if isinstance(val, bool):
continue
if not val.get("success"):
msg = val.get("message")
if not msg:
msg = (
- "There was an error resetting a syslog config '{0}'."
+ "There was an error resetting a syslog config '{}'."
"Please check debug logs.".format(val)
)
- ret["comment"] = "Error: {0}".format(msg)
+ ret["comment"] = "Error: {}".format(msg)
return ret
ret["changes"].update(
@@ -985,7 +982,7 @@ def syslog_configured(
current_firewall = __salt__[esxi_cmd]("get_firewall_status").get(host)
error = current_firewall.get("Error")
if error:
- ret["comment"] = "Error: {0}".format(error)
+ ret["comment"] = "Error: {}".format(error)
return ret
current_firewall = current_firewall.get("rulesets").get("syslog")
@@ -1000,23 +997,23 @@ def syslog_configured(
if enabled.get("retcode") != 0:
err = enabled.get("stderr")
out = enabled.get("stdout")
- ret["comment"] = "Error: {0}".format(err if err else out)
+ ret["comment"] = "Error: {}".format(err if err else out)
return ret
ret["changes"].update({"firewall": {"old": current_firewall, "new": firewall}})
current_syslog_config = __salt__[esxi_cmd]("get_syslog_config").get(host)
- for key, val in six.iteritems(syslog_configs):
+ for key, val in syslog_configs.items():
# The output of get_syslog_config has different keys than the keys
# Used to set syslog_config values. We need to look them up first.
try:
lookup_key = _lookup_syslog_config(key)
except KeyError:
- ret["comment"] = "'{0}' is not a valid config variable.".format(key)
+ ret["comment"] = "'{}' is not a valid config variable.".format(key)
return ret
current_val = current_syslog_config[lookup_key]
- if six.text_type(current_val) != six.text_type(val):
+ if str(current_val) != str(val):
# Only run the command if not using test=True
if not __opts__["test"]:
response = __salt__[esxi_cmd](
@@ -1031,7 +1028,7 @@ def syslog_configured(
msg = response.get(key).get("message")
if not msg:
msg = (
- "There was an error setting syslog config '{0}'. "
+ "There was an error setting syslog config '{}'. "
"Please check debug logs.".format(key)
)
ret["comment"] = msg
@@ -1101,7 +1098,7 @@ def diskgroups_configured(name, diskgroups, erase_disks=False):
if not proxy_details.get("vcenter")
else proxy_details["esxi_host"]
)
- log.info("Running state {0} for host '{1}'".format(name, hostname))
+ log.info("Running state {} for host '{}'".format(name, hostname))
# Variable used to return the result of the invocation
ret = {"name": name, "result": None, "changes": {}, "comments": None}
# Signals if errors have been encountered
@@ -1124,23 +1121,20 @@ def diskgroups_configured(name, diskgroups, erase_disks=False):
host_disks = __salt__["vsphere.list_disks"](service_instance=si)
if not host_disks:
raise VMwareObjectRetrievalError(
- "No disks retrieved from host '{0}'".format(hostname)
+ "No disks retrieved from host '{}'".format(hostname)
)
scsi_addr_to_disk_map = {d["scsi_address"]: d for d in host_disks}
- log.trace("scsi_addr_to_disk_map = {0}".format(scsi_addr_to_disk_map))
+ log.trace("scsi_addr_to_disk_map = {}".format(scsi_addr_to_disk_map))
existing_diskgroups = __salt__["vsphere.list_diskgroups"](service_instance=si)
cache_disk_to_existing_diskgroup_map = {
dg["cache_disk"]: dg for dg in existing_diskgroups
}
except CommandExecutionError as err:
- log.error("Error: {0}".format(err))
+ log.error("Error: {}".format(err))
if si:
__salt__["vsphere.disconnect"](si)
ret.update(
- {
- "result": False if not __opts__["test"] else None,
- "comment": six.text_type(err),
- }
+ {"result": False if not __opts__["test"] else None, "comment": str(err),}
)
return ret
@@ -1149,7 +1143,7 @@ def diskgroups_configured(name, diskgroups, erase_disks=False):
# Check for cache disk
if not dg["cache_scsi_addr"] in scsi_addr_to_disk_map:
comments.append(
- "No cache disk with scsi address '{0}' was "
+ "No cache disk with scsi address '{}' was "
"found.".format(dg["cache_scsi_addr"])
)
log.error(comments[-1])
@@ -1158,7 +1152,7 @@ def diskgroups_configured(name, diskgroups, erase_disks=False):
# Check for capacity disks
cache_disk_id = scsi_addr_to_disk_map[dg["cache_scsi_addr"]]["id"]
- cache_disk_display = "{0} (id:{1})".format(dg["cache_scsi_addr"], cache_disk_id)
+ cache_disk_display = "{} (id:{})".format(dg["cache_scsi_addr"], cache_disk_id)
bad_scsi_addrs = []
capacity_disk_ids = []
capacity_disk_displays = []
@@ -1168,13 +1162,13 @@ def diskgroups_configured(name, diskgroups, erase_disks=False):
continue
capacity_disk_ids.append(scsi_addr_to_disk_map[scsi_addr]["id"])
capacity_disk_displays.append(
- "{0} (id:{1})".format(scsi_addr, capacity_disk_ids[-1])
+ "{} (id:{})".format(scsi_addr, capacity_disk_ids[-1])
)
if bad_scsi_addrs:
comments.append(
- "Error in diskgroup #{0}: capacity disks with "
- "scsi addresses {1} were not found."
- "".format(idx, ", ".join(["'{0}'".format(a) for a in bad_scsi_addrs]))
+ "Error in diskgroup #{}: capacity disks with "
+ "scsi addresses {} were not found."
+ "".format(idx, ", ".join(["'{}'".format(a) for a in bad_scsi_addrs]))
)
log.error(comments[-1])
errors = True
@@ -1182,14 +1176,14 @@ def diskgroups_configured(name, diskgroups, erase_disks=False):
if not cache_disk_to_existing_diskgroup_map.get(cache_disk_id):
# A new diskgroup needs to be created
- log.trace("erase_disks = {0}".format(erase_disks))
+ log.trace("erase_disks = {}".format(erase_disks))
if erase_disks:
if __opts__["test"]:
comments.append(
- "State {0} will "
- "erase all disks of disk group #{1}; "
- "cache disk: '{2}', "
- "capacity disk(s): {3}."
+ "State {} will "
+ "erase all disks of disk group #{}; "
+ "cache disk: '{}', "
+ "capacity disk(s): {}."
"".format(
name,
idx,
@@ -1206,13 +1200,13 @@ def diskgroups_configured(name, diskgroups, erase_disks=False):
disk_id=disk_id, service_instance=si
)
comments.append(
- "Erased disks of diskgroup #{0}; "
- "cache disk: '{1}', capacity disk(s): "
- "{2}".format(
+ "Erased disks of diskgroup #{}; "
+ "cache disk: '{}', capacity disk(s): "
+ "{}".format(
idx,
cache_disk_display,
", ".join(
- ["'{0}'".format(a) for a in capacity_disk_displays]
+ ["'{}'".format(a) for a in capacity_disk_displays]
),
)
)
@@ -1220,13 +1214,13 @@ def diskgroups_configured(name, diskgroups, erase_disks=False):
if __opts__["test"]:
comments.append(
- "State {0} will create "
- "the disk group #{1}; cache disk: '{2}', "
- "capacity disk(s): {3}.".format(
+ "State {} will create "
+ "the disk group #{}; cache disk: '{}', "
+ "capacity disk(s): {}.".format(
name,
idx,
cache_disk_display,
- ", ".join(["'{0}'".format(a) for a in capacity_disk_displays]),
+ ", ".join(["'{}'".format(a) for a in capacity_disk_displays]),
)
)
log.info(comments[-1])
@@ -1241,15 +1235,15 @@ def diskgroups_configured(name, diskgroups, erase_disks=False):
)
except VMwareSaltError as err:
comments.append(
- "Error creating disk group #{0}: " "{1}.".format(idx, err)
+ "Error creating disk group #{}: " "{}.".format(idx, err)
)
log.error(comments[-1])
errors = True
continue
- comments.append("Created disk group #'{0}'.".format(idx))
+ comments.append("Created disk group #'{}'.".format(idx))
log.info(comments[-1])
- diskgroup_changes[six.text_type(idx)] = {
+ diskgroup_changes[str(idx)] = {
"new": {"cache": cache_disk_display, "capacity": capacity_disk_displays}
}
changes = True
@@ -1257,12 +1251,12 @@ def diskgroups_configured(name, diskgroups, erase_disks=False):
# The diskgroup exists; checking the capacity disks
log.debug(
- "Disk group #{0} exists. Checking capacity disks: "
- "{1}.".format(idx, capacity_disk_displays)
+ "Disk group #{} exists. Checking capacity disks: "
+ "{}.".format(idx, capacity_disk_displays)
)
existing_diskgroup = cache_disk_to_existing_diskgroup_map.get(cache_disk_id)
existing_capacity_disk_displays = [
- "{0} (id:{1})".format(
+ "{} (id:{})".format(
[d["scsi_address"] for d in host_disks if d["id"] == disk_id][0],
disk_id,
)
@@ -1280,7 +1274,7 @@ def diskgroups_configured(name, diskgroups, erase_disks=False):
][0]
added_capacity_disk_ids.append(disk_id)
added_capacity_disk_displays.append(
- "{0} (id:{1})".format(disk_scsi_addr, disk_id)
+ "{} (id:{})".format(disk_scsi_addr, disk_id)
)
for disk_id in existing_diskgroup["capacity_disks"]:
if disk_id not in capacity_disk_ids:
@@ -1289,12 +1283,12 @@ def diskgroups_configured(name, diskgroups, erase_disks=False):
][0]
removed_capacity_disk_ids.append(disk_id)
removed_capacity_disk_displays.append(
- "{0} (id:{1})".format(disk_scsi_addr, disk_id)
+ "{} (id:{})".format(disk_scsi_addr, disk_id)
)
log.debug(
- "Disk group #{0}: existing capacity disk ids: {1}; added "
- "capacity disk ids: {2}; removed capacity disk ids: {3}"
+ "Disk group #{}: existing capacity disk ids: {}; added "
+ "capacity disk ids: {}; removed capacity disk ids: {}"
"".format(
idx,
existing_capacity_disk_displays,
@@ -1306,11 +1300,11 @@ def diskgroups_configured(name, diskgroups, erase_disks=False):
# TODO revisit this when removing capacity disks is supported
if removed_capacity_disk_ids:
comments.append(
- "Error removing capacity disk(s) {0} from disk group #{1}; "
+ "Error removing capacity disk(s) {} from disk group #{}; "
"operation is not supported."
"".format(
", ".join(
- ["'{0}'".format(id) for id in removed_capacity_disk_displays]
+ ["'{}'".format(id) for id in removed_capacity_disk_displays]
),
idx,
)
@@ -1324,11 +1318,11 @@ def diskgroups_configured(name, diskgroups, erase_disks=False):
# Building a string representation of the capacity disks
# that need to be added
- s = ", ".join(["'{0}'".format(id) for id in added_capacity_disk_displays])
+ s = ", ".join(["'{}'".format(id) for id in added_capacity_disk_displays])
if __opts__["test"]:
comments.append(
- "State {0} will add "
- "capacity disk(s) {1} to disk group #{2}."
+ "State {} will add "
+ "capacity disk(s) {} to disk group #{}."
"".format(name, s, idx)
)
log.info(comments[-1])
@@ -1343,17 +1337,17 @@ def diskgroups_configured(name, diskgroups, erase_disks=False):
)
except VMwareSaltError as err:
comments.append(
- "Error adding capacity disk(s) {0} to "
- "disk group #{1}: {2}.".format(s, idx, err)
+ "Error adding capacity disk(s) {} to "
+ "disk group #{}: {}.".format(s, idx, err)
)
log.error(comments[-1])
errors = True
continue
- com = "Added capacity disk(s) {0} to disk group #{1}" "".format(s, idx)
+ com = "Added capacity disk(s) {} to disk group #{}" "".format(s, idx)
log.info(com)
comments.append(com)
- diskgroup_changes[six.text_type(idx)] = {
+ diskgroup_changes[str(idx)] = {
"new": {
"cache": cache_disk_display,
"capacity": capacity_disk_displays,
@@ -1367,9 +1361,7 @@ def diskgroups_configured(name, diskgroups, erase_disks=False):
continue
# No capacity needs to be added
- s = "Disk group #{0} is correctly configured. Nothing to be done." "".format(
- idx
- )
+ s = "Disk group #{} is correctly configured. Nothing to be done." "".format(idx)
log.info(s)
comments.append(s)
__salt__["vsphere.disconnect"](si)
@@ -1532,11 +1524,11 @@ def host_cache_configured(
)
if not existing_disks:
raise VMwareObjectRetrievalError(
- "Disk with scsi address '{0}' was not found in host '{1}'"
+ "Disk with scsi address '{}' was not found in host '{}'"
"".format(datastore["backing_disk_scsi_addr"], hostname)
)
backing_disk = existing_disks[0]
- backing_disk_display = "{0} (id:{1})".format(
+ backing_disk_display = "{} (id:{})".format(
backing_disk["scsi_address"], backing_disk["id"]
)
log.trace("backing_disk = %s", backing_disk_display)
@@ -1547,8 +1539,8 @@ def host_cache_configured(
if erase_backing_disk:
if __opts__["test"]:
comments.append(
- "State {0} will erase "
- "the backing disk '{1}' on host '{2}'."
+ "State {} will erase "
+ "the backing disk '{}' on host '{}'."
"".format(name, backing_disk_display, hostname)
)
log.info(comments[-1])
@@ -1558,16 +1550,16 @@ def host_cache_configured(
disk_id=backing_disk["id"], service_instance=si
)
comments.append(
- "Erased backing disk '{0}' on host "
- "'{1}'.".format(backing_disk_display, hostname)
+ "Erased backing disk '{}' on host "
+ "'{}'.".format(backing_disk_display, hostname)
)
log.info(comments[-1])
# Create the datastore
if __opts__["test"]:
comments.append(
- "State {0} will create "
- "the datastore '{1}', with backing disk "
- "'{2}', on host '{3}'."
+ "State {} will create "
+ "the datastore '{}', with backing disk "
+ "'{}', on host '{}'."
"".format(name, datastore["name"], backing_disk_display, hostname)
)
log.info(comments[-1])
@@ -1582,7 +1574,7 @@ def host_cache_configured(
non_mbr_partitions = [p for p in partitions if p["format"] != "mbr"]
if len(non_mbr_partitions) > 0:
raise VMwareApiError(
- "Backing disk '{0}' has unexpected partitions"
+ "Backing disk '{}' has unexpected partitions"
"".format(backing_disk_display)
)
__salt__["vsphere.create_vmfs_datastore"](
@@ -1592,8 +1584,8 @@ def host_cache_configured(
service_instance=si,
)
comments.append(
- "Created vmfs datastore '{0}', backed by "
- "disk '{1}', on host '{2}'."
+ "Created vmfs datastore '{}', backed by "
+ "disk '{}', on host '{}'."
"".format(datastore["name"], backing_disk_display, hostname)
)
log.info(comments[-1])
@@ -1615,21 +1607,21 @@ def host_cache_configured(
# Check datastore is backed by the correct disk
if not existing_datastores[0].get("backing_disk_ids"):
raise VMwareSaltError(
- "Datastore '{0}' doesn't have a "
+ "Datastore '{}' doesn't have a "
"backing disk"
"".format(datastore["name"])
)
if backing_disk["id"] not in existing_datastores[0]["backing_disk_ids"]:
raise VMwareSaltError(
- "Datastore '{0}' is not backed by the correct disk: "
- "expected '{1}'; got {2}"
+ "Datastore '{}' is not backed by the correct disk: "
+ "expected '{}'; got {}"
"".format(
datastore["name"],
backing_disk["id"],
", ".join(
[
- "'{0}'".format(disk)
+ "'{}'".format(disk)
for disk in existing_datastores[0]["backing_disk_ids"]
]
),
@@ -1637,8 +1629,8 @@ def host_cache_configured(
)
comments.append(
- "Datastore '{0}' already exists on host '{1}' "
- "and is backed by disk '{2}'. Nothing to be "
+ "Datastore '{}' already exists on host '{}' "
+ "and is backed by disk '{}'. Nothing to be "
"done.".format(datastore["name"], hostname, backing_disk_display)
)
existing_datastore = existing_datastores[0]
@@ -1686,8 +1678,8 @@ def host_cache_configured(
if needs_setting:
if __opts__["test"]:
comments.append(
- "State {0} will configure "
- "the host cache on host '{1}' to: {2}."
+ "State {} will configure "
+ "the host cache on host '{}' to: {}."
"".format(
name,
hostname,
@@ -1702,8 +1694,8 @@ def host_cache_configured(
if (existing_datastore["capacity"] / 1024.0 ** 2) < swap_size_MiB:
raise ArgumentValueError(
- "Capacity of host cache datastore '{0}' ({1} MiB) is "
- "smaller than the required swap size ({2} MiB)"
+ "Capacity of host cache datastore '{}' ({} MiB) is "
+ "smaller than the required swap size ({} MiB)"
"".format(
existing_datastore["name"],
existing_datastore["capacity"] / 1024.0 ** 2,
@@ -1717,11 +1709,11 @@ def host_cache_configured(
service_instance=si,
)
comments.append(
- "Host cache configured on host " "'{0}'.".format(hostname)
+ "Host cache configured on host " "'{}'.".format(hostname)
)
else:
comments.append(
- "Host cache on host '{0}' is already correctly "
+ "Host cache on host '{}' is already correctly "
"configured. Nothing to be done.".format(hostname)
)
result = True
diff --git a/salt/utils/http.py b/salt/utils/http.py
index 9522bd6ee4..c532da63d5 100644
--- a/salt/utils/http.py
+++ b/salt/utils/http.py
@@ -1062,3 +1062,23 @@ def _sanitize_url_components(comp_list, field):
ret = "{}&".format(comp_list[0])
comp_list.remove(comp_list[0])
return ret + _sanitize_url_components(comp_list, field)
+
+
+def session(user=None, password=None, verify_ssl=True, ca_bundle=None, headers=None):
+ """
+ create a requests session
+ """
+ session = requests.session()
+ if user and password:
+ session.auth = (user, password)
+ if ca_bundle and not verify_ssl:
+ log.error("You cannot use both ca_bundle and verify_ssl False together")
+ return False
+ if ca_bundle:
+ opts = {"ca_bundle": ca_bundle}
+ session.verify = get_ca_bundle(opts)
+ if not verify_ssl:
+ session.verify = False
+ if headers:
+ session.headers.update(headers)
+ return session
diff --git a/salt/utils/thin.py b/salt/utils/thin.py
index ce48957374..60ddd0e67c 100644
--- a/salt/utils/thin.py
+++ b/salt/utils/thin.py
@@ -217,8 +217,8 @@ def get_tops_python(py_ver, exclude=None, ext_py_ver=None):
"{} does not exist. Could not auto detect dependencies".format(py_ver)
)
return {}
- py_shell_cmd = "{0} -c 'import {1}; print({1}.__file__)'".format(py_ver, mod)
- cmd = subprocess.Popen(py_shell_cmd, stdout=subprocess.PIPE, shell=True)
+ py_shell_cmd = [py_ver, "-c", "import {0}; print({0}.__file__)".format(mod)]
+ cmd = subprocess.Popen(py_shell_cmd, stdout=subprocess.PIPE)
stdout, _ = cmd.communicate()
mod_file = os.path.abspath(salt.utils.data.decode(stdout).rstrip("\n"))
diff --git a/salt/utils/vmware.py b/salt/utils/vmware.py
index 57aa2aaa69..f801ba2aab 100644
--- a/salt/utils/vmware.py
+++ b/salt/utils/vmware.py
@@ -80,7 +80,6 @@ import ssl
import time
from http.client import BadStatusLine
-import requests
import salt.exceptions
import salt.modules.cmdmod
import salt.utils.path
@@ -182,7 +181,9 @@ def esxcli(
return ret
-def get_vsphere_client(server, username, password, session=None):
+def get_vsphere_client(
+ server, username, password, session=None, verify_ssl=True, ca_bundle=None
+):
"""
Internal helper method to create an instance of the vSphere API client.
Please provide username and password to authenticate.
@@ -196,6 +197,10 @@ def get_vsphere_client(server, username, password, session=None):
:param Session session:
Request HTTP session instance. If not specified, one
is automatically created and used
+ :param boolean verify_ssl:
+ Verify the SSL certificate. Default: True
+ :param basestring ca_bundle:
+ Path to the ca bundle to use when verifying SSL certificates.
:returns:
Vsphere Client instance
@@ -204,9 +209,7 @@ def get_vsphere_client(server, username, password, session=None):
"""
if not session:
# Create an https session to be used for a vSphere client
- session = requests.session()
- # If client uses own SSL cert, session should not verify
- session.verify = False
+ session = salt.utils.http.session(verify_ssl=verify_ssl, ca_bundle=ca_bundle)
client = None
try:
client = create_vsphere_client(
@@ -218,7 +221,15 @@ def get_vsphere_client(server, username, password, session=None):
def _get_service_instance(
- host, username, password, protocol, port, mechanism, principal, domain
+ host,
+ username,
+ password,
+ protocol,
+ port,
+ mechanism,
+ principal,
+ domain,
+ verify_ssl=True,
):
"""
Internal method to authenticate with a vCenter server or ESX/ESXi host
@@ -253,21 +264,26 @@ def _get_service_instance(
raise salt.exceptions.CommandExecutionError(
"Unsupported mechanism: '{}'".format(mechanism)
)
+
+ log.trace(
+ "Connecting using the '%s' mechanism, with username '%s'", mechanism, username,
+ )
+ default_msg = (
+ "Could not connect to host '{}'. "
+ "Please check the debug log for more information.".format(host)
+ )
+
try:
- log.trace(
- "Connecting using the '%s' mechanism, with username '%s'",
- mechanism,
- username,
- )
- service_instance = SmartConnect(
- host=host,
- user=username,
- pwd=password,
- protocol=protocol,
- port=port,
- b64token=token,
- mechanism=mechanism,
- )
+ if verify_ssl:
+ service_instance = SmartConnect(
+ host=host,
+ user=username,
+ pwd=password,
+ protocol=protocol,
+ port=port,
+ b64token=token,
+ mechanism=mechanism,
+ )
except TypeError as exc:
if "unexpected keyword argument" in exc.message:
log.error(
@@ -280,30 +296,33 @@ def _get_service_instance(
raise
except Exception as exc: # pylint: disable=broad-except
# pyVmomi's SmartConnect() actually raises Exception in some cases.
- default_msg = (
- "Could not connect to host '{}'. "
- "Please check the debug log for more information.".format(host)
- )
+ if (
+ isinstance(exc, vim.fault.HostConnectFault)
+ and "[SSL: CERTIFICATE_VERIFY_FAILED]" in exc.msg
+ ) or "[SSL: CERTIFICATE_VERIFY_FAILED]" in str(exc):
+ err_msg = (
+ "Could not verify the SSL certificate. You can use "
+ "verify_ssl: False if you do not want to verify the "
+ "SSL certificate. This is not recommended as it is "
+ "considered insecure."
+ )
+ else:
+ log.exception(exc)
+ err_msg = exc.msg if hasattr(exc, "msg") else default_msg
+ raise salt.exceptions.VMwareConnectionError(err_msg)
+ if not verify_ssl:
try:
- if (
- isinstance(exc, vim.fault.HostConnectFault)
- and "[SSL: CERTIFICATE_VERIFY_FAILED]" in exc.msg
- ) or "[SSL: CERTIFICATE_VERIFY_FAILED]" in str(exc):
- service_instance = SmartConnect(
- host=host,
- user=username,
- pwd=password,
- protocol=protocol,
- port=port,
- sslContext=ssl._create_unverified_context(),
- b64token=token,
- mechanism=mechanism,
- )
- else:
- log.exception(exc)
- err_msg = exc.msg if hasattr(exc, "msg") else default_msg
- raise salt.exceptions.VMwareConnectionError(err_msg)
+ service_instance = SmartConnect(
+ host=host,
+ user=username,
+ pwd=password,
+ protocol=protocol,
+ port=port,
+ sslContext=ssl._create_unverified_context(),
+ b64token=token,
+ mechanism=mechanism,
+ )
except Exception as exc: # pylint: disable=broad-except
# pyVmomi's SmartConnect() actually raises Exception in some cases.
if "certificate verify failed" in str(exc):
@@ -330,6 +349,7 @@ def _get_service_instance(
err_msg = exc.msg if hasattr(exc, "msg") else default_msg
log.trace(exc)
raise salt.exceptions.VMwareConnectionError(err_msg)
+
atexit.register(Disconnect, service_instance)
return service_instance
@@ -384,6 +404,7 @@ def get_service_instance(
mechanism="userpass",
principal=None,
domain=None,
+ verify_ssl=True,
):
"""
Authenticate with a vCenter server or ESX/ESXi host and return the service instance object.
@@ -416,6 +437,9 @@ def get_service_instance(
domain
Kerberos user domain. Required if mechanism is ``sspi``
+
+ verify_ssl
+ Verify the SSL certificate. Default: True
"""
if protocol is None:
@@ -438,7 +462,15 @@ def get_service_instance(
if not service_instance:
service_instance = _get_service_instance(
- host, username, password, protocol, port, mechanism, principal, domain
+ host,
+ username,
+ password,
+ protocol,
+ port,
+ mechanism,
+ principal,
+ domain,
+ verify_ssl=verify_ssl,
)
# Test if data can actually be retrieved or connection has gone stale
@@ -449,7 +481,15 @@ def get_service_instance(
log.trace("Session no longer authenticating. Reconnecting")
Disconnect(service_instance)
service_instance = _get_service_instance(
- host, username, password, protocol, port, mechanism, principal, domain
+ host,
+ username,
+ password,
+ protocol,
+ port,
+ mechanism,
+ principal,
+ domain,
+ verify_ssl=verify_ssl,
)
except vim.fault.NoPermission as exc:
log.exception(exc)
diff --git a/salt/wheel/__init__.py b/salt/wheel/__init__.py
index 38792a10f6..53c3d8527f 100644
--- a/salt/wheel/__init__.py
+++ b/salt/wheel/__init__.py
@@ -1,8 +1,6 @@
-# -*- coding: utf-8 -*-
"""
Modules used to control the master itself
"""
-from __future__ import absolute_import, print_function, unicode_literals
from collections.abc import Mapping
@@ -15,7 +13,7 @@ import salt.utils.zeromq
class WheelClient(
- salt.client.mixins.SyncClientMixin, salt.client.mixins.AsyncClientMixin, object
+ salt.client.mixins.SyncClientMixin, salt.client.mixins.AsyncClientMixin
):
"""
An interface to Salt's wheel modules
@@ -123,8 +121,8 @@ class WheelClient(
})
{'jid': '20131219224744416681', 'tag': 'salt/wheel/20131219224744416681'}
"""
- fun = low.pop("fun")
- return self.asynchronous(fun, low)
+ fun = low.get("fun")
+ return self.asynchronous(fun, low, local=False)
def cmd(
self,
@@ -143,9 +141,7 @@ class WheelClient(
>>> wheel.cmd('key.finger', ['jerry'])
{'minions': {'jerry': '5d:f6:79:43:5e:d4:42:3f:57:b8:45:a8:7e:a4:6e:ca'}}
"""
- return super(WheelClient, self).cmd(
- fun, arg, pub_data, kwarg, print_event, full_return
- )
+ return super().cmd(fun, arg, pub_data, kwarg, print_event, full_return)
Wheel = WheelClient # for backward-compat
diff --git a/salt/wheel/pillar_roots.py b/salt/wheel/pillar_roots.py
index 2c242ef3a7..7504d28777 100644
--- a/salt/wheel/pillar_roots.py
+++ b/salt/wheel/pillar_roots.py
@@ -1,19 +1,14 @@
-# -*- coding: utf-8 -*-
"""
The `pillar_roots` wheel module is used to manage files under the pillar roots
directories on the master server.
"""
-# Import python libs
-from __future__ import absolute_import, print_function, unicode_literals
import os
-# Import salt libs
import salt.utils.files
import salt.utils.path
-
-# Import 3rd-party libs
+import salt.utils.verify
from salt.ext import six
@@ -86,7 +81,7 @@ def read(path, saltenv="base"):
ret = []
files = find(path, saltenv)
for fn_ in files:
- full = next(six.iterkeys(fn_))
+ full = next(iter(fn_.keys()))
form = fn_[full]
if form == "txt":
with salt.utils.files.fopen(full, "rb") as fp_:
@@ -100,19 +95,23 @@ def write(data, path, saltenv="base", index=0):
index of the file can be specified to write to a lower priority file root
"""
if saltenv not in __opts__["pillar_roots"]:
- return "Named environment {0} is not present".format(saltenv)
+ return "Named environment {} is not present".format(saltenv)
if len(__opts__["pillar_roots"][saltenv]) <= index:
- return "Specified index {0} in environment {1} is not present".format(
+ return "Specified index {} in environment {} is not present".format(
index, saltenv
)
if os.path.isabs(path):
return (
- "The path passed in {0} is not relative to the environment " "{1}"
+ "The path passed in {} is not relative to the environment " "{}"
).format(path, saltenv)
+ roots_dir = __opts__["pillar_roots"][saltenv][index]
+ dest = os.path.join(roots_dir, path)
+ if not salt.utils.verify.clean_path(roots_dir, dest):
+ return "Invalid path"
dest = os.path.join(__opts__["pillar_roots"][saltenv][index], path)
dest_dir = os.path.dirname(dest)
if not os.path.isdir(dest_dir):
os.makedirs(dest_dir)
with salt.utils.files.fopen(dest, "w+") as fp_:
fp_.write(salt.utils.stringutils.to_str(data))
- return "Wrote data to file {0}".format(dest)
+ return "Wrote data to file {}".format(dest)
--
2.30.1