[202205][Mellanox] change the implementation of is_host() to fix a stuck issue on simx platform (#13101)

This PR is to backport #13100 to the 202205 branch since can not be cleanly cherry-picked.

Following code to judge whether a process is running inside a docker could get stuck on the simx platform

subprocess.Popen(["docker", "--version"],
                                stdout=subprocess.PIPE,
                                stderr=subprocess.STDOUT,
                                universal_newlines=True)
When it gets stuck, the config-chassisdb service can not be successfully started, thus the system can not be booted up.

root@sonic:/# service config-chassisdb status
     config-chassisdb.service - Config chassis_db
     Loaded: loaded (/lib/systemd/system/config-chassisdb.service; enabled; vendor preset: enabled)
     Active: activating (start) since Thu 2022-12-15 09:23:02 UTC; 29min ago
   Main PID: 571 (config-chassisd)
      Tasks: 14 (limit: 9501)
     Memory: 132.4M
     CGroup: /system.slice/config-chassisdb.service
                        ├─571 /bin/bash /usr/bin/config-chassisdb
			├─575 /usr/bin/python3 /usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform
			├─602 /bin/sh -c sudo decode-syseeprom -m
			├─603 sudo decode-syseeprom -m
			├─607 /usr/bin/python3 /usr/local/bin/decode-syseeprom -m
			├─616 /bin/sh -c docker --version 2>/dev/null
			└─617 docker --version
- How I did it
Use an alternative way to implement this function and issue can be avoided:

docker_env_file = '/.dockerenv'
return os.path.exists(docker_env_file) is False

- How to verify it
run regression on real hardware and simx platform.
This commit is contained in:
Kebo Liu 2022-12-20 15:59:24 +08:00 committed by GitHub
parent 2dff179f2c
commit a8376ef109
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -186,18 +186,8 @@ def is_host():
Test whether current process is running on the host or an docker Test whether current process is running on the host or an docker
return True for host and False for docker return True for host and False for docker
""" """
try: docker_env_file = '/.dockerenv'
proc = subprocess.Popen("docker --version 2>/dev/null", return os.path.exists(docker_env_file) is False
stdout=subprocess.PIPE,
shell=True,
stderr=subprocess.STDOUT,
universal_newlines=True)
stdout = proc.communicate()[0]
proc.wait()
result = stdout.rstrip('\n')
return result != ''
except OSError as e:
return False
def default_return(return_value, log_func=logger.log_debug): def default_return(return_value, log_func=logger.log_debug):