Skip to content

Commit

Permalink
fix: use DSN env var to run migration
Browse files Browse the repository at this point in the history
  • Loading branch information
nsklikas committed Sep 29, 2023
1 parent 1c7305b commit e004cf1
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 27 deletions.
39 changes: 18 additions & 21 deletions src/charm.py
Original file line number Diff line number Diff line change
Expand Up @@ -360,10 +360,23 @@ def _get_database_relation_info(self) -> dict:
"database_name": self._db_name,
}

@property
def _dsn(self) -> Optional[str]:
db_info = self._get_database_relation_info()
if not db_info:
return None

return "postgres://{username}:{password}@{endpoints}/{database_name}".format(
username=db_info.get("username"),
password=db_info.get("password"),
endpoints=db_info.get("endpoints"),
database_name=db_info.get("database_name"),
)

def _run_sql_migration(self, timeout: float = 60) -> bool:
"""Runs a command to create SQL schemas and apply migration plans."""
try:
self._hydra_cli.run_migration(timeout=timeout)
self._hydra_cli.run_migration(dsn=self._dsn, timeout=timeout)
except ExecError as err:
logger.error(f"Exited with code {err.exit_code}. Stderr: {err.stderr}")
return False
Expand Down Expand Up @@ -460,13 +473,6 @@ def _handle_status_update_config(self, event: HookEvent) -> None:
return

self.unit.status = MaintenanceStatus("Configuring resources")
self._container.add_layer(self._container_name, self._hydra_layer, combine=True)

if not self._hydra_service_is_created:
event.defer()
self.unit.status = WaitingStatus("Waiting for Hydra service")
logger.info("Hydra service is absent. Deferring the event.")
return

if not self.model.relations[self._db_relation_name]:
self.unit.status = BlockedStatus("Missing required relation with postgresql")
Expand All @@ -491,6 +497,7 @@ def _handle_status_update_config(self, event: HookEvent) -> None:

self._cleanup_peer_data()
self._container.push(self._hydra_config_path, self._render_conf_file(), make_dirs=True)
self._container.add_layer(self._container_name, self._hydra_layer, combine=True)
try:
self._container.restart(self._container_name)
except ChangeError as err:
Expand Down Expand Up @@ -561,22 +568,13 @@ def _on_database_created(self, event: DatabaseCreatedEvent) -> None:
event.defer()
return

self.unit.status = MaintenanceStatus(
"Configuring container and resources for database connection"
)

if not self._get_secrets():
self.unit.status = WaitingStatus("Waiting for secret creation")
event.defer()
return

logger.info("Updating Hydra config and restarting service")
self._container.add_layer(self._container_name, self._hydra_layer, combine=True)
self._container.push(self._hydra_config_path, self._render_conf_file(), make_dirs=True)

if not self._migration_is_needed():
self._container.start(self._container_name)
self.unit.status = ActiveStatus()
self._handle_status_update_config(event)
return

if not self.unit.is_leader():
Expand All @@ -590,9 +588,8 @@ def _on_database_created(self, event: DatabaseCreatedEvent) -> None:
logger.error("Automigration job failed, please use the run-migration action")
return

self._set_peer_data(DB_MIGRATION_VERSION_KEY, self._hydra_cli.get_version())
self._container.start(self._container_name)
self.unit.status = ActiveStatus()
self._set_peer_data(self._migration_peer_data_key, self._hydra_cli.get_version())
self._handle_status_update_config(event)

def _on_database_changed(self, event: DatabaseEndpointsChangedEvent) -> None:
"""Event Handler for database changed event."""
Expand Down
21 changes: 15 additions & 6 deletions src/hydra_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,11 +206,17 @@ def create_jwk(self, set_id: str = "hydra.openid.id-token", alg: str = "RS256")
logger.info(f"Successfully created jwk: {json_stdout['keys'][0]['kid']}")
return json_stdout

def run_migration(self, timeout: float = 60) -> Optional[str]:
def run_migration(self, dsn=None, timeout: float = 60) -> Optional[str]:
"""Run hydra migrations."""
cmd = ["hydra", "migrate", "sql", "-e", "--config", self.config_file_path, "--yes"]

_, stderr = self._run_cmd(cmd, timeout=timeout)
cmd = ["hydra", "migrate", "sql", "-e", "--yes"]
if dsn:
env = {"DSN": dsn}
else:
cmd.append("--config")
cmd.append(self.config_file_path)
env = None

_, stderr = self._run_cmd(cmd, timeout=timeout, environment=env)
return stderr

def get_version(self) -> str:
Expand All @@ -229,9 +235,12 @@ def get_version(self) -> str:
return versions[0]

def _run_cmd(
self, cmd: List[str], timeout: float = 20
self,
cmd: List[str],
timeout: float = 20,
environment: Optional[Dict] = None,
) -> Tuple[Union[str, bytes], Union[str, bytes]]:
logger.debug(f"Running cmd: {cmd}")
process = self.container.exec(cmd, timeout=timeout)
process = self.container.exec(cmd, environment=environment, timeout=timeout)
stdout, stderr = process.wait_output()
return stdout, stderr

0 comments on commit e004cf1

Please sign in to comment.