|
67 | 67 |
|
68 | 68 | import json
|
69 | 69 | import logging
|
| 70 | +import typing as t |
70 | 71 |
|
71 | 72 | import boto3
|
| 73 | +from codeforlife.types import JsonDict |
72 | 74 |
|
| 75 | +if t.TYPE_CHECKING: |
| 76 | + from mypy_boto3_s3.client import S3Client |
73 | 77 |
|
74 |
| -def check_for_pointer_file(S3_APP_BUCKET, S3_APP_KEY): |
75 |
| - s3 = boto3.client("s3") |
76 | 78 |
|
77 |
| - pointer = s3.list_objects( |
78 |
| - Bucket=S3_APP_BUCKET, Prefix=f"{S3_APP_KEY}/dbMetadata/pointer" |
79 |
| - ) |
80 |
| - |
81 |
| - if pointer.get("Contents"): |
82 |
| - resp = s3.get_object( |
83 |
| - Bucket=S3_APP_BUCKET, Key=pointer["Contents"][0]["Key"] |
84 |
| - ) |
85 |
| - return resp["Body"].read().decode("utf-8") |
86 |
| - |
87 |
| - return None |
88 |
| - |
89 |
| - |
90 |
| -def construct_db_config(S3_APP_BUCKET, S3_KEY, DB_DATA): |
91 |
| - s3 = boto3.client("s3") |
92 |
| - |
93 |
| - print(f'connecting with bucket: "{S3_APP_BUCKET}", key: "{S3_KEY}"') |
94 |
| - logging.info(f'connecting with bucket: "{S3_APP_BUCKET}", key: "{S3_KEY}"') |
| 79 | +AWS_S3_APP_BUCKET = os.getenv("aws_s3_app_bucket") |
| 80 | +AWS_S3_APP_FOLDER = os.getenv("aws_s3_app_folder") |
| 81 | +# AWS_REGION = os.getenv("aws_region") |
| 82 | +APP_ID = os.getenv("APP_ID") # type: ignore[assignment] |
| 83 | +APP_VERSION = os.getenv("APP_VERSION") # type: ignore[assignment] |
95 | 84 |
|
96 |
| - cfg = s3.get_object(Bucket=S3_APP_BUCKET, Key=S3_KEY) |
97 | 85 |
|
98 |
| - config = json.loads(cfg["Body"].read().decode("utf-8")) |
| 86 | +def get_databases(): |
| 87 | + if AWS_S3_APP_BUCKET and AWS_S3_APP_FOLDER and APP_ID: |
| 88 | + key = f"{AWS_S3_APP_FOLDER}/dbMetadata/{APP_ID}/app.dbdata" |
99 | 89 |
|
100 |
| - if config and config["DBEngine"] == "postgres": |
101 |
| - DB_DATA["default"].update( |
102 |
| - { |
103 |
| - "NAME": config["Database"], |
104 |
| - "USER": config["user"], |
105 |
| - "PASSWORD": config["password"], |
106 |
| - "HOST": config["Endpoint"], |
107 |
| - "PORT": config["Port"], |
108 |
| - } |
| 90 | + print( |
| 91 | + f'(print) connecting with bucket: "{AWS_S3_APP_BUCKET}", key: "{key}"' |
| 92 | + ) |
| 93 | + logging.info( |
| 94 | + f'(log) connecting with bucket: "{AWS_S3_APP_BUCKET}", key: "{key}"' |
109 | 95 | )
|
110 | 96 |
|
111 |
| - return DB_DATA |
112 |
| - |
| 97 | + s3: "S3Client" = boto3.client("s3") |
| 98 | + db_data_object = s3.get_object(Bucket=AWS_S3_APP_BUCKET, Key=key) |
113 | 99 |
|
114 |
| -def load_db_config(S3_APP_BUCKET, S3_APP_KEY): |
115 |
| - s3 = boto3.client("s3") |
| 100 | + db_data: JsonDict = json.loads( |
| 101 | + db_data_object["Body"].read().decode("utf-8") |
| 102 | + ) |
116 | 103 |
|
117 |
| - default_dict = { |
| 104 | + if not db_data or db_data["DBEngine"] != "postgres": |
| 105 | + raise ConnectionAbortedError("Invalid database data.") |
| 106 | + |
| 107 | + name = db_data["Database"] |
| 108 | + user = db_data["user"] |
| 109 | + password = db_data["password"] |
| 110 | + host = db_data["Endpoint"] |
| 111 | + port = db_data["Port"] |
| 112 | + else: |
| 113 | + name = os.getenv("DB_NAME", SERVICE_NAME) |
| 114 | + user = os.getenv("DB_USER", "root") |
| 115 | + password = os.getenv("DB_PASSWORD", "password") |
| 116 | + host = os.getenv("DB_HOST", "localhost") |
| 117 | + port = int(os.getenv("DB_PORT", "5432")) |
| 118 | + |
| 119 | + return { |
118 | 120 | "default": {
|
119 |
| - # "ENGINE": "django.db.backends.postgresql_psycopg2", |
120 | 121 | "ENGINE": "django.db.backends.postgresql",
|
121 |
| - "NAME": "", |
122 |
| - "USER": "", |
123 |
| - "PASSWORD": "", |
124 |
| - "HOST": "", |
125 |
| - "PORT": "", |
126 |
| - "OPTIONS": { |
127 |
| - "connect_timeout": 300, |
128 |
| - }, |
| 122 | + "NAME": name, |
| 123 | + "USER": user, |
| 124 | + "PASSWORD": password, |
| 125 | + "HOST": host, |
| 126 | + "PORT": port, |
| 127 | + # "OPTIONS": { |
| 128 | + # "connect_timeout": 300, |
| 129 | + # }, |
129 | 130 | "ATOMIC_REQUESTS": True,
|
130 | 131 | }
|
131 | 132 | }
|
132 | 133 |
|
133 |
| - link = check_for_pointer_file(S3_APP_BUCKET, S3_APP_KEY) |
134 |
| - if link: |
135 |
| - return construct_db_config(S3_APP_BUCKET, link, default_dict) |
136 |
| - |
137 |
| - objs = s3.list_objects( |
138 |
| - Bucket=S3_APP_BUCKET, Prefix=f"{S3_APP_KEY}/dbMetadata/" |
139 |
| - ) |
140 |
| - for config_file in objs.get("Contents", []): |
141 |
| - return construct_db_config( |
142 |
| - S3_APP_BUCKET, config_file["Key"], default_dict |
143 |
| - ) |
144 |
| - |
145 |
| - |
146 |
| -S3_BUCKET = os.getenv("aws_s3_app_bucket") |
147 |
| -S3_PREFIX = os.getenv("aws_s3_app_folder") |
148 |
| -# AWS_REGION = os.getenv("aws_region") |
149 | 134 |
|
150 |
| -if S3_BUCKET and S3_PREFIX: |
151 |
| - DATABASES = load_db_config(S3_BUCKET, S3_PREFIX) |
152 |
| - |
153 |
| -# DATABASES = { |
154 |
| -# "default": { |
155 |
| -# "ENGINE": "django.db.backends.postgresql", |
156 |
| -# "NAME": os.getenv("DB_NAME", SERVICE_NAME), |
157 |
| -# "HOST": os.getenv("DB_HOST", "localhost"), |
158 |
| -# "PORT": int(os.getenv("DB_PORT", "5432")), |
159 |
| -# # "USER": os.getenv("DB_USER", "root"), |
160 |
| -# # "PASSWORD": os.getenv("DB_PASSWORD", "password"), |
161 |
| -# "ATOMIC_REQUESTS": True, |
162 |
| -# } |
163 |
| -# } |
| 135 | +DATABASES = get_databases() |
0 commit comments