qontract-reconcile 0.10.1rc763__py3-none-any.whl → 0.10.1rc765__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.
Files changed (41) hide show
  1. {qontract_reconcile-0.10.1rc763.dist-info → qontract_reconcile-0.10.1rc765.dist-info}/METADATA +1 -1
  2. {qontract_reconcile-0.10.1rc763.dist-info → qontract_reconcile-0.10.1rc765.dist-info}/RECORD +27 -31
  3. reconcile/external_resources/aws.py +85 -0
  4. reconcile/external_resources/factories.py +133 -0
  5. reconcile/external_resources/integration.py +95 -0
  6. reconcile/external_resources/manager.py +350 -0
  7. reconcile/external_resources/meta.py +4 -0
  8. reconcile/external_resources/metrics.py +20 -0
  9. reconcile/external_resources/model.py +244 -0
  10. reconcile/external_resources/reconciler.py +249 -0
  11. reconcile/external_resources/secrets_sync.py +229 -0
  12. reconcile/external_resources/state.py +246 -0
  13. reconcile/saas_auto_promotions_manager/meta.py +1 -1
  14. reconcile/saas_auto_promotions_manager/subscriber.py +52 -2
  15. reconcile/saas_auto_promotions_manager/utils/saas_files_inventory.py +4 -0
  16. reconcile/test/saas_auto_promotions_manager/conftest.py +63 -0
  17. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/conftest.py +0 -37
  18. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_desired_state.py +20 -14
  19. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/conftest.py +0 -43
  20. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_multiple_namespaces.py +4 -11
  21. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_single_namespace.py +12 -19
  22. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_single_target.py +6 -12
  23. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_json_path_selector.py +8 -15
  24. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/data_keys.py +0 -4
  25. reconcile/test/saas_auto_promotions_manager/subscriber/conftest.py +0 -89
  26. reconcile/test/saas_auto_promotions_manager/subscriber/data_keys.py +0 -11
  27. reconcile/test/saas_auto_promotions_manager/subscriber/test_content_hash.py +0 -130
  28. reconcile/test/saas_auto_promotions_manager/subscriber/test_diff.py +0 -161
  29. reconcile/test/saas_auto_promotions_manager/subscriber/test_multiple_channels_config_hash.py +0 -218
  30. reconcile/test/saas_auto_promotions_manager/subscriber/test_multiple_channels_moving_ref.py +0 -216
  31. reconcile/test/saas_auto_promotions_manager/subscriber/test_multiple_publishers_moving_ref.py +0 -129
  32. reconcile/test/saas_auto_promotions_manager/subscriber/test_single_channel_with_single_publisher.py +0 -330
  33. reconcile/test/saas_auto_promotions_manager/utils/saas_files_inventory/__init__.py +0 -0
  34. reconcile/test/saas_auto_promotions_manager/utils/saas_files_inventory/test_multiple_publishers_for_single_channel.py +0 -68
  35. reconcile/test/saas_auto_promotions_manager/utils/saas_files_inventory/test_saas_files_use_target_config_hash.py +0 -62
  36. reconcile/test/saas_auto_promotions_manager/utils/saas_files_inventory/test_saas_files_with_auto_promote.py +0 -73
  37. reconcile/test/saas_auto_promotions_manager/utils/saas_files_inventory/test_saas_files_without_auto_promote.py +0 -64
  38. {qontract_reconcile-0.10.1rc763.dist-info → qontract_reconcile-0.10.1rc765.dist-info}/WHEEL +0 -0
  39. {qontract_reconcile-0.10.1rc763.dist-info → qontract_reconcile-0.10.1rc765.dist-info}/entry_points.txt +0 -0
  40. {qontract_reconcile-0.10.1rc763.dist-info → qontract_reconcile-0.10.1rc765.dist-info}/top_level.txt +0 -0
  41. /reconcile/{test/saas_auto_promotions_manager/subscriber → external_resources}/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: qontract-reconcile
3
- Version: 0.10.1rc763
3
+ Version: 0.10.1rc765
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
@@ -176,6 +176,17 @@ reconcile/cna/assets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
176
176
  reconcile/cna/assets/asset.py,sha256=1v51uYSaD1NOc9cI_YxG7h0NOcR1ng-mkmD2UzQ8PXE,866
