qontract-reconcile 0.10.0__py3-none-any.whl → 0.10.1.dev1203__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 (844) hide show
  1. qontract_reconcile-0.10.1.dev1203.dist-info/METADATA +500 -0
  2. qontract_reconcile-0.10.1.dev1203.dist-info/RECORD +771 -0
  3. {qontract_reconcile-0.10.0.dist-info → qontract_reconcile-0.10.1.dev1203.dist-info}/WHEEL +1 -2
  4. {qontract_reconcile-0.10.0.dist-info → qontract_reconcile-0.10.1.dev1203.dist-info}/entry_points.txt +4 -2
  5. reconcile/acs_notifiers.py +126 -0
  6. reconcile/acs_policies.py +243 -0
  7. reconcile/acs_rbac.py +596 -0
  8. reconcile/aus/advanced_upgrade_service.py +621 -8
  9. reconcile/aus/aus_label_source.py +115 -0
  10. reconcile/aus/base.py +1053 -353
  11. reconcile/{utils → aus}/cluster_version_data.py +27 -12
  12. reconcile/aus/healthchecks.py +77 -0
  13. reconcile/aus/metrics.py +158 -0
  14. reconcile/aus/models.py +245 -5
  15. reconcile/aus/node_pool_spec.py +35 -0
  16. reconcile/aus/ocm_addons_upgrade_scheduler_org.py +225 -110
  17. reconcile/aus/ocm_upgrade_scheduler.py +76 -71
  18. reconcile/aus/ocm_upgrade_scheduler_org.py +81 -23
  19. reconcile/aus/version_gate_approver.py +204 -0
  20. reconcile/aus/version_gates/__init__.py +12 -0
  21. reconcile/aus/version_gates/handler.py +33 -0
  22. reconcile/aus/version_gates/ingress_gate_handler.py +32 -0
  23. reconcile/aus/version_gates/ocp_gate_handler.py +26 -0
  24. reconcile/aus/version_gates/sts_version_gate_handler.py +100 -0
  25. reconcile/aws_account_manager/README.md +5 -0
  26. reconcile/aws_account_manager/integration.py +373 -0
  27. reconcile/aws_account_manager/merge_request_manager.py +114 -0
  28. reconcile/aws_account_manager/metrics.py +39 -0
  29. reconcile/aws_account_manager/reconciler.py +403 -0
  30. reconcile/aws_account_manager/utils.py +41 -0
  31. reconcile/aws_ami_cleanup/integration.py +273 -0
  32. reconcile/aws_ami_share.py +18 -14
  33. reconcile/aws_cloudwatch_log_retention/integration.py +253 -0
  34. reconcile/aws_iam_keys.py +1 -1
  35. reconcile/aws_iam_password_reset.py +56 -20
  36. reconcile/aws_saml_idp/integration.py +204 -0
  37. reconcile/aws_saml_roles/integration.py +322 -0
  38. reconcile/aws_support_cases_sos.py +2 -2
  39. reconcile/aws_version_sync/integration.py +430 -0
  40. reconcile/aws_version_sync/merge_request_manager/merge_request.py +156 -0
  41. reconcile/aws_version_sync/merge_request_manager/merge_request_manager.py +160 -0
  42. reconcile/aws_version_sync/utils.py +64 -0
  43. reconcile/blackbox_exporter_endpoint_monitoring.py +2 -5
  44. reconcile/change_owners/README.md +34 -0
  45. reconcile/change_owners/approver.py +7 -9
  46. reconcile/change_owners/bundle.py +134 -9
  47. reconcile/change_owners/change_log_tracking.py +236 -0
  48. reconcile/change_owners/change_owners.py +204 -194
  49. reconcile/change_owners/change_types.py +183 -265
  50. reconcile/change_owners/changes.py +488 -0
  51. reconcile/change_owners/decision.py +120 -41
  52. reconcile/change_owners/diff.py +63 -92
  53. reconcile/change_owners/implicit_ownership.py +19 -16
  54. reconcile/change_owners/self_service_roles.py +158 -35
  55. reconcile/change_owners/tester.py +20 -18
  56. reconcile/checkpoint.py +4 -6
  57. reconcile/cli.py +1523 -242
  58. reconcile/closedbox_endpoint_monitoring_base.py +10 -17
  59. reconcile/cluster_auth_rhidp/integration.py +257 -0
  60. reconcile/cluster_deployment_mapper.py +2 -5
  61. reconcile/cna/assets/asset.py +4 -7
  62. reconcile/cna/assets/null.py +2 -5
  63. reconcile/cna/integration.py +2 -3
  64. reconcile/cna/state.py +6 -9
  65. reconcile/dashdotdb_base.py +31 -10
  66. reconcile/dashdotdb_cso.py +3 -6
  67. reconcile/dashdotdb_dora.py +530 -0
  68. reconcile/dashdotdb_dvo.py +10 -13
  69. reconcile/dashdotdb_slo.py +75 -19
  70. reconcile/database_access_manager.py +753 -0
  71. reconcile/deadmanssnitch.py +207 -0
  72. reconcile/dynatrace_token_provider/dependencies.py +69 -0
  73. reconcile/dynatrace_token_provider/integration.py +656 -0
  74. reconcile/dynatrace_token_provider/metrics.py +62 -0
  75. reconcile/dynatrace_token_provider/model.py +14 -0
  76. reconcile/dynatrace_token_provider/ocm.py +140 -0
  77. reconcile/dynatrace_token_provider/validate.py +48 -0
  78. reconcile/endpoints_discovery/integration.py +348 -0
  79. reconcile/endpoints_discovery/merge_request.py +96 -0
  80. reconcile/endpoints_discovery/merge_request_manager.py +178 -0
  81. reconcile/external_resources/aws.py +204 -0
  82. reconcile/external_resources/factories.py +163 -0
  83. reconcile/external_resources/integration.py +194 -0
  84. reconcile/external_resources/integration_secrets_sync.py +47 -0
  85. reconcile/external_resources/manager.py +405 -0
  86. reconcile/external_resources/meta.py +17 -0
  87. reconcile/external_resources/metrics.py +95 -0
  88. reconcile/external_resources/model.py +350 -0
  89. reconcile/external_resources/reconciler.py +265 -0
  90. reconcile/external_resources/secrets_sync.py +465 -0
  91. reconcile/external_resources/state.py +258 -0
  92. reconcile/gabi_authorized_users.py +19 -11
  93. reconcile/gcr_mirror.py +43 -34
  94. reconcile/github_org.py +4 -6
  95. reconcile/github_owners.py +1 -1
  96. reconcile/github_repo_invites.py +2 -5
  97. reconcile/gitlab_fork_compliance.py +14 -13
  98. reconcile/gitlab_housekeeping.py +185 -91
  99. reconcile/gitlab_labeler.py +15 -14
  100. reconcile/gitlab_members.py +126 -120
  101. reconcile/gitlab_owners.py +53 -66
  102. reconcile/gitlab_permissions.py +167 -6
  103. reconcile/glitchtip/README.md +150 -0
  104. reconcile/glitchtip/integration.py +99 -51
  105. reconcile/glitchtip/reconciler.py +99 -70
  106. reconcile/glitchtip_project_alerts/__init__.py +0 -0
  107. reconcile/glitchtip_project_alerts/integration.py +333 -0
  108. reconcile/glitchtip_project_dsn/integration.py +43 -43
  109. reconcile/gql_definitions/acs/__init__.py +0 -0
  110. reconcile/gql_definitions/acs/acs_instances.py +83 -0
  111. reconcile/gql_definitions/acs/acs_policies.py +239 -0
  112. reconcile/gql_definitions/acs/acs_rbac.py +111 -0
  113. reconcile/gql_definitions/advanced_upgrade_service/aus_clusters.py +46 -8
  114. reconcile/gql_definitions/advanced_upgrade_service/aus_organization.py +38 -8
  115. reconcile/gql_definitions/app_interface_metrics_exporter/__init__.py +0 -0
  116. reconcile/gql_definitions/app_interface_metrics_exporter/onboarding_status.py +61 -0
  117. reconcile/gql_definitions/aws_account_manager/__init__.py +0 -0
  118. reconcile/gql_definitions/aws_account_manager/aws_accounts.py +177 -0
  119. reconcile/gql_definitions/aws_ami_cleanup/__init__.py +0 -0
  120. reconcile/gql_definitions/aws_ami_cleanup/aws_accounts.py +161 -0
  121. reconcile/gql_definitions/aws_saml_idp/__init__.py +0 -0
  122. reconcile/gql_definitions/aws_saml_idp/aws_accounts.py +117 -0
  123. reconcile/gql_definitions/aws_saml_roles/__init__.py +0 -0
  124. reconcile/gql_definitions/aws_saml_roles/aws_accounts.py +117 -0
  125. reconcile/gql_definitions/aws_saml_roles/roles.py +97 -0
  126. reconcile/gql_definitions/aws_version_sync/__init__.py +0 -0
  127. reconcile/gql_definitions/aws_version_sync/clusters.py +83 -0
  128. reconcile/gql_definitions/aws_version_sync/namespaces.py +143 -0
  129. reconcile/gql_definitions/change_owners/queries/change_types.py +16 -29
  130. reconcile/gql_definitions/change_owners/queries/self_service_roles.py +45 -11
  131. reconcile/gql_definitions/cluster_auth_rhidp/__init__.py +0 -0
  132. reconcile/gql_definitions/cluster_auth_rhidp/clusters.py +128 -0
  133. reconcile/gql_definitions/cna/queries/cna_provisioners.py +6 -8
  134. reconcile/gql_definitions/cna/queries/cna_resources.py +3 -5
  135. reconcile/gql_definitions/common/alerting_services_settings.py +2 -2
  136. reconcile/gql_definitions/common/app_code_component_repos.py +9 -5
  137. reconcile/gql_definitions/{glitchtip/glitchtip_settings.py → common/app_interface_custom_messages.py} +14 -16
  138. reconcile/gql_definitions/common/app_interface_dms_settings.py +86 -0
  139. reconcile/gql_definitions/common/app_interface_repo_settings.py +2 -2
  140. reconcile/gql_definitions/common/app_interface_state_settings.py +3 -5
  141. reconcile/gql_definitions/common/app_interface_vault_settings.py +3 -5
  142. reconcile/gql_definitions/common/app_quay_repos_escalation_policies.py +120 -0
  143. reconcile/gql_definitions/common/apps.py +72 -0
  144. reconcile/gql_definitions/common/aws_vpc_requests.py +109 -0
  145. reconcile/gql_definitions/common/aws_vpcs.py +84 -0
  146. reconcile/gql_definitions/common/clusters.py +120 -254
  147. reconcile/gql_definitions/common/clusters_minimal.py +11 -35
  148. reconcile/gql_definitions/common/clusters_with_dms.py +72 -0
  149. reconcile/gql_definitions/common/clusters_with_peering.py +70 -98
  150. reconcile/gql_definitions/common/github_orgs.py +2 -2
  151. reconcile/gql_definitions/common/jira_settings.py +68 -0
  152. reconcile/gql_definitions/common/jiralert_settings.py +68 -0
  153. reconcile/gql_definitions/common/namespaces.py +74 -32
  154. reconcile/gql_definitions/common/namespaces_minimal.py +4 -10
  155. reconcile/gql_definitions/common/ocm_env_telemeter.py +95 -0
  156. reconcile/gql_definitions/common/ocm_environments.py +4 -2
  157. reconcile/gql_definitions/common/pagerduty_instances.py +5 -5
  158. reconcile/gql_definitions/common/pgp_reencryption_settings.py +5 -11
  159. reconcile/gql_definitions/common/pipeline_providers.py +45 -90
  160. reconcile/gql_definitions/common/quay_instances.py +64 -0
  161. reconcile/gql_definitions/common/quay_orgs.py +68 -0
  162. reconcile/gql_definitions/common/reserved_networks.py +94 -0
  163. reconcile/gql_definitions/common/saas_files.py +133 -95
  164. reconcile/gql_definitions/common/saas_target_namespaces.py +41 -26
  165. reconcile/gql_definitions/common/saasherder_settings.py +2 -2
  166. reconcile/gql_definitions/common/slack_workspaces.py +62 -0
  167. reconcile/gql_definitions/common/smtp_client_settings.py +2 -2
  168. reconcile/gql_definitions/common/state_aws_account.py +77 -0
  169. reconcile/gql_definitions/common/users.py +3 -2
  170. reconcile/gql_definitions/cost_report/__init__.py +0 -0
  171. reconcile/gql_definitions/cost_report/app_names.py +68 -0
  172. reconcile/gql_definitions/cost_report/cost_namespaces.py +86 -0
  173. reconcile/gql_definitions/cost_report/settings.py +77 -0
  174. reconcile/gql_definitions/dashdotdb_slo/slo_documents_query.py +42 -12
  175. reconcile/gql_definitions/dynatrace_token_provider/__init__.py +0 -0
  176. reconcile/gql_definitions/dynatrace_token_provider/dynatrace_bootstrap_tokens.py +79 -0
  177. reconcile/gql_definitions/dynatrace_token_provider/token_specs.py +84 -0
  178. reconcile/gql_definitions/endpoints_discovery/__init__.py +0 -0
  179. reconcile/gql_definitions/endpoints_discovery/namespaces.py +127 -0
  180. reconcile/gql_definitions/external_resources/__init__.py +0 -0
  181. reconcile/gql_definitions/external_resources/aws_accounts.py +73 -0
  182. reconcile/gql_definitions/external_resources/external_resources_modules.py +78 -0
  183. reconcile/gql_definitions/external_resources/external_resources_namespaces.py +1111 -0
  184. reconcile/gql_definitions/external_resources/external_resources_settings.py +98 -0
  185. reconcile/gql_definitions/fragments/aus_organization.py +34 -39
  186. reconcile/gql_definitions/fragments/aws_account_common.py +62 -0
  187. reconcile/gql_definitions/fragments/aws_account_managed.py +57 -0
  188. reconcile/gql_definitions/fragments/aws_account_sso.py +35 -0
  189. reconcile/gql_definitions/fragments/aws_infra_management_account.py +2 -2
  190. reconcile/gql_definitions/fragments/aws_vpc.py +47 -0
  191. reconcile/gql_definitions/fragments/aws_vpc_request.py +65 -0
  192. reconcile/gql_definitions/fragments/aws_vpc_request_subnet.py +29 -0
  193. reconcile/gql_definitions/fragments/deplopy_resources.py +7 -7
  194. reconcile/gql_definitions/fragments/disable.py +28 -0
  195. reconcile/gql_definitions/fragments/jumphost_common_fields.py +2 -2
  196. reconcile/gql_definitions/fragments/membership_source.py +47 -0
  197. reconcile/gql_definitions/fragments/minimal_ocm_organization.py +29 -0
  198. reconcile/gql_definitions/fragments/oc_connection_cluster.py +4 -9
  199. reconcile/gql_definitions/fragments/ocm_environment.py +5 -5
  200. reconcile/gql_definitions/fragments/pipeline_provider_retention.py +30 -0
  201. reconcile/gql_definitions/fragments/prometheus_instance.py +48 -0
  202. reconcile/gql_definitions/fragments/resource_limits_requirements.py +29 -0
  203. reconcile/gql_definitions/fragments/{resource_requirements.py → resource_requests_requirements.py} +3 -3
  204. reconcile/gql_definitions/fragments/resource_values.py +2 -2
  205. reconcile/gql_definitions/fragments/saas_target_namespace.py +55 -12
  206. reconcile/gql_definitions/fragments/serviceaccount_token.py +38 -0
  207. reconcile/gql_definitions/fragments/terraform_state.py +36 -0
  208. reconcile/gql_definitions/fragments/upgrade_policy.py +5 -3
  209. reconcile/gql_definitions/fragments/user.py +3 -2
  210. reconcile/gql_definitions/fragments/vault_secret.py +2 -2
  211. reconcile/gql_definitions/gitlab_members/gitlab_instances.py +6 -2
  212. reconcile/gql_definitions/gitlab_members/permissions.py +3 -5
  213. reconcile/gql_definitions/glitchtip/glitchtip_instance.py +16 -2
  214. reconcile/gql_definitions/glitchtip/glitchtip_project.py +22 -23
  215. reconcile/gql_definitions/glitchtip_project_alerts/__init__.py +0 -0
  216. reconcile/gql_definitions/glitchtip_project_alerts/glitchtip_project.py +173 -0
  217. reconcile/gql_definitions/integrations/integrations.py +62 -45
  218. reconcile/gql_definitions/introspection.json +51176 -0
  219. reconcile/gql_definitions/jenkins_configs/jenkins_configs.py +13 -5
  220. reconcile/gql_definitions/jenkins_configs/jenkins_instances.py +79 -0
  221. reconcile/gql_definitions/jira/__init__.py +0 -0
  222. reconcile/gql_definitions/jira/jira_servers.py +80 -0
  223. reconcile/gql_definitions/jira_permissions_validator/__init__.py +0 -0
  224. reconcile/gql_definitions/jira_permissions_validator/jira_boards_for_permissions_validator.py +131 -0
  225. reconcile/gql_definitions/jumphosts/jumphosts.py +3 -5
  226. reconcile/gql_definitions/ldap_groups/__init__.py +0 -0
  227. reconcile/gql_definitions/ldap_groups/roles.py +111 -0
  228. reconcile/gql_definitions/ldap_groups/settings.py +79 -0
  229. reconcile/gql_definitions/maintenance/__init__.py +0 -0
  230. reconcile/gql_definitions/maintenance/maintenances.py +101 -0
  231. reconcile/gql_definitions/membershipsources/__init__.py +0 -0
  232. reconcile/gql_definitions/membershipsources/roles.py +112 -0
  233. reconcile/gql_definitions/ocm_labels/__init__.py +0 -0
  234. reconcile/gql_definitions/ocm_labels/clusters.py +112 -0
  235. reconcile/gql_definitions/ocm_labels/organizations.py +78 -0
  236. reconcile/gql_definitions/ocm_subscription_labels/__init__.py +0 -0
  237. reconcile/gql_definitions/openshift_cluster_bots/__init__.py +0 -0
  238. reconcile/gql_definitions/openshift_cluster_bots/clusters.py +126 -0
  239. reconcile/gql_definitions/openshift_groups/managed_groups.py +2 -2
  240. reconcile/gql_definitions/openshift_groups/managed_roles.py +3 -2
  241. reconcile/gql_definitions/openshift_serviceaccount_tokens/__init__.py +0 -0
  242. reconcile/gql_definitions/openshift_serviceaccount_tokens/tokens.py +132 -0
  243. reconcile/gql_definitions/quay_membership/quay_membership.py +3 -5
  244. reconcile/gql_definitions/rhidp/__init__.py +0 -0
  245. reconcile/gql_definitions/rhidp/organizations.py +96 -0
  246. reconcile/gql_definitions/service_dependencies/jenkins_instance_fragment.py +2 -2
  247. reconcile/gql_definitions/service_dependencies/service_dependencies.py +9 -31
  248. reconcile/gql_definitions/sharding/aws_accounts.py +2 -2
  249. reconcile/gql_definitions/sharding/ocm_organization.py +63 -0
  250. reconcile/gql_definitions/skupper_network/site_controller_template.py +2 -2
  251. reconcile/gql_definitions/skupper_network/skupper_networks.py +12 -38
  252. reconcile/gql_definitions/slack_usergroups/clusters.py +2 -2
  253. reconcile/gql_definitions/slack_usergroups/permissions.py +8 -15
  254. reconcile/gql_definitions/slack_usergroups/users.py +3 -2
  255. reconcile/gql_definitions/slo_documents/__init__.py +0 -0
  256. reconcile/gql_definitions/slo_documents/slo_documents.py +142 -0
  257. reconcile/gql_definitions/status_board/__init__.py +0 -0
  258. reconcile/gql_definitions/status_board/status_board.py +163 -0
  259. reconcile/gql_definitions/statuspage/statuspages.py +56 -7
  260. reconcile/gql_definitions/templating/__init__.py +0 -0
  261. reconcile/gql_definitions/templating/template_collection.py +130 -0
  262. reconcile/gql_definitions/templating/templates.py +108 -0
  263. reconcile/gql_definitions/terraform_cloudflare_dns/app_interface_cloudflare_dns_settings.py +4 -8
  264. reconcile/gql_definitions/terraform_cloudflare_dns/terraform_cloudflare_zones.py +8 -8
  265. reconcile/gql_definitions/terraform_cloudflare_resources/terraform_cloudflare_accounts.py +6 -8
  266. reconcile/gql_definitions/terraform_cloudflare_resources/terraform_cloudflare_resources.py +45 -56
  267. reconcile/gql_definitions/terraform_cloudflare_users/app_interface_setting_cloudflare_and_vault.py +4 -8
  268. reconcile/gql_definitions/terraform_cloudflare_users/terraform_cloudflare_roles.py +4 -8
  269. reconcile/gql_definitions/terraform_init/__init__.py +0 -0
  270. reconcile/gql_definitions/terraform_init/aws_accounts.py +93 -0
  271. reconcile/gql_definitions/terraform_repo/__init__.py +0 -0
  272. reconcile/gql_definitions/terraform_repo/terraform_repo.py +141 -0
  273. reconcile/gql_definitions/terraform_resources/database_access_manager.py +158 -0
  274. reconcile/gql_definitions/terraform_resources/terraform_resources_namespaces.py +153 -162
  275. reconcile/gql_definitions/terraform_tgw_attachments/__init__.py +0 -0
  276. reconcile/gql_definitions/terraform_tgw_attachments/aws_accounts.py +119 -0
  277. reconcile/gql_definitions/unleash_feature_toggles/__init__.py +0 -0
  278. reconcile/gql_definitions/unleash_feature_toggles/feature_toggles.py +113 -0
  279. reconcile/gql_definitions/vault_instances/vault_instances.py +17 -50
  280. reconcile/gql_definitions/vault_policies/vault_policies.py +2 -2
  281. reconcile/gql_definitions/vpc_peerings_validator/vpc_peerings_validator.py +49 -12
  282. reconcile/gql_definitions/vpc_peerings_validator/vpc_peerings_validator_peered_cluster_fragment.py +7 -2
  283. reconcile/integrations_manager.py +25 -13
  284. reconcile/jenkins/types.py +5 -1
  285. reconcile/jenkins_base.py +36 -0
  286. reconcile/jenkins_job_builder.py +10 -48
  287. reconcile/jenkins_job_builds_cleaner.py +40 -25
  288. reconcile/jenkins_job_cleaner.py +1 -3
  289. reconcile/jenkins_roles.py +22 -26
  290. reconcile/jenkins_webhooks.py +9 -6
  291. reconcile/jenkins_worker_fleets.py +11 -6
  292. reconcile/jira_permissions_validator.py +340 -0
  293. reconcile/jira_watcher.py +3 -5
  294. reconcile/ldap_groups/__init__.py +0 -0
  295. reconcile/ldap_groups/integration.py +279 -0
  296. reconcile/ldap_users.py +3 -0
  297. reconcile/ocm/types.py +39 -59
  298. reconcile/ocm_additional_routers.py +0 -1
  299. reconcile/ocm_addons_upgrade_tests_trigger.py +10 -15
  300. reconcile/ocm_aws_infrastructure_access.py +30 -32
  301. reconcile/ocm_clusters.py +217 -130
  302. reconcile/ocm_external_configuration_labels.py +15 -0
  303. reconcile/ocm_github_idp.py +1 -1
  304. reconcile/ocm_groups.py +25 -5
  305. reconcile/ocm_internal_notifications/__init__.py +0 -0
  306. reconcile/ocm_internal_notifications/integration.py +119 -0
  307. reconcile/ocm_labels/__init__.py +0 -0
  308. reconcile/ocm_labels/integration.py +409 -0
  309. reconcile/ocm_machine_pools.py +517 -108
  310. reconcile/ocm_upgrade_scheduler_org_updater.py +15 -11
  311. reconcile/openshift_base.py +609 -207
  312. reconcile/openshift_cluster_bots.py +344 -0
  313. reconcile/openshift_clusterrolebindings.py +15 -15
  314. reconcile/openshift_groups.py +42 -45
  315. reconcile/openshift_limitranges.py +1 -0
  316. reconcile/openshift_namespace_labels.py +22 -28
  317. reconcile/openshift_namespaces.py +22 -22
  318. reconcile/openshift_network_policies.py +4 -8
  319. reconcile/openshift_prometheus_rules.py +43 -0
  320. reconcile/openshift_resourcequotas.py +2 -16
  321. reconcile/openshift_resources.py +12 -10
  322. reconcile/openshift_resources_base.py +304 -328
  323. reconcile/openshift_rolebindings.py +18 -20
  324. reconcile/openshift_saas_deploy.py +105 -21
  325. reconcile/openshift_saas_deploy_change_tester.py +30 -35
  326. reconcile/openshift_saas_deploy_trigger_base.py +39 -36
  327. reconcile/openshift_saas_deploy_trigger_cleaner.py +41 -27
  328. reconcile/openshift_saas_deploy_trigger_configs.py +1 -2
  329. reconcile/openshift_saas_deploy_trigger_images.py +1 -2
  330. reconcile/openshift_saas_deploy_trigger_moving_commits.py +1 -2
  331. reconcile/openshift_saas_deploy_trigger_upstream_jobs.py +1 -2
  332. reconcile/openshift_serviceaccount_tokens.py +138 -74
  333. reconcile/openshift_tekton_resources.py +89 -24
  334. reconcile/openshift_upgrade_watcher.py +110 -62
  335. reconcile/openshift_users.py +16 -15
  336. reconcile/openshift_vault_secrets.py +11 -6
  337. reconcile/oum/__init__.py +0 -0
  338. reconcile/oum/base.py +387 -0
  339. reconcile/oum/labelset.py +55 -0
  340. reconcile/oum/metrics.py +71 -0
  341. reconcile/oum/models.py +69 -0
  342. reconcile/oum/providers.py +59 -0
  343. reconcile/oum/standalone.py +196 -0
  344. reconcile/prometheus_rules_tester/integration.py +31 -23
  345. reconcile/quay_base.py +4 -1
  346. reconcile/quay_membership.py +1 -2
  347. reconcile/quay_mirror.py +111 -61
  348. reconcile/quay_mirror_org.py +34 -21
  349. reconcile/quay_permissions.py +7 -3
  350. reconcile/quay_repos.py +24 -32
  351. reconcile/queries.py +263 -198
  352. reconcile/query_validator.py +3 -5
  353. reconcile/resource_scraper.py +3 -4
  354. reconcile/{template_tester.py → resource_template_tester.py} +3 -3
  355. reconcile/rhidp/__init__.py +0 -0
  356. reconcile/rhidp/common.py +214 -0
  357. reconcile/rhidp/metrics.py +20 -0
  358. reconcile/rhidp/ocm_oidc_idp/__init__.py +0 -0
  359. reconcile/rhidp/ocm_oidc_idp/base.py +221 -0
  360. reconcile/rhidp/ocm_oidc_idp/integration.py +56 -0
  361. reconcile/rhidp/ocm_oidc_idp/metrics.py +22 -0
  362. reconcile/rhidp/sso_client/__init__.py +0 -0
  363. reconcile/rhidp/sso_client/base.py +266 -0
  364. reconcile/rhidp/sso_client/integration.py +60 -0
  365. reconcile/rhidp/sso_client/metrics.py +39 -0
  366. reconcile/run_integration.py +293 -0
  367. reconcile/saas_auto_promotions_manager/integration.py +69 -24
  368. reconcile/saas_auto_promotions_manager/merge_request_manager/batcher.py +208 -0
  369. reconcile/saas_auto_promotions_manager/merge_request_manager/desired_state.py +28 -0
  370. reconcile/saas_auto_promotions_manager/merge_request_manager/merge_request.py +3 -4
  371. reconcile/saas_auto_promotions_manager/merge_request_manager/merge_request_manager_v2.py +172 -0
  372. reconcile/saas_auto_promotions_manager/merge_request_manager/metrics.py +42 -0
  373. reconcile/saas_auto_promotions_manager/merge_request_manager/mr_parser.py +226 -0
  374. reconcile/saas_auto_promotions_manager/merge_request_manager/open_merge_requests.py +23 -0
  375. reconcile/saas_auto_promotions_manager/merge_request_manager/renderer.py +108 -32
  376. reconcile/saas_auto_promotions_manager/meta.py +4 -0
  377. reconcile/saas_auto_promotions_manager/publisher.py +32 -4
  378. reconcile/saas_auto_promotions_manager/s3_exporter.py +77 -0
  379. reconcile/saas_auto_promotions_manager/subscriber.py +110 -23
  380. reconcile/saas_auto_promotions_manager/utils/saas_files_inventory.py +48 -41
  381. reconcile/saas_file_validator.py +16 -6
  382. reconcile/sendgrid_teammates.py +27 -12
  383. reconcile/service_dependencies.py +0 -3
  384. reconcile/signalfx_endpoint_monitoring.py +2 -5
  385. reconcile/skupper_network/integration.py +10 -11
  386. reconcile/skupper_network/models.py +3 -5
  387. reconcile/skupper_network/reconciler.py +28 -35
  388. reconcile/skupper_network/site_controller.py +8 -8
  389. reconcile/slack_base.py +4 -7
  390. reconcile/slack_usergroups.py +249 -171
  391. reconcile/sql_query.py +324 -171
  392. reconcile/status.py +0 -1
  393. reconcile/status_board.py +275 -0
  394. reconcile/statuspage/__init__.py +0 -5
  395. reconcile/statuspage/atlassian.py +219 -80
  396. reconcile/statuspage/integration.py +9 -97
  397. reconcile/statuspage/integrations/__init__.py +0 -0
  398. reconcile/statuspage/integrations/components.py +77 -0
  399. reconcile/statuspage/integrations/maintenances.py +111 -0
  400. reconcile/statuspage/page.py +107 -72
  401. reconcile/statuspage/state.py +6 -11
  402. reconcile/statuspage/status.py +8 -12
  403. reconcile/templates/rosa-classic-cluster-creation.sh.j2 +60 -0
  404. reconcile/templates/rosa-hcp-cluster-creation.sh.j2 +61 -0
  405. reconcile/templating/__init__.py +0 -0
  406. reconcile/templating/lib/__init__.py +0 -0
  407. reconcile/templating/lib/merge_request_manager.py +180 -0
  408. reconcile/templating/lib/model.py +20 -0
  409. reconcile/templating/lib/rendering.py +191 -0
  410. reconcile/templating/renderer.py +410 -0
  411. reconcile/templating/validator.py +153 -0
  412. reconcile/terraform_aws_route53.py +13 -10
  413. reconcile/terraform_cloudflare_dns.py +92 -122
  414. reconcile/terraform_cloudflare_resources.py +15 -13
  415. reconcile/terraform_cloudflare_users.py +27 -27
  416. reconcile/terraform_init/__init__.py +0 -0
  417. reconcile/terraform_init/integration.py +165 -0
  418. reconcile/terraform_init/merge_request.py +57 -0
  419. reconcile/terraform_init/merge_request_manager.py +102 -0
  420. reconcile/terraform_repo.py +403 -0
  421. reconcile/terraform_resources.py +266 -168
  422. reconcile/terraform_tgw_attachments.py +417 -167
  423. reconcile/terraform_users.py +40 -17
  424. reconcile/terraform_vpc_peerings.py +310 -142
  425. reconcile/terraform_vpc_resources/__init__.py +0 -0
  426. reconcile/terraform_vpc_resources/integration.py +220 -0
  427. reconcile/terraform_vpc_resources/merge_request.py +57 -0
  428. reconcile/terraform_vpc_resources/merge_request_manager.py +107 -0
  429. reconcile/typed_queries/alerting_services_settings.py +1 -2
  430. reconcile/typed_queries/app_interface_custom_messages.py +24 -0
  431. reconcile/typed_queries/app_interface_deadmanssnitch_settings.py +17 -0
  432. reconcile/typed_queries/app_interface_metrics_exporter/__init__.py +0 -0
  433. reconcile/typed_queries/app_interface_metrics_exporter/onboarding_status.py +13 -0
  434. reconcile/typed_queries/app_interface_repo_url.py +1 -2
  435. reconcile/typed_queries/app_interface_state_settings.py +1 -3
  436. reconcile/typed_queries/app_interface_vault_settings.py +1 -2
  437. reconcile/typed_queries/app_quay_repos_escalation_policies.py +14 -0
  438. reconcile/typed_queries/apps.py +11 -0
  439. reconcile/typed_queries/aws_vpc_requests.py +9 -0
  440. reconcile/typed_queries/aws_vpcs.py +12 -0
  441. reconcile/typed_queries/cloudflare.py +10 -0
  442. reconcile/typed_queries/clusters.py +7 -5
  443. reconcile/typed_queries/clusters_minimal.py +6 -5
  444. reconcile/typed_queries/clusters_with_dms.py +16 -0
  445. reconcile/typed_queries/cost_report/__init__.py +0 -0
  446. reconcile/typed_queries/cost_report/app_names.py +22 -0
  447. reconcile/typed_queries/cost_report/cost_namespaces.py +43 -0
  448. reconcile/typed_queries/cost_report/settings.py +15 -0
  449. reconcile/typed_queries/dynatrace.py +10 -0
  450. reconcile/typed_queries/dynatrace_environments.py +14 -0
  451. reconcile/typed_queries/dynatrace_token_provider_token_specs.py +14 -0
  452. reconcile/typed_queries/external_resources.py +46 -0
  453. reconcile/typed_queries/get_state_aws_account.py +20 -0
  454. reconcile/typed_queries/glitchtip.py +10 -0
  455. reconcile/typed_queries/jenkins.py +25 -0
  456. reconcile/typed_queries/jira.py +7 -0
  457. reconcile/typed_queries/jira_settings.py +16 -0
  458. reconcile/typed_queries/jiralert_settings.py +22 -0
  459. reconcile/typed_queries/ocm.py +8 -0
  460. reconcile/typed_queries/pagerduty_instances.py +2 -7
  461. reconcile/typed_queries/quay.py +23 -0
  462. reconcile/typed_queries/repos.py +20 -8
  463. reconcile/typed_queries/reserved_networks.py +12 -0
  464. reconcile/typed_queries/saas_files.py +221 -167
  465. reconcile/typed_queries/slack.py +7 -0
  466. reconcile/typed_queries/slo_documents.py +12 -0
  467. reconcile/typed_queries/status_board.py +58 -0
  468. reconcile/typed_queries/tekton_pipeline_providers.py +1 -2
  469. reconcile/typed_queries/terraform_namespaces.py +1 -2
  470. reconcile/typed_queries/terraform_tgw_attachments/__init__.py +0 -0
  471. reconcile/typed_queries/terraform_tgw_attachments/aws_accounts.py +16 -0
  472. reconcile/typed_queries/unleash.py +10 -0
  473. reconcile/typed_queries/users.py +11 -0
  474. reconcile/typed_queries/vault.py +10 -0
  475. reconcile/unleash_feature_toggles/__init__.py +0 -0
  476. reconcile/unleash_feature_toggles/integration.py +287 -0
  477. reconcile/utils/acs/__init__.py +0 -0
  478. reconcile/utils/acs/base.py +81 -0
  479. reconcile/utils/acs/notifiers.py +143 -0
  480. reconcile/utils/acs/policies.py +163 -0
  481. reconcile/utils/acs/rbac.py +277 -0
  482. reconcile/utils/aggregated_list.py +11 -9
  483. reconcile/utils/amtool.py +6 -4
  484. reconcile/utils/aws_api.py +279 -66
  485. reconcile/utils/aws_api_typed/__init__.py +0 -0
  486. reconcile/utils/aws_api_typed/account.py +23 -0
  487. reconcile/utils/aws_api_typed/api.py +273 -0
  488. reconcile/utils/aws_api_typed/dynamodb.py +16 -0
  489. reconcile/utils/aws_api_typed/iam.py +67 -0
  490. reconcile/utils/aws_api_typed/organization.py +152 -0
  491. reconcile/utils/aws_api_typed/s3.py +26 -0
  492. reconcile/utils/aws_api_typed/service_quotas.py +79 -0
  493. reconcile/utils/aws_api_typed/sts.py +36 -0
  494. reconcile/utils/aws_api_typed/support.py +79 -0
  495. reconcile/utils/aws_helper.py +42 -3
  496. reconcile/utils/batches.py +11 -0
  497. reconcile/utils/binary.py +7 -9
  498. reconcile/utils/cloud_resource_best_practice/__init__.py +0 -0
  499. reconcile/utils/cloud_resource_best_practice/aws_rds.py +66 -0
  500. reconcile/utils/clusterhealth/__init__.py +0 -0
  501. reconcile/utils/clusterhealth/providerbase.py +39 -0
  502. reconcile/utils/clusterhealth/telemeter.py +39 -0
  503. reconcile/utils/config.py +3 -4
  504. reconcile/utils/deadmanssnitch_api.py +86 -0
  505. reconcile/utils/differ.py +205 -0
  506. reconcile/utils/disabled_integrations.py +4 -6
  507. reconcile/utils/dynatrace/__init__.py +0 -0
  508. reconcile/utils/dynatrace/client.py +93 -0
  509. reconcile/utils/early_exit_cache.py +289 -0
  510. reconcile/utils/elasticsearch_exceptions.py +5 -0
  511. reconcile/utils/environ.py +2 -2
  512. reconcile/utils/exceptions.py +4 -0
  513. reconcile/utils/expiration.py +4 -8
  514. reconcile/utils/extended_early_exit.py +210 -0
  515. reconcile/utils/external_resource_spec.py +34 -12
  516. reconcile/utils/external_resources.py +48 -20
  517. reconcile/utils/filtering.py +16 -0
  518. reconcile/utils/git.py +49 -16
  519. reconcile/utils/github_api.py +10 -9
  520. reconcile/utils/gitlab_api.py +333 -190
  521. reconcile/utils/glitchtip/client.py +97 -100
  522. reconcile/utils/glitchtip/models.py +89 -11
  523. reconcile/utils/gql.py +157 -58
  524. reconcile/utils/grouping.py +17 -0
  525. reconcile/utils/helm.py +89 -18
  526. reconcile/utils/helpers.py +51 -0
  527. reconcile/utils/imap_client.py +5 -6
  528. reconcile/utils/internal_groups/__init__.py +0 -0
  529. reconcile/utils/internal_groups/client.py +160 -0
  530. reconcile/utils/internal_groups/models.py +71 -0
  531. reconcile/utils/jenkins_api.py +10 -34
  532. reconcile/utils/jinja2/__init__.py +0 -0
  533. reconcile/utils/{jinja2_ext.py → jinja2/extensions.py} +6 -4
  534. reconcile/utils/jinja2/filters.py +142 -0
  535. reconcile/utils/jinja2/utils.py +278 -0
  536. reconcile/utils/jira_client.py +165 -8
  537. reconcile/utils/jjb_client.py +47 -35
  538. reconcile/utils/jobcontroller/__init__.py +0 -0
  539. reconcile/utils/jobcontroller/controller.py +413 -0
  540. reconcile/utils/jobcontroller/models.py +195 -0
  541. reconcile/utils/jsonpath.py +4 -5
  542. reconcile/utils/jump_host.py +13 -12
  543. reconcile/utils/keycloak.py +106 -0
  544. reconcile/utils/ldap_client.py +35 -6
  545. reconcile/utils/lean_terraform_client.py +115 -6
  546. reconcile/utils/membershipsources/__init__.py +0 -0
  547. reconcile/utils/membershipsources/app_interface_resolver.py +60 -0
  548. reconcile/utils/membershipsources/models.py +91 -0
  549. reconcile/utils/membershipsources/resolver.py +110 -0
  550. reconcile/utils/merge_request_manager/__init__.py +0 -0
  551. reconcile/utils/merge_request_manager/merge_request_manager.py +99 -0
  552. reconcile/utils/merge_request_manager/parser.py +67 -0
  553. reconcile/utils/metrics.py +511 -1
  554. reconcile/utils/models.py +123 -0
  555. reconcile/utils/mr/README.md +198 -0
  556. reconcile/utils/mr/__init__.py +14 -10
  557. reconcile/utils/mr/app_interface_reporter.py +2 -2
  558. reconcile/utils/mr/aws_access.py +4 -4
  559. reconcile/utils/mr/base.py +51 -31
  560. reconcile/utils/mr/clusters_updates.py +10 -7
  561. reconcile/utils/mr/glitchtip_access_reporter.py +2 -4
  562. reconcile/utils/mr/labels.py +14 -1
  563. reconcile/utils/mr/notificator.py +1 -3
  564. reconcile/utils/mr/ocm_update_recommended_version.py +1 -2
  565. reconcile/utils/mr/ocm_upgrade_scheduler_org_updates.py +7 -3
  566. reconcile/utils/mr/promote_qontract.py +203 -0
  567. reconcile/utils/mr/user_maintenance.py +24 -4
  568. reconcile/utils/oauth2_backend_application_session.py +132 -0
  569. reconcile/utils/oc.py +194 -170
  570. reconcile/utils/oc_connection_parameters.py +40 -51
  571. reconcile/utils/oc_filters.py +11 -13
  572. reconcile/utils/oc_map.py +14 -35
  573. reconcile/utils/ocm/__init__.py +30 -1
  574. reconcile/utils/ocm/addons.py +228 -0
  575. reconcile/utils/ocm/base.py +618 -5
  576. reconcile/utils/ocm/cluster_groups.py +5 -56
  577. reconcile/utils/ocm/clusters.py +111 -99
  578. reconcile/utils/ocm/identity_providers.py +66 -0
  579. reconcile/utils/ocm/label_sources.py +75 -0
  580. reconcile/utils/ocm/labels.py +139 -54
  581. reconcile/utils/ocm/manifests.py +39 -0
  582. reconcile/utils/ocm/ocm.py +182 -928
  583. reconcile/utils/ocm/products.py +758 -0
  584. reconcile/utils/ocm/search_filters.py +20 -28
  585. reconcile/utils/ocm/service_log.py +32 -79
  586. reconcile/utils/ocm/sre_capability_labels.py +51 -0
  587. reconcile/utils/ocm/status_board.py +66 -0
  588. reconcile/utils/ocm/subscriptions.py +49 -59
  589. reconcile/utils/ocm/syncsets.py +39 -0
  590. reconcile/utils/ocm/upgrades.py +181 -0
  591. reconcile/utils/ocm_base_client.py +71 -36
  592. reconcile/utils/openshift_resource.py +113 -67
  593. reconcile/utils/output.py +18 -11
  594. reconcile/utils/pagerduty_api.py +16 -10
  595. reconcile/utils/parse_dhms_duration.py +13 -1
  596. reconcile/utils/prometheus.py +123 -0
  597. reconcile/utils/promotion_state.py +56 -19
  598. reconcile/utils/promtool.py +5 -8
  599. reconcile/utils/quay_api.py +13 -25
  600. reconcile/utils/raw_github_api.py +3 -5
  601. reconcile/utils/repo_owners.py +2 -8
  602. reconcile/utils/rest_api_base.py +126 -0
  603. reconcile/utils/rosa/__init__.py +0 -0
  604. reconcile/utils/rosa/rosa_cli.py +310 -0
  605. reconcile/utils/rosa/session.py +201 -0
  606. reconcile/utils/ruamel.py +16 -0
  607. reconcile/utils/runtime/__init__.py +0 -1
  608. reconcile/utils/runtime/desired_state_diff.py +9 -20
  609. reconcile/utils/runtime/environment.py +33 -8
  610. reconcile/utils/runtime/integration.py +28 -12
  611. reconcile/utils/runtime/meta.py +1 -3
  612. reconcile/utils/runtime/runner.py +8 -11
  613. reconcile/utils/runtime/sharding.py +93 -36
  614. reconcile/utils/saasherder/__init__.py +1 -1
  615. reconcile/utils/saasherder/interfaces.py +143 -138
  616. reconcile/utils/saasherder/models.py +201 -43
  617. reconcile/utils/saasherder/saasherder.py +508 -378
  618. reconcile/utils/secret_reader.py +22 -27
  619. reconcile/utils/semver_helper.py +15 -1
  620. reconcile/utils/slack_api.py +124 -36
  621. reconcile/utils/smtp_client.py +1 -2
  622. reconcile/utils/sqs_gateway.py +10 -6
  623. reconcile/utils/state.py +276 -127
  624. reconcile/utils/terraform/config_client.py +6 -7
  625. reconcile/utils/terraform_client.py +284 -125
  626. reconcile/utils/terrascript/cloudflare_client.py +38 -17
  627. reconcile/utils/terrascript/cloudflare_resources.py +67 -18
  628. reconcile/utils/terrascript/models.py +2 -3
  629. reconcile/utils/terrascript/resources.py +1 -2
  630. reconcile/utils/terrascript_aws_client.py +1292 -540
  631. reconcile/utils/three_way_diff_strategy.py +157 -0
  632. reconcile/utils/unleash/__init__.py +11 -0
  633. reconcile/utils/{unleash.py → unleash/client.py} +35 -29
  634. reconcile/utils/unleash/server.py +145 -0
  635. reconcile/utils/vault.py +42 -32
  636. reconcile/utils/vaultsecretref.py +2 -4
  637. reconcile/utils/vcs.py +250 -0
  638. reconcile/vault_replication.py +38 -31
  639. reconcile/vpc_peerings_validator.py +82 -13
  640. tools/app_interface_metrics_exporter.py +70 -0
  641. tools/app_interface_reporter.py +44 -157
  642. tools/cli_commands/container_images_report.py +154 -0
  643. tools/cli_commands/cost_report/__init__.py +0 -0
  644. tools/cli_commands/cost_report/aws.py +137 -0
  645. tools/cli_commands/cost_report/cost_management_api.py +155 -0
  646. tools/cli_commands/cost_report/model.py +49 -0
  647. tools/cli_commands/cost_report/openshift.py +166 -0
  648. tools/cli_commands/cost_report/openshift_cost_optimization.py +187 -0
  649. tools/cli_commands/cost_report/response.py +124 -0
  650. tools/cli_commands/cost_report/util.py +72 -0
  651. tools/cli_commands/cost_report/view.py +524 -0
  652. tools/cli_commands/erv2.py +620 -0
  653. tools/cli_commands/gpg_encrypt.py +5 -8
  654. tools/cli_commands/systems_and_tools.py +489 -0
  655. tools/glitchtip_access_revalidation.py +1 -1
  656. tools/qontract_cli.py +2301 -673
  657. tools/saas_metrics_exporter/__init__.py +0 -0
  658. tools/saas_metrics_exporter/commit_distance/__init__.py +0 -0
  659. tools/saas_metrics_exporter/commit_distance/channel.py +63 -0
  660. tools/saas_metrics_exporter/commit_distance/commit_distance.py +103 -0
  661. tools/saas_metrics_exporter/commit_distance/metrics.py +19 -0
  662. tools/saas_metrics_exporter/main.py +99 -0
  663. tools/saas_promotion_state/__init__.py +0 -0
  664. tools/saas_promotion_state/saas_promotion_state.py +105 -0
  665. tools/sd_app_sre_alert_report.py +145 -0
  666. tools/template_validation.py +107 -0
  667. e2e_tests/cli.py +0 -83
  668. e2e_tests/create_namespace.py +0 -43
  669. e2e_tests/dedicated_admin_rolebindings.py +0 -44
  670. e2e_tests/dedicated_admin_test_base.py +0 -39
  671. e2e_tests/default_network_policies.py +0 -47
  672. e2e_tests/default_project_labels.py +0 -52
  673. e2e_tests/network_policy_test_base.py +0 -17
  674. e2e_tests/test_base.py +0 -56
  675. qontract_reconcile-0.10.0.dist-info/LICENSE +0 -201
  676. qontract_reconcile-0.10.0.dist-info/METADATA +0 -63
  677. qontract_reconcile-0.10.0.dist-info/RECORD +0 -586
  678. qontract_reconcile-0.10.0.dist-info/top_level.txt +0 -4
  679. reconcile/ecr_mirror.py +0 -152
  680. reconcile/github_scanner.py +0 -74
  681. reconcile/gitlab_integrations.py +0 -63
  682. reconcile/gql_definitions/ocm_oidc_idp/clusters.py +0 -195
  683. reconcile/gql_definitions/ocp_release_mirror/ocp_release_mirror.py +0 -287
  684. reconcile/integrations_validator.py +0 -18
  685. reconcile/jenkins_plugins.py +0 -129
  686. reconcile/kafka_clusters.py +0 -208
  687. reconcile/ocm_cluster_admin.py +0 -42
  688. reconcile/ocm_oidc_idp.py +0 -198
  689. reconcile/ocp_release_mirror.py +0 -373
  690. reconcile/prometheus_rules_tester_old.py +0 -436
  691. reconcile/saas_auto_promotions_manager/merge_request_manager/merge_request_manager.py +0 -279
  692. reconcile/saas_auto_promotions_manager/utils/vcs.py +0 -141
  693. reconcile/sentry_config.py +0 -613
  694. reconcile/sentry_helper.py +0 -69
  695. reconcile/test/conftest.py +0 -187
  696. reconcile/test/fixtures.py +0 -24
  697. reconcile/test/saas_auto_promotions_manager/conftest.py +0 -69
  698. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/conftest.py +0 -110
  699. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/data_keys.py +0 -10
  700. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_housekeeping.py +0 -200
  701. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_merge_request_manager.py +0 -151
  702. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/conftest.py +0 -63
  703. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/data_keys.py +0 -4
  704. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_multiple_namespaces.py +0 -46
  705. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_single_namespace.py +0 -94
  706. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_single_target.py +0 -44
  707. reconcile/test/saas_auto_promotions_manager/subscriber/conftest.py +0 -74
  708. reconcile/test/saas_auto_promotions_manager/subscriber/data_keys.py +0 -11
  709. reconcile/test/saas_auto_promotions_manager/subscriber/test_content_hash.py +0 -155
  710. reconcile/test/saas_auto_promotions_manager/subscriber/test_diff.py +0 -173
  711. reconcile/test/saas_auto_promotions_manager/subscriber/test_multiple_channels_config_hash.py +0 -226
  712. reconcile/test/saas_auto_promotions_manager/subscriber/test_multiple_channels_moving_ref.py +0 -224
  713. reconcile/test/saas_auto_promotions_manager/subscriber/test_single_channel_with_single_publisher.py +0 -350
  714. reconcile/test/saas_auto_promotions_manager/test_integration_test.py +0 -129
  715. reconcile/test/saas_auto_promotions_manager/utils/saas_files_inventory/test_multiple_publishers_for_single_channel.py +0 -70
  716. reconcile/test/saas_auto_promotions_manager/utils/saas_files_inventory/test_saas_files_use_target_config_hash.py +0 -63
  717. reconcile/test/saas_auto_promotions_manager/utils/saas_files_inventory/test_saas_files_with_auto_promote.py +0 -74
  718. reconcile/test/saas_auto_promotions_manager/utils/saas_files_inventory/test_saas_files_without_auto_promote.py +0 -65
  719. reconcile/test/test_aggregated_list.py +0 -237
  720. reconcile/test/test_amtool.py +0 -37
  721. reconcile/test/test_auto_promoter.py +0 -295
  722. reconcile/test/test_aws_ami_share.py +0 -68
  723. reconcile/test/test_aws_iam_keys.py +0 -70
  724. reconcile/test/test_aws_iam_password_reset.py +0 -35
  725. reconcile/test/test_aws_support_cases_sos.py +0 -23
  726. reconcile/test/test_checkpoint.py +0 -178
  727. reconcile/test/test_cli.py +0 -41
  728. reconcile/test/test_closedbox_endpoint_monitoring.py +0 -207
  729. reconcile/test/test_gabi_authorized_users.py +0 -72
  730. reconcile/test/test_github_org.py +0 -154
  731. reconcile/test/test_github_repo_invites.py +0 -123
  732. reconcile/test/test_gitlab_housekeeping.py +0 -88
  733. reconcile/test/test_gitlab_labeler.py +0 -129
  734. reconcile/test/test_gitlab_members.py +0 -283
  735. reconcile/test/test_instrumented_wrappers.py +0 -18
  736. reconcile/test/test_integrations_manager.py +0 -995
  737. reconcile/test/test_jenkins_worker_fleets.py +0 -55
  738. reconcile/test/test_jump_host.py +0 -117
  739. reconcile/test/test_ldap_users.py +0 -123
  740. reconcile/test/test_make.py +0 -28
  741. reconcile/test/test_ocm_additional_routers.py +0 -134
  742. reconcile/test/test_ocm_addons_upgrade_scheduler_org.py +0 -149
  743. reconcile/test/test_ocm_clusters.py +0 -598
  744. reconcile/test/test_ocm_clusters_manifest_updates.py +0 -89
  745. reconcile/test/test_ocm_oidc_idp.py +0 -315
  746. reconcile/test/test_ocm_update_recommended_version.py +0 -145
  747. reconcile/test/test_ocm_upgrade_scheduler.py +0 -614
  748. reconcile/test/test_ocm_upgrade_scheduler_org_updater.py +0 -129
  749. reconcile/test/test_openshift_base.py +0 -730
  750. reconcile/test/test_openshift_namespace_labels.py +0 -345
  751. reconcile/test/test_openshift_namespaces.py +0 -256
  752. reconcile/test/test_openshift_resource.py +0 -415
  753. reconcile/test/test_openshift_resources_base.py +0 -440
  754. reconcile/test/test_openshift_saas_deploy_change_tester.py +0 -310
  755. reconcile/test/test_openshift_tekton_resources.py +0 -253
  756. reconcile/test/test_openshift_upgrade_watcher.py +0 -146
  757. reconcile/test/test_prometheus_rules_tester.py +0 -151
  758. reconcile/test/test_prometheus_rules_tester_old.py +0 -77
  759. reconcile/test/test_quay_membership.py +0 -86
  760. reconcile/test/test_quay_mirror.py +0 -109
  761. reconcile/test/test_quay_mirror_org.py +0 -70
  762. reconcile/test/test_quay_repos.py +0 -59
  763. reconcile/test/test_queries.py +0 -53
  764. reconcile/test/test_repo_owners.py +0 -47
  765. reconcile/test/test_requests_sender.py +0 -139
  766. reconcile/test/test_saasherder.py +0 -1074
  767. reconcile/test/test_saasherder_allowed_secret_paths.py +0 -127
  768. reconcile/test/test_secret_reader.py +0 -153
  769. reconcile/test/test_slack_base.py +0 -185
  770. reconcile/test/test_slack_usergroups.py +0 -744
  771. reconcile/test/test_sql_query.py +0 -19
  772. reconcile/test/test_terraform_cloudflare_dns.py +0 -117
  773. reconcile/test/test_terraform_cloudflare_resources.py +0 -106
  774. reconcile/test/test_terraform_cloudflare_users.py +0 -749
  775. reconcile/test/test_terraform_resources.py +0 -257
  776. reconcile/test/test_terraform_tgw_attachments.py +0 -631
  777. reconcile/test/test_terraform_users.py +0 -57
  778. reconcile/test/test_terraform_vpc_peerings.py +0 -499
  779. reconcile/test/test_terraform_vpc_peerings_build_desired_state.py +0 -1061
  780. reconcile/test/test_unleash.py +0 -138
  781. reconcile/test/test_utils_aws_api.py +0 -240
  782. reconcile/test/test_utils_aws_helper.py +0 -80
  783. reconcile/test/test_utils_cluster_version_data.py +0 -177
  784. reconcile/test/test_utils_data_structures.py +0 -13
  785. reconcile/test/test_utils_disabled_integrations.py +0 -86
  786. reconcile/test/test_utils_expiration.py +0 -109
  787. reconcile/test/test_utils_external_resource_spec.py +0 -383
  788. reconcile/test/test_utils_external_resources.py +0 -247
  789. reconcile/test/test_utils_github_api.py +0 -73
  790. reconcile/test/test_utils_gitlab_api.py +0 -20
  791. reconcile/test/test_utils_gpg.py +0 -69
  792. reconcile/test/test_utils_gql.py +0 -81
  793. reconcile/test/test_utils_helm.py +0 -306
  794. reconcile/test/test_utils_helpers.py +0 -55
  795. reconcile/test/test_utils_imap_client.py +0 -65
  796. reconcile/test/test_utils_jjb_client.py +0 -52
  797. reconcile/test/test_utils_jsonpath.py +0 -286
  798. reconcile/test/test_utils_ldap_client.py +0 -51
  799. reconcile/test/test_utils_mr.py +0 -226
  800. reconcile/test/test_utils_mr_clusters_updates.py +0 -77
  801. reconcile/test/test_utils_oc.py +0 -984
  802. reconcile/test/test_utils_ocm.py +0 -110
  803. reconcile/test/test_utils_pagerduty_api.py +0 -251
  804. reconcile/test/test_utils_parse_dhms_duration.py +0 -34
  805. reconcile/test/test_utils_password_validator.py +0 -155
  806. reconcile/test/test_utils_quay_api.py +0 -86
  807. reconcile/test/test_utils_semver_helper.py +0 -19
  808. reconcile/test/test_utils_sharding.py +0 -56
  809. reconcile/test/test_utils_slack_api.py +0 -439
  810. reconcile/test/test_utils_smtp_client.py +0 -73
  811. reconcile/test/test_utils_state.py +0 -256
  812. reconcile/test/test_utils_terraform.py +0 -13
  813. reconcile/test/test_utils_terraform_client.py +0 -585
  814. reconcile/test/test_utils_terraform_config_client.py +0 -219
  815. reconcile/test/test_utils_terrascript_aws_client.py +0 -277
  816. reconcile/test/test_utils_terrascript_cloudflare_client.py +0 -597
  817. reconcile/test/test_utils_terrascript_cloudflare_resources.py +0 -26
  818. reconcile/test/test_vault_replication.py +0 -515
  819. reconcile/test/test_vault_utils.py +0 -47
  820. reconcile/test/test_version_bump.py +0 -18
  821. reconcile/test/test_vpc_peerings_validator.py +0 -103
  822. reconcile/test/test_wrong_region.py +0 -78
  823. reconcile/typed_queries/glitchtip_settings.py +0 -18
  824. reconcile/typed_queries/ocp_release_mirror.py +0 -11
  825. reconcile/unleash_watcher.py +0 -120
  826. reconcile/utils/git_secrets.py +0 -63
  827. reconcile/utils/mr/auto_promoter.py +0 -218
  828. reconcile/utils/sentry_client.py +0 -383
  829. release/test_version.py +0 -50
  830. release/version.py +0 -100
  831. tools/test/test_qontract_cli.py +0 -60
  832. tools/test/test_sre_checkpoints.py +0 -79
  833. /e2e_tests/__init__.py → /reconcile/aus/upgrades.py +0 -0
  834. /reconcile/{gql_definitions/ocp_release_mirror → aws_account_manager}/__init__.py +0 -0
  835. /reconcile/{test → aws_ami_cleanup}/__init__.py +0 -0
  836. /reconcile/{test/saas_auto_promotions_manager → aws_cloudwatch_log_retention}/__init__.py +0 -0
  837. /reconcile/{test/saas_auto_promotions_manager/merge_request_manager → aws_saml_idp}/__init__.py +0 -0
  838. /reconcile/{test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager → aws_saml_roles}/__init__.py +0 -0
  839. /reconcile/{test/saas_auto_promotions_manager/merge_request_manager/renderer → aws_version_sync}/__init__.py +0 -0
  840. /reconcile/{test/saas_auto_promotions_manager/subscriber → aws_version_sync/merge_request_manager}/__init__.py +0 -0
  841. /reconcile/{test/saas_auto_promotions_manager/utils → cluster_auth_rhidp}/__init__.py +0 -0
  842. /reconcile/{test/saas_auto_promotions_manager/utils/saas_files_inventory → dynatrace_token_provider}/__init__.py +0 -0
  843. {release → reconcile/endpoints_discovery}/__init__.py +0 -0
  844. {tools/test → reconcile/external_resources}/__init__.py +0 -0
