atlas-init 0.4.3__py3-none-any.whl → 0.4.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- atlas_init/__init__.py +2 -3
- atlas_init/cli.py +2 -1
- atlas_init/cli_cfn/app.py +3 -5
- atlas_init/cli_cfn/cfn_parameter_finder.py +1 -28
- atlas_init/cli_cfn/contract.py +5 -3
- atlas_init/cli_cfn/example.py +8 -6
- atlas_init/cli_helper/go.py +17 -13
- atlas_init/cli_helper/tf_runner.py +14 -11
- atlas_init/cli_root/trigger.py +21 -8
- atlas_init/cli_tf/app.py +1 -1
- atlas_init/cli_tf/github_logs.py +4 -16
- atlas_init/cli_tf/hcl/modifier.py +115 -14
- atlas_init/cli_tf/mock_tf_log.py +3 -2
- atlas_init/cli_tf/schema_v3.py +2 -2
- atlas_init/cli_tf/schema_v3_sdk_base.py +1 -1
- atlas_init/settings/env_vars.py +119 -142
- atlas_init/settings/env_vars_generated.py +40 -9
- atlas_init/settings/env_vars_modules.py +71 -0
- atlas_init/settings/path.py +3 -9
- atlas_init/typer_app.py +3 -3
- {atlas_init-0.4.3.dist-info → atlas_init-0.4.4.dist-info}/METADATA +2 -2
- {atlas_init-0.4.3.dist-info → atlas_init-0.4.4.dist-info}/RECORD +25 -29
- atlas_init/cli_tf/example_update_test/test_update_example.tf +0 -23
- atlas_init/cli_tf/example_update_test.py +0 -96
- atlas_init/cli_tf/hcl/modifier_test/test_process_variables_output_.tf +0 -25
- atlas_init/cli_tf/hcl/modifier_test/test_process_variables_variable_.tf +0 -24
- atlas_init/cli_tf/hcl/modifier_test.py +0 -95
- {atlas_init-0.4.3.dist-info → atlas_init-0.4.4.dist-info}/WHEEL +0 -0
- {atlas_init-0.4.3.dist-info → atlas_init-0.4.4.dist-info}/entry_points.txt +0 -0
- {atlas_init-0.4.3.dist-info → atlas_init-0.4.4.dist-info}/licenses/LICENSE +0 -0
atlas_init/cli_tf/schema_v3.py
CHANGED
@@ -210,12 +210,12 @@ class Schema(BaseModelLocal):
|
|
210
210
|
|
211
211
|
|
212
212
|
class Resource(BaseModelLocal):
|
213
|
-
|
213
|
+
local_schema: Schema = Field(alias="schema")
|
214
214
|
name: SnakeCaseString
|
215
215
|
|
216
216
|
@property
|
217
217
|
def use_timeout(self) -> bool:
|
218
|
-
return any(a.timeouts for a in self.
|
218
|
+
return any(a.timeouts for a in self.local_schema.attributes)
|
219
219
|
|
220
220
|
|
221
221
|
ResourceSchemaV3 = Resource
|
@@ -41,7 +41,7 @@ def schema_attributes(root: object) -> list[Attribute]:
|
|
41
41
|
|
42
42
|
@schema_attributes.register
|
43
43
|
def _resource_attributes(root: Resource) -> list[Attribute]:
|
44
|
-
return root.
|
44
|
+
return root.local_schema.attributes
|
45
45
|
|
46
46
|
|
47
47
|
@schema_attributes.register
|
atlas_init/settings/env_vars.py
CHANGED
@@ -7,11 +7,10 @@ from functools import cached_property
|
|
7
7
|
from pathlib import Path
|
8
8
|
from typing import Any, NamedTuple, TypeVar
|
9
9
|
|
10
|
-
from model_lib import parse_payload
|
11
|
-
from pydantic import ValidationError, field_validator
|
12
|
-
from
|
10
|
+
from model_lib import StaticSettings, parse_payload
|
11
|
+
from pydantic import BaseModel, ValidationError, field_validator
|
12
|
+
from zero_3rdparty import iter_utils
|
13
13
|
|
14
|
-
from atlas_init.cloud.aws import AwsRegion
|
15
14
|
from atlas_init.settings.config import (
|
16
15
|
AtlasInitConfig,
|
17
16
|
TestSuite,
|
@@ -19,12 +18,10 @@ from atlas_init.settings.config import (
|
|
19
18
|
from atlas_init.settings.config import (
|
20
19
|
active_suites as config_active_suites,
|
21
20
|
)
|
22
|
-
from atlas_init.settings.env_vars_generated import AtlasSettings
|
23
21
|
from atlas_init.settings.path import (
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
DEFAULT_TF_PATH,
|
22
|
+
DEFAULT_ATLAS_INIT_CONFIG_PATH,
|
23
|
+
DEFAULT_ATLAS_INIT_SCHEMA_CONFIG_PATH,
|
24
|
+
DEFAULT_TF_SRC_PATH,
|
28
25
|
dump_dotenv,
|
29
26
|
load_dotenv,
|
30
27
|
repo_path_rel_path,
|
@@ -33,66 +30,59 @@ from atlas_init.settings.path import (
|
|
33
30
|
logger = logging.getLogger(__name__)
|
34
31
|
ENV_PREFIX = "ATLAS_INIT_"
|
35
32
|
DEFAULT_PROFILE = "default"
|
33
|
+
DEFAULT_PROJECT_NAME = "atlas-init"
|
36
34
|
ENV_S3_PROFILE_BUCKET = f"{ENV_PREFIX}S3_PROFILE_BUCKET"
|
37
35
|
ENV_PROJECT_NAME = f"{ENV_PREFIX}PROJECT_NAME"
|
38
36
|
ENV_PROFILE = f"{ENV_PREFIX}PROFILE"
|
39
|
-
ENV_PROFILES_PATH = f"{ENV_PREFIX}PROFILES_PATH"
|
40
37
|
ENV_TEST_SUITES = f"{ENV_PREFIX}TEST_SUITES"
|
41
38
|
ENV_CLIPBOARD_COPY = f"{ENV_PREFIX}CLIPBOARD_COPY"
|
42
|
-
REQUIRED_FIELDS = [
|
43
|
-
"MONGODB_ATLAS_ORG_ID",
|
44
|
-
"MONGODB_ATLAS_PRIVATE_KEY",
|
45
|
-
"MONGODB_ATLAS_PUBLIC_KEY",
|
46
|
-
]
|
47
39
|
FILENAME_ENV_MANUAL = ".env-manual"
|
48
40
|
T = TypeVar("T")
|
49
41
|
|
50
42
|
|
51
|
-
|
52
|
-
|
43
|
+
def read_from_env(env_key: str, default: str = "") -> str:
|
44
|
+
return next(
|
45
|
+
(os.environ[name] for name in [env_key, env_key.lower(), env_key.upper()] if name in os.environ),
|
46
|
+
default,
|
47
|
+
)
|
53
48
|
|
54
|
-
TF_CLI_CONFIG_FILE: str = ""
|
55
|
-
AWS_PROFILE: str = ""
|
56
|
-
AWS_REGION: AwsRegion = "us-east-1"
|
57
|
-
non_interactive: bool = False
|
58
49
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
50
|
+
class AtlasInitSettings(StaticSettings):
|
51
|
+
atlas_init_profile: str = DEFAULT_PROFILE # override this for different env, e.g. dev, prod
|
52
|
+
atlas_init_project_name: str = DEFAULT_PROJECT_NAME # used in the atlas cloud
|
53
|
+
atlas_init_config_path: Path = DEFAULT_ATLAS_INIT_CONFIG_PATH # /atlas_init.yaml
|
54
|
+
atlas_init_tf_src_path: Path = DEFAULT_TF_SRC_PATH # /tf directory of repo
|
55
|
+
atlas_init_tf_schema_config_path: Path = DEFAULT_ATLAS_INIT_SCHEMA_CONFIG_PATH # /terraform.yaml
|
56
|
+
atlas_init_schema_out_path: Path | None = None # override this for the generated schema
|
57
|
+
|
58
|
+
atlas_init_cfn_profile: str = ""
|
59
|
+
atlas_init_cfn_region: str = ""
|
60
|
+
atlas_init_cfn_use_kms_key: bool = False
|
61
|
+
atlas_init_cliboard_copy: str = ""
|
62
|
+
atlas_init_test_suites: str = ""
|
63
|
+
atlas_init_s3_profile_bucket: str = ""
|
64
|
+
|
65
|
+
non_interactive: bool = False
|
65
66
|
|
66
67
|
@property
|
67
68
|
def is_interactive(self) -> bool:
|
68
69
|
return not self.non_interactive
|
69
70
|
|
70
71
|
@property
|
71
|
-
def
|
72
|
-
return "
|
72
|
+
def profiles_path(self) -> Path:
|
73
|
+
return self.static_root / "profiles"
|
73
74
|
|
75
|
+
@property
|
76
|
+
def project_name(self) -> str:
|
77
|
+
return self.atlas_init_project_name
|
74
78
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
return os.environ[name]
|
79
|
-
return default
|
80
|
-
|
81
|
-
|
82
|
-
class AtlasInitPaths(BaseSettings):
|
83
|
-
model_config = SettingsConfigDict(env_prefix=ENV_PREFIX)
|
84
|
-
|
85
|
-
profile: str = DEFAULT_PROFILE
|
86
|
-
config_path: Path = DEFAULT_CONFIG_PATH
|
87
|
-
tf_path: Path = DEFAULT_TF_PATH
|
88
|
-
profiles_path: Path = DEFAULT_PROFILES_PATH
|
89
|
-
tf_schema_config_path: Path = DEFAULT_SCHEMA_CONFIG_PATH
|
90
|
-
schema_out_path: Path | None = None
|
91
|
-
s3_profile_bucket: str = ""
|
79
|
+
@property
|
80
|
+
def profile(self) -> str:
|
81
|
+
return self.atlas_init_profile
|
92
82
|
|
93
83
|
@property
|
94
84
|
def schema_out_path_computed(self) -> Path:
|
95
|
-
return self.
|
85
|
+
return self.atlas_init_schema_out_path or self.static_root / "schema"
|
96
86
|
|
97
87
|
@property
|
98
88
|
def profile_dir(self) -> Path:
|
@@ -135,8 +125,24 @@ class AtlasInitPaths(BaseSettings):
|
|
135
125
|
def tf_outputs_path(self) -> Path:
|
136
126
|
return self.profile_dir / "tf_outputs.json"
|
137
127
|
|
138
|
-
|
139
|
-
|
128
|
+
@property
|
129
|
+
def github_ci_run_logs(self) -> Path:
|
130
|
+
return self.cache_root / "github_ci_run_logs"
|
131
|
+
|
132
|
+
@property
|
133
|
+
def github_ci_summary_dir(self) -> Path:
|
134
|
+
return self.cache_root / "github_ci_summary"
|
135
|
+
|
136
|
+
@property
|
137
|
+
def go_test_logs_dir(self) -> Path:
|
138
|
+
return self.cache_root / "go_test_logs"
|
139
|
+
|
140
|
+
@property
|
141
|
+
def atlas_atlas_api_transformed_yaml(self) -> Path:
|
142
|
+
return self.cache_root / "atlas_api_transformed.yaml"
|
143
|
+
|
144
|
+
def cfn_region(self, default: str) -> str:
|
145
|
+
return self.atlas_init_cfn_region or default
|
140
146
|
|
141
147
|
def load_env_vars_full(self) -> dict[str, str]:
|
142
148
|
env_path = self.env_vars_vs_code
|
@@ -149,7 +155,7 @@ class AtlasInitPaths(BaseSettings):
|
|
149
155
|
|
150
156
|
def env_vars_cls(self, t: type[T], *, path: Path | None = None) -> T:
|
151
157
|
path = path or self.env_vars_vs_code
|
152
|
-
env_vars =
|
158
|
+
env_vars = load_dotenv(path) if path.exists() else {}
|
153
159
|
return t(**env_vars)
|
154
160
|
|
155
161
|
def load_profile_manual_env_vars(self, *, skip_os_update: bool = False) -> dict[str, str]:
|
@@ -161,77 +167,25 @@ class AtlasInitPaths(BaseSettings):
|
|
161
167
|
if new_updates := {k: v for k, v in manual_env_vars.items() if k not in os.environ}:
|
162
168
|
logger.info(f"loading manual env-vars {','.join(new_updates)}")
|
163
169
|
os.environ.update(new_updates)
|
164
|
-
else:
|
165
|
-
logger.warning(f"no {self.env_file_manual} exists")
|
166
170
|
return manual_env_vars
|
167
171
|
|
168
172
|
def include_extra_env_vars_in_vscode(self, extra_env_vars: dict[str, str]) -> None:
|
169
173
|
extra_name = ", ".join(extra_env_vars.keys())
|
170
|
-
original_env_vars =
|
174
|
+
original_env_vars = load_dotenv(self.env_vars_vs_code)
|
171
175
|
new_env_vars = original_env_vars | extra_env_vars
|
172
176
|
dump_dotenv(self.env_vars_vs_code, new_env_vars)
|
173
177
|
logger.info(f"done {self.env_vars_vs_code} updated with {extra_name} env-vars ✅")
|
174
178
|
|
175
|
-
|
176
|
-
class EnvVarsCheck(NamedTuple):
|
177
|
-
missing: list[str]
|
178
|
-
ambiguous: list[str]
|
179
|
-
|
180
|
-
|
181
|
-
class AtlasInitSettings(AtlasInitPaths, ExternalSettings):
|
182
|
-
model_config = SettingsConfigDict(env_prefix=ENV_PREFIX)
|
183
|
-
|
184
|
-
cfn_profile: str = ""
|
185
|
-
cfn_region: str = ""
|
186
|
-
cfn_use_kms_key: bool = False
|
187
|
-
project_name: str = ""
|
188
|
-
|
189
|
-
cliboard_copy: str = ""
|
190
|
-
test_suites: str = ""
|
191
|
-
|
192
|
-
@classmethod
|
193
|
-
def check_env_vars(
|
194
|
-
cls,
|
195
|
-
profile: str = DEFAULT_PROFILE,
|
196
|
-
required_env_vars: list[str] | None = None,
|
197
|
-
) -> EnvVarsCheck:
|
198
|
-
required_env_vars = required_env_vars or []
|
199
|
-
path_settings = AtlasInitPaths(profile=profile)
|
200
|
-
manual_env_vars = path_settings.manual_env_vars
|
201
|
-
ambiguous: list[str] = []
|
202
|
-
for env_name, manual_value in manual_env_vars.items():
|
203
|
-
env_value = read_from_env(env_name)
|
204
|
-
if env_value and manual_value != env_value:
|
205
|
-
ambiguous.append(env_name)
|
206
|
-
missing_env_vars = sorted(
|
207
|
-
env_name
|
208
|
-
for env_name in REQUIRED_FIELDS + required_env_vars
|
209
|
-
if read_from_env(env_name) == "" and env_name not in manual_env_vars
|
210
|
-
)
|
211
|
-
return EnvVarsCheck(missing=missing_env_vars, ambiguous=sorted(ambiguous))
|
212
|
-
|
213
|
-
@classmethod
|
214
|
-
def safe_settings(cls, profile: str, *, ext_settings: ExternalSettings | None = None) -> AtlasInitSettings:
|
215
|
-
"""side effect of loading manual env-vars and set profile"""
|
216
|
-
os.environ[ENV_PROFILE] = profile
|
217
|
-
AtlasInitPaths(profile=profile).load_profile_manual_env_vars()
|
218
|
-
ext_settings = ext_settings or ExternalSettings() # type: ignore
|
219
|
-
path_settings = AtlasInitPaths()
|
220
|
-
return cls(**path_settings.model_dump(), **ext_settings.model_dump())
|
221
|
-
|
222
|
-
@field_validator("test_suites", mode="after")
|
179
|
+
@field_validator(ENV_TEST_SUITES.lower(), mode="after")
|
223
180
|
@classmethod
|
224
181
|
def ensure_whitespace_replaced_with_commas(cls, value: str) -> str:
|
225
182
|
return value.strip().replace(" ", ",")
|
226
183
|
|
227
|
-
@model_validator(mode="after")
|
228
|
-
def post_init(self):
|
229
|
-
self.cfn_region = self.cfn_region or self.AWS_REGION
|
230
|
-
return self
|
231
|
-
|
232
184
|
@cached_property
|
233
185
|
def config(self) -> AtlasInitConfig:
|
234
|
-
config_path =
|
186
|
+
config_path = (
|
187
|
+
Path(self.atlas_init_config_path) if self.atlas_init_config_path else DEFAULT_ATLAS_INIT_CONFIG_PATH
|
188
|
+
)
|
235
189
|
assert config_path.exists(), f"no config path found @ {config_path}"
|
236
190
|
yaml_parsed = parse_payload(config_path)
|
237
191
|
assert isinstance(yaml_parsed, dict), f"config must be a dictionary, got {yaml_parsed}"
|
@@ -239,30 +193,35 @@ class AtlasInitSettings(AtlasInitPaths, ExternalSettings):
|
|
239
193
|
|
240
194
|
@property
|
241
195
|
def test_suites_parsed(self) -> list[str]:
|
242
|
-
return [t for t in self.
|
196
|
+
return [t for t in self.atlas_init_test_suites.split(",") if t]
|
243
197
|
|
244
|
-
def tf_vars(self) -> dict[str, Any]:
|
198
|
+
def tf_vars(self, default_aws_region: str) -> dict[str, Any]:
|
245
199
|
variables = {}
|
246
|
-
if self.
|
200
|
+
if self.atlas_init_cfn_profile:
|
247
201
|
variables["cfn_config"] = {
|
248
|
-
"profile": self.
|
249
|
-
"region": self.
|
250
|
-
"use_kms_key": self.
|
202
|
+
"profile": self.atlas_init_cfn_profile,
|
203
|
+
"region": self.atlas_init_cfn_region or default_aws_region,
|
204
|
+
"use_kms_key": self.atlas_init_cfn_use_kms_key,
|
251
205
|
}
|
252
|
-
if self.
|
206
|
+
if self.atlas_init_s3_profile_bucket:
|
253
207
|
variables["use_aws_s3"] = True
|
254
208
|
return variables
|
255
209
|
|
256
210
|
|
211
|
+
class EnvVarsCheck(NamedTuple):
|
212
|
+
missing: list[str]
|
213
|
+
ambiguous: list[str]
|
214
|
+
|
215
|
+
@property
|
216
|
+
def is_ok(self) -> bool:
|
217
|
+
return not self.missing and not self.ambiguous
|
218
|
+
|
219
|
+
|
257
220
|
def active_suites(settings: AtlasInitSettings) -> list[TestSuite]: # type: ignore
|
258
221
|
repo_path, cwd_rel_path = repo_path_rel_path()
|
259
222
|
return config_active_suites(settings.config, repo_path, cwd_rel_path, settings.test_suites_parsed)
|
260
223
|
|
261
224
|
|
262
|
-
_sentinel = object()
|
263
|
-
PLACEHOLDER_VALUE = "PLACEHOLDER"
|
264
|
-
|
265
|
-
|
266
225
|
class EnvVarsError(Exception):
|
267
226
|
def __init__(self, missing: list[str], ambiguous: list[str]):
|
268
227
|
self.missing = missing
|
@@ -273,31 +232,49 @@ class EnvVarsError(Exception):
|
|
273
232
|
return f"missing: {self.missing}, ambiguous: {self.ambiguous}"
|
274
233
|
|
275
234
|
|
235
|
+
def collect_required_env_vars(settings_classes: list[type[BaseModel]]) -> list[str]:
|
236
|
+
cls_required_env_vars: dict[str, list[str]] = {}
|
237
|
+
for cls in settings_classes:
|
238
|
+
try:
|
239
|
+
cls()
|
240
|
+
except ValidationError as error:
|
241
|
+
cls_required_env_vars[cls.__name__] = [".".join(str(loc) for loc in e["loc"]) for e in error.errors()]
|
242
|
+
return list(iter_utils.flat_map(cls_required_env_vars.values()))
|
243
|
+
|
244
|
+
|
245
|
+
def detect_ambiguous_env_vars(manual_env_vars: dict[str, str]) -> list[str]:
|
246
|
+
ambiguous: list[str] = []
|
247
|
+
for env_name, manual_value in manual_env_vars.items():
|
248
|
+
env_value = read_from_env(env_name)
|
249
|
+
if env_value and manual_value != env_value:
|
250
|
+
ambiguous.append(env_name)
|
251
|
+
return ambiguous
|
252
|
+
|
253
|
+
|
254
|
+
def find_missing_env_vars(required_env_vars: list[str], manual_env_vars: dict[str, str]) -> list[str]:
|
255
|
+
return sorted(
|
256
|
+
env_name for env_name in required_env_vars if read_from_env(env_name) == "" and env_name not in manual_env_vars
|
257
|
+
)
|
258
|
+
|
259
|
+
|
276
260
|
def init_settings(
|
277
|
-
|
278
|
-
*,
|
279
|
-
non_required: bool = False,
|
261
|
+
*settings_classes: type[BaseModel],
|
280
262
|
) -> AtlasInitSettings:
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
missing_env_vars
|
287
|
-
|
288
|
-
|
289
|
-
)
|
290
|
-
if missing_env_vars and not non_required:
|
291
|
-
logger.warning(f"missing env_vars: {missing_env_vars}")
|
292
|
-
if ambiguous_env_vars:
|
263
|
+
settings = AtlasInitSettings.from_env()
|
264
|
+
manual_env_vars = settings.manual_env_vars
|
265
|
+
|
266
|
+
required_env_vars = collect_required_env_vars(list(settings_classes))
|
267
|
+
ambiguous = detect_ambiguous_env_vars(manual_env_vars)
|
268
|
+
missing_env_vars = find_missing_env_vars(required_env_vars, manual_env_vars)
|
269
|
+
|
270
|
+
if ambiguous:
|
293
271
|
logger.warning(
|
294
|
-
f"
|
272
|
+
f"ambiguous env_vars: {ambiguous} (specified both in cli/env & in .env-manual file with different values)"
|
295
273
|
)
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
return AtlasInitSettings.safe_settings(profile, ext_settings=ext_settings)
|
274
|
+
if missing_env_vars or ambiguous:
|
275
|
+
raise EnvVarsError(missing_env_vars, ambiguous)
|
276
|
+
|
277
|
+
settings.load_profile_manual_env_vars()
|
278
|
+
for cls in settings_classes:
|
279
|
+
cls() # ensure any errors are raised
|
280
|
+
return AtlasInitSettings.from_env()
|
@@ -1,18 +1,55 @@
|
|
1
1
|
import random
|
2
|
+
from typing import Self
|
2
3
|
|
3
|
-
from pydantic import ConfigDict, Field
|
4
|
+
from pydantic import ConfigDict, Field, model_validator
|
4
5
|
from pydantic_settings import BaseSettings
|
5
6
|
|
6
7
|
|
7
8
|
class _EnvVarsGenerated(BaseSettings):
|
8
9
|
model_config = ConfigDict(extra="ignore") # type: ignore
|
9
10
|
|
11
|
+
@classmethod
|
12
|
+
def from_env(cls) -> Self:
|
13
|
+
return cls()
|
14
|
+
|
10
15
|
|
11
16
|
class AtlasSettings(_EnvVarsGenerated):
|
12
17
|
MONGODB_ATLAS_ORG_ID: str
|
13
18
|
MONGODB_ATLAS_PRIVATE_KEY: str
|
14
19
|
MONGODB_ATLAS_PUBLIC_KEY: str
|
15
|
-
MONGODB_ATLAS_BASE_URL: str
|
20
|
+
MONGODB_ATLAS_BASE_URL: str
|
21
|
+
|
22
|
+
@property
|
23
|
+
def realm_url(self) -> str:
|
24
|
+
assert not self.is_mongodbgov_cloud, "realm_url is not supported for mongodbgov cloud"
|
25
|
+
if "cloud-dev." in self.MONGODB_ATLAS_BASE_URL:
|
26
|
+
return "https://services.cloud-dev.mongodb.com/"
|
27
|
+
return "https://services.cloud.mongodb.com/"
|
28
|
+
|
29
|
+
@property
|
30
|
+
def is_mongodbgov_cloud(self) -> bool:
|
31
|
+
return "mongodbgov" in self.MONGODB_ATLAS_BASE_URL
|
32
|
+
|
33
|
+
|
34
|
+
class AWSSettings(_EnvVarsGenerated):
|
35
|
+
AWS_REGION: str
|
36
|
+
AWS_PROFILE: str = ""
|
37
|
+
AWS_ACCESS_KEY_ID: str = ""
|
38
|
+
AWS_SECRET_ACCESS_KEY: str = ""
|
39
|
+
|
40
|
+
@model_validator(mode="after")
|
41
|
+
def ensure_credentials_are_given(self) -> Self:
|
42
|
+
assert self.AWS_PROFILE or (self.AWS_ACCESS_KEY_ID and self.AWS_SECRET_ACCESS_KEY), (
|
43
|
+
"Either AWS_PROFILE or both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY must be provided"
|
44
|
+
)
|
45
|
+
assert not (self.AWS_PROFILE and (self.AWS_ACCESS_KEY_ID and self.AWS_SECRET_ACCESS_KEY)), (
|
46
|
+
"Either AWS_PROFILE or both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY must be provided, not both"
|
47
|
+
)
|
48
|
+
return self
|
49
|
+
|
50
|
+
|
51
|
+
class TerraformSettings(_EnvVarsGenerated):
|
52
|
+
TF_CLI_CONFIG_FILE: str
|
16
53
|
|
17
54
|
|
18
55
|
class RealmSettings(_EnvVarsGenerated):
|
@@ -24,11 +61,5 @@ class RealmSettings(_EnvVarsGenerated):
|
|
24
61
|
RANDOM_INT_100K: str = Field(default_factory=lambda: str(random.randint(0, 100_000))) # noqa: S311 # not used for cryptographic purposes # nosec
|
25
62
|
|
26
63
|
|
27
|
-
class
|
64
|
+
class AtlasSettingsWithProject(AtlasSettings):
|
28
65
|
MONGODB_ATLAS_PROJECT_ID: str
|
29
|
-
|
30
|
-
|
31
|
-
class TFModuleCluster(_EnvVarsGenerated):
|
32
|
-
MONGODB_ATLAS_CLUSTER_NAME: str
|
33
|
-
MONGODB_ATLAS_CONTAINER_ID: str
|
34
|
-
MONGODB_URL: str
|
@@ -0,0 +1,71 @@
|
|
1
|
+
from atlas_init.settings.env_vars_generated import _EnvVarsGenerated
|
2
|
+
|
3
|
+
|
4
|
+
class TFModuleAws_S3(_EnvVarsGenerated):
|
5
|
+
AWS_S3_BUCKET: str
|
6
|
+
|
7
|
+
|
8
|
+
class TFModuleAws_Vars(_EnvVarsGenerated):
|
9
|
+
AWS_ACCESS_KEY_ID: str
|
10
|
+
AWS_CUSTOMER_MASTER_KEY_ID: str
|
11
|
+
AWS_REGION: str
|
12
|
+
AWS_REGION_LOWERCASE: str
|
13
|
+
AWS_REGION_UPPERCASE: str
|
14
|
+
AWS_SECRET_ACCESS_KEY: str
|
15
|
+
|
16
|
+
|
17
|
+
class TFModuleAws_Vpc(_EnvVarsGenerated):
|
18
|
+
AWS_SECURITY_GROUP_ID: str
|
19
|
+
AWS_SUBNET_ID: str
|
20
|
+
AWS_VPC_CIDR_BLOCK: str
|
21
|
+
AWS_VPC_ID: str
|
22
|
+
|
23
|
+
|
24
|
+
class TFModuleCfn(_EnvVarsGenerated):
|
25
|
+
CFN_EXAMPLE_EXECUTION_ROLE: str
|
26
|
+
MONGODB_ATLAS_PRIVATE_API_KEY: str
|
27
|
+
MONGODB_ATLAS_PROFILE: str
|
28
|
+
MONGODB_ATLAS_PUBLIC_API_KEY: str
|
29
|
+
MONGODB_ATLAS_SECRET_PROFILE: str
|
30
|
+
|
31
|
+
|
32
|
+
class TFModuleCloud_Provider(_EnvVarsGenerated):
|
33
|
+
AWS_IAM_ROLE_ARN: str
|
34
|
+
IAM_ROLE_ID: str
|
35
|
+
|
36
|
+
|
37
|
+
class TFModuleCluster(_EnvVarsGenerated):
|
38
|
+
MONGODB_ATLAS_CLUSTER_NAME: str
|
39
|
+
MONGODB_ATLAS_CONTAINER_ID: str
|
40
|
+
MONGODB_URL: str
|
41
|
+
|
42
|
+
|
43
|
+
class TFModuleFederated_Vars(_EnvVarsGenerated):
|
44
|
+
MONGODB_ATLAS_FEDERATED_GROUP_ID: str
|
45
|
+
MONGODB_ATLAS_FEDERATED_IDP_ID: str
|
46
|
+
MONGODB_ATLAS_FEDERATED_ORG_ID: str
|
47
|
+
MONGODB_ATLAS_FEDERATED_SETTINGS_ASSOCIATED_DOMAIN: str
|
48
|
+
MONGODB_ATLAS_FEDERATION_SETTINGS_ID: str
|
49
|
+
|
50
|
+
|
51
|
+
class TFModuleProject_Extra(_EnvVarsGenerated):
|
52
|
+
MONGODB_ATLAS_ORG_API_KEY_ID: str
|
53
|
+
MONGODB_ATLAS_TEAMS_IDS: str
|
54
|
+
MONGODB_ATLAS_TEAM_ID: str
|
55
|
+
|
56
|
+
|
57
|
+
class TFModuleStream_Instance(_EnvVarsGenerated):
|
58
|
+
MONGODB_ATLAS_STREAM_INSTANCE_ID: str
|
59
|
+
MONGODB_ATLAS_STREAM_INSTANCE_NAME: str
|
60
|
+
|
61
|
+
|
62
|
+
class TFModuleVpc_Peering(_EnvVarsGenerated):
|
63
|
+
AWS_ACCOUNT_ID: str
|
64
|
+
AWS_REGION: str
|
65
|
+
AWS_VPC_CIDR_BLOCK: str
|
66
|
+
AWS_VPC_ID: str
|
67
|
+
|
68
|
+
|
69
|
+
class TFModuleVpc_Privatelink(_EnvVarsGenerated):
|
70
|
+
MONGODB_ATLAS_PRIVATE_ENDPOINT_DNS_NAME: str
|
71
|
+
MONGODB_ATLAS_PRIVATE_ENDPOINT_ID: str
|
atlas_init/settings/path.py
CHANGED
@@ -13,7 +13,6 @@ logger = logging.getLogger(__name__)
|
|
13
13
|
"""WARNING these variables should only be used through the AtlasInitSettings, not directly"""
|
14
14
|
if running_in_repo():
|
15
15
|
ROOT_PATH = Path(__file__).parent.parent.parent # atlas_init REPO_PATH
|
16
|
-
DEFAULT_PROFILES_PATH = ROOT_PATH / "profiles"
|
17
16
|
else:
|
18
17
|
ROOT_PATH = Path(__file__).parent.parent # site package install directory
|
19
18
|
_default_profiles_path = os.environ.get("ATLAS_INIT_PROFILES_PATH")
|
@@ -21,14 +20,9 @@ else:
|
|
21
20
|
_default_profiles_path = Path(user_data_dir("atlas_init")) / "profiles"
|
22
21
|
warning_msg = f"os.environ['ATLAS_INIT_PROFILES_PATH'] is not set using default: {_default_profiles_path}"
|
23
22
|
logger.warning(warning_msg)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
DEFAULT_CONFIG_PATH = ROOT_PATH / "atlas_init.yaml"
|
28
|
-
DEFAULT_SCHEMA_CONFIG_PATH = ROOT_PATH / "terraform.yaml"
|
29
|
-
DEFAULT_GITHUB_CI_RUN_LOGS = ROOT_PATH / "github_ci_run_logs"
|
30
|
-
DEFAULT_GITHUB_SUMMARY_DIR = ROOT_PATH / "github_ci_summary"
|
31
|
-
DEFAULT_DOWNLOADS_DIR = ROOT_PATH / "downloads"
|
23
|
+
DEFAULT_TF_SRC_PATH = ROOT_PATH / "tf"
|
24
|
+
DEFAULT_ATLAS_INIT_CONFIG_PATH = ROOT_PATH / "atlas_init.yaml"
|
25
|
+
DEFAULT_ATLAS_INIT_SCHEMA_CONFIG_PATH = ROOT_PATH / "terraform.yaml"
|
32
26
|
|
33
27
|
|
34
28
|
def load_dotenv(env_path: Path) -> dict[str, str]:
|
atlas_init/typer_app.py
CHANGED
@@ -26,7 +26,7 @@ logger = logging.getLogger(__name__)
|
|
26
26
|
|
27
27
|
def sync_on_done(return_value, s3_profile_bucket: str = "", use_clipboard: str = "", **kwargs):
|
28
28
|
logger.info(f"sync_on_done return_value={return_value} and {kwargs}")
|
29
|
-
settings = init_settings(
|
29
|
+
settings = init_settings()
|
30
30
|
if s3_profile_bucket:
|
31
31
|
logger.info(f"using s3 bucket for profile sync: {s3_profile_bucket}")
|
32
32
|
upload_to_s3(settings.profile_dir, s3_profile_bucket)
|
@@ -110,9 +110,9 @@ def main(
|
|
110
110
|
logger.info(f"in the app callback, log-level: {log_level}, command: {format_cmd(ctx)}")
|
111
111
|
if s3_bucket := s3_profile_bucket:
|
112
112
|
logger.info(f"using s3 bucket for profile sync: {s3_bucket}")
|
113
|
-
settings = init_settings(
|
113
|
+
settings = init_settings()
|
114
114
|
download_from_s3(settings.profile_dir, s3_bucket)
|
115
|
-
settings = init_settings(
|
115
|
+
settings = init_settings()
|
116
116
|
if not show_secrets:
|
117
117
|
# must happen after init_settings that might load some env-vars
|
118
118
|
hide_secrets(handler, {**os.environ})
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: atlas-init
|
3
|
-
Version: 0.4.
|
3
|
+
Version: 0.4.4
|
4
4
|
Project-URL: Documentation, https://github.com/EspenAlbert/atlas-init#readme
|
5
5
|
Project-URL: Issues, https://github.com/EspenAlbert/atlas-init/issues
|
6
6
|
Project-URL: Source, https://github.com/EspenAlbert/atlas-init
|
@@ -20,7 +20,7 @@ Requires-Dist: mypy-boto3-cloudformation==1.37.22
|
|
20
20
|
Requires-Dist: orjson==3.10.13
|
21
21
|
Requires-Dist: pydantic-settings==2.7.1
|
22
22
|
Requires-Dist: pygithub==2.6.1
|
23
|
-
Requires-Dist: python-hcl2==
|
23
|
+
Requires-Dist: python-hcl2==7.1.0
|
24
24
|
Requires-Dist: requests==2.32.2
|
25
25
|
Requires-Dist: rich==14.0.0
|
26
26
|
Requires-Dist: stringcase==1.2.0
|