177
177
  reconcile/cna/assets/asset_factory.py,sha256=7T7X_J6xIsoGETqBRI45_EyIKEdQcnRPt_GAuVuLQcc,785
178
178
  reconcile/cna/assets/null.py,sha256=Fby1Fbn7oNRIGNasdyhRDvXJ0ktpxv-pUAPN0lZWSzk,1684
179
+ reconcile/external_resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
180
+ reconcile/external_resources/aws.py,sha256=JvjKaABy2Pg8u8Lq82Acv4zMvpE3_qGKes7OG-zlHOM,2956
181
+ reconcile/external_resources/factories.py,sha256=bLboXX5Dq0xN60mtDGNjCOLC6HlKofXMWQxVbRwMMwo,4485
182
+ reconcile/external_resources/integration.py,sha256=QQZdKTeHoUD7afUTNKh878u-KWovYptAFZwjUBTIbCg,3317
183
+ reconcile/external_resources/manager.py,sha256=APszaw9PRIiHnFyCffHZjIFseIwhlYROIPLt18pHUTQ,13685
184
+ reconcile/external_resources/meta.py,sha256=SA4Km1r7ePdcNqHn2GA4ByQp4ZnIeo_n8qOOd-11IEg,151
185
+ reconcile/external_resources/metrics.py,sha256=m2TIOao2N7pD6k45driFbBGVCC_N7ai44m-lLPfa5qk,454
186
+ reconcile/external_resources/model.py,sha256=FJUb7rHU2l7YSAv-t4QaacL9pqheFBxhPydWSPqu3vY,7413
187
+ reconcile/external_resources/reconciler.py,sha256=E50X_lnOD0OWYXMzyZld1P6dCFJFYjHGyICWff9bxlc,9323
188
+ reconcile/external_resources/secrets_sync.py,sha256=g-ksvzmTlCTwo3PM3FgYXm0LUBcnwfAxcvisuR1jAMY,7982
189
+ reconcile/external_resources/state.py,sha256=rRePQdA3A6U9oFDDs9aaL5Ja7nSIXpOC1wHwY8R47_8,9197
179
190
  reconcile/glitchtip/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
180
191
  reconcile/glitchtip/integration.py,sha256=Y7ofQg_xCt3dOln3pjeXp7rAnwohCgD2zcUAb-Hciis,8375
181
192
  reconcile/glitchtip/reconciler.py,sha256=nUvDv7qG1ly0cA16MmlL6NV71yl1mJYLT2mui7lmi0Y,12402
@@ -396,10 +407,10 @@ reconcile/rhidp/sso_client/integration.py,sha256=kA8g7c38ZBSdrRtyfEqy_WgSreD1Pbw
396
407
  reconcile/rhidp/sso_client/metrics.py,sha256=Tq7tSOsqL3XdcPUdozxqzSPIodUeOV87UCTqpuuqqhw,1013
397
408
  reconcile/saas_auto_promotions_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
398
409
  reconcile/saas_auto_promotions_manager/integration.py,sha256=shWQ--FWfeh_1rHJUwOWDiZWnvzKxYJYuRUIGQv22RI,6759
399
- reconcile/saas_auto_promotions_manager/meta.py,sha256=2b44ik-qpACNtW72QlDa2YOQqxeN8FHZfLPDmKoH3Rg,161
410
+ reconcile/saas_auto_promotions_manager/meta.py,sha256=jzqK6qM2JDdCE5kzkcj1e1TBMAL9f6lM2Hse8yFb8W8,161
400
411
  reconcile/saas_auto_promotions_manager/publisher.py,sha256=psrthZGgCQDUO3rwQjKSBMlwcTgfij6sxdebGuxkNv4,2739
401
412
  reconcile/saas_auto_promotions_manager/s3_exporter.py,sha256=IKlVWZmiPnvl7sKeF6JgAlhXZe5CovKTxQc0SNkNSx4,2583
402
- reconcile/saas_auto_promotions_manager/subscriber.py,sha256=cLhPlkT71J2LIice3SLmH1WpsqzV46gd0peMxrnqyRw,7452
413
+ reconcile/saas_auto_promotions_manager/subscriber.py,sha256=NPhlagNF8om7ikrjRlYNSQ2Ra7wgW_3-OlEWapnjtW0,9405
403
414
  reconcile/saas_auto_promotions_manager/merge_request_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