@@ -1,32 +1,50 @@
1
- from typing import (
2
- Any,
3
- Optional,
4
- )
1
+ import functools
5
2
 
6
3
  from pydantic import BaseModel
7
4
 
8
- from reconcile import queries
9
5
  from reconcile.aus import base as aus
6
+ from reconcile.aus.base import (
7
+ AbstractUpgradePolicy,
8
+ AddonUpgradePolicy,
9
+ init_addon_service,
10
+ )
11
+ from reconcile.aus.cluster_version_data import VersionData
12
+ from reconcile.aus.healthchecks import (
13
+ AUSClusterHealthCheckProvider,
14
+ build_cluster_health_providers_for_organization,
15
+ )
16
+ from reconcile.aus.metrics import (
17
+ AUSAddonUpgradePolicyInfoMetric,
18
+ AUSAddonVersionRemainingSoakDaysGauge,
19
+ )
10
20
  from reconcile.aus.models import (
21
+ ClusterAddonUpgradeSpec,
11
22
  ClusterUpgradeSpec,
12
23
  OrganizationUpgradeSpec,
13
24
  )
14
- from reconcile.gql_definitions.advanced_upgrade_service.aus_organization import (
15
- query as aus_organizations_query,
16
- )
25
+ from reconcile.gql_definitions.fragments.aus_organization import AUSOCMOrganization
17
26
  from reconcile.gql_definitions.fragments.ocm_environment import OCMEnvironment
