qontract-reconcile 0.10.1rc918__py3-none-any.whl → 0.10.1rc920__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.
- {qontract_reconcile-0.10.1rc918.dist-info → qontract_reconcile-0.10.1rc920.dist-info}/METADATA +1 -1
- {qontract_reconcile-0.10.1rc918.dist-info → qontract_reconcile-0.10.1rc920.dist-info}/RECORD +7 -7
- reconcile/utils/saasherder/models.py +133 -13
- reconcile/utils/saasherder/saasherder.py +5 -87
- {qontract_reconcile-0.10.1rc918.dist-info → qontract_reconcile-0.10.1rc920.dist-info}/WHEEL +0 -0
- {qontract_reconcile-0.10.1rc918.dist-info → qontract_reconcile-0.10.1rc920.dist-info}/entry_points.txt +0 -0
- {qontract_reconcile-0.10.1rc918.dist-info → qontract_reconcile-0.10.1rc920.dist-info}/top_level.txt +0 -0
{qontract_reconcile-0.10.1rc918.dist-info → qontract_reconcile-0.10.1rc920.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: qontract-reconcile
|
3
|
-
Version: 0.10.
|
3
|
+
Version: 0.10.1rc920
|
4
4
|
Summary: Collection of tools to reconcile services with their desired state as defined in the app-interface DB.
|
5
5
|
Home-page: https://github.com/app-sre/qontract-reconcile
|
6
6
|
Author: Red Hat App-SRE Team
|
{qontract_reconcile-0.10.1rc918.dist-info → qontract_reconcile-0.10.1rc920.dist-info}/RECORD
RENAMED
@@ -792,8 +792,8 @@ reconcile/utils/runtime/runner.py,sha256=PBfE_M4hTZKtyubg29AkMWlLi2KKyA74yItREtT
|
|
792
792
|
reconcile/utils/runtime/sharding.py,sha256=r0ieUtNed7NvknSw6qQrCkKpVXE1shuHGnfFcnpA_k4,16142
|
793
793
|
reconcile/utils/saasherder/__init__.py,sha256=J3MBZBFa5YmhqYm08QsjBXz8mFcVOCiOCkyIcw41t7E,343
|
794
794
|
reconcile/utils/saasherder/interfaces.py,sha256=C2wrw34OXypshVocAsPrVZsSHptgw4g9u7Haa2wulZQ,9087
|
795
|
-
reconcile/utils/saasherder/models.py,sha256=
|
796
|
-
reconcile/utils/saasherder/saasherder.py,sha256=
|
795
|
+
reconcile/utils/saasherder/models.py,sha256=6MGie9SqsyP5ySjmk5bO5vPJ0-x53a0uzABxQO-WsB0,9746
|
796
|
+
reconcile/utils/saasherder/saasherder.py,sha256=ctnBBMZg8VmEeWJuY7p9ULYKoJMN1HHfftha2LW0Yuw,84549
|
797
797
|
reconcile/utils/terraform/__init__.py,sha256=zNbiyTWo35AT1sFTElL2j_AA0jJ_yWE_bfFn-nD2xik,250
|
798
798
|
reconcile/utils/terraform/config.py,sha256=5UVrd563TMcvi4ooa5JvWVDW1I3bIWg484u79evfV_8,164
|
799
799
|
reconcile/utils/terraform/config_client.py,sha256=3gUIIIEv52Vx7-VgQ2FZYfCCrfqUv_5gw_TQ3mbLcTs,4666
|
@@ -844,8 +844,8 @@ tools/test/test_qontract_cli.py,sha256=_D61RFGAN5x44CY1tYbouhlGXXABwYfxKSWSQx3Jr
|
|
844
844
|
tools/test/test_saas_promotion_state.py,sha256=dy4kkSSAQ7bC0Xp2CociETGN-2aABEfL6FU5D9Jl00Y,6056
|
845
845
|
tools/test/test_sd_app_sre_alert_report.py,sha256=v363r9zM7__0kR5K6mvJoGFcM9BvE33fWAayrqkpojA,2116
|
846
846
|
tools/test/test_sre_checkpoints.py,sha256=SKqPPTl9ua0RFdSSofnoQX-JZE6dFLO3LRhfQzqtfh8,2607
|
847
|
-
qontract_reconcile-0.10.
|
848
|
-
qontract_reconcile-0.10.
|
849
|
-
qontract_reconcile-0.10.
|
850
|
-
qontract_reconcile-0.10.
|
851
|
-
qontract_reconcile-0.10.
|
847
|
+
qontract_reconcile-0.10.1rc920.dist-info/METADATA,sha256=taZOLpwx8PC55Jl2OvyrcB4AgcVycWXbjf6k_Ch_MQ8,2273
|
848
|
+
qontract_reconcile-0.10.1rc920.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
849
|
+
qontract_reconcile-0.10.1rc920.dist-info/entry_points.txt,sha256=GKQqCl2j2X1BJQ69een6rHcR26PmnxnONLNOQB-nRjY,491
|
850
|
+
qontract_reconcile-0.10.1rc920.dist-info/top_level.txt,sha256=l5ISPoXzt0SdR4jVdkfa7RPSKNc8zAHYWAnR-Dw8Ey8,24
|
851
|
+
qontract_reconcile-0.10.1rc920.dist-info/RECORD,,
|
@@ -1,4 +1,6 @@
|
|
1
1
|
import base64
|
2
|
+
import json
|
3
|
+
import logging
|
2
4
|
from collections.abc import Iterable, Sequence
|
3
5
|
from dataclasses import dataclass
|
4
6
|
from enum import Enum
|
@@ -12,12 +14,17 @@ from pydantic import (
|
|
12
14
|
|
13
15
|
from reconcile.utils.oc_connection_parameters import Cluster
|
14
16
|
from reconcile.utils.saasherder.interfaces import (
|
17
|
+
HasParameters,
|
18
|
+
HasSecretParameters,
|
15
19
|
ManagedResourceName,
|
16
20
|
SaasApp,
|
17
21
|
SaasEnvironment,
|
22
|
+
SaasFile,
|
18
23
|
SaasPipelinesProviders,
|
24
|
+
SaasResourceTemplate,
|
19
25
|
SaasResourceTemplateTarget,
|
20
26
|
)
|
27
|
+
from reconcile.utils.secret_reader import SecretReaderBase
|
21
28
|
|
22
29
|
|
23
30
|
class Providers(Enum):
|
@@ -208,21 +215,134 @@ class ImageAuth:
|
|
208
215
|
|
209
216
|
@dataclass
|
210
217
|
class TargetSpec:
|
211
|
-
|
212
|
-
|
218
|
+
saas_file: SaasFile
|
219
|
+
resource_template: SaasResourceTemplate
|
213
220
|
target: SaasResourceTemplateTarget
|
214
|
-
cluster: str
|
215
|
-
namespace: str
|
216
|
-
managed_resource_types: Iterable[str]
|
217
|
-
managed_resource_names: Sequence[ManagedResourceName] | None
|
218
|
-
delete: bool
|
219
|
-
privileged: bool
|
220
221
|
image_auth: ImageAuth
|
221
|
-
image_patterns: list[str]
|
222
|
-
url: str
|
223
|
-
path: str
|
224
|
-
provider: str
|
225
222
|
hash_length: int
|
226
|
-
parameters: dict[str, str]
|
227
223
|
github: Github
|
228
224
|
target_config_hash: str
|
225
|
+
secret_reader: SecretReaderBase
|
226
|
+
|
227
|
+
@property
|
228
|
+
def saas_file_name(self) -> str:
|
229
|
+
return self.saas_file.name
|
230
|
+
|
231
|
+
@property
|
232
|
+
def managed_resource_types(self) -> Iterable[str]:
|
233
|
+
return self.saas_file.managed_resource_types
|
234
|
+
|
235
|
+
@property
|
236
|
+
def managed_resource_names(self) -> Sequence[ManagedResourceName] | None:
|
237
|
+
return self.saas_file.managed_resource_names
|
238
|
+
|
239
|
+
@property
|
240
|
+
def privileged(self) -> bool:
|
241
|
+
return bool(self.saas_file.cluster_admin)
|
242
|
+
|
243
|
+
@property
|
244
|
+
def image_patterns(self) -> list[str]:
|
245
|
+
return self.saas_file.image_patterns
|
246
|
+
|
247
|
+
@property
|
248
|
+
def resource_template_name(self) -> str:
|
249
|
+
return self.resource_template.name
|
250
|
+
|
251
|
+
@property
|
252
|
+
def url(self) -> str:
|
253
|
+
return self.resource_template.url
|
254
|
+
|
255
|
+
@property
|
256
|
+
def path(self) -> str:
|
257
|
+
return self.resource_template.path
|
258
|
+
|
259
|
+
@property
|
260
|
+
def provider(self) -> str:
|
261
|
+
return self.resource_template.provider or "openshift-template"
|
262
|
+
|
263
|
+
@property
|
264
|
+
def cluster(self) -> str:
|
265
|
+
return self.target.namespace.cluster.name
|
266
|
+
|
267
|
+
@property
|
268
|
+
def namespace(self) -> str:
|
269
|
+
return self.target.namespace.name
|
270
|
+
|
271
|
+
@property
|
272
|
+
def delete(self) -> bool:
|
273
|
+
return bool(self.target.delete)
|
274
|
+
|
275
|
+
def parameters(self, adjust: bool = True) -> dict[str, str]:
|
276
|
+
environment_parameters = self._collect_parameters(
|
277
|
+
self.target.namespace.environment, adjust=adjust
|
278
|
+
)
|
279
|
+
saas_file_parameters = self._collect_parameters(self.saas_file, adjust=adjust)
|
280
|
+
resource_template_parameters = self._collect_parameters(
|
281
|
+
self.resource_template, adjust=adjust
|
282
|
+
)
|
283
|
+
target_parameters = self._collect_parameters(self.target, adjust=adjust)
|
284
|
+
|
285
|
+
try:
|
286
|
+
saas_file_secret_parameters = self._collect_secret_parameters(
|
287
|
+
self.saas_file
|
288
|
+
)
|
289
|
+
resource_template_secret_parameters = self._collect_secret_parameters(
|
290
|
+
self.resource_template
|
291
|
+
)
|
292
|
+
environment_secret_parameters = self._collect_secret_parameters(
|
293
|
+
self.target.namespace.environment
|
294
|
+
)
|
295
|
+
target_secret_parameters = self._collect_secret_parameters(self.target)
|
296
|
+
except Exception as e:
|
297
|
+
logging.error(f"Error collecting secrets: {e}")
|
298
|
+
raise
|
299
|
+
|
300
|
+
consolidated_parameters = {}
|
301
|
+
consolidated_parameters.update(environment_parameters)
|
302
|
+
consolidated_parameters.update(environment_secret_parameters)
|
303
|
+
consolidated_parameters.update(saas_file_parameters)
|
304
|
+
consolidated_parameters.update(saas_file_secret_parameters)
|
305
|
+
consolidated_parameters.update(resource_template_parameters)
|
306
|
+
consolidated_parameters.update(resource_template_secret_parameters)
|
307
|
+
consolidated_parameters.update(target_parameters)
|
308
|
+
consolidated_parameters.update(target_secret_parameters)
|
309
|
+
|
310
|
+
for replace_key, replace_value in consolidated_parameters.items():
|
311
|
+
if not isinstance(replace_value, str):
|
312
|
+
continue
|
313
|
+
replace_pattern = "${" + replace_key + "}"
|
314
|
+
for k, v in consolidated_parameters.items():
|
315
|
+
if not isinstance(v, str):
|
316
|
+
continue
|
317
|
+
if replace_pattern in v:
|
318
|
+
consolidated_parameters[k] = v.replace(
|
319
|
+
replace_pattern, replace_value
|
320
|
+
)
|
321
|
+
|
322
|
+
return consolidated_parameters
|
323
|
+
|
324
|
+
@staticmethod
|
325
|
+
def _collect_parameters(
|
326
|
+
container: HasParameters, adjust: bool = True
|
327
|
+
) -> dict[str, str]:
|
328
|
+
parameters = container.parameters or {}
|
329
|
+
if isinstance(parameters, str):
|
330
|
+
parameters = json.loads(parameters)
|
331
|
+
if adjust:
|
332
|
+
# adjust Python's True/False
|
333
|
+
for k, v in parameters.items():
|
334
|
+
if v is True:
|
335
|
+
parameters[k] = "true"
|
336
|
+
elif v is False:
|
337
|
+
parameters[k] = "false"
|
338
|
+
elif any(isinstance(v, t) for t in [dict, list, tuple]):
|
339
|
+
parameters[k] = json.dumps(v)
|
340
|
+
return parameters
|
341
|
+
|
342
|
+
def _collect_secret_parameters(
|
343
|
+
self, container: HasSecretParameters
|
344
|
+
) -> dict[str, str]:
|
345
|
+
return {
|
346
|
+
sp.name: self.secret_reader.read_secret(sp.secret)
|
347
|
+
for sp in container.secret_parameters or []
|
348
|
+
}
|
@@ -59,8 +59,6 @@ from reconcile.utils.promotion_state import (
|
|
59
59
|
PromotionState,
|
60
60
|
)
|
61
61
|
from reconcile.utils.saasherder.interfaces import (
|
62
|
-
HasParameters,
|
63
|
-
HasSecretParameters,
|
64
62
|
SaasFile,
|
65
63
|
SaasParentSaasPromotion,
|
66
64
|
SaasResourceTemplate,
|
@@ -706,29 +704,6 @@ class SaasHerder: # pylint: disable=too-many-public-methods
|
|
706
704
|
for rt in saas_file.resource_templates
|
707
705
|
)
|
708
706
|
|
709
|
-
@staticmethod
|
710
|
-
def _collect_parameters(container: HasParameters) -> dict[str, str]:
|
711
|
-
parameters = container.parameters or {}
|
712
|
-
if isinstance(parameters, str):
|
713
|
-
parameters = json.loads(parameters)
|
714
|
-
# adjust Python's True/False
|
715
|
-
for k, v in parameters.items():
|
716
|
-
if v is True:
|
717
|
-
parameters[k] = "true"
|
718
|
-
elif v is False:
|
719
|
-
parameters[k] = "false"
|
720
|
-
elif any(isinstance(v, t) for t in [dict, list, tuple]):
|
721
|
-
parameters[k] = json.dumps(v)
|
722
|
-
return parameters
|
723
|
-
|
724
|
-
def _collect_secret_parameters(
|
725
|
-
self, container: HasSecretParameters
|
726
|
-
) -> dict[str, str]:
|
727
|
-
return {
|
728
|
-
sp.name: self.secret_reader.read_secret(sp.secret)
|
729
|
-
for sp in container.secret_parameters or []
|
730
|
-
}
|
731
|
-
|
732
707
|
@staticmethod
|
733
708
|
def _get_file_contents_github(repo: Repository, path: str, commit_sha: str) -> str:
|
734
709
|
f = repo.get_contents(path, commit_sha)
|
@@ -899,44 +874,11 @@ class SaasHerder: # pylint: disable=too-many-public-methods
|
|
899
874
|
provider = spec.provider
|
900
875
|
hash_length = spec.hash_length
|
901
876
|
target = spec.target
|
902
|
-
parameters = spec.parameters
|
903
877
|
github = spec.github
|
904
878
|
target_config_hash = spec.target_config_hash
|
905
879
|
|
906
880
|
if provider == "openshift-template":
|
907
|
-
|
908
|
-
target.namespace.environment
|
909
|
-
)
|
910
|
-
target_parameters = self._collect_parameters(target)
|
911
|
-
|
912
|
-
try:
|
913
|
-
environment_secret_parameters = self._collect_secret_parameters(
|
914
|
-
target.namespace.environment
|
915
|
-
)
|
916
|
-
target_secret_parameters = self._collect_secret_parameters(target)
|
917
|
-
except Exception as e:
|
918
|
-
logging.error(f"Error collecting secrets: {e}")
|
919
|
-
raise
|
920
|
-
|
921
|
-
consolidated_parameters = {}
|
922
|
-
consolidated_parameters.update(environment_parameters)
|
923
|
-
consolidated_parameters.update(environment_secret_parameters)
|
924
|
-
consolidated_parameters.update(parameters)
|
925
|
-
consolidated_parameters.update(target_parameters)
|
926
|
-
consolidated_parameters.update(target_secret_parameters)
|
927
|
-
|
928
|
-
for replace_key, replace_value in consolidated_parameters.items():
|
929
|
-
if not isinstance(replace_value, str):
|
930
|
-
continue
|
931
|
-
replace_pattern = "${" + replace_key + "}"
|
932
|
-
for k, v in consolidated_parameters.items():
|
933
|
-
if not isinstance(v, str):
|
934
|
-
continue
|
935
|
-
if replace_pattern in v:
|
936
|
-
consolidated_parameters[k] = v.replace(
|
937
|
-
replace_pattern, replace_value
|
938
|
-
)
|
939
|
-
|
881
|
+
consolidated_parameters = spec.parameters()
|
940
882
|
try:
|
941
883
|
template, html_url, commit_sha = self._get_file_contents(
|
942
884
|
url=url, path=path, ref=target.ref, github=github
|
@@ -1304,23 +1246,10 @@ class SaasHerder: # pylint: disable=too-many-public-methods
|
|
1304
1246
|
specs = []
|
1305
1247
|
github = self._initiate_github(saas_file)
|
1306
1248
|
image_auth = self._initiate_image_auth(saas_file)
|
1307
|
-
saas_file_parameters = self._collect_parameters(saas_file)
|
1308
|
-
saas_file_secret_parameters = self._collect_secret_parameters(saas_file)
|
1309
|
-
|
1310
1249
|
all_trigger_specs = self.get_saas_targets_config_trigger_specs(saas_file)
|
1311
1250
|
# iterate over resource templates (multiple per saas_file)
|
1312
1251
|
for rt in saas_file.resource_templates:
|
1313
|
-
provider = rt.provider or "openshift-template"
|
1314
1252
|
hash_length = rt.hash_length or self.hash_length
|
1315
|
-
resource_template_parameters = self._collect_parameters(rt)
|
1316
|
-
resource_template_secret_parameters = self._collect_secret_parameters(rt)
|
1317
|
-
|
1318
|
-
consolidated_parameters = {}
|
1319
|
-
consolidated_parameters.update(saas_file_parameters)
|
1320
|
-
consolidated_parameters.update(saas_file_secret_parameters)
|
1321
|
-
consolidated_parameters.update(resource_template_parameters)
|
1322
|
-
consolidated_parameters.update(resource_template_secret_parameters)
|
1323
|
-
|
1324
1253
|
# Iterate over targets (each target is a namespace).
|
1325
1254
|
for target in rt.targets:
|
1326
1255
|
if target.disable:
|
@@ -1344,26 +1273,15 @@ class SaasHerder: # pylint: disable=too-many-public-methods
|
|
1344
1273
|
|
1345
1274
|
specs.append(
|
1346
1275
|
TargetSpec(
|
1347
|
-
|
1348
|
-
|
1349
|
-
|
1350
|
-
managed_resource_types=saas_file.managed_resource_types,
|
1351
|
-
managed_resource_names=saas_file.managed_resource_names,
|
1352
|
-
delete=bool(target.delete),
|
1353
|
-
privileged=bool(saas_file.cluster_admin),
|
1276
|
+
saas_file=saas_file,
|
1277
|
+
resource_template=rt,
|
1278
|
+
target=target,
|
1354
1279
|
# process_template options
|
1355
|
-
resource_template_name=rt.name,
|
1356
1280
|
image_auth=image_auth,
|
1357
|
-
url=rt.url,
|
1358
|
-
path=rt.path,
|
1359
|
-
provider=provider,
|
1360
1281
|
hash_length=hash_length,
|
1361
|
-
target=target,
|
1362
|
-
parameters=consolidated_parameters,
|
1363
1282
|
github=github,
|
1364
1283
|
target_config_hash=digest,
|
1365
|
-
|
1366
|
-
image_patterns=saas_file.image_patterns,
|
1284
|
+
secret_reader=self.secret_reader,
|
1367
1285
|
)
|
1368
1286
|
)
|
1369
1287
|
|
File without changes
|
File without changes
|
{qontract_reconcile-0.10.1rc918.dist-info → qontract_reconcile-0.10.1rc920.dist-info}/top_level.txt
RENAMED
File without changes
|