404
415
  reconcile/saas_auto_promotions_manager/merge_request_manager/desired_state.py,sha256=jgfgKv4UTYFxtDao_JwNEGEKmu4GpeMm5vbaat0289c,1225
405
416
  reconcile/saas_auto_promotions_manager/merge_request_manager/merge_request.py,sha256=BeAJWLow7b4HQyZ9zz398sQkPeIz8chpMkCts2NU27c,1282
@@ -409,7 +420,7 @@ reconcile/saas_auto_promotions_manager/merge_request_manager/mr_parser.py,sha256
409
420
  reconcile/saas_auto_promotions_manager/merge_request_manager/reconciler.py,sha256=KZVAkFJR75Qu7-feV4mzg1S8ua-pkbuu1oC7PebSpDs,7801
410
421
  reconcile/saas_auto_promotions_manager/merge_request_manager/renderer.py,sha256=iu0wMyyEvro5r5SBJVN3HGmVSIcxTyLN0Xxx3mhbYXE,7066
411
422
  reconcile/saas_auto_promotions_manager/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
412
- reconcile/saas_auto_promotions_manager/utils/saas_files_inventory.py,sha256=ZNxwqp9kdUSoxb3kTdM4KrtPyd3V5O4jMfjrVT2IJfs,7605
423
+ reconcile/saas_auto_promotions_manager/utils/saas_files_inventory.py,sha256=7LlTQCzYotWCbtYBaNQP81CFlLUOvsyGMBQE-Ha0cKY,7820
413
424
  reconcile/skupper_network/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
414
425
  reconcile/skupper_network/integration.py,sha256=178Q9RSYuZ9NmrCK4jRMLMekrewUaaRdclccI6zBsQ8,10786
415
426
  reconcile/skupper_network/models.py,sha256=DNTI7HZv-rqY42GIIxyRuvroHLvdH6rJerjIq9lj3RU,6663
@@ -523,38 +534,23 @@ reconcile/test/test_version_bump.py,sha256=q6-3Y1roriI6YWpFwaHOMN7emEP3yL33sh_0V
523
534
  reconcile/test/test_vpc_peerings_validator.py,sha256=dFSmjc_dMN2GqMbntCFpa7PUZmyYuQ9DKffh-T5wmxM,6639
524
535
  reconcile/test/test_wrong_region.py,sha256=7KzL7OaICQ9Z3DW27zt_ykMN7_87owAFC-2CYjvGoyA,2138
525
536
  reconcile/test/saas_auto_promotions_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
526
- reconcile/test/saas_auto_promotions_manager/conftest.py,sha256=tZNs35EuWulP53Cqt61RteOGY_uH4gfhtXfGQ8-awwM,3081
537
+ reconcile/test/saas_auto_promotions_manager/conftest.py,sha256=4BtuxVZ0Lsmdp6AhG8kbtowkwG7e-pSjIKv35Wm1hI0,5803
527
538
  reconcile/test/saas_auto_promotions_manager/test_integration_test.py,sha256=x7QgHDMKIoPRY8k2SRSWa7qY3Z5Vabsyh9xWCtMXtfY,1857
528
539
  reconcile/test/saas_auto_promotions_manager/merge_request_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
529
540
  reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
530
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/conftest.py,sha256=7O3lbk1EmEtUofqGncfiwMYvDPXrkQNPB59zlQ_zXkM,4588
541
+ reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/conftest.py,sha256=HikuDsdDxJ6HW48WY50s_7fmeGr07kcRdBZxgHzwc-0,3514
531
542
  reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/data_keys.py,sha256=Z1IV51OUuzhd-3S8W-k7ixC-fkaglCokn0eakK0Z73s,606
532
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_desired_state.py,sha256=x5DDZog0SA-Z8noxwalZniGtkovaPvR0V9Pqa5QaFFY,2302
543
+ reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_desired_state.py,sha256=OLtJ11SsznoT39_tudsozcksK0N3TVNv-JWhIrCVaQk,2356
533
544
  reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_merge_request_manager.py,sha256=h8lnorFPZIxTtbaaXGLoiEsBbB4Qj-Mg9BKV62ZqEBQ,2389
