From afa06c72a8bde8dcacb5383f01bb6fbd72cc2f8d Mon Sep 17 00:00:00 2001 From: Anurav Modak Date: Mon, 11 Dec 2023 22:47:09 +0530 Subject: [PATCH 1/5] dynamic port assignment while creating user session Signed-off-by: Anurav Modak --- src/oci_cli/cli_setup_bootstrap.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/oci_cli/cli_setup_bootstrap.py b/src/oci_cli/cli_setup_bootstrap.py index d379f12ff..4407abde5 100644 --- a/src/oci_cli/cli_setup_bootstrap.py +++ b/src/oci_cli/cli_setup_bootstrap.py @@ -15,6 +15,7 @@ import oci._vendor.jwt as jwt import oci import oci.regions as regions +import socket import os import sys import uuid @@ -39,6 +40,25 @@ @cli_util.help_option @click.pass_context @cli_util.wrap_exceptions +def is_port_available(port): + try: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind('',port) + return True + except OSError as e: + return False + + +def find_port(start_port,max_attempts=100): + """Find an available port starting from start_port""" + if is_port_available(start_port): + return start_port + for port in range(start_port+1,start_port+max_attempts+1): + if is_port_available(port): + return port + raise OSError(f"Could not find an available port in the range {start_port + 1} to {start_port + max_attempts}.") + + def bootstrap_oci_cli(ctx, profile_name, config_location): region_param = ctx.obj['region'] if ctx.obj['region'] else '' user_session = create_user_session(region=region_param) @@ -114,8 +134,12 @@ def create_user_session(region='', tenancy_name=None): if region == '': region = cli_setup.prompt_for_region() + + # try to set up http server so we can fail early if the required port is in use try: + # Firstly, we will check if PORT is available or not + BOOTSTRAP_SERVICE_PORT=is_port_available(BOOTSTRAP_SERVICE_PORT) server_address = ('', BOOTSTRAP_SERVICE_PORT) httpd = StoppableHttpServer(server_address, StoppableHttpRequestHandler) except OSError as e: From fc2bb85692786446bd03ead86b420c7c5d43080c Mon Sep 17 00:00:00 2001 From: Anurav Modak Date: Sun, 11 Feb 2024 14:43:06 +0530 Subject: [PATCH 2/5] Added command-line parameter Signed-off-by: Anurav Modak --- src/oci_cli/cli_setup_bootstrap.py | 74 +++++++++++++++++------------- 1 file changed, 43 insertions(+), 31 deletions(-) diff --git a/src/oci_cli/cli_setup_bootstrap.py b/src/oci_cli/cli_setup_bootstrap.py index 4407abde5..d60485a7b 100644 --- a/src/oci_cli/cli_setup_bootstrap.py +++ b/src/oci_cli/cli_setup_bootstrap.py @@ -43,22 +43,12 @@ def is_port_available(port): try: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: - s.bind('',port) + s.bind(('',port)) return True except OSError as e: - return False - - -def find_port(start_port,max_attempts=100): - """Find an available port starting from start_port""" - if is_port_available(start_port): - return start_port - for port in range(start_port+1,start_port+max_attempts+1): - if is_port_available(port): - return port - raise OSError(f"Could not find an available port in the range {start_port + 1} to {start_port + max_attempts}.") - - + return False + + def bootstrap_oci_cli(ctx, profile_name, config_location): region_param = ctx.obj['region'] if ctx.obj['region'] else '' user_session = create_user_session(region=region_param) @@ -129,28 +119,50 @@ def bootstrap_oci_cli(ctx, profile_name, config_location): oci iam region list --config-file {config_file} --profile {profile} """.format(config_file=config_location, profile=profile_name)) - -def create_user_session(region='', tenancy_name=None): +@click.command() +@click.option('-e', '--env-port', default=None, envvar='BOOTSTRAP_PORT', help='Specify the port to use (can be set via BOOTSTRAP_PORT environment variable)') +def create_user_session(env_port,region='', tenancy_name=None,): if region == '': region = cli_setup.prompt_for_region() - - - - # try to set up http server so we can fail early if the required port is in use + try: - # Firstly, we will check if PORT is available or not - BOOTSTRAP_SERVICE_PORT=is_port_available(BOOTSTRAP_SERVICE_PORT) - server_address = ('', BOOTSTRAP_SERVICE_PORT) - httpd = StoppableHttpServer(server_address, StoppableHttpRequestHandler) + env_port1 = os.getenv('BOOTSTRAP_PORT') + if env_port is None: + boot_strap_service_port = is_port_available(BOOTSTRAP_SERVICE_PORT) + click.echo("Port {} is available, establishing connection...".format(BOOTSTRAP_SERVICE_PORT)) + if boot_strap_service_port: + server_address = ('', int(BOOTSTRAP_SERVICE_PORT)) + httpd = StoppableHttpServer(server_address, StoppableHttpRequestHandler) + click.echo("Connected to port {}.".format(BOOTSTRAP_SERVICE_PORT)) + else: + click.echo("Could not complete bootstrap process because default port {} is already in use.".format( + BOOTSTRAP_SERVICE_PORT)) + elif env_port1: + if (is_port_available(int(env_port1)) and env_port1.isdigit()): + click.echo("Environment port {} is available, establishing connection...".format(env_port1)) + server_address = ('', int(env_port1)) + httpd = StoppableHttpServer(server_address, StoppableHttpRequestHandler) + click.echo("Connected to port {}".format(env_port1)) + else: + click.echo("Could not complete bootstrap process because port {} is already in use.".format(env_port)) + + elif env_port: + if is_port_available(int(env_port)) and env_port.isdigit(): + click.echo("Environment port {} is available, establishing connection...".format(env_port)) + server_address = ('', int(env_port)) + httpd = StoppableHttpServer(server_address, StoppableHttpRequestHandler) + click.echo("Connected to port {}".format(env_port)) + + else: + click.echo("Could not complete bootstrap process because port {} is already in use.".format(env_port)) + + else: + click.echo("No input of port received. Exiting...") + sys.exit(0) except OSError as e: if e.errno == errno.EADDRINUSE: - click.echo("Could not complete bootstrap process because port {port} is already in use.".format( - port=BOOTSTRAP_SERVICE_PORT) - ) - - sys.exit(1) - - raise e + click.echo("Could not complete bootstrap process. Failed to find an empty port") + sys.exit(0) # create new key pair # this key pair is used to get the initial token and also uploaded as a new API key for the user From dc012776ba86fc38d0fc787d47b9821968fbd32a Mon Sep 17 00:00:00 2001 From: Anurav Modak Date: Sun, 11 Feb 2024 15:00:13 +0530 Subject: [PATCH 3/5] Added command-line parameter v1.1 Signed-off-by: Anurav Modak --- src/oci_cli/cli_setup_bootstrap.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/oci_cli/cli_setup_bootstrap.py b/src/oci_cli/cli_setup_bootstrap.py index d60485a7b..0b43c00ae 100644 --- a/src/oci_cli/cli_setup_bootstrap.py +++ b/src/oci_cli/cli_setup_bootstrap.py @@ -127,6 +127,12 @@ def create_user_session(env_port,region='', tenancy_name=None,): try: env_port1 = os.getenv('BOOTSTRAP_PORT') + port_number=env_port1 or env_port + if not port_number.isdigit(): + click.echo("Invalid port number") + raise ValueError("Invalid port number") + + if env_port is None: boot_strap_service_port = is_port_available(BOOTSTRAP_SERVICE_PORT) click.echo("Port {} is available, establishing connection...".format(BOOTSTRAP_SERVICE_PORT)) @@ -138,7 +144,7 @@ def create_user_session(env_port,region='', tenancy_name=None,): click.echo("Could not complete bootstrap process because default port {} is already in use.".format( BOOTSTRAP_SERVICE_PORT)) elif env_port1: - if (is_port_available(int(env_port1)) and env_port1.isdigit()): + if is_port_available(int(env_port1)): click.echo("Environment port {} is available, establishing connection...".format(env_port1)) server_address = ('', int(env_port1)) httpd = StoppableHttpServer(server_address, StoppableHttpRequestHandler) @@ -147,7 +153,7 @@ def create_user_session(env_port,region='', tenancy_name=None,): click.echo("Could not complete bootstrap process because port {} is already in use.".format(env_port)) elif env_port: - if is_port_available(int(env_port)) and env_port.isdigit(): + if is_port_available(int(env_port)): click.echo("Environment port {} is available, establishing connection...".format(env_port)) server_address = ('', int(env_port)) httpd = StoppableHttpServer(server_address, StoppableHttpRequestHandler) From 62e0c902b95ac40ea434861b242bc577bad23c68 Mon Sep 17 00:00:00 2001 From: Anurav Modak Date: Sun, 11 Feb 2024 15:01:20 +0530 Subject: [PATCH 4/5] Added command-line parameter v1.1 Signed-off-by: Anurav Modak --- src/oci_cli/cli_setup_bootstrap.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/oci_cli/cli_setup_bootstrap.py b/src/oci_cli/cli_setup_bootstrap.py index 0b43c00ae..1fc40a4ae 100644 --- a/src/oci_cli/cli_setup_bootstrap.py +++ b/src/oci_cli/cli_setup_bootstrap.py @@ -135,11 +135,11 @@ def create_user_session(env_port,region='', tenancy_name=None,): if env_port is None: boot_strap_service_port = is_port_available(BOOTSTRAP_SERVICE_PORT) - click.echo("Port {} is available, establishing connection...".format(BOOTSTRAP_SERVICE_PORT)) + click.echo("Default port {} is available, establishing connection...".format(BOOTSTRAP_SERVICE_PORT)) if boot_strap_service_port: server_address = ('', int(BOOTSTRAP_SERVICE_PORT)) httpd = StoppableHttpServer(server_address, StoppableHttpRequestHandler) - click.echo("Connected to port {}.".format(BOOTSTRAP_SERVICE_PORT)) + click.echo("Connected to default port {}.".format(BOOTSTRAP_SERVICE_PORT)) else: click.echo("Could not complete bootstrap process because default port {} is already in use.".format( BOOTSTRAP_SERVICE_PORT)) From d7e0a7ec4fbce5db28e1c423cc662d6fc7e0bc70 Mon Sep 17 00:00:00 2001 From: Anurav Modak Date: Sun, 11 Feb 2024 15:05:24 +0530 Subject: [PATCH 5/5] Added command-line parameter v1.2 Signed-off-by: Anurav Modak --- src/oci_cli/cli_setup_bootstrap.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/oci_cli/cli_setup_bootstrap.py b/src/oci_cli/cli_setup_bootstrap.py index 1fc40a4ae..1946716c4 100644 --- a/src/oci_cli/cli_setup_bootstrap.py +++ b/src/oci_cli/cli_setup_bootstrap.py @@ -128,15 +128,15 @@ def create_user_session(env_port,region='', tenancy_name=None,): try: env_port1 = os.getenv('BOOTSTRAP_PORT') port_number=env_port1 or env_port + if not port_number.isdigit(): click.echo("Invalid port number") raise ValueError("Invalid port number") - if env_port is None: boot_strap_service_port = is_port_available(BOOTSTRAP_SERVICE_PORT) - click.echo("Default port {} is available, establishing connection...".format(BOOTSTRAP_SERVICE_PORT)) if boot_strap_service_port: + click.echo("Default port {} is available, establishing connection...".format(BOOTSTRAP_SERVICE_PORT)) server_address = ('', int(BOOTSTRAP_SERVICE_PORT)) httpd = StoppableHttpServer(server_address, StoppableHttpRequestHandler) click.echo("Connected to default port {}.".format(BOOTSTRAP_SERVICE_PORT)) @@ -145,7 +145,7 @@ def create_user_session(env_port,region='', tenancy_name=None,): BOOTSTRAP_SERVICE_PORT)) elif env_port1: if is_port_available(int(env_port1)): - click.echo("Environment port {} is available, establishing connection...".format(env_port1)) + click.echo("Port {} passed as env. variable is available, establishing connection...".format(env_port1)) server_address = ('', int(env_port1)) httpd = StoppableHttpServer(server_address, StoppableHttpRequestHandler) click.echo("Connected to port {}".format(env_port1)) @@ -154,7 +154,7 @@ def create_user_session(env_port,region='', tenancy_name=None,): elif env_port: if is_port_available(int(env_port)): - click.echo("Environment port {} is available, establishing connection...".format(env_port)) + click.echo("Port {} passed as env. variable is available, establishing connection...".format(env_port)) server_address = ('', int(env_port)) httpd = StoppableHttpServer(server_address, StoppableHttpRequestHandler) click.echo("Connected to port {}".format(env_port))