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)
                 )
             )