Skip to content

Commit

Permalink
[6.15.z] Poll ncat tunnel pid (#15335)
Browse files Browse the repository at this point in the history
Poll ncat tunnel pid (#15056)

when checking the pid right after ncat startup
it could happen that no pid was found despite ncat being started.
Polling solves this problem

(cherry picked from commit e918739)

Co-authored-by: dosas <[email protected]>
  • Loading branch information
Satellite-QE and dosas authored Jun 6, 2024
1 parent 5935bb7 commit 0a8b42a
Showing 1 changed file with 36 additions and 16 deletions.
52 changes: 36 additions & 16 deletions robottelo/host_helpers/satellite_mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import re

import requests
from wait_for import TimedOutError, wait_for

from robottelo.cli.proxy import CapsuleTunnelError
from robottelo.config import settings
Expand Down Expand Up @@ -279,26 +280,45 @@ def default_url_on_new_port(self, oldport, newport):
:rtype: str
"""
pre_ncat_procs = self.execute('pgrep ncat').stdout.splitlines()
with self.session.shell() as channel:
# if ncat isn't backgrounded, it prevents the channel from closing
command = f'ncat -kl -p {newport} -c "ncat {self.hostname} {oldport}" &'
logger.debug(f'Creating tunnel: {command}')
channel.send(command)

def check_ncat_startup(pre_ncat_procs):
post_ncat_procs = self.execute('pgrep ncat').stdout.splitlines()
ncat_pid = set(post_ncat_procs).difference(set(pre_ncat_procs))
if not len(ncat_pid):
err = channel.get_exit_signal()
logger.debug(f'Tunnel failed: {err}')
# Something failed, so raise an exception.
raise CapsuleTunnelError(f'Starting ncat failed: {err}')
if len(ncat_pid):
return ncat_pid

return None

def start_ncat():
pre_ncat_procs = self.execute('pgrep ncat').stdout.splitlines()
with self.session.shell() as channel:
# if ncat isn't backgrounded, it prevents the channel from closing
command = f'ncat -kl -p {newport} -c "ncat {self.hostname} {oldport}" &'
logger.debug(f'Creating tunnel: {command}')
channel.send(command)

try:
return wait_for(
check_ncat_startup,
func_args=[pre_ncat_procs],
fail_condition=None,
timeout=5,
delay=0.5,
)[0]
except TimedOutError as e:
err = channel.get_exit_signal()
logger.debug(f'Tunnel failed: {err}')
# Something failed, so raise an exception.
raise CapsuleTunnelError(f'Starting ncat failed: {err}') from e

ncat_pid = start_ncat()
try:
forward_url = f'https://{self.hostname}:{newport}'
logger.debug(f'Yielding capsule forward port url: {forward_url}')
try:
yield forward_url
finally:
logger.debug(f'Killing ncat pid: {ncat_pid}')
self.execute(f'kill {ncat_pid.pop()}')
yield forward_url
finally:
logger.debug(f'Killing ncat pid: {ncat_pid}')
self.execute(f'kill {ncat_pid.pop()}')

def validate_pulp_filepath(
self,
Expand Down

0 comments on commit 0a8b42a

Please sign in to comment.