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)