Skip to content

Commit 4670b21

Browse files
authored
Oci prep for principals (#312)
* Fixed bootstrap issue * break out overrides
1 parent a012444 commit 4670b21

File tree

14 files changed

+129
-99
lines changed

14 files changed

+129
-99
lines changed

src/launch_client.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
logger = logging_config.logging.getLogger("launch_client")
2323

2424
# Import launch_server if it exists
25-
LAUNCH_SERVER_EXISTS = True
25+
launch_server_exists = True
2626
try:
2727
from launch_server import start_server, get_api_key
2828

@@ -31,7 +31,7 @@
3131
except ImportError as ex:
3232
logger.debug("API Server not present: %s", ex)
3333
os.environ.pop("API_SERVER_CONTROL", None)
34-
LAUNCH_SERVER_EXISTS = False
34+
launch_server_exists = False
3535

3636
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
3737

@@ -159,7 +159,7 @@ def main() -> None:
159159
if __name__ == "__main__":
160160
# Start Server if not running
161161
init_server_state()
162-
if LAUNCH_SERVER_EXISTS:
162+
if launch_server_exists:
163163
try:
164164
logger.debug("Server PID: %i", state.server["pid"])
165165
except KeyError:

src/server/api/core/bootstrap.py

Lines changed: 0 additions & 16 deletions
This file was deleted.

src/server/api/core/databases.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"""
55

66
from typing import Optional, Union
7-
from server.api.core import bootstrap
7+
from server.bootstrap import bootstrap
88

99
from common.schema import Database, DatabaseNameType
1010
from common import logging_config

src/server/api/core/prompts.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
# spell-checker:ignore
66

77
from typing import Optional, Union
8-
from server.api.core import bootstrap
8+
from server.bootstrap import bootstrap
99

1010
from common.schema import PromptCategoryType, PromptNameType, Prompt
1111
from common import logging_config

src/server/api/core/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import os
77
import copy
88
import json
9-
from server.api.core import bootstrap
9+
from server.bootstrap import bootstrap
1010

1111
from common.schema import Settings, Configuration, ClientIdType
1212
from common import logging_config

src/server/api/utils/databases.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ def connect(config: Database) -> oracledb.Connection:
156156
raise
157157
except OSError as ex:
158158
raise ConnectionError(f"Error connecting to database: {ex}") from ex
159-
159+
160160
logger.debug("Connected to Databases: %s", config.dsn)
161161

162162
return conn

src/server/api/utils/oci.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import oci
1414

15-
from server.bootstrap.bootstrap import OCI_OBJECTS, SETTINGS_OBJECTS
15+
from server.bootstrap import bootstrap
1616
from common.schema import OracleCloudSettings, ClientIdType, OCIProfileType
1717
from common import logging_config
1818

@@ -48,12 +48,19 @@ def get(
4848
if client is not None and auth_profile is not None:
4949
raise ValueError("provide either 'client' or 'auth_profile', not both")
5050

51-
oci_objects = OCI_OBJECTS
51+
oci_objects = bootstrap.OCI_OBJECTS
5252
if client is not None:
5353
# Get client settings directly from SETTINGS_OBJECTS
54-
client_settings = next((s for s in SETTINGS_OBJECTS if s.client == client), None)
54+
logger.debug("Looking for client %s in SETTINGS_OBJECTS", client)
55+
logger.debug(
56+
"SETTINGS_OBJECTS has %d entries: %s",
57+
len(bootstrap.SETTINGS_OBJECTS),
58+
[s.client for s in bootstrap.SETTINGS_OBJECTS],
59+
)
60+
client_settings = next((s for s in bootstrap.SETTINGS_OBJECTS if s.client == client), None)
5561
if not client_settings:
56-
raise ValueError(f"client {client} not found")
62+
available_clients = [s.client for s in bootstrap.SETTINGS_OBJECTS]
63+
raise ValueError(f"client {client} not found in SETTINGS_OBJECTS with clients: {available_clients}")
5764

5865
derived_auth_profile = (
5966
getattr(client_settings.oci, "auth_profile", "DEFAULT") if client_settings.oci else "DEFAULT"
@@ -275,6 +282,7 @@ def get_genai_models(config: OracleCloudSettings, regional: bool = False) -> lis
275282
"id": model.id,
276283
}
277284
)
285+
logger.info("Registered %i GenAI Models", len(genai_models))
278286
except oci.exceptions.ServiceError as ex:
279287
logger.info("Unable to get GenAI Models in Region: %s (%s)", region["region_name"], ex.message)
280288
except (oci.exceptions.RequestException, urllib3.exceptions.MaxRetryError):

src/server/bootstrap/bootstrap.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
"""
55
# spell-checker:ignore genai
66

7-
from server.bootstrap import models, oci, settings
7+
from server.bootstrap import databases, models, oci, prompts, settings
88
from common import logging_config
99

1010
logger = logging_config.logging.getLogger("bootstrap")
1111

12+
DATABASE_OBJECTS = databases.main()
1213
MODEL_OBJECTS = models.main()
1314
OCI_OBJECTS = oci.main()
15+
PROMPT_OBJECTS = prompts.main()
1416
SETTINGS_OBJECTS = settings.main()

src/server/bootstrap/oci.py

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,49 @@
1616
logger = logging_config.logging.getLogger("bootstrap.oci")
1717

1818

19+
def _apply_env_overrides_to_default_profile(config: list[dict]) -> None:
20+
"""Apply environment variable overrides to the DEFAULT OCI profile."""
21+
def override(profile: dict, key: str, env_key: str, env: dict, overrides: dict, default=None):
22+
val = env.get(env_key)
23+
if val is not None and val != profile.get(key):
24+
overrides[key] = (profile.get(key), val)
25+
return val
26+
return profile.get(key, default)
27+
28+
env = os.environ
29+
30+
for profile in config:
31+
if profile["auth_profile"] == oci.config.DEFAULT_PROFILE:
32+
overrides = {}
33+
34+
profile.update(
35+
{
36+
"tenancy": override(profile, "tenancy", "OCI_CLI_TENANCY", env, overrides),
37+
"region": override(profile, "region", "OCI_CLI_REGION", env, overrides),
38+
"user": override(profile, "user", "OCI_CLI_USER", env, overrides),
39+
"fingerprint": override(profile, "fingerprint", "OCI_CLI_FINGERPRINT", env, overrides),
40+
"key_file": override(profile, "key_file", "OCI_CLI_KEY_FILE", env, overrides),
41+
"security_token_file": override(
42+
profile, "security_token_file", "OCI_CLI_SECURITY_TOKEN_FILE", env, overrides
43+
),
44+
"authentication": env.get("OCI_CLI_AUTH")
45+
or ("security_token" if profile.get("security_token_file") else "api_key"),
46+
"genai_compartment_id": override(
47+
profile, "genai_compartment_id", "OCI_GENAI_COMPARTMENT_ID", env, overrides, None
48+
),
49+
"genai_region": override(profile, "genai_region", "OCI_GENAI_REGION", env, overrides, None),
50+
"log_requests": profile.get("log_requests", False),
51+
"additional_user_agent": profile.get("additional_user_agent", ""),
52+
"pass_phrase": profile.get("pass_phrase"),
53+
}
54+
)
55+
56+
if overrides:
57+
logger.info("Environment variable overrides for OCI DEFAULT profile:")
58+
for key, (old, new) in overrides.items():
59+
logger.info(" %s: '%s' -> '%s'", key, old, new)
60+
61+
1962
def main() -> list[OracleCloudSettings]:
2063
"""Read in OCI Configuration options into an object"""
2164
logger.debug("*** Bootstrapping OCI - Start")
@@ -62,45 +105,7 @@ def main() -> list[OracleCloudSettings]:
62105
config.append({"auth_profile": oci.config.DEFAULT_PROFILE})
63106

64107
# Override DEFAULT profile with environment variables
65-
def override(profile: dict, key: str, env_key: str, env: dict, overrides: dict, default=None):
66-
val = env.get(env_key)
67-
if val is not None and val != profile.get(key):
68-
overrides[key] = (profile.get(key), val)
69-
return val
70-
return profile.get(key, default)
71-
72-
env = os.environ
73-
74-
for profile in config:
75-
if profile["auth_profile"] == oci.config.DEFAULT_PROFILE:
76-
overrides = {}
77-
78-
profile.update(
79-
{
80-
"tenancy": override(profile, "tenancy", "OCI_CLI_TENANCY", env, overrides),
81-
"region": override(profile, "region", "OCI_CLI_REGION", env, overrides),
82-
"user": override(profile, "user", "OCI_CLI_USER", env, overrides),
83-
"fingerprint": override(profile, "fingerprint", "OCI_CLI_FINGERPRINT", env, overrides),
84-
"key_file": override(profile, "key_file", "OCI_CLI_KEY_FILE", env, overrides),
85-
"security_token_file": override(
86-
profile, "security_token_file", "OCI_CLI_SECURITY_TOKEN_FILE", env, overrides
87-
),
88-
"authentication": env.get("OCI_CLI_AUTH")
89-
or ("security_token" if profile.get("security_token_file") else "api_key"),
90-
"genai_compartment_id": override(
91-
profile, "genai_compartment_id", "OCI_GENAI_COMPARTMENT_ID", env, overrides, None
92-
),
93-
"genai_region": override(profile, "genai_region", "OCI_GENAI_REGION", env, overrides, None),
94-
"log_requests": profile.get("log_requests", False),
95-
"additional_user_agent": profile.get("additional_user_agent", ""),
96-
"pass_phrase": profile.get("pass_phrase"),
97-
}
98-
)
99-
100-
if overrides:
101-
logger.info("Environment variable overrides for OCI DEFAULT profile:")
102-
for key, (old, new) in overrides.items():
103-
logger.info(" %s: '%s' -> '%s'", key, old, new)
108+
_apply_env_overrides_to_default_profile(config)
104109

105110
# Build final OracleCloudSettings objects
106111
oci_objects = []

tests/server/unit/api/core/test_core_databases.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import pytest
1010

1111
from server.api.core import databases
12-
from server.api.core import bootstrap
12+
from server.bootstrap import bootstrap
1313
from common.schema import Database
1414

1515

0 commit comments

Comments
 (0)