534
545
  reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_mr_parser.py,sha256=dcGHzxuafKSxmswSO1qF2WlKaqsmEvtERC6Lb8kDAN0,10019
535
546
  reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_reconciler.py,sha256=_bzfJzjFJgubu--7wyXIiusUrdbmLtFbHmkbat4SX_M,17828
536
547
  reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
537
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/conftest.py,sha256=2rCSstewp4LPoEJHm5N7dGJexEtY8ndLHvoGZYjmpsc,1678
538
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/data_keys.py,sha256=beHYQ9kgDLeBZgC2FvxQA3tHx1PO-RAMN8_kVcSdikI,90
539
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_multiple_namespaces.py,sha256=mlsSuTKHTPEMDFmDJnpeZ5j9R0eZOK2KMj8kAm4nvRU,1116
540
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_single_namespace.py,sha256=tS57UbNsJGb4kTnHNCPTfUEpLWwxprhtCeJOnvIt8A0,2527
541
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_single_target.py,sha256=6g4s2c--W4l_PMTcCA_8aNM85YejwDZttQOz5Iowido,1908
542
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_json_path_selector.py,sha256=k_jA4x_9fRGGAT1T0aeAFiZwZ7zlDZpPPgqMDeuR7y8,2189
543
- reconcile/test/saas_auto_promotions_manager/subscriber/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
544
- reconcile/test/saas_auto_promotions_manager/subscriber/conftest.py,sha256=5hMe91UEp_GQm49OeTee4ALv_xq2KhWwF6NfzzQwpnc,3101
545
- reconcile/test/saas_auto_promotions_manager/subscriber/data_keys.py,sha256=2j4Ue-njmK53Xm4vJScT2MJJeKV7wk9xf_95pmNfLWE,402
546
- reconcile/test/saas_auto_promotions_manager/subscriber/test_content_hash.py,sha256=viw-p42vDOC2telE5lelssRBL7V35aNJ1qUg6D-QGWw,4546
547
- reconcile/test/saas_auto_promotions_manager/subscriber/test_diff.py,sha256=BkxCoWBlUahY5Vq36FX_t_UyIdzIc64CumzAd3imUAQ,4529
548
- reconcile/test/saas_auto_promotions_manager/subscriber/test_multiple_channels_config_hash.py,sha256=0MeFuJnKUHdMXGe8v2Fzge1mhihTcKqr2OAMLEAyHP4,6439
549
- reconcile/test/saas_auto_promotions_manager/subscriber/test_multiple_channels_moving_ref.py,sha256=rcF2tHltCsZiPQo23b-xjBuEqBHzVn4TMzHv_x0778o,6209
550
- reconcile/test/saas_auto_promotions_manager/subscriber/test_multiple_publishers_moving_ref.py,sha256=tGAjetYspWeevuuUCfbeU33noM-dP4lsb96UUAHkxWw,3588
551
- reconcile/test/saas_auto_promotions_manager/subscriber/test_single_channel_with_single_publisher.py,sha256=YDXCzrclRyKRW7qRBg9GB2HinJP_HPqzTcWMGD1rbFI,9452
548
+ reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/conftest.py,sha256=MjTLg7KwvdIYvxkCzgJG-gByD1fZxaq6c4SI6rWWUu8,552
549
+ reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_multiple_namespaces.py,sha256=6LMsnbPx5svTF1nL6oQGLTp1NgjLG_tO56c0hbA2Di4,1059
550
+ reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_single_namespace.py,sha256=dc7vMOiVLl5yRUEfjF4eE7HfMZTbtT2dz1CMGJVLUZA,2526
551
+ reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_single_target.py,sha256=FY9pzmvE8uXvvt_P_G3M7_br8Zt1s428H23FlAj9nuY,1881
552
+ reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_json_path_selector.py,sha256=jCtG0hVCqJ-A4XBjwexDww5LQUXJFRc44O5rEMA7_7E,2160
552
553
  reconcile/test/saas_auto_promotions_manager/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
