diff --git a/port_ocean/cli/commands.py b/port_ocean/cli/commands.py index 1ffa19dbe3..c04ab64d86 100644 --- a/port_ocean/cli/commands.py +++ b/port_ocean/cli/commands.py @@ -67,11 +67,31 @@ def version(short: bool) -> None: type=click.Choice(["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]), default="DEBUG", help="""Set the logging level for the integration. -Supported levels are DEBUG, INFO, WARNING, ERROR, -and CRITICAL. If not specified, the default level -is DEBUG.""", + Supported levels are DEBUG, INFO, WARNING, ERROR, + and CRITICAL. If not specified, the default level + is DEBUG.""", ) -def sail(path: str, log_level: LogLevelType) -> None: +@click.option( + "-p", + "--port", + "port", + type=int, + default=8000, + help="""Set the port for the integration to run on. + If not specified, the default port is 8000.""", +) +@click.option( + "-i", + "--initialize-port-resources", + "initialize_port_resources", + type=bool, + default=False, + help="""Set to true to create default resources on installation. + If not specified, the default value is false.""", +) +def sail( + path: str, log_level: LogLevelType, port: int, initialize_port_resources: bool +) -> None: """ Runs the integration in the given PATH. if no PATH is provided, the current directory will be used. @@ -82,7 +102,7 @@ def sail(path: str, log_level: LogLevelType) -> None: print_logo() console.print("Setting sail... ⛵️⚓️⛵️⚓️ All hands on deck! ⚓️") - run(path, log_level) + run(path, log_level, port, initialize_port_resources) @cli_start.command() diff --git a/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/defaults/.gitignore b/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/defaults/.gitignore new file mode 100644 index 0000000000..f935021a8f --- /dev/null +++ b/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/defaults/.gitignore @@ -0,0 +1 @@ +!.gitignore diff --git a/port_ocean/config/integration.py b/port_ocean/config/integration.py index 78f7dec90e..b045392c66 100644 --- a/port_ocean/config/integration.py +++ b/port_ocean/config/integration.py @@ -1,6 +1,6 @@ from typing import Any, Literal -from pydantic import BaseModel, Field, BaseSettings +from pydantic import Field, BaseSettings from port_ocean.config.base import BaseOceanSettings from port_ocean.core.event_listener import EventListenerSettingsType @@ -31,6 +31,9 @@ class IntegrationConfiguration(BaseOceanSettings): LogLevelType = Literal["ERROR", "WARNING", "INFO", "DEBUG", "CRITICAL"] -class LoggerConfiguration(BaseModel): - level: LogLevelType = "DEBUG" - serialize: bool = False +class ApplicationSettings(BaseSettings): + log_level: LogLevelType = "DEBUG" + port: int = 8000 + + class Config: + env_prefix = "APPLICATION_" diff --git a/port_ocean/logger_setup.py b/port_ocean/logger_setup.py index faae7c8cc9..d1e6cde87b 100644 --- a/port_ocean/logger_setup.py +++ b/port_ocean/logger_setup.py @@ -2,11 +2,10 @@ from loguru import logger -from port_ocean.config.integration import LoggerConfiguration, LogLevelType +from port_ocean.config.integration import LogLevelType def setup_logger(level: LogLevelType) -> None: - settings = LoggerConfiguration(level=level) logger_format = ( "{time:YYYY-MM-DD HH:mm:ss.SSS} | " "{level: <8} | " @@ -16,9 +15,8 @@ def setup_logger(level: LogLevelType) -> None: logger.remove() logger.add( sys.stdout, - level=settings.level.upper(), + level=level.upper(), format=logger_format, - serialize=settings.serialize, enqueue=True, # process logs in background diagnose=False, # hide variable values in log backtrace ) diff --git a/port_ocean/ocean.py b/port_ocean/ocean.py index 0eaa78102f..cb233d1426 100644 --- a/port_ocean/ocean.py +++ b/port_ocean/ocean.py @@ -12,7 +12,11 @@ from port_ocean.clients.port.client import PortClient from port_ocean.config.dynamic import default_config_factory -from port_ocean.config.integration import IntegrationConfiguration, LogLevelType +from port_ocean.config.integration import ( + IntegrationConfiguration, + LogLevelType, + ApplicationSettings, +) from port_ocean.context.ocean import ( PortOceanContext, ocean, @@ -95,8 +99,15 @@ async def startup() -> None: await self.fast_api_app(scope, receive, send) -def run(path: str = ".", log_level: LogLevelType = "DEBUG") -> None: - setup_logger(log_level) +def run( + path: str = ".", + log_level: LogLevelType = "DEBUG", + port: int = 8000, + initialize_port_resources: bool = False, +) -> None: + application_settings = ApplicationSettings(log_level=log_level, port=port) + + setup_logger(application_settings.log_level) sys.path.append(".") try: integration_path = f"{path}/integration.py" if path else "integration.py" @@ -119,9 +130,11 @@ def run(path: str = ".", log_level: LogLevelType = "DEBUG") -> None: "app", default_app ) + # Override config with arguments + app.config.initialize_port_resources = initialize_port_resources if app.config.initialize_port_resources: initialize_defaults( app.integration.AppConfigHandlerClass.CONFIG_CLASS, app.config ) - uvicorn.run(app, host="0.0.0.0", port=8000) + uvicorn.run(app, host="0.0.0.0", port=application_settings.port)