18
- from reconcile.utils import gql
19
- from reconcile.utils.cluster_version_data import VersionData
20
- from reconcile.utils.ocm import OCMMap
27
+ from reconcile.utils import metrics
28
+ from reconcile.utils.ocm.addons import (
29
+ OCMAddonInstallation,
30
+ )
31
+ from reconcile.utils.ocm.clusters import (
32
+ OCMCluster,
33
+ discover_clusters_for_organizations,
34
+ )
35
+ from reconcile.utils.ocm_base_client import (
36
+ OCMBaseClient,
37
+ init_ocm_base_client,
38
+ init_ocm_base_client_for_org,
39
+ )
21
40
 
22
41
  QONTRACT_INTEGRATION = "ocm-addons-upgrade-scheduler-org"
23
42
 
24
43
 
25
44
  class AUSOrgAddonUpgradeState(BaseModel):
26
-
27
45
  addon_id: str
28
- current_state: list[dict[str, Any]]
29
- desired_state: list[dict[str, Any]]
46
+ current_state: list[AbstractUpgradePolicy]
47
+ upgrade_policies: list[ClusterUpgradeSpec]
30
48
 
31
49
 
32
50
  class OCMAddonsUpgradeSchedulerOrgIntegration(
@@ -39,119 +57,216 @@ class OCMAddonsUpgradeSchedulerOrgIntegration(
39
57
  def process_upgrade_policies_in_org(
40
58
  self, dry_run: bool, org_upgrade_spec: OrganizationUpgradeSpec
41
59
  ) -> None:
42
- ocm_map, addon_states = get_state_for_org_spec_per_addon(
43
- org_upgrade_spec, fetch_current_state=True
44
- )
45
- for addon_state in addon_states:
46
- version_data_map = aus.get_version_data_map(
47
- dry_run=dry_run,
48
- upgrade_policies=addon_state.desired_state,
49
- ocm_map=ocm_map,
50
- addon_id=addon_state.addon_id,
51
- integration=self.name,
52
- )
53
- diffs = calculate_diff(
54
- addon_state.current_state,
55
- addon_state.desired_state,
56
- ocm_map,
57
- version_data_map,
58
- addon_id=addon_state.addon_id,
60
+ with init_ocm_base_client_for_org(
61
+ org_upgrade_spec.org, self.secret_reader
62
+ ) as org_ocm_api:
63
+ current_state = aus.fetch_current_state(
64
+ org_ocm_api,
65
+ org_upgrade_spec,
66
+ addons=True,
59
67
  )
60
- aus.act(dry_run, diffs, ocm_map, addon_id=addon_state.addon_id)
68
+
69
+ addons = {
70
+ spec.addon.id
71
+ for spec in org_upgrade_spec.specs
72
+ if isinstance(spec, ClusterAddonUpgradeSpec)
73
+ }
74
+
75
+ for addon_id in addons:
76
+ addon_org_upgrade_spec = OrganizationUpgradeSpec(
77
+ org=org_upgrade_spec.org,
78
+ specs=[
79
+ spec
80
+ for spec in org_upgrade_spec.specs
81
+ if isinstance(spec, ClusterAddonUpgradeSpec)
82
+ and spec.addon.id == addon_id
83
+ ],
84
+ )
85
+ version_data = aus.get_version_data_map(
86
+ dry_run=dry_run,
87
+ org_upgrade_spec=addon_org_upgrade_spec,
88
+ addon_id=addon_id,
89
+ integration=self.name,
90
+ ).get(
91
+ org_upgrade_spec.org.environment.name, org_upgrade_spec.org.org_id
92
+ )
93
+
94
+ addon_current_state: list[AddonUpgradePolicy] = [
95
+ s
96
+ for s in current_state
97
+ if isinstance(s, AddonUpgradePolicy) and s.addon_id == addon_id
98
+ ]
99
+
100
+ self.expose_remaining_soak_day_metrics(
101
+ org_upgrade_spec=org_upgrade_spec,
102
+ version_data=version_data,
103
+ current_state=addon_current_state,
104
+ metrics_builder=functools.partial(
105
+ AUSAddonVersionRemainingSoakDaysGauge,
106
+ integration=self.name,
107
+ ocm_env=org_upgrade_spec.org.environment.name,
108
+ addon=addon_id,
109
+ ),
110
+ )
111
+
112
+ diffs = calculate_diff(
113
+ addon_current_state=addon_current_state,
114
+ org_upgrade_spec=addon_org_upgrade_spec,
115
+ ocm_api=org_ocm_api,
116
+ version_data=version_data,
117
+ addon_id=addon_id,
118
+ )
119
+ aus.act(
120
+ dry_run,
121
+ diffs,
122
+ org_ocm_api,
123
+ addon_id=addon_id,
124
+ )
61
125
 
62
126
  def get_ocm_env_upgrade_specs(
63
- self, ocm_env: OCMEnvironment, org_name: Optional[str] = None
127
+ self, ocm_env: OCMEnvironment
64
128
  ) -> dict[str, OrganizationUpgradeSpec]:
65
- return {
66
- org.name: OrganizationUpgradeSpec(
67
- org=org,
68
- specs=[
69
- ClusterUpgradeSpec(
70
- name=cluster.name,
71
- ocm=org,
72
- upgradePolicy=cluster.upgrade_policy,
73
- )
74
- for cluster in org.upgrade_policy_clusters or []
75
- ],
76
- )
77
- for org in aus_organizations_query(
78
- query_func=gql.get_api().query
79
- ).organizations
80
- or []
81
- if org.environment.name == ocm_env.name
82
- and org.addon_managed_upgrades
83
- and (org_name is None or org.name == org_name)
84
- }
129
+ """
130
+ Build the upgrade specs for all relevant organizations. Each org spec contains
131
+ one spec per cluster and addon.
132
+ """
133
+ organizations = self.get_orgs_for_environment(
134
+ ocm_env, only_addon_managed_upgrades=True
135
+ )
136
+ if not organizations:
137
+ return {}
85
138
 
139
+ addon_service = init_addon_service(ocm_env)
86
140
 
87
- def get_state_for_org_spec(
88
- org_upgrade_spec: OrganizationUpgradeSpec, fetch_current_state: bool
89
- ) -> tuple[OCMMap, list[dict[str, Any]], list[dict[str, Any]]]:
90
- settings = queries.get_app_interface_settings()
91
- cluster_like_objects = [
92
- policy.dict(by_alias=True) for policy in org_upgrade_spec.specs
93
- ]
94
- ocm_map = OCMMap(
95
- clusters=cluster_like_objects,
96
- integration=QONTRACT_INTEGRATION,
97
- settings=settings,
98
- init_version_gates=True,
99
- init_addons=True,
100
- )
101
- desired_state = aus.fetch_desired_state(cluster_like_objects, ocm_map, addons=True)
102
- current_state: list[dict[str, Any]] = []
103
- if fetch_current_state:
104
- current_state = aus.fetch_current_state(
105
- cluster_like_objects,
106
- ocm_map,
107
- addons=True,
108
- )
141
+ # lookup cluster in OCM to figure out if they exist
142
+ # and to get their UUID
143
+ with init_ocm_base_client(ocm_env, self.secret_reader) as ocm_api:
144
+ clusters = discover_clusters_for_organizations(
145
+ ocm_api, [org.org_id for org in organizations]
146
+ )
147
+ addon_latest_versions = addon_service.get_addon_latest_versions(ocm_api)
148
+ addons_per_cluster: dict[str, list[OCMAddonInstallation]] = {
149
+ cluster.ocm_cluster.name: addon_service.get_addons_for_cluster(
150
+ ocm_api=ocm_api,
151
+ cluster_id=cluster.ocm_cluster.id,
152
+ addon_latest_versions=addon_latest_versions,
153
+ required_state="ready",
154
+ )
155
+ for cluster in clusters
156
+ }
157
+
158
+ cluster_health_providers = self._health_check_providers_for_env(ocm_env.name)
109
159
 
110
- return (ocm_map, current_state, desired_state)
160
+ return {
161
+ o.name: OrganizationUpgradeSpec(
162
+ org=o,
163
+ specs=self._build_addon_upgrade_spec(
164
+ org=o,
165
+ clusters_by_name={
166
+ c.ocm_cluster.name: c.ocm_cluster
167
+ for c in clusters
168
+ if c.organization_id == o.org_id
169
+ },
170
+ addons_per_cluster=addons_per_cluster,
171
+ cluster_health_provider=build_cluster_health_providers_for_organization(
172
+ org=o,
173
+ providers=cluster_health_providers,
174
+ ),
175
+ ),
176
+ )
177
+ for o in organizations
178
+ }
111
179
 
180
+ def _build_addon_upgrade_spec(
181
+ self,
182
+ org: AUSOCMOrganization,
183
+ clusters_by_name: dict[str, OCMCluster],
184
+ addons_per_cluster: dict[str, list[OCMAddonInstallation]],
185
+ cluster_health_provider: AUSClusterHealthCheckProvider,
186
+ ) -> list[ClusterAddonUpgradeSpec]:
187
+ """
188
+ builds a upgrade spec objects for each addon on each cluster
189
+ """
190
+ return [
191
+ ClusterAddonUpgradeSpec(
192
+ org=org,
193
+ upgradePolicy=cluster.upgrade_policy,
194
+ cluster=clusters_by_name[cluster.name],
195
+ addon=addon,
196
+ health=cluster_health_provider.cluster_health(
197
+ cluster_external_id=clusters_by_name[cluster.name].external_id,
198
+ org_id=org.org_id,
199
+ ),
200
+ )
201
+ for cluster in org.upgrade_policy_clusters or []
202
+ if cluster.name in clusters_by_name
203
+ # clusters that are not in the dict will be ignored because
204
+ # they don't exist in the OCM organization (or have been deprovisioned)
205
+ for addon in addons_per_cluster.get(cluster.name, [])
206
+ ]
112
207
 
113
- def get_state_for_org_spec_per_addon(
114
- org_upgrade_spec: OrganizationUpgradeSpec, fetch_current_state: bool
115
- ) -> tuple[OCMMap, list[AUSOrgAddonUpgradeState]]:
116
- ocm_map, current_state, desired_state = get_state_for_org_spec(
117
- org_upgrade_spec, fetch_current_state
118
- )
119
- result = []
120
- for addon_id in set(a["addon_id"] for a in desired_state):
121
- addon_current_state = [c for c in current_state if c["addon_id"] == addon_id]
122
- addon_desired_state = [d for d in desired_state if d["addon_id"] == addon_id]
123
- result.append(
124
- AUSOrgAddonUpgradeState(
125
- addon_id=addon_id,
126
- current_state=addon_current_state,
127
- desired_state=addon_desired_state,
208
+ def expose_org_upgrade_spec_metrics(
209
+ self, ocm_env: str, org_upgrade_spec: OrganizationUpgradeSpec
210
+ ) -> None:
211
+ for cluster_upgrade_spec in org_upgrade_spec.specs:
212
+ if not isinstance(cluster_upgrade_spec, ClusterAddonUpgradeSpec):
213
+ continue
214
+ mutexes = cluster_upgrade_spec.upgrade_policy.conditions.mutexes
215
+ metrics.set_info(
216
+ AUSAddonUpgradePolicyInfoMetric(
217
+ integration=self.name,
218
+ ocm_env=ocm_env,
219
+ cluster_uuid=cluster_upgrade_spec.cluster_uuid,
220
+ org_id=cluster_upgrade_spec.org.org_id,
221
+ org_name=org_upgrade_spec.org.name,
222
+ channel=cluster_upgrade_spec.cluster.version.channel_group,
223
+ current_version=cluster_upgrade_spec.current_version,
224
+ cluster_name=cluster_upgrade_spec.name,
225
+ schedule=cluster_upgrade_spec.upgrade_policy.schedule,
226
+ sector=cluster_upgrade_spec.upgrade_policy.conditions.sector or "",
227
+ mutexes=",".join(mutexes) if mutexes else "",
228
+ soak_days=str(
229
+ cluster_upgrade_spec.upgrade_policy.conditions.soak_days or 0
230
+ ),
231
+ workloads=",".join(cluster_upgrade_spec.upgrade_policy.workloads),
232
+ addon=cluster_upgrade_spec.addon.id,
233
+ product=cluster_upgrade_spec.cluster.product.id,
234
+ hypershift=cluster_upgrade_spec.cluster.hypershift.enabled,
235
+ ),
128
236
  )
129
- )
130
- return ocm_map, result
131
237
 
132
238
 
133
239
  def calculate_diff(
134
- addon_current_state: list[dict[str, Any]],
135
- addon_desired_state: list[dict[str, Any]],
136
- ocm_map: OCMMap,
137
- version_data_map: dict[str, VersionData],
240
+ addon_current_state: list[AddonUpgradePolicy],
241
+ org_upgrade_spec: OrganizationUpgradeSpec,
242
+ ocm_api: OCMBaseClient,
243
+ version_data: VersionData,
138
244
  addon_id: str = "",
139
- ) -> list[dict[str, str]]:
245
+ ) -> list[aus.UpgradePolicyHandler]:
140
246
  diffs = aus.calculate_diff(
141
247
  addon_current_state,
142
- addon_desired_state,
143
- ocm_map,
144
- version_data_map,
145
- addon_id=addon_id,
248
+ org_upgrade_spec,
249
+ ocm_api,
250
+ version_data,
251
+ addon_id,
146
252
  )
147
- for c in addon_current_state:
148
- if addon_id == c["addon_id"] and c["schedule_type"] == "automatic":
253
+ for current in addon_current_state:
254
+ if addon_id == current.addon_id and (
255
+ current.schedule_type == "automatic" or current.state == "completed"
256
+ ):
149
257
  diffs.append(
150
- {
151
- "action": "delete",
152
- "cluster": c["cluster"],
153
- "version": c["schedule_type"],
154
- "id": c["id"],
155
- }
258
+ aus.UpgradePolicyHandler(
259
+ action="delete",
260
+ policy=aus.AddonUpgradePolicy(
261
+ cluster=current.cluster,
262
+ version=current.schedule_type,
263
+ id=current.id,
264
+ addon_id=current.addon_id,
265
+ schedule_type=current.schedule_type,
266
+ addon_service=init_addon_service(
267
+ org_upgrade_spec.org.environment
268
+ ),
269
+ ),
270
+ )
156
271
  )
157
272
  return diffs
@@ -1,30 +1,32 @@
1
- from collections import defaultdict
2
- from typing import Optional
1
+ import functools
2
+ from abc import ABC
3
3
 
4
- from reconcile import queries
5
4
  from reconcile.aus import base as aus
6
- from reconcile.aus.models import (
7
- ClusterUpgradeSpec,
8
- OrganizationUpgradeSpec,
5
+ from reconcile.aus.cluster_version_data import VersionData
6
+ from reconcile.aus.metrics import (
7
+ AUSClusterVersionRemainingSoakDaysGauge,
8
+ AUSOrganizationVersionDataGauge,
9
9
  )
10
- from reconcile.gql_definitions.advanced_upgrade_service.aus_clusters import (
11
- query as aus_clusters_query,
12
- )
13
- from reconcile.gql_definitions.fragments.ocm_environment import OCMEnvironment
14
- from reconcile.utils import gql
15
- from reconcile.utils.disabled_integrations import integration_is_enabled
10
+ from reconcile.aus.models import OrganizationUpgradeSpec
11
+ from reconcile.utils import metrics
16
12
  from reconcile.utils.ocm import (
17
13
  OCM_PRODUCT_OSD,
18
- OCMMap,
14
+ OCM_PRODUCT_ROSA,
19
15
  )
16
+ from reconcile.utils.ocm_base_client import init_ocm_base_client_for_org
20
17
 
21
18
  QONTRACT_INTEGRATION = "ocm-upgrade-scheduler"
22
- SUPPORTED_OCM_PRODUCTS = [OCM_PRODUCT_OSD]
19
+ SUPPORTED_OCM_PRODUCTS = [OCM_PRODUCT_OSD, OCM_PRODUCT_ROSA]
23
20
 
24
21
 
25
22
  class OCMClusterUpgradeSchedulerIntegration(
26
- aus.AdvancedUpgradeSchedulerBaseIntegration
23
+ aus.AdvancedUpgradeSchedulerBaseIntegration, ABC
27
24
  ):
25
+ """
26
+ This flavor of upgrade scheduler has been made abstract to indicate that it
27
+ should not be used directly anymore until its code is removed.
28
+ """
29
+
28
30
  @property
29
31
  def name(self) -> str:
30
32
  return QONTRACT_INTEGRATION
@@ -32,64 +34,67 @@ class OCMClusterUpgradeSchedulerIntegration(
32
34
  def process_upgrade_policies_in_org(
33
35
  self, dry_run: bool, org_upgrade_spec: OrganizationUpgradeSpec
34
36
  ) -> None:
35
- settings = queries.get_app_interface_settings()
36
- cluster_like_objects = [
37
- policy.dict(by_alias=True) for policy in org_upgrade_spec.specs
38
- ]
37
+ with init_ocm_base_client_for_org(
38
+ org_upgrade_spec.org, self.secret_reader
39
+ ) as ocm_api:
40
+ current_state = aus.fetch_current_state(
41
+ ocm_api=ocm_api,
42
+ org_upgrade_spec=org_upgrade_spec,
43
+ )
39
44
 
40
- ocm_map = OCMMap(
41
- clusters=cluster_like_objects,
42
- integration=self.name,
43
- settings=settings,
44
- init_version_gates=True,
45
- )
46
- current_state = aus.fetch_current_state(
47
- clusters=cluster_like_objects, ocm_map=ocm_map
48
- )
49
- desired_state = aus.fetch_desired_state(
50
- clusters=cluster_like_objects, ocm_map=ocm_map
51
- )
52
- version_data_map = aus.get_version_data_map(
53
- dry_run=dry_run,
54
- upgrade_policies=desired_state,
55
- ocm_map=ocm_map,
56
- integration=self.name,
57
- )
58
- diffs = aus.calculate_diff(
59
- current_state, desired_state, ocm_map, version_data_map
60
- )
61
- aus.act(dry_run, diffs, ocm_map)
45
+ # expose version data metrics for the current organization
46
+ # this does not include inherited version data from other
47
+ # organizations, so that aggregations in prometheus can be more
48
+ # flexible
49
+ self.expose_version_data_metrics(
50
+ ocm_env=org_upgrade_spec.org.environment.name,
51
+ org_id=org_upgrade_spec.org.org_id,
52
+ version_data=aus.get_version_data_map(
53
+ dry_run=True,
54
+ org_upgrade_spec=org_upgrade_spec,
55
+ integration=self.name,
56
+ inherit_version_data=False,
57
+ ).get(
58
+ org_upgrade_spec.org.environment.name, org_upgrade_spec.org.org_id
59
+ ),
60
+ )
62
61
 
63
- def get_ocm_env_upgrade_specs(
64
- self, ocm_env: OCMEnvironment, org_name: Optional[str] = None
65
- ) -> dict[str, OrganizationUpgradeSpec]:
66
- specs_per_org: dict[str, list[ClusterUpgradeSpec]] = defaultdict(list)
67
- for cluster in (
68
- aus_clusters_query(query_func=gql.get_api().query).clusters or []
69
- ):
70
- supported_product = (
71
- cluster.spec and cluster.spec.product in SUPPORTED_OCM_PRODUCTS
62
+ version_data = aus.get_version_data_map(
63
+ dry_run=dry_run,
64
+ org_upgrade_spec=org_upgrade_spec,
65
+ integration=self.name,
66
+ ).get(org_upgrade_spec.org.environment.name, org_upgrade_spec.org.org_id)
67
+ self.expose_remaining_soak_day_metrics(
68
+ org_upgrade_spec=org_upgrade_spec,
69
+ version_data=version_data,
70
+ current_state=current_state,
71
+ metrics_builder=functools.partial(
72
+ AUSClusterVersionRemainingSoakDaysGauge,
73
+ integration=self.name,
74
+ ocm_env=org_upgrade_spec.org.environment.name,
75
+ ),
72
76
  )
73
- in_env_shard = cluster.ocm and ocm_env.name == cluster.ocm.environment.name
74
- in_org_shard = org_name is None or (
75
- cluster.ocm and cluster.ocm.name == org_name
77
+
78
+ diffs = aus.calculate_diff(
79
+ current_state, org_upgrade_spec, ocm_api, version_data
76
80
  )
77
- in_shard = in_env_shard and in_org_shard
78
- if (
79
- integration_is_enabled(self.name, cluster)
80
- and cluster.ocm
81
- and cluster.upgrade_policy
82
- and supported_product
83
- and in_shard
84
- ):
85
- specs_per_org[cluster.ocm.name].append(
86
- ClusterUpgradeSpec(
87
- name=cluster.name,
88
- ocm=cluster.ocm,
89
- upgradePolicy=cluster.upgrade_policy,
90
- )
81
+ aus.act(dry_run, diffs, ocm_api)
82
+
83
+ def expose_version_data_metrics(
84
+ self,
85
+ ocm_env: str,
86
+ org_id: str,
87
+ version_data: VersionData,
88
+ ) -> None:
89
+ for version, version_history in version_data.versions.items():
90
+ for workload, workload_history in version_history.workloads.items():
91
+ metrics.set_gauge(
92
+ AUSOrganizationVersionDataGauge(
93
+ integration=self.name,
94
+ ocm_env=ocm_env,
95
+ org_id=org_id,
96
+ version=version,
97
+ workload=workload,
98
+ ),
99
+ workload_history.soak_days,
91
100
  )
92
- return {
93
- org_name: OrganizationUpgradeSpec(org=specs[0].ocm, specs=specs)
94
- for org_name, specs in specs_per_org.items()
95
- }
@@ -1,15 +1,23 @@
1
- from typing import Optional
1
+ from collections import defaultdict
2
2
 
3
+ from reconcile.aus.healthchecks import (
4
+ AUSClusterHealthCheckProvider,
5
+ build_cluster_health_providers_for_organization,
6
+ )
3
7
  from reconcile.aus.models import (
4
8
  ClusterUpgradeSpec,
9
+ NodePoolSpec,
5
10
  OrganizationUpgradeSpec,
6
11
  )
12
+ from reconcile.aus.node_pool_spec import get_node_pool_specs_by_org_cluster
7
13
  from reconcile.aus.ocm_upgrade_scheduler import OCMClusterUpgradeSchedulerIntegration
8
- from reconcile.gql_definitions.advanced_upgrade_service.aus_organization import (
9
- query as aus_organizations_query,
10
- )
14
+ from reconcile.gql_definitions.fragments.aus_organization import AUSOCMOrganization
11
15
  from reconcile.gql_definitions.fragments.ocm_environment import OCMEnvironment
12
- from reconcile.utils import gql
16
+ from reconcile.utils.ocm.clusters import (
17
+ OCMCluster,
18
+ discover_clusters_for_organizations,
19
+ )
20
+ from reconcile.utils.ocm_base_client import init_ocm_base_client
13
21
 
14
22
  QONTRACT_INTEGRATION = "ocm-upgrade-scheduler-org"
15
23
 
@@ -20,24 +28,74 @@ class OCMClusterUpgradeSchedulerOrgIntegration(OCMClusterUpgradeSchedulerIntegra
20
28
  return QONTRACT_INTEGRATION
21
29
 
22
30
  def get_ocm_env_upgrade_specs(
23
- self, ocm_env: OCMEnvironment, org_name: Optional[str] = None
31
+ self, ocm_env: OCMEnvironment
24
32
  ) -> dict[str, OrganizationUpgradeSpec]:
25
- return {
26
- org.name: OrganizationUpgradeSpec(
33
+ organizations = self.get_orgs_for_environment(ocm_env)
34
+ if not organizations:
35
+ return {}
36
+
37
+ # lookup cluster in OCM to figure out if they exist
38
+ # and to get their UUID
39
+ with init_ocm_base_client(ocm_env, self.secret_reader) as ocm_api:
40
+ clusters = discover_clusters_for_organizations(
41
+ ocm_api, [org.org_id for org in organizations]
42
+ )
43
+
44
+ cluster_health_providers = self._health_check_providers_for_env(
45
+ ocm_env.name
46
+ )
47
+
48
+ clusters_by_org = defaultdict(list)
49
+ for cluster in clusters:
50
+ clusters_by_org[cluster.organization_id].append(cluster)
51
+
52
+ node_pool_specs_by_org_cluster = get_node_pool_specs_by_org_cluster(
53
+ ocm_api,
54
+ clusters_by_org,
55
+ )
56
+
57
+ return {
58
+ org.name: OrganizationUpgradeSpec(
59
+ org=org,
60
+ specs=self._build_cluster_upgrade_specs(
61
+ org=org,
62
+ clusters_by_name={
63
+ c.ocm_cluster.name: c.ocm_cluster
64
+ for c in clusters_by_org[org.org_id]
65
+ },
66
+ cluster_health_provider=build_cluster_health_providers_for_organization(
67
+ org=org,
68
+ providers=cluster_health_providers,
69
+ ),
70
+ node_pool_specs_by_cluster_id=node_pool_specs_by_org_cluster.get(
71
+ org.org_id
72
+ )
73
+ or {},
74
+ ),
75
+ )
76
+ for org in organizations
77
+ }
78
+
79
+ def _build_cluster_upgrade_specs(
80
+ self,
81
+ org: AUSOCMOrganization,
82
+ clusters_by_name: dict[str, OCMCluster],
83
+ cluster_health_provider: AUSClusterHealthCheckProvider,
84
+ node_pool_specs_by_cluster_id: dict[str, list[NodePoolSpec]],
85
+ ) -> list[ClusterUpgradeSpec]:
86
+ return [
87
+ ClusterUpgradeSpec(
27
88
  org=org,
28
- specs=[
29
- ClusterUpgradeSpec(
30
- name=cluster.name,
31
- ocm=org,
32
- upgradePolicy=cluster.upgrade_policy,
33
- )
34
- for cluster in org.upgrade_policy_clusters or []
35
- ],
89
+ upgradePolicy=cluster.upgrade_policy,
90
+ cluster=clusters_by_name[cluster.name],
91
+ health=cluster_health_provider.cluster_health(
92
+ cluster_external_id=clusters_by_name[cluster.name].external_id,
93
+ org_id=org.org_id,
94
+ ),
95
+ nodePools=node_pool_specs_by_cluster_id.get(ocm_cluster.id) or [],
36
96
  )
37
- for org in aus_organizations_query(
38
- query_func=gql.get_api().query
39
- ).organizations
40
- or []
41
- if org.environment.name == ocm_env.name
42
- and (org_name is None or org.name == org_name)
43
- }
97
+ for cluster in org.upgrade_policy_clusters or []
98
+ # clusters that are not in the UUID dict will be ignored because
99
+ # they don't exist in the OCM organization (or have been deprovisioned)
100
+ if (ocm_cluster := clusters_by_name.get(cluster.name))
101
+ ]