553
- reconcile/test/saas_auto_promotions_manager/utils/saas_files_inventory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
554
- reconcile/test/saas_auto_promotions_manager/utils/saas_files_inventory/test_multiple_publishers_for_single_channel.py,sha256=jX8ade2615gRYiJ_Bui4F2kvv3rUyod5sdiMFhzcnsw,2168
555
- reconcile/test/saas_auto_promotions_manager/utils/saas_files_inventory/test_saas_files_use_target_config_hash.py,sha256=TThr7UeF8k7lNBeknknEcE4H9z-_K4jKdzNA_SqFKoY,1948
556
- reconcile/test/saas_auto_promotions_manager/utils/saas_files_inventory/test_saas_files_with_auto_promote.py,sha256=OSSdVEQ72npDRrbkx5JHhXus-0ku699wG7ecsco4axM,2545
557
- reconcile/test/saas_auto_promotions_manager/utils/saas_files_inventory/test_saas_files_without_auto_promote.py,sha256=6GoZ6ogpXBVYlRwag2wu9Z-1ES9LzyPxMqZkcX7oTA0,2040
558
554
  reconcile/typed_queries/__init__.py,sha256=rRk4CyslLsBr4vAh1pIPgt6s3P4R1M9NSEPLnyQgBpk,61
559
555
  reconcile/typed_queries/alerting_services_settings.py,sha256=sX6s8GY-BB0UHogMC1ICeREVab-IYrNm1c-hqMGEdYQ,864
560
556
  reconcile/typed_queries/app_interface_custom_messages.py,sha256=5HWr68_kb4bEL8pDCIH0ez6GOrdwdbGF6w88xV0_Ccs,718
@@ -786,8 +782,8 @@ tools/test/test_app_interface_metrics_exporter.py,sha256=SX7qL3D1SIRKFo95FoQztvf
786
782
  tools/test/test_qontract_cli.py,sha256=w2l4BHB09k1d-BGJ1jBUNCqDv7zkqYrMHojQXg-21kQ,4155
787
783
  tools/test/test_sd_app_sre_alert_report.py,sha256=v363r9zM7__0kR5K6mvJoGFcM9BvE33fWAayrqkpojA,2116
788
784
  tools/test/test_sre_checkpoints.py,sha256=SKqPPTl9ua0RFdSSofnoQX-JZE6dFLO3LRhfQzqtfh8,2607
