Updates to kube env interaction
- local KUBECONFIG var detection
- proper handling of env vars
- fixes for KUBECONFIG loading when env file is given/not given
- main IP extraction
- wording fixes
Related-PROD: PROD-35903
Change-Id: I68f1fd18a72a99502460d3b6158a43cd60d7cf1b
diff --git a/cfg_checker/common/settings.py b/cfg_checker/common/settings.py
index c654970..dac917e 100644
--- a/cfg_checker/common/settings.py
+++ b/cfg_checker/common/settings.py
@@ -2,6 +2,7 @@
import json
import pwd
import sys
+import yaml
from cfg_checker.common.const import ENV_TYPE_GLOB, ENV_TYPE_SALT
from cfg_checker.common.const import ENV_TYPE_KUBE, ENV_TYPE_LINUX, ENV_LOCAL
@@ -26,14 +27,14 @@
def _extract_salt_return(_raw):
if not isinstance(_raw, str):
_json = _raw
- logger_cli.debug("...ambigious return detected")
+ logger_cli.debug("... ambigious return detected")
else:
try:
_json = json.loads(_raw)
except ValueError:
_json = _raw
logger_cli.debug(
- "...return value is not a json: '{}'".format(_raw)
+ "... return value is not a json: '{}'".format(_raw)
)
return _json
@@ -53,7 +54,7 @@
return None
def _detect(self, _type):
- logger_cli.debug("...detecting '{}'".format(_type))
+ logger_cli.debug("... detecting '{}'".format(_type))
if _type is None:
raise ConfigException("# Unexpected supported env type")
elif _type == ENV_TYPE_SALT:
@@ -64,7 +65,7 @@
)
# Try to call salt API on target host
_r = None
- logger_cli.debug("...trying to detect env type '{}'".format(_type))
+ logger_cli.debug("... detecting env type '{}'".format(_type))
if self.env_name == ENV_LOCAL:
_r = shell(" ".join(_detect_cmd))
else:
@@ -90,7 +91,7 @@
_kube = get_kube_remote(self)
if not _kube.initialized:
logger_cli.debug(
- "... failed to load config from '{}'".format(
+ "... failed to init kube using '{}'".format(
_kube.kConfigPath
)
)
@@ -107,12 +108,11 @@
if hasattr(_v, "platform") and \
hasattr(_v, "major") and \
hasattr(_v, "minor"):
- _host = "localhost" if _kube.is_local else _kube.kConf.host
logger_cli.info(
"# Kube server found: {}:{} on '{}'".format(
_v.major,
_v.minor,
- _host
+ _kube.kConfigPath
)
)
return True
@@ -130,7 +130,7 @@
from platform import system, release
_s = system()
_r = release()
- logger_cli.debug("...running on {} {}".format(_s, _r))
+ logger_cli.debug("... running on {} {}".format(_s, _r))
if _s in ['Linux', 'Darwin']:
return True
else:
@@ -163,6 +163,10 @@
self.salt_vars = []
self.kube_vars = []
for _key, _value in self.vars:
+ if _key in os.environ:
+ logger_cli.info(
+ "-> Using env var '{}={}'".format(_key, os.environ[_key])
+ )
if _key.startswith(ENV_TYPE_GLOB):
os.environ[_key] = _value
elif _key.startswith(ENV_TYPE_SALT):
@@ -213,23 +217,28 @@
def _init_env_values(self):
if ENV_TYPE_SALT in self.detected_envs:
for _key, _value in self.salt_vars:
- os.environ[_key] = _value
+ if _key not in os.environ:
+ os.environ[_key] = _value
self.salt_user = os.environ.get('SALT_USER', 'salt')
self.salt_timeout = os.environ.get('SALT_TIMEOUT', 30)
- self.salt_file_root = os.environ.get('SALT_FILE_ROOT', None)
+ self.salt_file_root = os.environ.get(
+ 'SALT_FILE_ROOT',
+ "/usr/share/salt-formulas/env/"
+ )
self.salt_scripts_folder = os.environ.get(
'SALT_SCRIPTS_FOLDER',
'cfg_checker_scripts'
)
elif ENV_TYPE_KUBE in self.detected_envs:
for _key, _value in self.kube_vars:
- os.environ[_key] = _value
+ if _key not in os.environ:
+ os.environ[_key] = _value
- self.kube_config_root = os.environ.get('KUBE_CONFIG_ROOT', None)
+ self.kube_config_root = os.environ.get('KUBE_CONFIG_ROOT', "/root")
self.kube_scripts_folder = os.environ.get(
'KUBE_SCRIPTS_FOLDER',
- None
+ "cfg-checker-scripts"
)
self.kube_node_user = os.environ.get(
'KUBE_NODE_USER',
@@ -286,6 +295,57 @@
ConfigException -- on IO error when loading env file
ConfigException -- on env file failed validation
"""
+ # detect kubeconfig placement
+ _env_kubeconf_path = os.environ.get('KUBECONFIG', None)
+ if not os.path.exists(self.kube_config_path):
+ logger_cli.debug(
+ "... kubeconfig not detected at '{}'".format(
+ self.kube_config_path
+ )
+ )
+ # not exists, get KUBECONFIG var
+ if _env_kubeconf_path:
+ # get the env var path
+ self.kube_config_path = _env_kubeconf_path
+ logger_cli.debug(
+ "... KUBECONFIG var points to '{}'".format(
+ self.kube_config_path
+ )
+ )
+ self.kube_config_detected = True
+ else:
+ logger_cli.debug("... KUBECONFIG env var not found")
+ self.kube_config_path = None
+ self.kube_config_detected = False
+ else:
+ logger_cli.debug(
+ "... kubeconfig detected at '{}'".format(
+ self.kube_config_path
+ )
+ )
+ self.kube_config_detected = True
+
+ # try to load values from KUBECONF
+ _kube_conf = None
+ if self.kube_config_path:
+ with open(self.kube_config_path) as kF:
+ _kube_conf = yaml.load(kF, Loader=yaml.SafeLoader)
+ # extract host ip
+ try:
+ _server = _kube_conf["clusters"][0]["cluster"]["server"]
+ except KeyError as e:
+ logger_cli.debug(
+ "... failed to extract server ip: "
+ "no '{}' key in 'clusters/[0]/cluster/server".format(e)
+ )
+ except IndexError:
+ logger_cli.debug(
+ "... failed to extract server ip: empty cluster list"
+ )
+ _ip = _server.split(':')
+ self.remote_ip = _ip[1].replace('/', '')
+ logger_cli.debug("... detected ip: '{}'".format(self.remote_ip))
+
# load env file as init os.environment with its values
if os.path.isfile(config_path):
with open(config_path) as _f:
@@ -326,7 +386,7 @@
)
else:
logger_cli.debug(
- "-> ...loaded total of '{}' vars".format(
+ "... loaded total of '{}' vars".format(
len(_list)
)
)