diff --git a/src/drunc/process_manager/interface/commands.py b/src/drunc/process_manager/interface/commands.py index cbfde6250..b5a479086 100644 --- a/src/drunc/process_manager/interface/commands.py +++ b/src/drunc/process_manager/interface/commands.py @@ -13,7 +13,7 @@ from drunc.process_manager.interface.context import ProcessManagerContext from drunc.process_manager.utils import tabulate_process_instance_list from drunc.utils.shell_utils import InterruptedCommand, log_pm_cmd -from drunc.utils.utils import get_logger +from drunc.utils.utils import get_logger, resolve_context_peer @click.command("boot") @@ -45,11 +45,13 @@ def boot( ) -> None: log = get_logger("process_manager.shell") log_pm_cmd(obj) - processes = obj.get_driver("process_manager").ps(ProcessQuery(user=user)) + processes = obj.get_driver("process_manager").ps( + ProcessQuery(user=user, session=session_name) + ) if len(processes.values) > 0: click.confirm( - f"You already have {len(processes.values)} processes running, are you sure you want to boot a session?", + f"You already have {len(processes.values)} processes running for {session_name}, are you sure you want to boot a session?", abort=True, ) @@ -78,6 +80,7 @@ def boot( raise e controller_address = obj.get_driver("process_manager").controller_address + controller_address = resolve_context_peer(controller_address) if controller_address: obj.print( Panel( @@ -286,7 +289,7 @@ def logs_impl( log = get_logger("process_manager.shell") # TODO: MOVE BACK TO DEBUG BEFORE MERGE # THIS IS USEFUL FOR TESTING THOUGH - log.error(f"Running logs with query {query}") + log.debug(f"Running logs with query {query}") log_req = LogRequest( how_far=how_far, query=query, diff --git a/src/drunc/process_manager/process_manager_driver.py b/src/drunc/process_manager/process_manager_driver.py index ea239f4d6..aa38f314a 100644 --- a/src/drunc/process_manager/process_manager_driver.py +++ b/src/drunc/process_manager/process_manager_driver.py @@ -7,6 +7,7 @@ from collections.abc import Iterator from time import sleep from typing import Dict, List +from urllib.parse import urlparse import conffwk import grpc @@ -287,7 +288,11 @@ def _build_boot_request( override_logs: bool, pwd: str, ) -> BootRequest: - host = format_hostname(app["restriction"]) + # Run mapping to physical hostname to enable multi host usage + host = resolve_localhost_to_hostname(format_hostname(app["restriction"])) + self.log.info(f"boot resolve {host}") # keep this until big PR gets merged + + # this is one of the two minimal changes needed to get this working in general? name = app["name"] exe = app["type"] args = app["args"] @@ -546,7 +551,12 @@ def _connect_to_service( connection_port = session_dal.connectivity_service.service.port if connection_server == "localhost": - resolved_server = resolve_localhost_to_hostname(connection_server) + # resolve localhost to hostname to enable multi host + resolved_address = resolve_localhost_to_hostname(connection_server) + if "://" not in resolved_address: + resolved_address = "grpc://" + resolved_address + + resolved_server = urlparse(resolved_address).hostname self.log.debug( f"Resolved connection server 'localhost' to '{resolved_server}' to avoid K8s hairpinning." ) diff --git a/src/drunc/process_manager/ssh_process_manager.py b/src/drunc/process_manager/ssh_process_manager.py index 09a2f55cd..f4eef6679 100644 --- a/src/drunc/process_manager/ssh_process_manager.py +++ b/src/drunc/process_manager/ssh_process_manager.py @@ -394,7 +394,7 @@ def __boot(self, boot_request: BootRequest, uuid: str) -> ProcessInstance: self.log.info( f"Booted '{boot_request.process_description.metadata.name}' " f"from session '{boot_request.process_description.metadata.session}' " - f"with UUID {uuid}" + f"with UUID {uuid} in hosts '{boot_request.process_restriction.allowed_hosts}" ) # Query current process status diff --git a/src/drunc/unified_shell/commands.py b/src/drunc/unified_shell/commands.py index be093c134..7dc1bc950 100644 --- a/src/drunc/unified_shell/commands.py +++ b/src/drunc/unified_shell/commands.py @@ -58,12 +58,12 @@ def boot( override_logs_boot = obj.override_logs else: override_logs_boot = override_logs - # if len(processes.values) > 0: - # log.error( - # f"Cannot boot: session {session_name} already has {len(processes.values)} processes running. " - # "Please terminate the existing session first." - # ) - # return + if len(processes.values) > 0: + log.error( + f"Cannot boot: session {session_name} already has {len(processes.values)} processes running. " + "Please terminate the existing session first." + ) + return try: results = obj.get_driver("process_manager").boot( diff --git a/src/drunc/utils/utils.py b/src/drunc/utils/utils.py index 0109c00c4..2dc9456e3 100644 --- a/src/drunc/utils/utils.py +++ b/src/drunc/utils/utils.py @@ -524,6 +524,18 @@ def resolve_context_peer(peer: str) -> str: str: The original peer string, or a resolved ``host:port`` representation. """ + if not peer: + return peer + + # Some callers pass a plain host:port string without a transport prefix. + # Handle those directly instead of assuming the first token is always a transport. + if peer.startswith("[") or peer.count(":") == 1: + parsed = _parse_host_port(peer) + if parsed is not None: + host, port = parsed + resolved_host = _resolve_host(host) + return f"{resolved_host}:{port}" + match = re.match(r"^(?P[^:]+):(?P
.+)$", peer) if not match: return peer diff --git a/tests/process_manager/conftest.py b/tests/process_manager/conftest.py index 6a2ba4bfd..78aed2525 100644 --- a/tests/process_manager/conftest.py +++ b/tests/process_manager/conftest.py @@ -7,6 +7,8 @@ to be back in line with druncschema definitions. """ +import socket + import google.protobuf.any_pb2 import pytest from druncschema.description_pb2 import Description @@ -36,7 +38,7 @@ def app_data(): Provides a mock application dictionary with required keys. """ return { - "restriction": "localhost", + "restriction": socket.gethostname(), "name": "TestApp", "type": "binary", "args": ["--arg1"], @@ -55,7 +57,7 @@ def bootrequest(app_data): user="test_user", session="session1", name=app_data["name"], - hostname="localhost", + hostname=socket.gethostname(), tree_id=app_data["tree_id"], ), executable_and_arguments=[{"exec": "binary", "args": ["--arg1"]}], diff --git a/tests/process_manager/interface/test_commands.py b/tests/process_manager/interface/test_commands.py index 6ba1e10ad..f1a5c5e4b 100644 --- a/tests/process_manager/interface/test_commands.py +++ b/tests/process_manager/interface/test_commands.py @@ -237,8 +237,9 @@ def test_boot_exiting_processes_abort(boot_arguments): # check that 'boot' was never called mock_driver.boot.assert_not_called() + # conf-id-123 from session name in this file assert ( - "You already have 2 processes running, are you sure you want to boot a session?" + "You already have 2 processes running for conf-id-123, are you sure you want to boot a session?" in result.output ) @@ -267,7 +268,7 @@ def test_boot_exiting_processes_user_confirm(boot_arguments): mock_driver.boot.assert_called() assert ( - "You already have 2 processes running, are you sure you want to boot a session?" + "You already have 2 processes running for conf-id-123, are you sure you want to boot a session?" in result.output ) diff --git a/tests/utils/test_utils.py b/tests/utils/test_utils.py index 94b3573d6..5094824b0 100644 --- a/tests/utils/test_utils.py +++ b/tests/utils/test_utils.py @@ -20,6 +20,7 @@ now_str, parent_death_pact, regex_match, + resolve_context_peer, resolve_localhost_and_127_ip_to_network_ip, resolve_localhost_to_hostname, validate_command_facility, @@ -157,6 +158,12 @@ def test_resolve_localhost_and_127_ip_to_network_ip(): assert resolved == generate_address(this_ip) +def test_resolve_context_peer(): + assert resolve_context_peer("grpc:np04-srv-028:50000") == "np04-srv-028:50000" + assert resolve_context_peer("np04-srv-028:50000") == "np04-srv-028:50000" + assert resolve_context_peer("") == "" + + def test_host_is_local(): this_ip = socket.gethostbyname(socket.gethostname()) hostname = socket.gethostname()