qontract-reconcile 0.10.1rc1031__py3-none-any.whl → 0.10.1rc1033__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 (45) hide show
  1. {qontract_reconcile-0.10.1rc1031.dist-info → qontract_reconcile-0.10.1rc1033.dist-info}/METADATA +1 -1
  2. {qontract_reconcile-0.10.1rc1031.dist-info → qontract_reconcile-0.10.1rc1033.dist-info}/RECORD +45 -45
  3. reconcile/aws_support_cases_sos.py +1 -1
  4. reconcile/cli.py +1 -1
  5. reconcile/dynatrace_token_provider/integration.py +2 -2
  6. reconcile/endpoints_discovery/integration.py +1 -2
  7. reconcile/endpoints_discovery/merge_request.py +10 -6
  8. reconcile/endpoints_discovery/merge_request_manager.py +3 -0
  9. reconcile/github_org.py +1 -1
  10. reconcile/ocm_aws_infrastructure_access.py +2 -2
  11. reconcile/openshift_base.py +2 -2
  12. reconcile/openshift_cluster_bots.py +1 -1
  13. reconcile/openshift_namespaces.py +1 -1
  14. reconcile/openshift_resources_base.py +2 -2
  15. reconcile/openshift_saas_deploy_change_tester.py +1 -1
  16. reconcile/openshift_saas_deploy_trigger_base.py +1 -1
  17. reconcile/query_validator.py +2 -2
  18. reconcile/terraform_aws_route53.py +2 -2
  19. reconcile/test/test_closedbox_endpoint_monitoring.py +5 -5
  20. reconcile/test/test_openshift_resource.py +2 -2
  21. reconcile/test/test_openshift_resources_base.py +7 -7
  22. reconcile/test/test_openshift_serviceaccount_tokens.py +7 -5
  23. reconcile/test/test_terraform_vpc_peerings.py +2 -2
  24. reconcile/utils/acs/base.py +1 -1
  25. reconcile/utils/acs/notifiers.py +1 -1
  26. reconcile/utils/aws_api.py +1 -1
  27. reconcile/utils/config.py +2 -4
  28. reconcile/utils/external_resources.py +1 -1
  29. reconcile/utils/gql.py +1 -1
  30. reconcile/utils/jinja2/utils.py +1 -1
  31. reconcile/utils/jobcontroller/controller.py +3 -3
  32. reconcile/utils/mr/__init__.py +8 -8
  33. reconcile/utils/ocm/__init__.py +2 -2
  34. reconcile/utils/saasherder/__init__.py +1 -1
  35. reconcile/utils/saasherder/saasherder.py +5 -5
  36. reconcile/utils/state.py +2 -2
  37. reconcile/utils/terraform_client.py +1 -1
  38. reconcile/utils/terrascript_aws_client.py +1 -1
  39. reconcile/utils/unleash/__init__.py +2 -2
  40. reconcile/utils/vcs.py +2 -2
  41. tools/app_interface_reporter.py +7 -7
  42. tools/qontract_cli.py +21 -45
  43. {qontract_reconcile-0.10.1rc1031.dist-info → qontract_reconcile-0.10.1rc1033.dist-info}/WHEEL +0 -0
  44. {qontract_reconcile-0.10.1rc1031.dist-info → qontract_reconcile-0.10.1rc1033.dist-info}/entry_points.txt +0 -0
  45. {qontract_reconcile-0.10.1rc1031.dist-info → qontract_reconcile-0.10.1rc1033.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: qontract-reconcile
3
- Version: 0.10.1rc1031
3
+ Version: 0.10.1rc1033
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
@@ -7,10 +7,10 @@ reconcile/aws_ecr_image_pull_secrets.py,sha256=TGEc_0nv8oxV2HqA8VdcM4HHP-B1YqmNO
7
7
  reconcile/aws_garbage_collector.py,sha256=ddwU8IKTueAJc0TzymcREr7hcoVui9kOGvdH1B2EcuM,450
8
8
  reconcile/aws_iam_keys.py,sha256=GpxZR_A4ZQFlOQG1jpNiYhL5GMxdeTJ05aAYgUwWveE,3633
9
9
  reconcile/aws_iam_password_reset.py,sha256=q96mwr2KeEQ5bpNniGlgIMZTxiuLSodcYfX-tSaZPjA,3108
10
- reconcile/aws_support_cases_sos.py,sha256=Jk6_XjDeJSYxgRGqcEAOcynt9qJF2r5HPIPcSKmoBv8,2974
10
+ reconcile/aws_support_cases_sos.py,sha256=hl_9L53yQYRQxKs3IWrd69Cc60XK067g_bJRM9B0udo,2975
11
11
  reconcile/blackbox_exporter_endpoint_monitoring.py,sha256=O1wFp52EyF538c6txaWBs8eMtUIy19gyHZ6VzJ6QXS8,3512
12
12
  reconcile/checkpoint.py,sha256=_JhMxrye5BgkRMxWYuf7Upli6XayPINKSsuo3ynHTRc,5010
13
- reconcile/cli.py,sha256=XYYAh7NPZY86nIIJXNaY3ehbP1ACuix-pMpBUJqsLI4,107372
13
+ reconcile/cli.py,sha256=2hjHLQED4DR41EHoov3uHiURb8dfAbDpaTwxnEvrVhk,107388
14
14
  reconcile/closedbox_endpoint_monitoring_base.py,sha256=rLh16BOlBOxTmJ8Si3wWyyEpmMlhh4Znx1Gc36qsmOc,4865
15
15
  reconcile/cluster_deployment_mapper.py,sha256=5gumAaRCcFXsabUJ1dnuUy9WrP_FEEM5JnOnE8ch9sE,2326
16
16
  reconcile/dashdotdb_base.py,sha256=l34QDu1G96_Ctnh7ZXdxXgSeCE93GQMdLAkWxmN6vDA,4775
@@ -23,7 +23,7 @@ reconcile/deadmanssnitch.py,sha256=n-5W-djUgwzpmdDM4eQIZpkkDmHY0vndt-42LJXI4Y8,7
23
23
  reconcile/email_sender.py,sha256=-5L-Ag_jaEYSzYRoMr52KQBRXz1E8yx9GqLbg2X4XFU,3533
24
24
  reconcile/gabi_authorized_users.py,sha256=rmvJN1TKZbDT0eOYObUeshKpl7uGhPam_r3U5j1eHX4,4854
25
25
  reconcile/gcr_mirror.py,sha256=dXMPHBx_Rdr7HQPfctz7tmBrJHAFG0wos1f4nZe4jRo,8742
26
- reconcile/github_org.py,sha256=m24SQQBlqghh9v663GE3lbHcSCKdcZqHd1hwcfU2PaQ,13455
26
+ reconcile/github_org.py,sha256=Bjxtin6Qlosb7BOVdjPbcQc2QALbEsqnDfYjHAl7OIA,13458
27
27
  reconcile/github_owners.py,sha256=s9NDIqTbaqgGE5lj89eh3Sr52B-6SCUWQILzQlzGyxw,2949
28
28
  reconcile/github_repo_invites.py,sha256=3GOBGZq1DKMIuyYsDxHqXDnMTWlJfeu248-m3ajfV8Y,2672
29
29
  reconcile/github_repo_permissions_validator.py,sha256=dcbXdUx6imjNchjp3pg9-z1i7lFEGOr_28GvsiwO5Xw,1734
@@ -53,7 +53,7 @@ reconcile/mr_client_gateway.py,sha256=WhjMd-sIXDFCV8-rt8CEjurJ5OYB1pOD0K3o0tZRXQ
53
53
  reconcile/ocm_additional_routers.py,sha256=KfcFDVbNoc6n5dHWjYdAf1_DiVqVG6Tw23WLKoV8cdg,3306
54
54
  reconcile/ocm_addons.py,sha256=qqAyqRBRbdZQvAcjb-QlSVyRAyQBZk6iVlgnI4jyi7s,3353
55
55
  reconcile/ocm_addons_upgrade_tests_trigger.py,sha256=A9zXeYG-_52DsS1dz47yDSnHz62du5XpPBlaeRa6zxY,3975
56
- reconcile/ocm_aws_infrastructure_access.py,sha256=SghVWdmgliPVo_xHsp-e64_iC3mqDiia2ANSHb-g5G8,6891
56
+ reconcile/ocm_aws_infrastructure_access.py,sha256=rrlcQxvRTmKyYOUR1C-Nlxj_o_iCDSxc7PNoELUDiew,6892
57
57
  reconcile/ocm_clusters.py,sha256=0AlqFrUoxxB8rsOgobvnwiBI2Zal8BK2TI2cpWa0Qqg,16895
58
58
  reconcile/ocm_external_configuration_labels.py,sha256=imEpDv1RBpCSj8tHDv0R76hmNCFtcUzVNgS1yOVl8vs,3870
59
59
  reconcile/ocm_github_idp.py,sha256=glwXMsIBcl38-OmDDQCpe0YoLLXfoRgVQmqwXMEXjds,3946
@@ -61,23 +61,23 @@ reconcile/ocm_groups.py,sha256=-rTPMewkdyo1De6gs4u-294p3z34oUbGfuNi8ov56Sk,3424
61
61
  reconcile/ocm_machine_pools.py,sha256=poGfITOCJEMwYAJpiuL8SytgTcBmGIKEZPgNGld80TY,16563
62
62
  reconcile/ocm_update_recommended_version.py,sha256=IYkfLXIprOW1jguZeELcGP1iBPuj-b53R-FTqKulMl8,4204
63
63
  reconcile/ocm_upgrade_scheduler_org_updater.py,sha256=aLgyInt9oIWAg0XtCiwJRUSwdPx3masKV8kHzkyEEOQ,4282
64
- reconcile/openshift_base.py,sha256=ZcyB6FU0MSibu8mLCQrQFOcEIoGITGBjR-g3vbdNKHE,52647
65
- reconcile/openshift_cluster_bots.py,sha256=1aGPaKUOoWuqDt6Jv6hdxc7NfdvjstrCmcDHHFfatIk,10942
64
+ reconcile/openshift_base.py,sha256=l3stMLbjRj3Z18orwyRv8ZN5IqVRaEwQ9tgiQJjDI5w,52641
65
+ reconcile/openshift_cluster_bots.py,sha256=AmCLCrlsZ_Wd5qMPzlv-O01i47WGJuojEc-Jgt2n77c,10942
66
66
  reconcile/openshift_clusterrolebindings.py,sha256=sDgHi_t2ayE3O6zZ5CLao7uBmihxRK8K70w2GSADz-w,5822
67
67
  reconcile/openshift_groups.py,sha256=sK2wLWwNupztbfyFPl32VH42s_s8Mu3g-URdlisnwJc,9382
68
68
  reconcile/openshift_limitranges.py,sha256=UvCGo_OQ4XoDK55TJmn55qEhhlkhLzhU12tX8nT5kPQ,3442
69
69
  reconcile/openshift_namespace_labels.py,sha256=97qZl0MlYCUGP5Uu3zwMoU-qt0Drbhafb2NHy4CZWLo,15619
70
- reconcile/openshift_namespaces.py,sha256=wCDf9LVvk0aTTPUQe_ZycjjWldAjycU6A0_4FQJR74Y,5809
70
+ reconcile/openshift_namespaces.py,sha256=ju6G46odndwQlaMMV6Y6RjcDmtjAAFP4oEEaDuLAbLg,5806
71
71
  reconcile/openshift_network_policies.py,sha256=DyjaeJvSFHmslbM8nyHCxpF9EtU2m-MJokMrAv6Nwoo,4171
72
72
  reconcile/openshift_prometheus_rules.py,sha256=onowXab248zmHH8SbYDTc1W1bl7JiqRFU1xdTkZyLFg,1332
73
73
  reconcile/openshift_resourcequotas.py,sha256=yUi56PiOn3inMMfq_x_FEHmaW-reGipzoorjdar372g,2415
74
74
  reconcile/openshift_resources.py,sha256=I2nO_C37mG3rfyGrd4cGwN3mVseVGuTAHAyhFzLyqF4,1518
75
- reconcile/openshift_resources_base.py,sha256=Seh4T8oA_JO-g0Z5TODDtL5cyRj-o7bmk6-eOmDAL4Q,40751
75
+ reconcile/openshift_resources_base.py,sha256=SKlJffnYjnc7AHIOvi7Ui9TmDA93_t81d5t54wnqCOA,40745
76
76
  reconcile/openshift_rolebindings.py,sha256=9mlJ2FjWUoH-rsjtasreA_hV-K5Z_YR00qR_RR60OZM,6555
77
77
  reconcile/openshift_routes.py,sha256=fXvuPSjcjVw1X3j2EQvUAdbOepmIFdKk-M3qP8QzPiw,1075
78
78
  reconcile/openshift_saas_deploy.py,sha256=UZlm29JujJVS3MzSm6uehlC3y-jZxl6WVwMeKRdN11U,12773
79
- reconcile/openshift_saas_deploy_change_tester.py,sha256=FfXrx_JloAlWeJVsJLIQPqFQ7OoBkaB2TgJJXlNZNCM,8796
80
- reconcile/openshift_saas_deploy_trigger_base.py,sha256=m7aqYEZUM-vr3EBw-hIbz1rHpXZNxs_BAJv3ndfvnAQ,14039
79
+ reconcile/openshift_saas_deploy_change_tester.py,sha256=12uyBwaeMka1C3_pejmQPIBPAx2V1sJ4dJkScq-2e2M,8793
80
+ reconcile/openshift_saas_deploy_trigger_base.py,sha256=Ss_FE31d8jR2f3lbSiU0ROBMVI1kg-Y_8nxLavFPFko,14036
81
81
  reconcile/openshift_saas_deploy_trigger_cleaner.py,sha256=roLyVAVntaQptKaZbnN1LyLvCA8fyvqELfjU6M8xfeY,3511
82
82
  reconcile/openshift_saas_deploy_trigger_configs.py,sha256=eUejMGWuaQabZTLuvPLLvROfN5HOFyYZOpH4YEsiU_g,928
83
83
  reconcile/openshift_saas_deploy_trigger_images.py,sha256=iUsiBGJf-CyFw7tSLWo59rXmSvsVnN6TTaAObbsVpNg,936
@@ -95,7 +95,7 @@ reconcile/quay_mirror_org.py,sha256=utrJpJaKCs7U6WX6DODdfCeB0EmX-lUC8Y5fkmpgFSs,
95
95
  reconcile/quay_permissions.py,sha256=9KOutS1w4RFQqkvMSy54VtsKNx56-phzP6yI_rEW-B8,4244
96
96
  reconcile/quay_repos.py,sha256=cuEYG0HUe0ut5yvLdEwOF5-CmccpXQHRb_wDazvDrvQ,6895
97
97
  reconcile/queries.py,sha256=-mwZ0V89Tik0zB585ID0jEqC4VSuUVaAPlaSXaNAR-E,50180
98
- reconcile/query_validator.py,sha256=BAjGrU8_VhzTOv5k0-uz0hY9ziZyconv8VAhgre1Auc,1497
98
+ reconcile/query_validator.py,sha256=MSh5pKLBksws4AqfuvT8nrIGucIbqX-IOzYyPYTLO7k,1491
99
99
  reconcile/requests_sender.py,sha256=914iluuF4UVgG3VyxxtnHOu4yf6YKS2fIy6PViSsFTQ,3875
100
100
  reconcile/resource_scraper.py,sha256=znXCHrU7YwPfKuxGBiUrV7T1tYtn4vlz9qmZlfy6Flg,2307
101
101
  reconcile/resource_template_tester.py,sha256=DsKvBuNLPxm4Fa-e1YHHySnhThm5i_j-nF3G4b02Mz0,2416
@@ -108,7 +108,7 @@ reconcile/slack_usergroups.py,sha256=tZIpxbCmS8M4A15tYdtgCMEJ1Q6hcrkF9j_5-CZ6Yjs
108
108
  reconcile/sql_query.py,sha256=pH-EHkXiDknn8ZNXVqRZeqFc3sKhu2nhsaykgSytbS8,25895
109
109
  reconcile/status.py,sha256=cY4IJFXemhxptRJqR4qaaOWqei9e4jgLXuVSGajMsjg,544
110
110
  reconcile/status_board.py,sha256=YeoE7kLf1YKpOdN32u3vqhuSI46ep5N_qcVWC1CBCf8,8635
111
- reconcile/terraform_aws_route53.py,sha256=1C1_xd_xjysPLSYKvohS6bfSsjSMP0U3sWVcRNW9cAA,9957
111
+ reconcile/terraform_aws_route53.py,sha256=dQzzT46YhwRA902_H6pi-f7WlX4EaH187wXSdmJAUkQ,9958
112
112
  reconcile/terraform_cloudflare_dns.py,sha256=-aLEe2QnH5cJPu7HWqs-R9NmQ1NlFbcVUm0v7alVL3I,13431
113
113
  reconcile/terraform_cloudflare_resources.py,sha256=41Mj1WkuS75slCDpmhG2GGf1nh3BwfxcdNC73-PNadc,15000
114
114
  reconcile/terraform_cloudflare_users.py,sha256=iyTG5sj20Jg4J4qWJ144KVptfIHGOSfH8wQKxu0imq0,13942
@@ -181,14 +181,14 @@ reconcile/cna/assets/asset_factory.py,sha256=7T7X_J6xIsoGETqBRI45_EyIKEdQcnRPt_G
181
181
  reconcile/cna/assets/null.py,sha256=85mVh97atCoC0aLuX47poTZiyOthmziJeBsUw0c924w,1658
182
182
  reconcile/dynatrace_token_provider/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
183
183
  reconcile/dynatrace_token_provider/dependencies.py,sha256=41q05A4C_eS3E8-MR4veeMxtQNsPoGdxmEa3d-OKxq4,2814
184
- reconcile/dynatrace_token_provider/integration.py,sha256=jOpj2qtkI95b_Ih0IH3cYV5G63RBuxhG6kX4RADBWeg,23003
184
+ reconcile/dynatrace_token_provider/integration.py,sha256=-oAZ40IHLbY99PZB9THtH2FnS5LHCKpQMIYFdy1bp4Q,22997
185
185
  reconcile/dynatrace_token_provider/metrics.py,sha256=xiKkl8fTEBQaXJelGCPNTZhHAWdO1M3pCXNr_Tei63c,1285
186
186
  reconcile/dynatrace_token_provider/model.py,sha256=gkpqo5rRRueBXnIMjp4EEHqBUBuU65TRI8zpdb8GJ0A,241
187
187
  reconcile/dynatrace_token_provider/ocm.py,sha256=iHMsgbsLs-dlrB9UXmWNDF7E4UDe49JOsLa9rnowKfo,4282
188
188
  reconcile/endpoints_discovery/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
189
- reconcile/endpoints_discovery/integration.py,sha256=lUx_S_mQNATuB3tqGbyaliHBb355PCuU5SaVAiD_tbQ,12354
190
- reconcile/endpoints_discovery/merge_request.py,sha256=NktpwMUoQ9TvBzOeHSPC09OqxWmgZBZVy-Eqmsm_vrA,2909
191
- reconcile/endpoints_discovery/merge_request_manager.py,sha256=oY3lovy5DcUgHNEDzWrbOPabzZtaGMns6YLl5ipZJ0c,6346
189
+ reconcile/endpoints_discovery/integration.py,sha256=q01DJgCv1YiDY-VUWDfQ5kfGm67BUhP-YP7c0JQObj8,12333
190
+ reconcile/endpoints_discovery/merge_request.py,sha256=_yLb4tnvoZMCko8rta2C_CvOInJa9pa3HzSmHNtjgGU,2978
191
+ reconcile/endpoints_discovery/merge_request_manager.py,sha256=wUMsumxv8RnWaRattax4HfoRlhtVzmgro3GiJJ1C4Vc,6392
192
192
  reconcile/external_resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
193
193
  reconcile/external_resources/aws.py,sha256=JvjKaABy2Pg8u8Lq82Acv4zMvpE3_qGKes7OG-zlHOM,2956
194
194
  reconcile/external_resources/factories.py,sha256=DXgaLxoO87zZ76VOpRpu2GeYGhsbfOnOx5mrzgo4Gf4,4767
@@ -507,7 +507,7 @@ reconcile/test/test_aws_iam_password_reset.py,sha256=fnkqB90adR7W4L4saNdrtIiwnQB
507
507
  reconcile/test/test_aws_support_cases_sos.py,sha256=MLgPHTv8uZhh2iINoBV38jiweEqFhqGg7WYOveXkIXY,837
508
508
  reconcile/test/test_checkpoint.py,sha256=sbDtqTbfw5yMZ_mCltMXxkyyGueVLGUjTDtcWhPP7yA,5340
509
509
  reconcile/test/test_cli.py,sha256=qx_iBwh4Z-YkK3sbjK1wEziPTgn060EN-baf9DNvR3k,1096
510
- reconcile/test/test_closedbox_endpoint_monitoring.py,sha256=isMHYwRWMFARU2nbJgbl69kD6H0eA86noCM4MPVI1fo,7151
510
+ reconcile/test/test_closedbox_endpoint_monitoring.py,sha256=I0lSFOUQ5dBxjKeq1Dg3E4gWqoZ9d26d5pQmsLqWLPc,7166
511
511
  reconcile/test/test_dashdotdb_dora.py,sha256=MfHGAsX2eSQSvBVt9_1Sah3aQKNJBXA9Iu86X0NWD6c,7705
512
512
  reconcile/test/test_database_access_manager.py,sha256=n37cNan0dcMymWJbpsKN9HaCQ0vzXDn5PZencEH7e98,19592
513
513
  reconcile/test/test_deadmanssnitch.py,sha256=YAf8wlZoEC60Ul7UA6Y6XqwnZ1yqf07J15ABqeLpqW4,9835
@@ -536,12 +536,12 @@ reconcile/test/test_openshift_base.py,sha256=SX8URKF8Kn21nA-qcmICSUaZKHuc5YTgPzf
536
536
  reconcile/test/test_openshift_cluster_bots.py,sha256=sSGLgxnXO82xcfTFVNJzsrDuNfObwAR_-AkDe4B_4WE,7983
537
537
  reconcile/test/test_openshift_namespace_labels.py,sha256=i4S5QJFxMRjLkwi3iO6A-uhjgZ1QZb4jYXwB696m82Y,12070
538
538
  reconcile/test/test_openshift_namespaces.py,sha256=HmRnCE5EnFt3MYceVEFHmk8wWRtCrxu2AFGFkY9pdyA,9214
539
- reconcile/test/test_openshift_resource.py,sha256=lbTf48jX1q6rGnRiA5pPvfU0uPfY8zhNylMtryn0sLI,12995
540
- reconcile/test/test_openshift_resources_base.py,sha256=LtlR9x3o7KkSEw0JN0fZhinFeAAxBAQlB_9PpBnKwOM,14353
539
+ reconcile/test/test_openshift_resource.py,sha256=0HlknH5SR3H6YXyoaKuk-4Trii04LSowM_pbsGsucjA,13001
540
+ reconcile/test/test_openshift_resources_base.py,sha256=GOMYGG6yFACXpDWwPMBBIOR0v0ikjefEDON1DPQfdkk,14374
541
541
  reconcile/test/test_openshift_saas_deploy.py,sha256=3QXMrN9dXIiR0JktVDNQ7yJSexMTjZLb1tbRrB3-7uU,5991
542
542
  reconcile/test/test_openshift_saas_deploy_change_tester.py,sha256=1yVe54Hx9YdVjn6qdnKge5Sa_s732c-8uZqCnuT1gGI,12871
543
543
  reconcile/test/test_openshift_saas_deploy_trigger_cleaner.py,sha256=UQx1iJ21rsMa2whG-rtUIuTXbUzc0Ngr7jRLKXZCCCI,2838
544
- reconcile/test/test_openshift_serviceaccount_tokens.py,sha256=l5de4zsK4-eJMZuLsftYrsdKSXImKsxaWApPbK0pOoY,8958
544
+ reconcile/test/test_openshift_serviceaccount_tokens.py,sha256=VvVXDCS94KFvSLOhK8ScKjvmns5k1B6QgWr691AXiKc,8991
545
545
  reconcile/test/test_openshift_tekton_resources.py,sha256=O6-qPQwSiPHQKm1a1iqRU2V8eabc4uiG4mNxPSUBg88,11212
546
546
  reconcile/test/test_openshift_upgrade_watcher.py,sha256=0GDQ_YFHIX8DbkbDYSuLv9uZeeg4NwP1vlOqvSaZvN4,7183
547
547
  reconcile/test/test_prometheus_rules_tester.py,sha256=cgVkPM3KcAw69bOkJ6iR2Lfog_WgblyoqVRtXv4ly7o,5685
@@ -567,7 +567,7 @@ reconcile/test/test_terraform_repo.py,sha256=INfl-VlUtpV87J0neQt4wliptnX7PKvxLPF
567
567
  reconcile/test/test_terraform_resources.py,sha256=8C97yXIEihaQ3DZrtjxLNt4y4G12IOhD01ydm7JjliY,15359
568
568
  reconcile/test/test_terraform_tgw_attachments.py,sha256=SM6QwogMZNLh0BkUyaxzFafuOLp23-hBtYTu_F53C4I,40922
569
569
  reconcile/test/test_terraform_users.py,sha256=XOAfGvITCJPI1LTlISmHbA4ONMQMkxYUMTsny7pQCFw,4319
570
- reconcile/test/test_terraform_vpc_peerings.py,sha256=Btl0ym7NmO2QFST9Xviz4OO1RjJuhCp1Xhix5A3e_HQ,20822
570
+ reconcile/test/test_terraform_vpc_peerings.py,sha256=bpjCjhmic07cw3XKSHf-2JvmLuWlyQG8laXlC-H7qtI,20796
571
571
  reconcile/test/test_terraform_vpc_peerings_build_desired_state.py,sha256=7VAFVbjlnnUJoOkZ4ApDc1lHFj38Zj4yrbDKvWkqWXE,49545
572
572
  reconcile/test/test_three_way_diff_strategy.py,sha256=v3rNkQFNy5e1uyfeNSlNBA07fvrPGD0aXD91Lgv8oxc,4062
573
573
  reconcile/test/test_utils_jinja2.py,sha256=TpzQlpFnLGzNEZp5WOh0o7AuBiGEktqO4MuwiiJW2YY,3895
@@ -650,11 +650,11 @@ reconcile/unleash_feature_toggles/integration.py,sha256=nx7BhtzCsTfPbOp60vI5MkNw
650
650
  reconcile/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
651
651
  reconcile/utils/aggregated_list.py,sha256=km0xadW0jO4G_CqZPsXmoBURQ8c90FaTu5x4X1K1cZs,3357
652
652
  reconcile/utils/amtool.py,sha256=ngtBuVPETH6oAy5RnKzvreVbjwQCaATS_PYYwBprzjQ,2288
653
- reconcile/utils/aws_api.py,sha256=0Sh83kX8tk-XGwsWbNI19miuits71c3btKxGVhyApuY,66860
653
+ reconcile/utils/aws_api.py,sha256=tYjTEW1uSkWsMWNFxwavJsI9xtq1dEeJ2HPlN5LAHzA,66861
654
654
  reconcile/utils/aws_helper.py,sha256=MDbv5jrNdqqJ5pfBxniGdJXBBO_EYc2_Uf2w9ZzeMNs,2854
655
655
  reconcile/utils/batches.py,sha256=TtEm64a8lWhFuNbUVpFEmXVdU2Q0sTBrP_I0Cjbgh7g,320
656
656
  reconcile/utils/binary.py,sha256=7MaAFBpzuBUTJ_aA6G6-eult_BPMVyiXbBLD0Y6F-DM,2301
657
- reconcile/utils/config.py,sha256=lweqMxBEoSh2anhhvr9CTIYIh2ZtitOLpnlJYmU7p48,1032
657
+ reconcile/utils/config.py,sha256=kwaAaNBQ9z-fsDJu2-WZFgTnL6HKd3FPjiu0mbriHkg,1004
658
658
  reconcile/utils/constants.py,sha256=pOUd97bqZdsAu5RWJ8NUs9cwCY7K9y0eW9VVeJ4fZIU,138
659
659
  reconcile/utils/data_structures.py,sha256=VyKfnlNJTiRvZKNpfgIrjESQ2YgmEpWuPQXT14WA1vI,311
660
660
  reconcile/utils/deadmanssnitch_api.py,sha256=0uajXxRNUEyF8CPTYPFNV4G-_3KB_hDF9L8OtTy2zCk,2476
@@ -669,14 +669,14 @@ reconcile/utils/exceptions.py,sha256=DwfnWUpVOotpP79RWZ2pycmG6nKCL00RBIeZLYkQPW4
669
669
  reconcile/utils/expiration.py,sha256=3JaXH4psksR7z262k7FmdyREjCLqm66OpVMEbcfdWRo,1213
670
670
  reconcile/utils/extended_early_exit.py,sha256=QSktrmfw37zSRMNk930tDbQsVeKxaPPPD43e79DGwZw,6754
671
671
  reconcile/utils/external_resource_spec.py,sha256=bhH_xneFwATdFumTPkiQmcVKYI0gcaWuqV6FpFdf_P0,7006
672
- reconcile/utils/external_resources.py,sha256=ObBOGBRTsDQ2s9rojfeUfFMoR8ls4Kg-AnpsyF6m7u8,7539
672
+ reconcile/utils/external_resources.py,sha256=GC4wYuSXwk2ifr3aDEwnEiumaYqWhzgKK-hXp6pXemA,7516
673
673
  reconcile/utils/filtering.py,sha256=S4PbMHuFr3ED0P2Q_ea5CAaB7FimI62B-F5YTaKrphA,402
674
674
  reconcile/utils/git.py,sha256=JkpbUO10oBTtNHZ1IhjyG6dTOUizc7I5H0vm7NvDVNw,1409
675
675
  reconcile/utils/git_secrets.py,sha256=y1rEhwA8DyDpBSAEuhMS7Y2X3mpxT2zQ4zyDFkhLe_g,1936
676
676
  reconcile/utils/github_api.py,sha256=R8OvqyPdnRqvP-Efnv9RvIcbBlb4M0KC4RlbnJMD0Tg,2426
677
677
  reconcile/utils/gitlab_api.py,sha256=WfhLhOp3-cOwgptiCNPhWja74Lo41ZIlJ6HFSWaIDRw,30512
678
678
  reconcile/utils/gpg.py,sha256=EKG7_fdMv8BMlV5yUdPiqoTx-KrzmVSEAl2sLkaKwWI,1123
679
- reconcile/utils/gql.py,sha256=NqxosFCInLy_dF_fcXnRYcZgsThedSyv_I3U8k2SLMg,14161
679
+ reconcile/utils/gql.py,sha256=C0thIm_k9MBldfqwHzyqtYZk9sIvMdm9IbbnXLGwjD8,14158
680
680
  reconcile/utils/grouping.py,sha256=vr9SFHZ7bqmHYrvYcEZt-Er3-yQYfAAdq5sHLZVmXPY,456
681
681
  reconcile/utils/helm.py,sha256=Zmh9shdcUNJmiHIbBDkuUlk9T_Cg7uvWfw9c4St2n8E,3775
682
682
  reconcile/utils/helpers.py,sha256=k9svgFFZG7H5FvHYY0g5jJyvgvh2UDZxf0Ib221teag,1179
@@ -719,19 +719,19 @@ reconcile/utils/sharding.py,sha256=gkYf0lD3IUKQPEmdRJZ70mdDT1c9qWjbdP7evRsUis4,8
719
719
  reconcile/utils/slack_api.py,sha256=iaOFzv3wiZRhcgYK2NB4lsG6ymNsGk2MEuj0PgZVp7w,17355
720
720
  reconcile/utils/smtp_client.py,sha256=ee8FHnCMt_uhDBJOvIfFtyutbToq-Ni5MECC_c8DXnA,2769
721
721
  reconcile/utils/sqs_gateway.py,sha256=XNIf3PY4UCPNufP2Ul0UJj3fKlt5larBba-VTT-41Fg,2265
722
- reconcile/utils/state.py,sha256=a_EO5u7__Pqd0_E3MqzUttJ-0xRtuxcNx5oQi5WIahI,16392
722
+ reconcile/utils/state.py,sha256=W0_awkLAPX18hNOF_60o73tkPxDUylqbzYNHfl_sDsk,16386
723
723
  reconcile/utils/structs.py,sha256=LcbLEg8WxfRqM6nW7NhcWN0YeqF7SQzxOgntmLs1SgY,352
724
724
  reconcile/utils/template.py,sha256=wTvRU4AnAV_o042tD4Mwls2dwWMuk7MKnde3MaCjaYg,331
725
- reconcile/utils/terraform_client.py,sha256=4eYKaKfG5wYfR--e1jHpmoMq36Q-JX1_WtT916wlMVw,34669
726
- reconcile/utils/terrascript_aws_client.py,sha256=1JgXcCF_-xbaAg7V9qihL1Xz5okQlSSrT1DeXGducHc,278037
725
+ reconcile/utils/terraform_client.py,sha256=jHTkqqJk1HQh2vZP1FkEeDOiMlO-SKmX8oYuS7lzO_o,34672
726
+ reconcile/utils/terrascript_aws_client.py,sha256=eshIGXo9HQkAAANhO_mdL3a7M7A6NbMMlc8nj61k6Lk,278034
727
727
  reconcile/utils/three_way_diff_strategy.py,sha256=oQcHXd9LVhirJfoaOBoHUYuZVGfyL2voKr6KVI34zZE,4833
728
728
  reconcile/utils/throughput.py,sha256=iP4UWAe2LVhDo69mPPmgo9nQ7RxHD6_GS8MZe-aSiuM,344
729
729
  reconcile/utils/vault.py,sha256=9GSNHku8tw5KM2LKpZ1myWYDLtLGUJgpSnD0DxbzeO0,14956
730
730
  reconcile/utils/vaultsecretref.py,sha256=0KUSzuvTRxPyKY919TO3-B_eYg4_76fzKvMF8j5s1G0,911
731
- reconcile/utils/vcs.py,sha256=i2fbeoct1o6vMLON7SqW2IcDUhHQv7eZyNK3r7Ue6_w,8875
731
+ reconcile/utils/vcs.py,sha256=98SLBpqy-j_foE6NRwsyMCiPpNQtM6ujspnk6_qOURI,8881
732
732
  reconcile/utils/acs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
733
- reconcile/utils/acs/base.py,sha256=6bMvtvmqb8j7fvOYqKu3lMWQzRuhMmZ6xv1Gfyev1hU,2535
734
- reconcile/utils/acs/notifiers.py,sha256=WI2HEerP73vDDYtBW-mC40MQAbo-VcTJbonl4_rhCTk,4997
733
+ reconcile/utils/acs/base.py,sha256=4UsDrCpAOuddL3PKNuIQYoJP1BtZQNNB8_KEX0lXneg,2532
734
+ reconcile/utils/acs/notifiers.py,sha256=nHVw9C_2-K4nv5zq26jlOTSw1roY6TKlovi1sOfpxpI,4998
735
735
  reconcile/utils/acs/policies.py,sha256=jpbi3qpGkBD_X6MfzsX12dPajUbmACmhIOz_0rDvYzs,5489
736
736
  reconcile/utils/acs/rbac.py,sha256=ugsLM9Pb7FbUbdq85E3VzXGMaB9ZovXob7tdWCxwqZ8,8808
737
737
  reconcile/utils/aws_api_typed/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -760,9 +760,9 @@ reconcile/utils/internal_groups/models.py,sha256=y_IqBVqfGqNXiu0VudvBWFrm_-uafVm
760
760
  reconcile/utils/jinja2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
761
761
  reconcile/utils/jinja2/extensions.py,sha256=7K-uo6G2eCWa98MHT8fRPYIKCLQB_5D2keqQ_LyAfHM,1293
762
762
  reconcile/utils/jinja2/filters.py,sha256=tmiaYMhji5fv4B66YtR7zc-mE3wQLyj5I5SeX0WA2l4,4754
763
- reconcile/utils/jinja2/utils.py,sha256=gjsTb__eSddY-JyYjx-9AGFzYCEMqfYyMym_B8x0pdo,8045
763
+ reconcile/utils/jinja2/utils.py,sha256=a4vpt8f0UHerPAZs5zFESkVzZdEZRJjZ4mzJ19nubjI,8048
764
764
  reconcile/utils/jobcontroller/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
765
- reconcile/utils/jobcontroller/controller.py,sha256=2V_vm5thFx6adW4bMy9CdHXFesuo6S4lSkEpGxkXSM0,14492
765
+ reconcile/utils/jobcontroller/controller.py,sha256=n9twSH_xZtp5vknM3qByp0eWCn9ED4U1a6yOFBS-GTg,14488
766
766
  reconcile/utils/jobcontroller/models.py,sha256=x9YIvWfYOOvXNKToFVx1H7qDrZb0Sa1KI_4Y0gl7rMM,6336
767
767
  reconcile/utils/membershipsources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
768
768
  reconcile/utils/membershipsources/app_interface_resolver.py,sha256=MqDFvK3aXhmmMuMiIygC-onFVrrIopKHriaYJQ5jnuY,1988
@@ -771,7 +771,7 @@ reconcile/utils/membershipsources/resolver.py,sha256=meERrCZqeVJZR2lHdZEznaZDsCs
771
771
  reconcile/utils/merge_request_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
772
772
  reconcile/utils/merge_request_manager/merge_request_manager.py,sha256=3EP6Yw_zB7nY0OkU8D_32nDqta1TITgtRI0cSmOlNQg,3332
773
773
  reconcile/utils/merge_request_manager/parser.py,sha256=5pGoz8Q6EuYXlUc1z-D0FahdRP2YLO8CpACoa9HcgtQ,2098
774
- reconcile/utils/mr/__init__.py,sha256=IvDRx0x33ROPZ66DDkg3FCt8pLpcaVRGWyCJvZQ1SPE,2578
774
+ reconcile/utils/mr/__init__.py,sha256=hcfHDIIIsJT4C0BnzDnyeZEfZdamrqHzMLcBzIT1ibI,2578
775
775
  reconcile/utils/mr/app_interface_reporter.py,sha256=6Kpg93V9FvcOke9Jimkva359MQ-ZyBIkUpf8QIA6-to,1793
776
776
  reconcile/utils/mr/aws_access.py,sha256=w-UJutB_OfBJOvr-gsPzhtBPkDfKcNZZWGGuI9cN3HI,2605
777
777
  reconcile/utils/mr/base.py,sha256=TP6xaxznxsF_v2KcC_D3ut1cX_4KCcx4pjIC1-4eZUY,7307
@@ -783,7 +783,7 @@ reconcile/utils/mr/ocm_update_recommended_version.py,sha256=p_aVP0TGrlKk9WBwgQnY
783
783
  reconcile/utils/mr/ocm_upgrade_scheduler_org_updates.py,sha256=ojnIjw-8vRnmCCxOGBOEgPZLH4nC1hcuef74LWw2Rpk,3004
784
784
  reconcile/utils/mr/promote_qontract.py,sha256=3o_Lpn3gQc8HP3kSJRB1d7TvaDoIAKWLap5bhagQRaM,5945
785
785
  reconcile/utils/mr/user_maintenance.py,sha256=cHPBn8zrReWLHalyk-EFdkFJe9zjVjRoZhT4t2zZfGE,3956
786
- reconcile/utils/ocm/__init__.py,sha256=xv7CJp7K9LCQfa4gL_W0MMCOD1P4qOy8t5aZj1xXNUE,808
786
+ reconcile/utils/ocm/__init__.py,sha256=Y-bp8GomMpyCo0tFW6kJ78-ZG1UIupYRtBzbMWU0kwM,798
787
787
  reconcile/utils/ocm/addons.py,sha256=_LDdJ-gapM3s5exKlIUt-MlXZTAUoHezbYBU0QmvfWQ,7335
788
788
  reconcile/utils/ocm/base.py,sha256=iL_uMN03URDisWHpsaGGto_pLx652epUkuld_9ctx5o,14555
789
789
  reconcile/utils/ocm/cluster_groups.py,sha256=F8oqVqN_4QUnGL0K61zZhoYIzJeP57EcmZpwmoV0mr4,1751
@@ -811,10 +811,10 @@ reconcile/utils/runtime/integration.py,sha256=H3kDfbc4IKrhubSDCWHs0W9oxM7FoCiPax
811
811
  reconcile/utils/runtime/meta.py,sha256=dWdKS9eHVuowFkTK4lgXJ723vS1y9giOMzePUKnHnDI,214
812
812
  reconcile/utils/runtime/runner.py,sha256=I30KRrX1UQbHc_Ir1cIZX3OfNSdoHKdnDSPAEB69Ilk,7944
813
813
  reconcile/utils/runtime/sharding.py,sha256=r0ieUtNed7NvknSw6qQrCkKpVXE1shuHGnfFcnpA_k4,16142
814
- reconcile/utils/saasherder/__init__.py,sha256=J3MBZBFa5YmhqYm08QsjBXz8mFcVOCiOCkyIcw41t7E,343
814
+ reconcile/utils/saasherder/__init__.py,sha256=3U8plqMAPRE1kjwZ5YnIsYsggTf4_gS7flRUEuXVBAs,343
815
815
  reconcile/utils/saasherder/interfaces.py,sha256=C2wrw34OXypshVocAsPrVZsSHptgw4g9u7Haa2wulZQ,9087
816
816
  reconcile/utils/saasherder/models.py,sha256=z8ln03zi2a8cu716NcNUDHp8Dv1VcVbhqdWVxCl7x9A,10148
817
- reconcile/utils/saasherder/saasherder.py,sha256=rTsBaQrCY7StLWkkHnMLVil8luLMsZ9hRED6SDw4Cds,85698
817
+ reconcile/utils/saasherder/saasherder.py,sha256=qYnVoBydM0lMMW0J4xvMWFi6kBZzpvguqEbQgm2c1QM,85683
818
818
  reconcile/utils/terraform/__init__.py,sha256=zNbiyTWo35AT1sFTElL2j_AA0jJ_yWE_bfFn-nD2xik,250
819
819
  reconcile/utils/terraform/config.py,sha256=5UVrd563TMcvi4ooa5JvWVDW1I3bIWg484u79evfV_8,164
820
820
  reconcile/utils/terraform/config_client.py,sha256=gRL1rQ0AqvShei_rcGqC3HDYGskOFKE1nPrJyJE9yno,4676
@@ -823,7 +823,7 @@ reconcile/utils/terrascript/cloudflare_client.py,sha256=HPmWBF6X2yZ4_Yly5IdMmEwx
823
823
  reconcile/utils/terrascript/cloudflare_resources.py,sha256=AXI0NddGSwn5rro1GvKdL7CAbiobPnb_0KpDUZVpIGk,15973
824
824
  reconcile/utils/terrascript/models.py,sha256=DZfSEqyaZh8fCE_g7toa9TUCzcn3MHnuumoWCdzACh0,441
825
825
  reconcile/utils/terrascript/resources.py,sha256=ucuudrCjmJYeSleklXTlmeSEwZOqVtEfzWFEiDZydxM,1361
826
- reconcile/utils/unleash/__init__.py,sha256=ayCrW7Cw9dxQYq56QwrjtTcCnMp0xAHr1R7re9jo6RM,219
826
+ reconcile/utils/unleash/__init__.py,sha256=2PsN3GlLU8DOyWSvv5q9uzwuFn_vYtfEo-mmVaIFtpA,219
827
827
  reconcile/utils/unleash/client.py,sha256=YrJnauxjcy1ml7W2AHg7dzIH_fVK_GugoRu7IFmk6e0,3505
828
828
  reconcile/utils/unleash/server.py,sha256=907gDh9Ee8UxLqusnfpzE-7LUnttB38D4xhVJ0vMf_M,4439
829
829
  release/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -831,10 +831,10 @@ release/test_version.py,sha256=4DKxDZkT0aoS6ibZFsH2fd_wNETij1qfn2pCgQtVCGo,2093
831
831
  release/version.py,sha256=hLSW-Ai13atY9yBcUkEPEOr-drkZdRC4VcFIm1n5Y8o,4103
832
832
  tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
833
833
  tools/app_interface_metrics_exporter.py,sha256=zkwkxdAUAxjdc-pzx2_oJXG25fo0Fnyd5JXPk-iPcOQ,1619
834
- tools/app_interface_reporter.py,sha256=1ZP58LYV6ww3XOLVxgy8NKasMb1jQmp4BNqzTEB0VBE,17723
834
+ tools/app_interface_reporter.py,sha256=oZPib4HPq0aZ2Zui1QGJGk6qQdfpeihujGDBnSdKyGE,17627
835
835
  tools/glitchtip_access_reporter.py,sha256=oPBnk_YoDuljU3v0FaChzOwwnk4vap1xEE67QEjzdqs,2948
836
836
  tools/glitchtip_access_revalidation.py,sha256=8kbBJk04mkq28kWoRDDkfCGIF3GRg3pJrFAh1sW0dbk,2821
837
- tools/qontract_cli.py,sha256=8HbIKtepnmoQteb9Q31iJXFG7_y2o_g6JEkIhXnoncM,128916
837
+ tools/qontract_cli.py,sha256=LDQgwmAg3kzgtPuODqhGgPeVfD_9g8dgiOOVRsJ3YRA,128234
838
838
  tools/sd_app_sre_alert_report.py,sha256=e9vAdyenUz2f5c8-z-5WY0wv-SJ9aePKDH2r4IwB6pc,5063
839
839
  tools/template_validation.py,sha256=qpKYaTgk0GOPGa2Ct5_5sKdwIHtCAKIBGzsMPuJU5fw,3371
840
840
  tools/cli_commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -865,8 +865,8 @@ tools/test/test_qontract_cli.py,sha256=_D61RFGAN5x44CY1tYbouhlGXXABwYfxKSWSQx3Jr
865
865
  tools/test/test_saas_promotion_state.py,sha256=dy4kkSSAQ7bC0Xp2CociETGN-2aABEfL6FU5D9Jl00Y,6056
866
866
  tools/test/test_sd_app_sre_alert_report.py,sha256=v363r9zM7__0kR5K6mvJoGFcM9BvE33fWAayrqkpojA,2116
867
867
  tools/test/test_sre_checkpoints.py,sha256=SKqPPTl9ua0RFdSSofnoQX-JZE6dFLO3LRhfQzqtfh8,2607
868
- qontract_reconcile-0.10.1rc1031.dist-info/METADATA,sha256=IU8tp02udRNBkJ5CY9gEN_NBZcO87JMc_Kqe3JP4siY,2213
869
- qontract_reconcile-0.10.1rc1031.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
870
- qontract_reconcile-0.10.1rc1031.dist-info/entry_points.txt,sha256=GKQqCl2j2X1BJQ69een6rHcR26PmnxnONLNOQB-nRjY,491
871
- qontract_reconcile-0.10.1rc1031.dist-info/top_level.txt,sha256=l5ISPoXzt0SdR4jVdkfa7RPSKNc8zAHYWAnR-Dw8Ey8,24
872
- qontract_reconcile-0.10.1rc1031.dist-info/RECORD,,
868
+ qontract_reconcile-0.10.1rc1033.dist-info/METADATA,sha256=UgXHDzIBXemPFdpTK2uj033p1---CqacT8xzomQxMxI,2213
869
+ qontract_reconcile-0.10.1rc1033.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
870
+ qontract_reconcile-0.10.1rc1033.dist-info/entry_points.txt,sha256=GKQqCl2j2X1BJQ69een6rHcR26PmnxnONLNOQB-nRjY,491
871
+ qontract_reconcile-0.10.1rc1033.dist-info/top_level.txt,sha256=l5ISPoXzt0SdR4jVdkfa7RPSKNc8zAHYWAnR-Dw8Ey8,24
872
+ qontract_reconcile-0.10.1rc1033.dist-info/RECORD,,
@@ -53,7 +53,7 @@ def act(dry_run, gitlab_project_id, accounts, keys_to_delete, defer=None):
53
53
  key = k["key"]
54
54
  logging.info(["delete_aws_access_key", account, key])
55
55
  if not dry_run:
56
- path = "data" + [a["path"] for a in accounts if a["name"] == account][0]
56
+ path = "data" + next(a["path"] for a in accounts if a["name"] == account)
57
57
 
58
58
  mr = CreateDeleteAwsAccessKey(account, path, key)
59
59
  mr.submit(cli=mr_cli)
reconcile/cli.py CHANGED
@@ -1003,7 +1003,7 @@ def aws_saml_roles(
1003
1003
  "--initial-user-secret-vault-path",
1004
1004
  help="The path in Vault to store the initial user secret. Python format string with access to 'account_name' attribute.",
1005
1005
  required=True,
1006
- default="app-sre-v2/creds/terraform/{account_name}/config",
1006
+ default="app-sre-v2/creds/terraform/{account_name}/config", # noqa: RUF027
1007
1007
  )
1008
1008
  @click.option(
1009
1009
  "--account-tmpl-resource",
@@ -218,7 +218,7 @@ class DynatraceTokenProviderIntegration(
218
218
  _expose_errors_as_service_log(
219
219
  ocm_client,
220
220
  cluster.external_id,
221
- f"DTP can't create {token_spec.name=} {str(e.args)}",
221
+ f"DTP can't create {token_spec.name=} {e.args!s}",
222
222
  )
223
223
  logging.info(
224
224
  f"{token_spec.name=} created in {dt_api_url} for {cluster.external_id=}."
@@ -271,7 +271,7 @@ class DynatraceTokenProviderIntegration(
271
271
  _expose_errors_as_service_log(
272
272
  ocm_client,
273
273
  cluster.external_id,
274
- f"DTP can't patch {token_spec.name=} for {SYNCSET_AND_MANIFEST_ID} due to {str(e.args)}",
274
+ f"DTP can't patch {token_spec.name=} for {SYNCSET_AND_MANIFEST_ID} due to {e.args!s}",
275
275
  )
276
276
  logging.info(
277
277
  f"Patched {token_spec.name=} for {SYNCSET_AND_MANIFEST_ID} in {cluster.external_id=}."
@@ -261,8 +261,7 @@ class EndpointsDiscoveryIntegration(
261
261
  ) -> ExtendedEarlyExitRunnerResult:
262
262
  """Reconcile the endpoints for all namespaces."""
263
263
  apps = self.get_apps(oc_map, endpoint_template, namespaces)
264
- if apps:
265
- merge_request_manager.create_merge_request(apps=apps)
264
+ merge_request_manager.create_merge_request(apps=apps)
266
265
  return ExtendedEarlyExitRunnerResult(payload={}, applied_count=len(apps))
267
266
 
268
267
  @defer
@@ -72,13 +72,17 @@ class Renderer:
72
72
  """Update the app-interface app file for a merge request."""
73
73
  yml = create_ruamel_instance(explicit_start=True)
74
74
  content = yml.load(current_content)
75
- app_endpoints = content.setdefault("endPoints", [])
76
- for i, app_endpoint in enumerate(app_endpoints):
75
+ new_endpoints = []
76
+ for app_endpoint in content.setdefault("endPoints", []):
77
77
  if app_endpoint["name"] in endpoints_to_delete:
78
- app_endpoints.remove(app_endpoint)
79
- if app_endpoint["name"] in endpoints_to_change:
80
- app_endpoints[i] = endpoints_to_change[app_endpoint["name"]]
81
- app_endpoints.extend(endpoints_to_add)
78
+ continue
79
+ elif app_endpoint["name"] in endpoints_to_change:
80
+ new_endpoints.append(endpoints_to_change[app_endpoint["name"]])
81
+ else:
82
+ new_endpoints.append(app_endpoint)
83
+
84
+ new_endpoints.extend(endpoints_to_add)
85
+ content["endPoints"] = new_endpoints
82
86
  with StringIO() as stream:
83
87
  yml.dump(content, stream)
84
88
  return stream.getvalue()
@@ -139,6 +139,9 @@ class MergeRequestManager(MergeRequestManagerBase[EPDInfo]):
139
139
  # same external resource.
140
140
  return None
141
141
 
142
+ if not apps:
143
+ return None
144
+
142
145
  endpoints_discovery_mr = EndpointsDiscoveryMR(
143
146
  title=self._renderer.render_title(),
144
147
  description=self._renderer.render_description(hash=apps_hash),
reconcile/github_org.py CHANGED
@@ -128,7 +128,7 @@ def get_config(default=False):
128
128
 
129
129
  def get_default_config():
130
130
  github_config = get_config(default=True)
131
- return list(github_config["github"].values())[0]
131
+ return next(iter(github_config["github"].values()))
132
132
 
133
133
 
134
134
  @retry()
@@ -113,9 +113,9 @@ def fetch_desired_state(clusters):
113
113
  continue
114
114
  if aws_infrastructure_access.get("assume_role"):
115
115
  continue
116
- aws_account_uid = [
116
+ aws_account_uid = next(
117
117
  a["uid"] for a in aws_accounts if a["name"] == spec.provisioner_name
118
- ][0]
118
+ )
119
119
  cluster = aws_infrastructure_access["cluster"]["name"]
120
120
  access_level = aws_infrastructure_access["access_level"]
121
121
  item = {
@@ -316,7 +316,7 @@ def populate_current_state(
316
316
  )
317
317
  except StatusCodeError as e:
318
318
  ri.register_error(cluster=spec.cluster)
319
- logging.error(f"[{spec.cluster}/{spec.namespace}] {str(e)}")
319
+ logging.error(f"[{spec.cluster}/{spec.namespace}] {e!s}")
320
320
 
321
321
 
322
322
  def fetch_current_state(
@@ -907,7 +907,7 @@ def delete_action(
907
907
  )
908
908
  except StatusCodeError as e:
909
909
  ri.register_error()
910
- msg = f"[{cluster}/{namespace}] {str(e)}"
910
+ msg = f"[{cluster}/{namespace}] {e!s}"
911
911
  logging.error(msg)
912
912
 
913
913
 
@@ -91,7 +91,7 @@ def oc(
91
91
  kubeconfig: str, namespace: str, command: list[str], stdin: bytes | None = None
92
92
  ) -> dict | None:
93
93
  ret = subprocess.run(
94
- ["oc", "--kubeconfig", kubeconfig, "-n", namespace, "-o", "json"] + command,
94
+ ["oc", "--kubeconfig", kubeconfig, "-n", namespace, "-o", "json", *command],
95
95
  input=stdin,
96
96
  check=True,
97
97
  capture_output=True,
@@ -132,7 +132,7 @@ def check_results(
132
132
  err = True
133
133
  msg = (
134
134
  f'cluster: {s["cluster"]}, namespace: {s["namespace"]}, '
135
- f"exception: {str(e)}"
135
+ f"exception: {e!s}"
136
136
  )
137
137
  logging.error(msg)
138
138
  return err
@@ -680,7 +680,7 @@ def fetch_desired_state(
680
680
  UnknownProviderError,
681
681
  ) as e:
682
682
  ri.register_error()
683
- msg = f"[{cluster}/{namespace}] {str(e)}"
683
+ msg = f"[{cluster}/{namespace}] {e!s}"
684
684
  _locked_error_log(msg)
685
685
  return
686
686
 
@@ -747,7 +747,7 @@ def fetch_states(
747
747
 
748
748
  except StatusCodeError as e:
749
749
  ri.register_error(cluster=spec.cluster)
750
- logging.error(f"{spec} - exception: {str(e)}")
750
+ logging.error(f"{spec} - exception: {e!s}")
751
751
 
752
752
 
753
753
  def fetch_data(
@@ -147,7 +147,7 @@ def collect_compare_diffs(
147
147
  # that changes another saas file was merged but is not yet
148
148
  # reflected in the baseline graphql endpoint.
149
149
  # https://issues.redhat.com/browse/APPSRE-3029
150
- logging.debug(f"Diff not found in changed paths, skipping: {str(d)}")
150
+ logging.debug(f"Diff not found in changed paths, skipping: {d!s}")
151
151
  continue
152
152
  for c in current_state:
153
153
  if d.saas_file_name != c.saas_file_name:
@@ -297,7 +297,7 @@ def _trigger_tekton(
297
297
  logging.error(
298
298
  f"could not trigger pipeline {tkn_name} "
299
299
  + f"in {tkn_cluster_name}/{tkn_namespace_name}. "
300
- + f"details: {str(e)}"
300
+ + f"details: {e!s}"
301
301
  )
302
302
 
303
303
  if not error and not dry_run:
@@ -42,13 +42,13 @@ def run(dry_run):
42
42
  gqlapi.query(gql.get_resource(q["path"])["content"])
43
43
  except (gql.GqlGetResourceError, gql.GqlApiError) as e:
44
44
  error = True
45
- logging.error(f"query validation error in {qv_name}: {str(e)}")
45
+ logging.error(f"query validation error in {qv_name}: {e!s}")
46
46
  for r in qv.get("resources") or []:
47
47
  try:
48
48
  fetch_openshift_resource(r, qv, settings=settings, skip_validation=True)
49
49
  except Exception as e:
50
50
  error = True
51
- logging.error(f"query validation error in {qv_name}: {str(e)}")
51
+ logging.error(f"query validation error in {qv_name}: {e!s}")
52
52
 
53
53
  if error:
54
54
  sys.exit(ExitCodes.ERROR)
@@ -147,9 +147,9 @@ def build_desired_state(
147
147
  sys.exit(ExitCodes.ERROR)
148
148
  tf_zone_spec = tf_zone_specs[0]
149
149
  tf_zone_account_name = tf_zone_spec.provisioner_name
150
- zone_account = [
150
+ zone_account = next(
151
151
  a for a in all_accounts if a["name"] == tf_zone_account_name
152
- ][0]
152
+ )
153
153
  tf_zone_region = (
154
154
  tf_zone_spec.resource.get("region")
155
155
  or zone_account["resourcesDefaultRegion"]
@@ -43,7 +43,7 @@ def test_blackbox_exporter_endpoint_loading(mocker):
43
43
  assert endpoints is not None
44
44
  assert len(endpoints) == 1
45
45
 
46
- provider = list(endpoints.keys())[0]
46
+ provider = next(iter(endpoints.keys()))
47
47
  assert provider.provider == BLACKBOX_EXPORTER_PROVIDER
48
48
  provider_endpoints = endpoints.get(provider)
49
49
  assert provider_endpoints is not None
@@ -74,7 +74,7 @@ def test_blackbox_exporter_probe_building(mocker):
74
74
  endpoints = get_endpoints(BLACKBOX_EXPORTER_PROVIDER)
75
75
  assert len(endpoints) == 1
76
76
 
77
- provider = list(endpoints.keys())[0]
77
+ provider = next(iter(endpoints.keys()))
78
78
  provider_endpoints = endpoints.get(provider)
79
79
  assert provider_endpoints is not None
80
80
  probe_resource = blackbox_exporter_probe_builder(provider, provider_endpoints)
@@ -108,7 +108,7 @@ def test_signalfx_probe_building(mocker):
108
108
  endpoints = get_endpoints(SIGNALFX_PROVIDER)
109
109
  assert len(endpoints) == 1
110
110
 
111
- provider = list(endpoints.keys())[0]
111
+ provider = next(iter(endpoints.keys()))
112
112
  provider_endpoints = endpoints.get(provider)
113
113
  assert provider_endpoints is not None
114
114
  probe_resource = signalfx_probe_builder(provider, provider_endpoints)
@@ -157,7 +157,7 @@ def test_blackbox_exporter_filling_desired_state(mocker):
157
157
  add_desired_mock = mocker.patch.object(ResourceInventory, "add_desired")
158
158
 
159
159
  endpoints = get_endpoints(BLACKBOX_EXPORTER_PROVIDER)
160
- provider = list(endpoints.keys())[0]
160
+ provider = next(iter(endpoints.keys()))
161
161
  probe = blackbox_exporter_probe_builder(provider, endpoints[provider])
162
162
  assert probe is not None
163
163
  fill_desired_state(provider, probe, ResourceInventory())
@@ -178,7 +178,7 @@ def test_signalfx_filling_desired_state(mocker):
178
178
  add_desired_mock = mocker.patch.object(ResourceInventory, "add_desired")
179
179
 
180
180
  endpoints = get_endpoints(SIGNALFX_PROVIDER)
181
- provider = list(endpoints.keys())[0]
181
+ provider = next(iter(endpoints.keys()))
182
182
  probe = signalfx_probe_builder(provider, endpoints[provider])
183
183
  assert probe is not None
184
184
  fill_desired_state(provider, probe, ResourceInventory())
@@ -391,7 +391,7 @@ def test_resource_inventory_add_desired_resource_short_kind():
391
391
 
392
392
  assert len(list(ri)) == 1
393
393
 
394
- cluster_name, namespace_name, resource_type, resource = list(ri)[0]
394
+ cluster_name, namespace_name, resource_type, resource = next(iter(ri))
395
395
  assert cluster_name == "cl"
396
396
  assert namespace_name == "ns"
397
397
  assert resource_type == "Deployment"
@@ -412,7 +412,7 @@ def test_resource_inventory_add_desired_resource_long_kind():
412
412
 
413
413
  assert len(list(ri)) == 1
414
414
 
415
- cluster_name, namespace_name, resource_type, resource = list(ri)[0]
415
+ cluster_name, namespace_name, resource_type, resource = next(iter(ri))
416
416
  assert cluster_name == "cl"
417
417
  assert namespace_name == "ns"
418
418
  assert resource_type == "Deployment.apps"
@@ -155,7 +155,7 @@ def test_fetch_current_state_ri_initialized(oc_cs1: oc.OCClient, tmpl1: dict[str
155
155
  resource_names=[],
156
156
  )
157
157
 
158
- _, _, _, resource = list(ri)[0]
158
+ _, _, _, resource = next(iter(ri))
159
159
  assert len(resource["current"]) == 1
160
160
  assert "tmpl1" in resource["current"]
161
161
  assert resource["current"]["tmpl1"].kind == "Template"
@@ -178,7 +178,7 @@ def test_fetch_current_state_kind_not_supported(
178
178
  resource_names=[],
179
179
  )
180
180
 
181
- _, _, _, resource = list(ri)[0]
181
+ _, _, _, resource = next(iter(ri))
182
182
  assert len(resource["current"]) == 0
183
183
 
184
184
 
@@ -195,7 +195,7 @@ def test_fetch_current_state_long_kind(oc_cs1: oc.OCClient, tmpl1: dict[str, Any
195
195
  resource_names=[],
196
196
  )
197
197
 
198
- _, _, _, resource = list(ri)[0]
198
+ _, _, _, resource = next(iter(ri))
199
199
  assert len(resource["current"]) == 1
200
200
  assert "tmpl1" in resource["current"]
201
201
  assert resource["current"]["tmpl1"].kind == "Template"
@@ -218,7 +218,7 @@ def test_fetch_current_state_long_kind_not_supported(
218
218
  resource_names=[],
219
219
  )
220
220
 
221
- _, _, _, resource = list(ri)[0]
221
+ _, _, _, resource = next(iter(ri))
222
222
  assert len(resource["current"]) == 0
223
223
 
224
224
 
@@ -227,7 +227,7 @@ def test_fetch_states(current_state_spec: CurrentStateSpec, tmpl1: dict[str, Any
227
227
  ri.initialize_resource_type("cs1", "ns1", "Template")
228
228
  current_state_spec.oc.get_items = lambda kind, **kwargs: [tmpl1] # type: ignore[method-assign]
229
229
  orb.fetch_states(ri=ri, spec=current_state_spec)
230
- _, _, _, resource = list(ri)[0]
230
+ _, _, _, resource = next(iter(ri))
231
231
  assert len(resource["current"]) == 1
232
232
  assert "tmpl1" in resource["current"]
233
233
  assert resource["current"]["tmpl1"].kind == "Template"
@@ -238,7 +238,7 @@ def test_fetch_states_unknown_kind(current_state_spec: CurrentStateSpec):
238
238
  ri = ResourceInventory()
239
239
  ri.initialize_resource_type("cs1", "ns1", "UnknownKind")
240
240
  orb.fetch_states(ri=ri, spec=current_state_spec)
241
- _, _, _, resource = list(ri)[0]
241
+ _, _, _, resource = next(iter(ri))
242
242
  assert len(resource["current"]) == 0
243
243
 
244
244
 
@@ -250,7 +250,7 @@ def test_fetch_states_oc_error(current_state_spec: CurrentStateSpec):
250
250
  ri.initialize_resource_type("cs1", "ns1", "Template")
251
251
  orb.fetch_states(ri=ri, spec=current_state_spec)
252
252
  assert ri.has_error_registered("cs1")
253
- _, _, _, resource = list(ri)[0]
253
+ _, _, _, resource = next(iter(ri))
254
254
  assert len(resource["current"]) == 0
255
255
 
256
256
 
@@ -264,11 +264,13 @@ def test_openshift_serviceaccount_tokens__fetch_desired_state_create_token(
264
264
  )
265
265
  == 1
266
266
  )
267
- r = list(
268
- ri._clusters["cluster"]["with-openshift-serviceaccount-tokens"]["Secret"][
269
- "desired"
270
- ].values()
271
- )[0]
267
+ r = next(
268
+ iter(
269
+ ri._clusters["cluster"]["with-openshift-serviceaccount-tokens"]["Secret"][
270
+ "desired"
271
+ ].values()
272
+ )
273
+ )
272
274
  assert r.body["type"] == "kubernetes.io/service-account-token"
273
275
 
274
276
 
@@ -117,7 +117,7 @@ def build_cluster(
117
117
  cluster["awsInfrastructureManagementAccounts"] = []
118
118
  if read_only_accounts:
119
119
  for acc in read_only_accounts:
120
- cluster["awsInfrastructureManagementAccounts"].append( # type: ignore # noqa: E501
120
+ cluster["awsInfrastructureManagementAccounts"].append( # type: ignore
121
121
  {
122
122
  "account": {
123
123
  "name": acc,
@@ -131,7 +131,7 @@ def build_cluster(
131
131
  )
132
132
  if network_mgmt_accounts:
133
133
  for idx, acc in enumerate(network_mgmt_accounts):
134
- cluster["awsInfrastructureManagementAccounts"].append( # type: ignore # noqa: E501
134
+ cluster["awsInfrastructureManagementAccounts"].append( # type: ignore
135
135
  {
136
136
  "account": {
137
137
  "name": acc,
@@ -70,7 +70,7 @@ class AcsBaseApi(BaseModel):
70
70
  try:
71
71
  response.raise_for_status()
72
72
  except requests.exceptions.HTTPError as e:
73
- logging.error(f"{str(e)}: {response.text}")
73
+ logging.error(f"{e!s}: {response.text}")
74
74
  raise
75
75
 
76
76
  return response
@@ -123,7 +123,7 @@ class AcsNotifiersApi(AcsBaseApi):
123
123
  ]
124
124
 
125
125
  def get_notifier_id_by_name(self, name: str) -> str:
126
- return [n["id"] for n in self.get_notifiers() if n["name"] == name][0]
126
+ return next(n["id"] for n in self.get_notifiers() if n["name"] == name)
127
127
 
128
128
  def update_jira_notifier(
129
129
  self, jira_notifier: JiraNotifier, jira_credentials: JiraCredentials
@@ -738,7 +738,7 @@ class AWSApi: # pylint: disable=too-many-public-methods
738
738
 
739
739
  def get_user_key_status(self, iam: IAMClient, user: str, key: str) -> KeyStatus:
740
740
  key_list = self._get_user_key_list(iam, user)
741
- return [k["Status"] for k in key_list if k["AccessKeyId"] == key][0]
741
+ return next(k["Status"] for k in key_list if k["AccessKeyId"] == key)
742
742
 
743
743
  def get_support_cases(self):
744
744
  all_support_cases = {}
reconcile/utils/config.py CHANGED
@@ -35,7 +35,7 @@ def read(secret):
35
35
  config = config[t]
36
36
  return config[field]
37
37
  except Exception as e:
38
- raise SecretNotFound(f"key not found in config file {path}: {str(e)}") from None
38
+ raise SecretNotFound(f"key not found in config file {path}: {e!s}") from None
39
39
 
40
40
 
41
41
  def read_all(secret):
@@ -47,6 +47,4 @@ def read_all(secret):
47
47
  config = config[t]
48
48
  return config
49
49
  except Exception as e:
50
- raise SecretNotFound(
51
- f"secret {path} not found in config file: {str(e)}"
52
- ) from None
50
+ raise SecretNotFound(f"secret {path} not found in config file: {e!s}") from None
@@ -33,7 +33,7 @@ def get_external_resource_specs(
33
33
  external_resources = namespace_info.get("externalResources") or []
34
34
  for e in external_resources:
35
35
  for r in e.get("resources", []):
36
- if "managed_by_erv2" in r and r["managed_by_erv2"]:
36
+ if r.get("managed_by_erv2"):
37
37
  continue
38
38
  spec = ExternalResourceSpec(
39
39
  provision_provider=e["provider"],
reconcile/utils/gql.py CHANGED
@@ -77,7 +77,7 @@ class GqlApiErrorForbiddenSchema(Exception):
77
77
 
78
78
  class GqlGetResourceError(Exception):
79
79
  def __init__(self, path, msg):
80
- super().__init__(f"Error getting resource from path {path}: {str(msg)}")
80
+ super().__init__(f"Error getting resource from path {path}: {msg!s}")
81
81
 
82
82
 
83
83
  class GqlApi:
@@ -122,7 +122,7 @@ def lookup_graphql_query_results(query: str, **kwargs: dict[str, Any]) -> list[A
122
122
  gqlapi = gql.get_api()
123
123
  resource = gqlapi.get_resource(query)["content"]
124
124
  rendered_resource = jinja2.Template(resource).render(**kwargs)
125
- results = list(gqlapi.query(rendered_resource).values())[0]
125
+ results = next(iter(gqlapi.query(rendered_resource).values()))
126
126
  return results
127
127
 
128
128
 
@@ -158,9 +158,9 @@ class K8sJobController:
158
158
  the function will wait indefinitely. If a timeout occures, a TimeoutError will be raised.
159
159
  """
160
160
  jobs_left = job_names.copy()
161
- job_statuses: dict[str, JobStatus] = {
162
- name: JobStatus.NOT_EXISTS for name in job_names
163
- }
161
+ job_statuses: dict[str, JobStatus] = dict.fromkeys(
162
+ job_names, JobStatus.NOT_EXISTS
163
+ )
164
164
 
165
165
  start_time = self.time_module.time()
166
166
  while jobs_left:
@@ -22,19 +22,19 @@ from reconcile.utils.mr.user_maintenance import (
22
22
  )
23
23
 
24
24
  __all__ = [
25
- "init_from_sqs_message",
26
- "UnknownMergeRequestType",
27
- "MergeRequestProcessingError",
25
+ "CreateAppInterfaceNotificator",
28
26
  "CreateAppInterfaceReporter",
29
- "CreateDeleteAwsAccessKey",
30
27
  "CreateClustersUpdates",
31
- "CreateOCMUpgradeSchedulerOrgUpdates",
32
- "CreateOCMUpdateRecommendedVersion",
33
- "CreateAppInterfaceNotificator",
28
+ "CreateDeleteAwsAccessKey",
34
29
  "CreateDeleteUserAppInterface",
35
30
  "CreateDeleteUserInfra",
36
- "PromoteQontractSchemas",
31
+ "CreateOCMUpdateRecommendedVersion",
32
+ "CreateOCMUpgradeSchedulerOrgUpdates",
33
+ "MergeRequestProcessingError",
37
34
  "PromoteQontractReconcileCommercial",
35
+ "PromoteQontractSchemas",
36
+ "UnknownMergeRequestType",
37
+ "init_from_sqs_message",
38
38
  ]
39
39
 
40
40
 
@@ -1,5 +1,5 @@
1
- from reconcile.utils.ocm.ocm import * # noqa: F401,F403
2
- from reconcile.utils.ocm.products import ( # noqa: F401,F403
1
+ from reconcile.utils.ocm.ocm import * # noqa: F403
2
+ from reconcile.utils.ocm.products import ( # noqa: F401
3
3
  BYTES_IN_GIGABYTE,
4
4
  CS_API_BASE,
5
5
  DEFAULT_OCM_MACHINE_POOL_ID,
@@ -9,9 +9,9 @@ from reconcile.utils.saasherder.saasherder import (
9
9
  )
10
10
 
11
11
  __all__ = [
12
+ "UNIQUE_SAAS_FILE_ENV_COMBO_LEN",
12
13
  "Providers",
13
14
  "SaasHerder",
14
15
  "TriggerSpecUnion",
15
16
  "TriggerTypes",
16
- "UNIQUE_SAAS_FILE_ENV_COMBO_LEN",
17
17
  ]
@@ -888,7 +888,7 @@ class SaasHerder: # pylint: disable=too-many-public-methods
888
888
  url=url, path=path, ref=ref, github=github
889
889
  )
890
890
  except Exception as e:
891
- logging.error(f"{error_prefix} error fetching template: {str(e)}")
891
+ logging.error(f"{error_prefix} error fetching template: {e!s}")
892
892
  raise
893
893
 
894
894
  # add COMMIT_SHA only if it is unspecified
@@ -930,7 +930,7 @@ class SaasHerder: # pylint: disable=too-many-public-methods
930
930
  logging.error(
931
931
  f"{error_prefix} error generating REPO_DIGEST. "
932
932
  + "Is REGISTRY_IMG missing? "
933
- + f"{str(e)}"
933
+ + f"{e!s}"
934
934
  )
935
935
  raise
936
936
 
@@ -955,7 +955,7 @@ class SaasHerder: # pylint: disable=too-many-public-methods
955
955
  try:
956
956
  resources = oc.process(template, consolidated_parameters)
957
957
  except StatusCodeError as e:
958
- logging.error(f"{error_prefix} error processing template: {str(e)}")
958
+ logging.error(f"{error_prefix} error processing template: {e!s}")
959
959
 
960
960
  elif provider == "directory":
961
961
  try:
@@ -964,7 +964,7 @@ class SaasHerder: # pylint: disable=too-many-public-methods
964
964
  )
965
965
  except Exception as e:
966
966
  logging.error(
967
- f"{error_prefix} error fetching directory: {str(e)} "
967
+ f"{error_prefix} error fetching directory: {e!s} "
968
968
  + "(We do not support nested directories. Do you by chance have subdirectories?)"
969
969
  )
970
970
  raise
@@ -1141,7 +1141,7 @@ class SaasHerder: # pylint: disable=too-many-public-methods
1141
1141
  )
1142
1142
  except Exception as e:
1143
1143
  logging.error(
1144
- f"{error_prefix} Image is invalid: {image}. " + f"details: {str(e)}"
1144
+ f"{error_prefix} Image is invalid: {image}. " + f"details: {e!s}"
1145
1145
  )
1146
1146
 
1147
1147
  return None
reconcile/utils/state.py CHANGED
@@ -250,7 +250,7 @@ class State:
250
250
  self.client.head_bucket(Bucket=self.bucket)
251
251
  except ClientError as details:
252
252
  raise StateInaccessibleException(
253
- f"Bucket {self.bucket} is not accessible - {str(details)}"
253
+ f"Bucket {self.bucket} is not accessible - {details!s}"
254
254
  ) from None
255
255
 
256
256
  def __enter__(self) -> Self:
@@ -301,7 +301,7 @@ class State:
301
301
 
302
302
  raise StateInaccessibleException(
303
303
  f"Can not access state key {key_path} "
304
- f"in bucket {self.bucket} - {str(details)}"
304
+ f"in bucket {self.bucket} - {details!s}"
305
305
  ) from None
306
306
 
307
307
  def ls(self) -> list[str]:
@@ -523,7 +523,7 @@ class TerraformClient: # pylint: disable=too-many-public-methods
523
523
  self.OUTPUT_TYPE_PASSWORDS,
524
524
  self.OUTPUT_TYPE_CONSOLEURLS,
525
525
  }:
526
- return data[list(data.keys())[0]]
526
+ return data[next(iter(data.keys()))]
527
527
  return data
528
528
 
529
529
  def populate_terraform_output_secrets(
@@ -5734,7 +5734,7 @@ class TerrascriptClient: # pylint: disable=too-many-public-methods
5734
5734
  s3_client.head_bucket(Bucket=bucket_name)
5735
5735
  except ClientError as details:
5736
5736
  raise StateInaccessibleException(
5737
- f"Bucket {bucket_name} is not accessible - {str(details)}"
5737
+ f"Bucket {bucket_name} is not accessible - {details!s}"
5738
5738
  ) from None
5739
5739
 
5740
5740
  # todo: probably remove 'RedHat' from the object/variable/filepath
@@ -5,7 +5,7 @@ from .client import (
5
5
  )
6
6
 
7
7
  __all__ = [
8
- "get_feature_toggles",
9
- "get_feature_toggle_state",
10
8
  "get_feature_toggle_default",
9
+ "get_feature_toggle_state",
10
+ "get_feature_toggles",
11
11
  ]
reconcile/utils/vcs.py CHANGED
@@ -129,7 +129,7 @@ class VCS:
129
129
  gitlab_instances: Iterable[GitlabInstanceV1],
130
130
  ) -> GitLabApi:
131
131
  return GitLabApi(
132
- list(gitlab_instances)[0].dict(by_alias=True),
132
+ next(iter(gitlab_instances)).dict(by_alias=True),
133
133
  secret_reader=self._secret_reader,
134
134
  )
135
135
 
@@ -139,7 +139,7 @@ class VCS:
139
139
  app_interface_repo_url: str,
140
140
  ) -> GitLabApi:
141
141
  return GitLabApi(
142
- list(gitlab_instances)[0].dict(by_alias=True),
142
+ next(iter(gitlab_instances)).dict(by_alias=True),
143
143
  secret_reader=self._secret_reader,
144
144
  project_url=app_interface_repo_url,
145
145
  )
@@ -338,10 +338,10 @@ def get_apps_data(date, month_delta=1, thread_pool_size=10):
338
338
  validt_mx[cluster][namespace] = {}
339
339
  if validation not in validt_mx[cluster][namespace]:
340
340
  validt_mx[cluster][namespace][validation] = {}
341
- if status not in validt_mx[cluster][namespace][validation]: # noqa: E501
342
- validt_mx[cluster][namespace][validation][status] = {} # noqa: E501
341
+ if status not in validt_mx[cluster][namespace][validation]:
342
+ validt_mx[cluster][namespace][validation][status] = {}
343
343
  value = int(sample.value)
344
- validt_mx[cluster][namespace][validation][status] = value # noqa: E501
344
+ validt_mx[cluster][namespace][validation][status] = value
345
345
  for family in text_string_to_metric_families(slo_metrics):
346
346
  for sample in family.samples:
347
347
  if sample.name == "serviceslometrics":
@@ -358,14 +358,14 @@ def get_apps_data(date, month_delta=1, thread_pool_size=10):
358
358
  slo_mx[cluster] = {}
359
359
  if namespace not in slo_mx[cluster]:
360
360
  slo_mx[cluster][namespace] = {}
361
- if slo_doc_name not in slo_mx[cluster][namespace]: # pylint: disable=line-too-long # noqa: E501
361
+ if slo_doc_name not in slo_mx[cluster][namespace]: # pylint: disable=line-too-long
362
362
  slo_mx[cluster][namespace][slo_doc_name] = {}
363
- if slo_name not in slo_mx[cluster][namespace][slo_doc_name]: # noqa: E501
364
- slo_mx[cluster][namespace][slo_doc_name][slo_name] = { # noqa: E501
363
+ if slo_name not in slo_mx[cluster][namespace][slo_doc_name]:
364
+ slo_mx[cluster][namespace][slo_doc_name][slo_name] = {
365
365
  sample.labels["type"]: sample.value
366
366
  }
367
367
  else:
368
- slo_mx[cluster][namespace][slo_doc_name][slo_name].update({ # pylint: disable=line-too-long # noqa: E501
368
+ slo_mx[cluster][namespace][slo_doc_name][slo_name].update({ # pylint: disable=line-too-long
369
369
  sample.labels["type"]: sample.value
370
370
  })
371
371
  app["container_vulnerabilities"] = vuln_mx
tools/qontract_cli.py CHANGED
@@ -1124,14 +1124,14 @@ def cidr_blocks(ctx, for_cluster: int, mask: int) -> None:
1124
1124
 
1125
1125
  avail_addr = ipaddress.ip_address(latest_cluster_cidr["to"]) + 1
1126
1126
 
1127
- print(f"INFO: Latest available network address: {str(avail_addr)}")
1127
+ print(f"INFO: Latest available network address: {avail_addr!s}")
1128
1128
  try:
1129
1129
  result_cidr_block = str(ipaddress.ip_network((avail_addr, mask)))
1130
1130
  except ValueError:
1131
1131
  print(f"ERROR: Invalid CIDR Mask {mask} Provided.")
1132
1132
  sys.exit(1)
1133
- print(f"INFO: You are reserving {str(2 ** (32 - mask))} network addresses.")
1134
- print(f"\nYou can use: {str(result_cidr_block)}")
1133
+ print(f"INFO: You are reserving {2 ** (32 - mask)!s} network addresses.")
1134
+ print(f"\nYou can use: {result_cidr_block!s}")
1135
1135
  else:
1136
1136
  ctx.obj["options"]["sort"] = False
1137
1137
  print_output(ctx.obj["options"], cidrs, columns)
@@ -1744,17 +1744,8 @@ def roles(ctx, org_username):
1744
1744
 
1745
1745
  user = users[0]
1746
1746
 
1747
- roles = []
1748
-
1749
- def add(d):
1750
- for i, r in enumerate(roles):
1751
- if all(d[k] == r[k] for k in ("type", "name", "resource")):
1752
- roles.insert(
1753
- i + 1, {"type": "", "name": "", "resource": "", "ref": d["ref"]}
1754
- )
1755
- return
1756
-
1757
- roles.append(d)
1747
+ # type, name, resource, [ref]
1748
+ roles: dict[(str, str, str), set] = defaultdict(set)
1758
1749
 
1759
1750
  for role in user["roles"]:
1760
1751
  role_name = role["path"]
@@ -1771,53 +1762,38 @@ def roles(ctx, org_username):
1771
1762
  if "team" in p:
1772
1763
  r_name += "/" + p["team"]
1773
1764
 
1774
- add({
1775
- "type": "permission",
1776
- "name": p["name"],
1777
- "resource": r_name,
1778
- "ref": role_name,
1779
- })
1765
+ roles[("permission", p["name"], r_name)].add(role_name)
1780
1766
 
1781
1767
  for aws in role.get("aws_groups") or []:
1782
1768
  for policy in aws["policies"]:
1783
- add({
1784
- "type": "aws",
1785
- "name": policy,
1786
- "resource": aws["account"]["name"],
1787
- "ref": aws["path"],
1788
- })
1769
+ roles[("aws", policy, aws["account"]["name"])].add(aws["path"])
1789
1770
 
1790
1771
  for a in role.get("access") or []:
1791
1772
  if a["cluster"]:
1792
1773
  cluster_name = a["cluster"]["name"]
1793
- add({
1794
- "type": "cluster",
1795
- "name": a["clusterRole"],
1796
- "resource": cluster_name,
1797
- "ref": role_name,
1798
- })
1774
+ roles[("cluster", a["clusterRole"], cluster_name)].add(role_name)
1799
1775
  elif a["namespace"]:
1800
1776
  ns_name = a["namespace"]["name"]
1801
- add({
1802
- "type": "namespace",
1803
- "name": a["role"],
1804
- "resource": ns_name,
1805
- "ref": role_name,
1806
- })
1777
+ roles[("namespace", a["role"], ns_name)].add(role_name)
1807
1778
 
1808
1779
  for s in role.get("self_service") or []:
1809
1780
  for d in s.get("datafiles") or []:
1810
1781
  name = d.get("name")
1811
1782
  if name:
1812
- add({
1813
- "type": "saas_file",
1814
- "name": "owner",
1815
- "resource": name,
1816
- "ref": role_name,
1817
- })
1783
+ roles[("saas_file", "owner", name)].add(role_name)
1818
1784
 
1819
1785
  columns = ["type", "name", "resource", "ref"]
1820
- print_output(ctx.obj["options"], roles, columns)
1786
+ rows = [
1787
+ {
1788
+ "type": k[0],
1789
+ "name": k[1],
1790
+ "resource": k[2],
1791
+ "ref": ref,
1792
+ }
1793
+ for k, v in roles.items()
1794
+ for ref in v
1795
+ ]
1796
+ print_output(ctx.obj["options"], rows, columns)
1821
1797
 
1822
1798
 
1823
1799
  @get.command()