Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[6.15.z] Poll ncat tunnel pid #15335

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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