789
- qontract_reconcile-0.10.1rc763.dist-info/METADATA,sha256=fcRNcPrqjl4BhzNXPaBi1VfLS0USg01x3-xMR4r4bvc,2382
790
- qontract_reconcile-0.10.1rc763.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
791
- qontract_reconcile-0.10.1rc763.dist-info/entry_points.txt,sha256=rIxI5zWtHNlfpDeq1a7pZXAPoqf7HG32KMTN3MeWK_8,429
792
- qontract_reconcile-0.10.1rc763.dist-info/top_level.txt,sha256=l5ISPoXzt0SdR4jVdkfa7RPSKNc8zAHYWAnR-Dw8Ey8,24
793
- qontract_reconcile-0.10.1rc763.dist-info/RECORD,,
785
+ qontract_reconcile-0.10.1rc765.dist-info/METADATA,sha256=jvfPojPDE35EHICj36iXRI8v0jcPR9pHsqy5dacJiVE,2382
786
+ qontract_reconcile-0.10.1rc765.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
787
+ qontract_reconcile-0.10.1rc765.dist-info/entry_points.txt,sha256=rIxI5zWtHNlfpDeq1a7pZXAPoqf7HG32KMTN3MeWK_8,429
788
+ qontract_reconcile-0.10.1rc765.dist-info/top_level.txt,sha256=l5ISPoXzt0SdR4jVdkfa7RPSKNc8zAHYWAnR-Dw8Ey8,24
789
+ qontract_reconcile-0.10.1rc765.dist-info/RECORD,,
@@ -0,0 +1,85 @@
1
+ from abc import ABC, abstractmethod
2
+ from typing import Any
3
+
4
+ from reconcile.external_resources.model import (
5
+ ExternalResource,
6
+ ExternalResourcesInventory,
7
+ )
8
+ from reconcile.utils.external_resource_spec import (
9
+ ExternalResourceSpec,
10
+ )
11
+ from reconcile.utils.external_resources import ResourceValueResolver
12
+ from reconcile.utils.secret_reader import SecretReaderBase
13
+
14
+
15
+ class AWSResourceFactory(ABC):
16
+ def __init__(
17
+ self, er_inventory: ExternalResourcesInventory, secrets_reader: SecretReaderBase
18
+ ):
19
+ self.er_inventory = er_inventory
20
+ self.secrets_reader = secrets_reader
21
+
22
+ @abstractmethod
23
+ def resolve(self, spec: ExternalResourceSpec) -> dict[str, Any]: ...
24
+
25
+ @abstractmethod
26
+ def validate(self, resource: ExternalResource) -> None: ...
27
+
28
+
29
+ class AWSDefaultResourceFactory(AWSResourceFactory):
30
+ def resolve(self, spec: ExternalResourceSpec) -> dict[str, Any]:
31
+ return ResourceValueResolver(spec=spec, identifier_as_value=True).resolve()
32
+
33
+ def validate(self, resource: ExternalResource) -> None: ...
34
+
35
+
36
+ class AWSRdsFactory(AWSDefaultResourceFactory):
37
+ def _get_source_db_spec(
38
+ self, provisioner: str, identifier: str
39
+ ) -> ExternalResourceSpec:
40
+ return self.er_inventory.get_inventory_spec(
41
+ "aws", provisioner, "rds", identifier
42
+ )
43
+
44
+ def _get_kms_key_spec(
45
+ self, provisioner: str, identifier: str
46
+ ) -> ExternalResourceSpec:
47
+ return self.er_inventory.get_inventory_spec(
48
+ "aws", provisioner, "kms", identifier
49
+ )
50
+
51
+ def resolve(self, spec: ExternalResourceSpec) -> dict[str, Any]:
52
+ rvr = ResourceValueResolver(spec=spec, identifier_as_value=True)
53
+ data = rvr.resolve()
54
+
55
+ data["output_prefix"] = spec.output_prefix
56
+
57
+ if "parameter_group" in data:
58
+ pg_data = rvr._get_values(data["parameter_group"])
59
+ data["parameter_group"] = pg_data
60
+ if "old_parameter_group" in data:
61
+ old_pg_data = rvr._get_values(data["old_parameter_group"])
62
+ data["old_parameter_group"] = old_pg_data
63
+ if "replica_source" in data:
64
+ sourcedb_spec = self._get_source_db_spec(
65
+ spec.provisioner_name, data["replica_source"]
66
+ )
67
+ sourcedb = self.resolve(sourcedb_spec)
68
+ sourcedb_region = (
69
+ sourcedb.get("region", None)
70
+ or sourcedb_spec.provisioner["resources_default_region"]
71
+ )
72
+ data["replica_source"] = {
73
+ "identifier": sourcedb["identifier"],
74
+ "region": sourcedb_region,
75
+ }
76
+
77
+ kms_key_id: str = data.get("kms_key_id", None)
78
+ if kms_key_id and not kms_key_id.startswith("arn:"):
79
+ data["kms_key_id"] = self._get_kms_key_spec(
80
+ spec.provisioner_name, kms_key_id
81
+ ).identifier
82
+
83
+ return data
84
+
85
+ def validate(self, resource: ExternalResource) -> None: ...
@@ -0,0 +1,133 @@
1
+ from abc import (
2
+ ABC,
3
+ abstractmethod,
4
+ )
5
+ from typing import Generic, TypeVar
6
+
7
+ from reconcile.external_resources.aws import (
8
+ AWSDefaultResourceFactory,
9
+ AWSRdsFactory,
10
+ AWSResourceFactory,
11
+ )
12
+ from reconcile.external_resources.model import (
13
+ ExternalResource,
14
+ ExternalResourceKey,
15
+ ExternalResourceProvision,
16
+ ExternalResourcesInventory,
17
+ ModuleInventory,
18
+ ModuleProvisionData,
19
+ TerraformModuleProvisionData,
20
+ )
21
+ from reconcile.gql_definitions.external_resources.external_resources_settings import (
22
+ ExternalResourcesSettingsV1,
23
+ )
24
+ from reconcile.utils.external_resource_spec import (
25
+ ExternalResourceSpec,
26
+ )
27
+ from reconcile.utils.secret_reader import SecretReaderBase
28
+
29
+ T = TypeVar("T")
30
+
31
+
32
+ class ObjectFactory(Generic[T]):
33
+ def __init__(self) -> None:
34
+ self._factories: dict[str, T] = {}
35
+
36
+ def register_factory(self, id: str, t: T) -> None:
37
+ self._factories[id] = t
38
+
39
+ def get_factory(self, id: str) -> T:
40
+ return self._factories[id]
41
+
42
+
43
+ class ExternalResourceFactory(ABC):
44
+ @abstractmethod
45
+ def create_external_resource(self, spec: ExternalResourceSpec) -> ExternalResource:
46
+ pass
47
+
48
+ @abstractmethod
49
+ def validate_external_resource(self, resource: ExternalResource) -> None:
50
+ pass
51
+
52
+
53
+ class ModuleProvisionDataFactory(ABC):
54
+ @abstractmethod
55
+ def create_provision_data(self, ers: ExternalResourceSpec) -> ModuleProvisionData:
56
+ pass
57
+
58
+
59
+ class TerraformModuleProvisionDataFactory(ModuleProvisionDataFactory):
60
+ def __init__(self, settings: ExternalResourcesSettingsV1):
61
+ self.settings = settings
62
+
63
+ def create_provision_data(
64
+ self, spec: ExternalResourceSpec
65
+ ) -> TerraformModuleProvisionData:
66
+ key = ExternalResourceKey.from_spec(spec)
67
+
68
+ return TerraformModuleProvisionData(
69
+ tf_state_bucket=self.settings.tf_state_bucket,
70
+ tf_state_region=self.settings.tf_state_region,
71
+ tf_state_dynamodb_table=self.settings.tf_state_dynamodb_table,
72
+ tf_state_key=key.state_path + "/terraform.tfstate",
73
+ )
74
+
75
+
76
+ def setup_aws_resource_factories(
77
+ er_inventory: ExternalResourcesInventory, secrets_reader: SecretReaderBase
78
+ ) -> ObjectFactory[AWSResourceFactory]:
79
+ f = ObjectFactory[AWSResourceFactory]()
80
+ f.register_factory("rds", AWSRdsFactory(er_inventory, secrets_reader))
81
+ f.register_factory(
82
+ "default", AWSDefaultResourceFactory(er_inventory, secrets_reader)
83
+ )
84
+ return f
85
+
86
+
87
+ class AWSExternalResourceFactory(ExternalResourceFactory):
88
+ def __init__(
89
+ self,
90
+ module_inventory: ModuleInventory,
91
+ er_inventory: ExternalResourcesInventory,
92
+ secret_reader: SecretReaderBase,
93
+ provision_factories: ObjectFactory[ModuleProvisionDataFactory],
94
+ resource_factories: ObjectFactory[AWSResourceFactory],
95
+ ):
96
+ self.provision_factories = provision_factories
97
+ self.resource_factories = resource_factories
98
+ self.module_inventory = module_inventory
99
+ self.er_inventory = er_inventory
100
+ self.secret_reader = secret_reader
101
+
102
+ def create_external_resource(self, spec: ExternalResourceSpec) -> ExternalResource:
103
+ f = self.resource_factories.get_factory(spec.provider)
104
+ data = f.resolve(spec)
105
+
106
+ region = data.get("region")
107
+ if region:
108
+ if region not in spec.provisioner["supported_deployment_regions"]:
109
+ raise ValueError(region)
110
+ else:
111
+ region = spec.provisioner["resources_default_region"]
112
+ data["region"] = region
113
+
114
+ module_type = self.module_inventory.get_from_spec(spec).module_type
115
+ provision_factory = self.provision_factories.get_factory(module_type)
116
+ module_provision_data = provision_factory.create_provision_data(spec)
117
+
118
+ provision = ExternalResourceProvision(
119
+ provision_provider=spec.provision_provider,
120
+ provisioner=spec.provisioner_name,
121
+ provider=spec.provider,
122
+ identifier=spec.identifier,
123
+ target_cluster=spec.cluster_name,
124
+ target_namespace=spec.namespace_name,
125
+ target_secret_name=spec.output_resource_name,
126
+ module_provision_data=module_provision_data,
127
+ )
128
+
129
+ return ExternalResource(data=data, provision=provision)
130
+
131
+ def validate_external_resource(self, resource: ExternalResource) -> None:
132
+ f = self.resource_factories.get_factory(resource.provision.provider)
133
+ f.validate(resource)
@@ -0,0 +1,95 @@
1
+ import logging
2
+
3
+ from reconcile.external_resources.manager import (
4
+ ExternalResourcesInventory,
5
+ ExternalResourcesManager,
6
+ setup_factories,
7
+ )
8
+ from reconcile.external_resources.meta import (
9
+ QONTRACT_INTEGRATION,
10
+ QONTRACT_INTEGRATION_VERSION,
11
+ )
12
+ from reconcile.external_resources.model import load_module_inventory
13
+ from reconcile.external_resources.reconciler import K8sExternalResourcesReconciler
14
+ from reconcile.external_resources.secrets_sync import (
15
+ build_incluster_secrets_reconciler,
16
+ )
17
+ from reconcile.external_resources.state import ExternalResourcesStateDynamoDB
18
+ from reconcile.typed_queries.app_interface_vault_settings import (
19
+ get_app_interface_vault_settings,
20
+ )
21
+ from reconcile.typed_queries.external_resources import (
22
+ get_modules,
23
+ get_namespaces,
24
+ get_settings,
25
+ )
26
+ from reconcile.utils.jobcontroller.controller import (
27
+ build_job_controller,
28
+ )
29
+ from reconcile.utils.oc import (
30
+ OCCli,
31
+ )
32
+ from reconcile.utils.openshift_resource import OpenshiftResource, ResourceInventory
33
+ from reconcile.utils.secret_reader import create_secret_reader
34
+
35
+
36
+ def fetch_current_state(
37
+ ri: ResourceInventory, oc: OCCli, cluster: str, namespace: str
38
+ ) -> None:
39
+ for item in oc.get_items("Job", namespace=namespace):
40
+ r = OpenshiftResource(item, QONTRACT_INTEGRATION, QONTRACT_INTEGRATION_VERSION)
41
+ ri.add_current(cluster, namespace, "Job", r.name, r)
42
+
43
+
44
+ def run(
45
+ dry_run: bool,
46
+ cluster: str,
47
+ namespace: str,
48
+ dry_run_job_suffix: str,
49
+ thread_pool_size: int,
50
+ ) -> None:
51
+ vault_settings = get_app_interface_vault_settings()
52
+ secret_reader = create_secret_reader(use_vault=vault_settings.vault)
53
+ er_settings = get_settings()[0]
54
+ m_inventory = load_module_inventory(get_modules())
55
+ namespaces = [ns for ns in get_namespaces() if ns.external_resources]
56
+ er_inventory = ExternalResourcesInventory(namespaces)
57
+
58
+ er_mgr = ExternalResourcesManager(
59
+ thread_pool_size=thread_pool_size,
60
+ settings=er_settings,
61
+ secret_reader=secret_reader,
62
+ factories=setup_factories(
63
+ er_settings, m_inventory, er_inventory, secret_reader
64
+ ),
65
+ er_inventory=er_inventory,
66
+ module_inventory=m_inventory,
67
+ state_manager=ExternalResourcesStateDynamoDB(
68
+ table_name=er_settings.state_dynamodb_table,
69
+ region_name=er_settings.state_dynamodb_region,
70
+ ),
71
+ reconciler=K8sExternalResourcesReconciler(
72
+ controller=build_job_controller(
73
+ integration=QONTRACT_INTEGRATION,
74
+ integration_version=QONTRACT_INTEGRATION_VERSION,
75
+ cluster=cluster,
76
+ namespace=namespace,
77
+ secret_reader=secret_reader,
78
+ dry_run=dry_run,
79
+ ),
80
+ dry_run=dry_run,
81
+ dry_run_job_suffix=dry_run_job_suffix,
82
+ ),
83
+ secrets_reconciler=build_incluster_secrets_reconciler(
84
+ cluster, namespace, secret_reader, vault_path="app-sre"
85
+ ),
86
+ )
87
+
88
+ if dry_run:
89
+ er_mgr.handle_dry_run_resources()
90
+ if er_mgr.errors:
91
+ logging.error("Validation Errors:")
92
+ for k, e in er_mgr.errors.items():
93
+ logging.error("ExternalResourceKey: %s, Error: %s" % (k, e))
94
+ else:
95
+ er_mgr.handle_resources()