diff options
| -rw-r--r-- | python/vyos/utils/process.py | 27 | ||||
| -rw-r--r-- | smoketest/scripts/cli/base_interfaces_test.py | 16 | 
2 files changed, 29 insertions, 14 deletions
diff --git a/python/vyos/utils/process.py b/python/vyos/utils/process.py index e09c7d86d..cd58b4be2 100644 --- a/python/vyos/utils/process.py +++ b/python/vyos/utils/process.py @@ -204,17 +204,32 @@ def process_running(pid_file):          pid = f.read().strip()      return pid_exists(int(pid)) -def process_named_running(name, cmdline: str=None): +def process_named_running(name, cmdline: str=None, timeout=0):      """ Checks if process with given name is running and returns its PID.      If Process is not running, return None      """      from psutil import process_iter -    for p in process_iter(['name', 'pid', 'cmdline']): -        if cmdline: -            if p.info['name'] == name and cmdline in p.info['cmdline']: +    def check_process(name, cmdline): +        for p in process_iter(['name', 'pid', 'cmdline']): +            if cmdline: +                if name in p.info['name'] and cmdline in p.info['cmdline']: +                    return p.info['pid'] +            elif name in p.info['name']:                  return p.info['pid'] -        elif p.info['name'] == name: -            return p.info['pid'] +        return None +    if timeout: +        import time +        time_expire = time.time() + timeout +        while True: +            tmp = check_process(name, cmdline) +            if not tmp: +                if time.time() > time_expire: +                    break +                time.sleep(0.100) # wait 250ms +                continue +            return tmp +    else: +        return check_process(name, cmdline)      return None  def is_systemd_service_active(service): diff --git a/smoketest/scripts/cli/base_interfaces_test.py b/smoketest/scripts/cli/base_interfaces_test.py index 3f42196f7..7219fe622 100644 --- a/smoketest/scripts/cli/base_interfaces_test.py +++ b/smoketest/scripts/cli/base_interfaces_test.py @@ -127,9 +127,9 @@ class BasicInterfaceTest:                  # by also checking the cmd arguments passed to the daemon                  if self._interfaces:                      for tmp in self._interfaces: -                        self.assertFalse(process_named_running(daemon, tmp)) +                        self.assertFalse(process_named_running(daemon, tmp, timeout=10))                  else: -                    self.assertFalse(process_named_running(daemon)) +                    self.assertFalse(process_named_running(daemon, timeout=10))          def test_dhcp_disable_interface(self):              if not self._test_dhcp: @@ -179,7 +179,7 @@ class BasicInterfaceTest:              for interface in self._interfaces:                  # Check if dhclient process runs -                dhclient_pid = process_named_running(dhclient_process_name, cmdline=interface) +                dhclient_pid = process_named_running(dhclient_process_name, cmdline=interface, timeout=10)                  self.assertTrue(dhclient_pid)                  dhclient_config = read_file(f'{dhclient_base_dir}/dhclient_{interface}.conf') @@ -216,7 +216,7 @@ class BasicInterfaceTest:                  self.assertEqual(tmp, vrf_name)                  # Check if dhclient process runs -                dhclient_pid = process_named_running(dhclient_process_name, cmdline=interface) +                dhclient_pid = process_named_running(dhclient_process_name, cmdline=interface, timeout=10)                  self.assertTrue(dhclient_pid)                  # .. inside the appropriate VRF instance                  vrf_pids = cmd(f'ip vrf pids {vrf_name}') @@ -251,7 +251,7 @@ class BasicInterfaceTest:                  self.assertEqual(tmp, vrf_name)                  # Check if dhclient process runs -                tmp = process_named_running(dhcp6c_process_name, cmdline=interface) +                tmp = process_named_running(dhcp6c_process_name, cmdline=interface, timeout=10)                  self.assertTrue(tmp)                  # .. inside the appropriate VRF instance                  vrf_pids = cmd(f'ip vrf pids {vrf_name}') @@ -945,7 +945,7 @@ class BasicInterfaceTest:                  duid_base += 1                  # Better ask the process about it's commandline in the future -                pid = process_named_running(dhcp6c_process_name, cmdline=interface) +                pid = process_named_running(dhcp6c_process_name, cmdline=interface, timeout=10)                  self.assertTrue(pid)                  dhcp6c_options = read_file(f'/proc/{pid}/cmdline') @@ -1004,7 +1004,7 @@ class BasicInterfaceTest:                      address = str(int(address) + 1)                  # Check for running process -                self.assertTrue(process_named_running(dhcp6c_process_name, cmdline=interface)) +                self.assertTrue(process_named_running(dhcp6c_process_name, cmdline=interface, timeout=10))              for delegatee in delegatees:                  # we can already cleanup the test delegatee interface here @@ -1070,7 +1070,7 @@ class BasicInterfaceTest:                      address = str(int(address) + 1)                  # Check for running process -                self.assertTrue(process_named_running(dhcp6c_process_name, cmdline=interface)) +                self.assertTrue(process_named_running(dhcp6c_process_name, cmdline=interface, timeout=10))              for delegatee in delegatees:                  # we can already cleanup the test delegatee interface here  | 
