qontract-reconcile 0.10.2.dev349__py3-none-any.whl → 0.10.2.dev414__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 (356) hide show
  1. {qontract_reconcile-0.10.2.dev349.dist-info → qontract_reconcile-0.10.2.dev414.dist-info}/METADATA +12 -11
  2. {qontract_reconcile-0.10.2.dev349.dist-info → qontract_reconcile-0.10.2.dev414.dist-info}/RECORD +356 -350
  3. reconcile/acs_rbac.py +2 -2
  4. reconcile/aus/advanced_upgrade_service.py +15 -12
  5. reconcile/aus/base.py +26 -27
  6. reconcile/aus/cluster_version_data.py +15 -5
  7. reconcile/aus/models.py +1 -1
  8. reconcile/automated_actions/config/integration.py +15 -3
  9. reconcile/aws_account_manager/integration.py +8 -8
  10. reconcile/aws_account_manager/reconciler.py +3 -3
  11. reconcile/aws_ami_cleanup/integration.py +8 -12
  12. reconcile/aws_ami_share.py +69 -62
  13. reconcile/aws_cloudwatch_log_retention/integration.py +155 -126
  14. reconcile/aws_ecr_image_pull_secrets.py +2 -2
  15. reconcile/aws_iam_keys.py +7 -41
  16. reconcile/aws_saml_idp/integration.py +12 -4
  17. reconcile/aws_saml_roles/integration.py +32 -25
  18. reconcile/aws_version_sync/integration.py +6 -12
  19. reconcile/change_owners/bundle.py +3 -3
  20. reconcile/change_owners/change_log_tracking.py +3 -2
  21. reconcile/change_owners/change_owners.py +1 -1
  22. reconcile/change_owners/diff.py +2 -4
  23. reconcile/checkpoint.py +11 -3
  24. reconcile/cli.py +33 -8
  25. reconcile/dashdotdb_dora.py +5 -12
  26. reconcile/dashdotdb_slo.py +1 -1
  27. reconcile/database_access_manager.py +123 -117
  28. reconcile/dynatrace_token_provider/integration.py +1 -1
  29. reconcile/endpoints_discovery/integration.py +4 -1
  30. reconcile/endpoints_discovery/merge_request.py +1 -1
  31. reconcile/endpoints_discovery/merge_request_manager.py +9 -11
  32. reconcile/external_resources/factories.py +5 -12
  33. reconcile/external_resources/integration.py +1 -1
  34. reconcile/external_resources/manager.py +24 -10
  35. reconcile/external_resources/meta.py +0 -1
  36. reconcile/external_resources/metrics.py +1 -1
  37. reconcile/external_resources/model.py +13 -13
  38. reconcile/external_resources/reconciler.py +7 -4
  39. reconcile/external_resources/secrets_sync.py +6 -8
  40. reconcile/external_resources/state.py +60 -17
  41. reconcile/fleet_labeler/integration.py +1 -1
  42. reconcile/gabi_authorized_users.py +8 -5
  43. reconcile/gcp_image_mirror.py +2 -2
  44. reconcile/github_org.py +1 -1
  45. reconcile/github_owners.py +4 -0
  46. reconcile/gitlab_housekeeping.py +13 -15
  47. reconcile/gitlab_members.py +6 -12
  48. reconcile/gitlab_mr_sqs_consumer.py +2 -2
  49. reconcile/gitlab_owners.py +15 -11
  50. reconcile/gitlab_permissions.py +8 -12
  51. reconcile/glitchtip_project_alerts/integration.py +3 -1
  52. reconcile/gql_definitions/acs/acs_instances.py +5 -5
  53. reconcile/gql_definitions/acs/acs_policies.py +5 -5
  54. reconcile/gql_definitions/acs/acs_rbac.py +5 -5
  55. reconcile/gql_definitions/advanced_upgrade_service/aus_clusters.py +5 -5
  56. reconcile/gql_definitions/advanced_upgrade_service/aus_organization.py +5 -5
  57. reconcile/gql_definitions/app_interface_metrics_exporter/onboarding_status.py +5 -5
  58. reconcile/gql_definitions/app_sre_tekton_access_revalidation/roles.py +5 -5
  59. reconcile/gql_definitions/app_sre_tekton_access_revalidation/users.py +5 -5
  60. reconcile/gql_definitions/automated_actions/instance.py +46 -7
  61. reconcile/gql_definitions/aws_account_manager/aws_accounts.py +5 -5
  62. reconcile/gql_definitions/aws_ami_cleanup/aws_accounts.py +15 -5
  63. reconcile/gql_definitions/aws_cloudwatch_log_retention/aws_accounts.py +27 -66
  64. reconcile/gql_definitions/aws_saml_idp/aws_accounts.py +15 -5
  65. reconcile/gql_definitions/aws_saml_roles/aws_accounts.py +15 -5
  66. reconcile/gql_definitions/aws_saml_roles/roles.py +5 -5
  67. reconcile/gql_definitions/aws_version_sync/clusters.py +5 -5
  68. reconcile/gql_definitions/aws_version_sync/namespaces.py +5 -5
  69. reconcile/gql_definitions/change_owners/queries/change_types.py +5 -5
  70. reconcile/gql_definitions/change_owners/queries/self_service_roles.py +5 -5
  71. reconcile/gql_definitions/cluster_auth_rhidp/clusters.py +5 -5
  72. reconcile/gql_definitions/common/alerting_services_settings.py +5 -5
  73. reconcile/gql_definitions/common/app_code_component_repos.py +5 -5
  74. reconcile/gql_definitions/common/app_interface_custom_messages.py +5 -5
  75. reconcile/gql_definitions/common/app_interface_dms_settings.py +5 -5
  76. reconcile/gql_definitions/common/app_interface_repo_settings.py +5 -5
  77. reconcile/gql_definitions/common/app_interface_roles.py +5 -5
  78. reconcile/gql_definitions/common/app_interface_state_settings.py +5 -5
  79. reconcile/gql_definitions/common/app_interface_vault_settings.py +5 -5
  80. reconcile/gql_definitions/common/app_quay_repos_escalation_policies.py +5 -5
  81. reconcile/gql_definitions/common/apps.py +5 -5
  82. reconcile/gql_definitions/common/aws_vpc_requests.py +15 -5
  83. reconcile/gql_definitions/common/aws_vpcs.py +5 -5
  84. reconcile/gql_definitions/common/clusters.py +7 -5
  85. reconcile/gql_definitions/common/clusters_minimal.py +5 -5
  86. reconcile/gql_definitions/common/clusters_with_dms.py +5 -5
  87. reconcile/gql_definitions/common/clusters_with_peering.py +5 -5
  88. reconcile/gql_definitions/common/github_orgs.py +5 -5
  89. reconcile/gql_definitions/common/jira_settings.py +5 -5
  90. reconcile/gql_definitions/common/jiralert_settings.py +5 -5
  91. reconcile/gql_definitions/common/ldap_settings.py +5 -5
  92. reconcile/gql_definitions/common/namespaces.py +5 -5
  93. reconcile/gql_definitions/common/namespaces_minimal.py +7 -5
  94. reconcile/gql_definitions/common/ocm_env_telemeter.py +5 -5
  95. reconcile/gql_definitions/common/ocm_environments.py +5 -5
  96. reconcile/gql_definitions/common/pagerduty_instances.py +5 -5
  97. reconcile/gql_definitions/common/pgp_reencryption_settings.py +5 -5
  98. reconcile/gql_definitions/common/pipeline_providers.py +5 -5
  99. reconcile/gql_definitions/common/quay_instances.py +5 -5
  100. reconcile/gql_definitions/common/quay_orgs.py +5 -5
  101. reconcile/gql_definitions/common/reserved_networks.py +5 -5
  102. reconcile/gql_definitions/common/rhcs_provider_settings.py +5 -5
  103. reconcile/gql_definitions/common/saas_files.py +5 -5
  104. reconcile/gql_definitions/common/saas_target_namespaces.py +5 -5
  105. reconcile/gql_definitions/common/saasherder_settings.py +5 -5
  106. reconcile/gql_definitions/common/slack_workspaces.py +5 -5
  107. reconcile/gql_definitions/common/smtp_client_settings.py +5 -5
  108. reconcile/gql_definitions/common/state_aws_account.py +5 -5
  109. reconcile/gql_definitions/common/users.py +5 -5
  110. reconcile/gql_definitions/common/users_with_paths.py +5 -5
  111. reconcile/gql_definitions/cost_report/app_names.py +5 -5
  112. reconcile/gql_definitions/cost_report/cost_namespaces.py +5 -5
  113. reconcile/gql_definitions/cost_report/settings.py +5 -5
  114. reconcile/gql_definitions/dashdotdb_slo/slo_documents_query.py +5 -5
  115. reconcile/gql_definitions/dynatrace_token_provider/dynatrace_bootstrap_tokens.py +5 -5
  116. reconcile/gql_definitions/dynatrace_token_provider/token_specs.py +5 -5
  117. reconcile/gql_definitions/email_sender/apps.py +5 -5
  118. reconcile/gql_definitions/email_sender/emails.py +5 -5
  119. reconcile/gql_definitions/email_sender/users.py +5 -5
  120. reconcile/gql_definitions/endpoints_discovery/apps.py +5 -5
  121. reconcile/gql_definitions/external_resources/aws_accounts.py +5 -5
  122. reconcile/gql_definitions/external_resources/external_resources_modules.py +5 -5
  123. reconcile/gql_definitions/external_resources/external_resources_namespaces.py +89 -6
  124. reconcile/gql_definitions/external_resources/external_resources_settings.py +7 -5
  125. reconcile/gql_definitions/external_resources/fragments/external_resources_module_overrides.py +5 -5
  126. reconcile/gql_definitions/fleet_labeler/fleet_labels.py +5 -5
  127. reconcile/gql_definitions/fragments/aus_organization.py +5 -5
  128. reconcile/gql_definitions/fragments/aws_account_common.py +7 -5
  129. reconcile/gql_definitions/fragments/aws_account_managed.py +5 -5
  130. reconcile/gql_definitions/fragments/aws_account_sso.py +5 -5
  131. reconcile/gql_definitions/fragments/aws_infra_management_account.py +5 -5
  132. reconcile/gql_definitions/fragments/aws_organization.py +33 -0
  133. reconcile/gql_definitions/fragments/aws_vpc.py +5 -5
  134. reconcile/gql_definitions/fragments/aws_vpc_request.py +7 -5
  135. reconcile/gql_definitions/fragments/container_image_mirror.py +5 -5
  136. reconcile/gql_definitions/fragments/deploy_resources.py +5 -5
  137. reconcile/gql_definitions/fragments/disable.py +5 -5
  138. reconcile/gql_definitions/fragments/email_service.py +5 -5
  139. reconcile/gql_definitions/fragments/email_user.py +5 -5
  140. reconcile/gql_definitions/fragments/jumphost_common_fields.py +5 -5
  141. reconcile/gql_definitions/fragments/membership_source.py +5 -5
  142. reconcile/gql_definitions/fragments/minimal_ocm_organization.py +5 -5
  143. reconcile/gql_definitions/fragments/oc_connection_cluster.py +5 -5
  144. reconcile/gql_definitions/fragments/ocm_environment.py +5 -5
  145. reconcile/gql_definitions/fragments/pipeline_provider_retention.py +5 -5
  146. reconcile/gql_definitions/fragments/prometheus_instance.py +5 -5
  147. reconcile/gql_definitions/fragments/resource_limits_requirements.py +5 -5
  148. reconcile/gql_definitions/fragments/resource_requests_requirements.py +5 -5
  149. reconcile/gql_definitions/fragments/resource_values.py +5 -5
  150. reconcile/gql_definitions/fragments/saas_slo_document.py +5 -5
  151. reconcile/gql_definitions/fragments/saas_target_namespace.py +5 -5
  152. reconcile/gql_definitions/fragments/serviceaccount_token.py +5 -5
  153. reconcile/gql_definitions/fragments/terraform_state.py +5 -5
  154. reconcile/gql_definitions/fragments/upgrade_policy.py +5 -5
  155. reconcile/gql_definitions/fragments/user.py +5 -5
  156. reconcile/gql_definitions/fragments/vault_secret.py +5 -5
  157. reconcile/gql_definitions/gcp/gcp_docker_repos.py +5 -5
  158. reconcile/gql_definitions/gcp/gcp_projects.py +5 -5
  159. reconcile/gql_definitions/gitlab_members/gitlab_instances.py +5 -5
  160. reconcile/gql_definitions/gitlab_members/permissions.py +5 -5
  161. reconcile/gql_definitions/glitchtip/glitchtip_instance.py +5 -5
  162. reconcile/gql_definitions/glitchtip/glitchtip_project.py +5 -5
  163. reconcile/gql_definitions/glitchtip_project_alerts/glitchtip_project.py +5 -5
  164. reconcile/gql_definitions/integrations/integrations.py +5 -5
  165. reconcile/gql_definitions/introspection.json +2137 -1053
  166. reconcile/gql_definitions/jenkins_configs/jenkins_configs.py +5 -5
  167. reconcile/gql_definitions/jenkins_configs/jenkins_instances.py +5 -5
  168. reconcile/gql_definitions/jira/jira_servers.py +5 -5
  169. reconcile/gql_definitions/jira_permissions_validator/jira_boards_for_permissions_validator.py +9 -5
  170. reconcile/gql_definitions/jumphosts/jumphosts.py +5 -5
  171. reconcile/gql_definitions/ldap_groups/roles.py +5 -5
  172. reconcile/gql_definitions/ldap_groups/settings.py +5 -5
  173. reconcile/gql_definitions/maintenance/maintenances.py +5 -5
  174. reconcile/gql_definitions/membershipsources/roles.py +5 -5
  175. reconcile/gql_definitions/ocm_labels/clusters.py +5 -5
  176. reconcile/gql_definitions/ocm_labels/organizations.py +5 -5
  177. reconcile/gql_definitions/openshift_cluster_bots/clusters.py +5 -5
  178. reconcile/gql_definitions/openshift_groups/managed_groups.py +5 -5
  179. reconcile/gql_definitions/openshift_groups/managed_roles.py +5 -5
  180. reconcile/gql_definitions/openshift_serviceaccount_tokens/tokens.py +5 -5
  181. reconcile/gql_definitions/quay_membership/quay_membership.py +5 -5
  182. reconcile/gql_definitions/rhcs/certs.py +5 -5
  183. reconcile/gql_definitions/rhidp/organizations.py +5 -5
  184. reconcile/gql_definitions/service_dependencies/jenkins_instance_fragment.py +5 -5
  185. reconcile/gql_definitions/service_dependencies/service_dependencies.py +5 -5
  186. reconcile/gql_definitions/sharding/aws_accounts.py +5 -5
  187. reconcile/gql_definitions/sharding/ocm_organization.py +5 -5
  188. reconcile/gql_definitions/skupper_network/site_controller_template.py +5 -5
  189. reconcile/gql_definitions/skupper_network/skupper_networks.py +5 -5
  190. reconcile/gql_definitions/slack_usergroups/clusters.py +5 -5
  191. reconcile/gql_definitions/slack_usergroups/permissions.py +5 -5
  192. reconcile/gql_definitions/slack_usergroups/users.py +5 -5
  193. reconcile/gql_definitions/slo_documents/slo_documents.py +5 -5
  194. reconcile/gql_definitions/status_board/status_board.py +5 -5
  195. reconcile/gql_definitions/statuspage/statuspages.py +5 -5
  196. reconcile/gql_definitions/templating/template_collection.py +5 -5
  197. reconcile/gql_definitions/templating/templates.py +5 -5
  198. reconcile/gql_definitions/terraform_cloudflare_dns/app_interface_cloudflare_dns_settings.py +5 -5
  199. reconcile/gql_definitions/terraform_cloudflare_dns/terraform_cloudflare_zones.py +5 -5
  200. reconcile/gql_definitions/terraform_cloudflare_resources/terraform_cloudflare_accounts.py +5 -5
  201. reconcile/gql_definitions/terraform_cloudflare_resources/terraform_cloudflare_resources.py +5 -5
  202. reconcile/gql_definitions/terraform_cloudflare_users/app_interface_setting_cloudflare_and_vault.py +5 -5
  203. reconcile/gql_definitions/terraform_cloudflare_users/terraform_cloudflare_roles.py +5 -5
  204. reconcile/gql_definitions/terraform_init/aws_accounts.py +19 -5
  205. reconcile/gql_definitions/terraform_repo/terraform_repo.py +5 -5
  206. reconcile/gql_definitions/terraform_resources/database_access_manager.py +5 -5
  207. reconcile/gql_definitions/terraform_resources/terraform_resources_namespaces.py +38 -6
  208. reconcile/gql_definitions/terraform_tgw_attachments/aws_accounts.py +15 -5
  209. reconcile/gql_definitions/unleash_feature_toggles/feature_toggles.py +5 -5
  210. reconcile/gql_definitions/vault_instances/vault_instances.py +5 -5
  211. reconcile/gql_definitions/vault_policies/vault_policies.py +5 -5
  212. reconcile/gql_definitions/vpc_peerings_validator/vpc_peerings_validator.py +5 -5
  213. reconcile/gql_definitions/vpc_peerings_validator/vpc_peerings_validator_peered_cluster_fragment.py +5 -5
  214. reconcile/integrations_manager.py +3 -3
  215. reconcile/jenkins_worker_fleets.py +10 -8
  216. reconcile/jira_permissions_validator.py +237 -122
  217. reconcile/ldap_groups/integration.py +1 -1
  218. reconcile/ocm/types.py +35 -56
  219. reconcile/ocm_aws_infrastructure_access.py +1 -1
  220. reconcile/ocm_clusters.py +4 -4
  221. reconcile/ocm_labels/integration.py +3 -2
  222. reconcile/ocm_machine_pools.py +23 -23
  223. reconcile/openshift_base.py +53 -2
  224. reconcile/openshift_cluster_bots.py +3 -2
  225. reconcile/openshift_namespace_labels.py +1 -1
  226. reconcile/openshift_namespaces.py +97 -101
  227. reconcile/openshift_resources_base.py +6 -2
  228. reconcile/openshift_rhcs_certs.py +5 -5
  229. reconcile/openshift_rolebindings.py +7 -11
  230. reconcile/openshift_saas_deploy.py +6 -7
  231. reconcile/openshift_saas_deploy_change_tester.py +9 -7
  232. reconcile/openshift_saas_deploy_trigger_cleaner.py +3 -5
  233. reconcile/openshift_serviceaccount_tokens.py +2 -2
  234. reconcile/openshift_upgrade_watcher.py +4 -4
  235. reconcile/oum/labelset.py +5 -3
  236. reconcile/oum/models.py +1 -4
  237. reconcile/prometheus_rules_tester/integration.py +3 -3
  238. reconcile/quay_mirror.py +1 -1
  239. reconcile/queries.py +131 -1
  240. reconcile/rhidp/common.py +3 -5
  241. reconcile/rhidp/sso_client/base.py +1 -1
  242. reconcile/saas_auto_promotions_manager/merge_request_manager/renderer.py +1 -1
  243. reconcile/saas_auto_promotions_manager/subscriber.py +4 -3
  244. reconcile/skupper_network/integration.py +2 -2
  245. reconcile/slack_usergroups.py +35 -14
  246. reconcile/sql_query.py +1 -0
  247. reconcile/status_board.py +6 -6
  248. reconcile/statuspage/atlassian.py +7 -7
  249. reconcile/statuspage/integrations/maintenances.py +4 -3
  250. reconcile/statuspage/page.py +4 -9
  251. reconcile/statuspage/status.py +5 -8
  252. reconcile/templates/rosa-classic-cluster-creation.sh.j2 +4 -0
  253. reconcile/templates/rosa-hcp-cluster-creation.sh.j2 +3 -0
  254. reconcile/templating/lib/rendering.py +3 -3
  255. reconcile/templating/renderer.py +4 -3
  256. reconcile/terraform_aws_route53.py +7 -1
  257. reconcile/terraform_cloudflare_dns.py +3 -3
  258. reconcile/terraform_cloudflare_resources.py +5 -5
  259. reconcile/terraform_cloudflare_users.py +3 -2
  260. reconcile/terraform_init/integration.py +187 -23
  261. reconcile/terraform_repo.py +16 -12
  262. reconcile/terraform_resources.py +17 -7
  263. reconcile/terraform_tgw_attachments.py +27 -19
  264. reconcile/terraform_users.py +7 -0
  265. reconcile/terraform_vpc_peerings.py +14 -3
  266. reconcile/terraform_vpc_resources/integration.py +10 -1
  267. reconcile/typed_queries/aws_account_tags.py +41 -0
  268. reconcile/typed_queries/cost_report/app_names.py +1 -1
  269. reconcile/typed_queries/cost_report/cost_namespaces.py +2 -2
  270. reconcile/typed_queries/saas_files.py +13 -13
  271. reconcile/typed_queries/status_board.py +2 -2
  272. reconcile/unleash_feature_toggles/integration.py +4 -2
  273. reconcile/utils/acs/base.py +6 -3
  274. reconcile/utils/acs/policies.py +2 -2
  275. reconcile/utils/aggregated_list.py +4 -3
  276. reconcile/utils/aws_api.py +51 -54
  277. reconcile/utils/aws_api_typed/api.py +38 -9
  278. reconcile/utils/aws_api_typed/cloudformation.py +149 -0
  279. reconcile/utils/aws_api_typed/logs.py +73 -0
  280. reconcile/utils/aws_api_typed/organization.py +4 -2
  281. reconcile/utils/datetime_util.py +67 -0
  282. reconcile/utils/deadmanssnitch_api.py +1 -1
  283. reconcile/utils/differ.py +2 -3
  284. reconcile/utils/early_exit_cache.py +11 -12
  285. reconcile/utils/expiration.py +7 -3
  286. reconcile/utils/external_resource_spec.py +24 -1
  287. reconcile/utils/filtering.py +1 -1
  288. reconcile/utils/gitlab_api.py +7 -5
  289. reconcile/utils/glitchtip/client.py +6 -2
  290. reconcile/utils/glitchtip/models.py +25 -28
  291. reconcile/utils/gql.py +4 -7
  292. reconcile/utils/helm.py +2 -1
  293. reconcile/utils/helpers.py +1 -1
  294. reconcile/utils/instrumented_wrappers.py +1 -1
  295. reconcile/utils/internal_groups/client.py +2 -2
  296. reconcile/utils/internal_groups/models.py +8 -17
  297. reconcile/utils/jinja2/utils.py +6 -101
  298. reconcile/utils/jira_client.py +82 -63
  299. reconcile/utils/jjb_client.py +9 -12
  300. reconcile/utils/jobcontroller/controller.py +1 -1
  301. reconcile/utils/jobcontroller/models.py +17 -1
  302. reconcile/utils/json.py +70 -0
  303. reconcile/utils/membershipsources/app_interface_resolver.py +4 -2
  304. reconcile/utils/membershipsources/models.py +16 -23
  305. reconcile/utils/membershipsources/resolver.py +4 -2
  306. reconcile/utils/merge_request_manager/merge_request_manager.py +4 -4
  307. reconcile/utils/merge_request_manager/parser.py +6 -6
  308. reconcile/utils/metrics.py +5 -5
  309. reconcile/utils/models.py +304 -82
  310. reconcile/utils/mr/app_interface_reporter.py +2 -2
  311. reconcile/utils/mr/base.py +2 -2
  312. reconcile/utils/mr/notificator.py +3 -3
  313. reconcile/utils/mr/update_access_report_base.py +3 -4
  314. reconcile/utils/mr/user_maintenance.py +3 -2
  315. reconcile/utils/oc.py +118 -97
  316. reconcile/utils/oc_filters.py +3 -3
  317. reconcile/utils/ocm/addons.py +0 -1
  318. reconcile/utils/ocm/base.py +17 -20
  319. reconcile/utils/ocm/cluster_groups.py +1 -1
  320. reconcile/utils/ocm/identity_providers.py +2 -2
  321. reconcile/utils/ocm/labels.py +1 -1
  322. reconcile/utils/ocm/products.py +9 -3
  323. reconcile/utils/ocm/search_filters.py +3 -6
  324. reconcile/utils/ocm/service_log.py +4 -6
  325. reconcile/utils/ocm/sre_capability_labels.py +20 -13
  326. reconcile/utils/openshift_resource.py +10 -5
  327. reconcile/utils/output.py +3 -2
  328. reconcile/utils/pagerduty_api.py +10 -7
  329. reconcile/utils/promotion_state.py +6 -11
  330. reconcile/utils/raw_github_api.py +1 -1
  331. reconcile/utils/rhcsv2_certs.py +1 -4
  332. reconcile/utils/runtime/integration.py +2 -3
  333. reconcile/utils/runtime/runner.py +2 -2
  334. reconcile/utils/saasherder/interfaces.py +13 -20
  335. reconcile/utils/saasherder/models.py +25 -21
  336. reconcile/utils/saasherder/saasherder.py +35 -24
  337. reconcile/utils/slack_api.py +26 -4
  338. reconcile/utils/sloth.py +171 -2
  339. reconcile/utils/sqs_gateway.py +2 -1
  340. reconcile/utils/state.py +2 -1
  341. reconcile/utils/structs.py +1 -1
  342. reconcile/utils/terraform_client.py +5 -4
  343. reconcile/utils/terrascript_aws_client.py +171 -114
  344. reconcile/utils/unleash/server.py +2 -8
  345. reconcile/utils/vault.py +5 -12
  346. reconcile/utils/vcs.py +8 -8
  347. reconcile/vault_replication.py +107 -42
  348. tools/app_interface_reporter.py +4 -4
  349. tools/cli_commands/cost_report/cost_management_api.py +3 -3
  350. tools/cli_commands/cost_report/view.py +7 -6
  351. tools/cli_commands/erv2.py +3 -1
  352. tools/cli_commands/systems_and_tools.py +5 -1
  353. tools/qontract_cli.py +31 -18
  354. tools/template_validation.py +3 -1
  355. {qontract_reconcile-0.10.2.dev349.dist-info → qontract_reconcile-0.10.2.dev414.dist-info}/WHEEL +0 -0
  356. {qontract_reconcile-0.10.2.dev349.dist-info → qontract_reconcile-0.10.2.dev414.dist-info}/entry_points.txt +0 -0
@@ -33,14 +33,11 @@ QONTRACT_INTEGRATION = "openshift-rolebindings"
33
33
  QONTRACT_INTEGRATION_VERSION = make_semver(0, 3, 0)
34
34
 
35
35
 
36
- class OCResource(BaseModel):
36
+ class OCResource(BaseModel, arbitrary_types_allowed=True):
37
37
  resource: OR
38
38
  resource_name: str
39
39
  privileged: bool
40
40
 
41
- class Config:
42
- arbitrary_types_allowed = True
43
-
44
41
 
45
42
  @dataclass
46
43
  class ServiceAccountSpec:
@@ -61,7 +58,7 @@ class ServiceAccountSpec:
61
58
  ]
62
59
 
63
60
 
64
- class RoleBindingSpec(BaseModel):
61
+ class RoleBindingSpec(BaseModel, validate_by_alias=True, arbitrary_types_allowed=True):
65
62
  role_name: str
66
63
  role_kind: str
67
64
  namespace: NamespaceV1
@@ -70,9 +67,6 @@ class RoleBindingSpec(BaseModel):
70
67
  usernames: set[str]
71
68
  openshift_service_accounts: list[ServiceAccountSpec]
72
69
 
73
- class Config:
74
- arbitrary_types_allowed = True
75
-
76
70
  def get_users_desired_state(self) -> list[dict[str, str]]:
77
71
  return [
78
72
  {"cluster": self.cluster.name, "user": username}
@@ -93,7 +87,9 @@ class RoleBindingSpec(BaseModel):
93
87
  if not (access.role or access.cluster_role):
94
88
  return None
95
89
  privileged = access.namespace.cluster_admin or False
96
- auth_dict = [auth.dict(by_alias=True) for auth in access.namespace.cluster.auth]
90
+ auth_dict = [
91
+ auth.model_dump(by_alias=True) for auth in access.namespace.cluster.auth
92
+ ]
97
93
  usernames = RoleBindingSpec.get_usernames_from_users(
98
94
  users,
99
95
  ob.determine_user_keys_for_access(
@@ -290,7 +286,7 @@ def is_valid_namespace(namespace: NamespaceV1 | CommonNamespaceV1) -> bool:
290
286
  return (
291
287
  bool(namespace.managed_roles)
292
288
  and is_in_shard(f"{namespace.cluster.name}/{namespace.name}")
293
- and not ob.is_namespace_deleted(namespace.dict(by_alias=True))
289
+ and not ob.is_namespace_deleted(namespace.model_dump(by_alias=True))
294
290
  )
295
291
 
296
292
 
@@ -304,7 +300,7 @@ def run(
304
300
  defer: Callable | None = None,
305
301
  ) -> None:
306
302
  namespaces = [
307
- namespace.dict(by_alias=True, exclude={"openshift_resources"})
303
+ namespace.model_dump(by_alias=True, exclude={"openshift_resources"})
308
304
  for namespace in get_namespaces()
309
305
  if is_valid_namespace(namespace)
310
306
  ]
@@ -1,4 +1,3 @@
1
- import json
2
1
  import logging
3
2
  import os
4
3
  import sys
@@ -28,6 +27,7 @@ from reconcile.typed_queries.saas_files import (
28
27
  from reconcile.utils.constants import DEFAULT_THREAD_POOL_SIZE
29
28
  from reconcile.utils.defer import defer
30
29
  from reconcile.utils.gitlab_api import GitLabApi
30
+ from reconcile.utils.json import json_dumps
31
31
  from reconcile.utils.openshift_resource import ResourceInventory
32
32
  from reconcile.utils.saasherder import SaasHerder
33
33
  from reconcile.utils.secret_reader import create_secret_reader
@@ -150,7 +150,7 @@ def run(
150
150
  + "when using slack notifications"
151
151
  )
152
152
  slack = slackapi_from_slack_workspace(
153
- saas_file.slack.dict(by_alias=True),
153
+ saas_file.slack.model_dump(by_alias=True),
154
154
  secret_reader,
155
155
  QONTRACT_INTEGRATION,
156
156
  init_usergroups=False,
@@ -224,7 +224,7 @@ def run(
224
224
  default=False,
225
225
  )
226
226
  ri, oc_map = ob.fetch_current_state(
227
- namespaces=[ns.dict(by_alias=True) for ns in saasherder.namespaces],
227
+ namespaces=[ns.model_dump(by_alias=True) for ns in saasherder.namespaces],
228
228
  thread_pool_size=thread_pool_size,
229
229
  integration=QONTRACT_INTEGRATION,
230
230
  integration_version=QONTRACT_INTEGRATION_VERSION,
@@ -319,14 +319,13 @@ def run(
319
319
  openshift_saas_deploy_trigger_upstream_jobs.QONTRACT_INTEGRATION,
320
320
  openshift_saas_deploy_trigger_images.QONTRACT_INTEGRATION,
321
321
  ]
322
- scan = (
322
+ if (
323
323
  not dry_run
324
324
  and len(saas_files) == 1
325
325
  and trigger_integration
326
326
  and trigger_integration in allowed_integration
327
327
  and trigger_reason
328
- )
329
- if scan:
328
+ ):
330
329
  saas_file = saas_files[0]
331
330
  owners = saas_file.app.service_owners or []
332
331
  emails = " ".join([o.email for o in owners])
@@ -346,4 +345,4 @@ def run(
346
345
  if image_auth.auth_server:
347
346
  json_file = os.path.join(io_dir, "dockerconfigjson")
348
347
  with open(json_file, "w", encoding="locale") as f:
349
- f.write(json.dumps(image_auth.get_docker_config_json(), indent=2))
348
+ f.write(json_dumps(image_auth.get_docker_config_json(), indent=2))
@@ -34,7 +34,7 @@ class Definition(BaseModel):
34
34
  class State(BaseModel):
35
35
  saas_file_path: str
36
36
  saas_file_name: str
37
- saas_file_deploy_resources: DeployResourcesV1 | None
37
+ saas_file_deploy_resources: DeployResourcesV1 | None = None
38
38
  resource_template_name: str
39
39
  cluster: str
40
40
  namespace: str
@@ -44,10 +44,10 @@ class State(BaseModel):
44
44
  parameters: dict[str, Any]
45
45
  secret_parameters: dict[str, VaultSecret]
46
46
  saas_file_definitions: Definition
47
- upstream: SaasResourceTemplateTargetUpstreamV1 | None
48
- disable: bool | None
49
- delete: bool | None
50
- target_path: str | None
47
+ upstream: SaasResourceTemplateTargetUpstreamV1 | None = None
48
+ disable: bool | None = None
49
+ delete: bool | None = None
50
+ target_path: str | None = None
51
51
 
52
52
 
53
53
  def osd_run_wrapper(
@@ -213,11 +213,13 @@ def run(
213
213
  saas_file_list = SaasFileList()
214
214
  desired_saas_file_state = collect_state(saas_file_list.saas_files)
215
215
  # compare dicts against dicts which is much faster than comparing BaseModel objects
216
- comparison_saas_file_state_dicts = [s.dict() for s in comparison_saas_file_state]
216
+ comparison_saas_file_state_dicts = [
217
+ s.model_dump() for s in comparison_saas_file_state
218
+ ]
217
219
  saas_file_state_diffs = [
218
220
  s
219
221
  for s in desired_saas_file_state
220
- if s.dict() not in comparison_saas_file_state_dicts
222
+ if s.model_dump() not in comparison_saas_file_state_dicts
221
223
  ]
222
224
  if not saas_file_state_diffs:
223
225
  return
@@ -1,14 +1,11 @@
1
1
  import logging
2
2
  from collections.abc import Callable
3
3
  from datetime import (
4
- UTC,
5
4
  datetime,
6
5
  timedelta,
7
6
  )
8
7
  from typing import Any
9
8
 
10
- from dateutil import parser
11
-
12
9
  from reconcile.gql_definitions.fragments.pipeline_provider_retention import (
13
10
  PipelineProviderRetention,
14
11
  )
@@ -19,6 +16,7 @@ from reconcile.typed_queries.tekton_pipeline_providers import (
19
16
  get_tekton_pipeline_providers,
20
17
  )
21
18
  from reconcile.utils.constants import DEFAULT_THREAD_POOL_SIZE
19
+ from reconcile.utils.datetime_util import from_utc_iso_format, utc_now
22
20
  from reconcile.utils.defer import defer
23
21
  from reconcile.utils.oc_map import (
24
22
  OCLogMsg,
@@ -35,7 +33,7 @@ def within_retention_days(
35
33
  resource: dict[str, Any], days: int, now_date: datetime
36
34
  ) -> bool:
37
35
  metadata = resource["metadata"]
38
- creation_date = parser.parse(metadata["creationTimestamp"])
36
+ creation_date = from_utc_iso_format(metadata["creationTimestamp"])
39
37
  interval = now_date.timestamp() - creation_date.timestamp()
40
38
 
41
39
  return interval < timedelta(days=days).total_seconds()
@@ -69,7 +67,7 @@ def run(
69
67
  use_jump_host: bool = True,
70
68
  defer: Callable | None = None,
71
69
  ) -> None:
72
- now_date = datetime.now(UTC)
70
+ now_date = utc_now()
73
71
  vault_settings = get_app_interface_vault_settings()
74
72
  secret_reader = create_secret_reader(use_vault=vault_settings.vault)
75
73
  pipeline_providers = get_tekton_pipeline_providers()
@@ -177,7 +177,7 @@ def canonicalize_namespaces(namespaces: Iterable[NamespaceV1]) -> list[Namespace
177
177
  key = f"{sat.namespace.cluster.name}/{sat.namespace.name}"
178
178
  if key not in canonicalized_namespaces:
179
179
  canonicalized_namespaces[key] = NamespaceV1(
180
- **sat.namespace.dict(by_alias=True),
180
+ **sat.namespace.model_dump(by_alias=True),
181
181
  sharedResources=None,
182
182
  openshiftServiceAccountTokens=None,
183
183
  )
@@ -217,7 +217,7 @@ def run(
217
217
  get_namespaces_with_serviceaccount_tokens(gql_api.query)
218
218
  )
219
219
  ri, oc_map = ob.fetch_current_state(
220
- namespaces=[ns.dict(by_alias=True) for ns in namespaces],
220
+ namespaces=[ns.model_dump(by_alias=True) for ns in namespaces],
221
221
  thread_pool_size=thread_pool_size,
222
222
  integration=QONTRACT_INTEGRATION,
223
223
  integration_version=QONTRACT_INTEGRATION_VERSION,
@@ -3,7 +3,6 @@ from collections.abc import (
3
3
  Callable,
4
4
  Iterable,
5
5
  )
6
- from datetime import datetime
7
6
 
8
7
  from reconcile import queries
9
8
  from reconcile.gql_definitions.common.clusters import ClusterV1
@@ -13,6 +12,7 @@ from reconcile.typed_queries.app_interface_vault_settings import (
13
12
  )
14
13
  from reconcile.typed_queries.clusters import get_clusters
15
14
  from reconcile.utils.constants import DEFAULT_THREAD_POOL_SIZE
15
+ from reconcile.utils.datetime_util import from_utc_iso_format, utc_now
16
16
  from reconcile.utils.defer import defer
17
17
  from reconcile.utils.oc_map import (
18
18
  OCLogMsg,
@@ -101,7 +101,7 @@ def notify_upgrades_start(
101
101
  state: State,
102
102
  slack: SlackApi | None,
103
103
  ) -> None:
104
- now = datetime.utcnow()
104
+ now = utc_now()
105
105
  for cluster in clusters:
106
106
  if cluster.spec and not cluster.spec.hypershift:
107
107
  upgrade_at, version = _get_start_osd(oc_map, cluster.name)
@@ -113,7 +113,7 @@ def notify_upgrades_start(
113
113
  continue
114
114
 
115
115
  if upgrade_at and version:
116
- upgrade_at_obj = datetime.strptime(upgrade_at, "%Y-%m-%dT%H:%M:%SZ")
116
+ upgrade_at_obj = from_utc_iso_format(upgrade_at)
117
117
  state_key = f"{cluster.name}-{upgrade_at}1"
118
118
  # if this is the first iteration in which 'now' had passed
119
119
  # the upgrade at date time, we send a notification
@@ -185,7 +185,7 @@ def run(
185
185
  if defer:
186
186
  defer(oc_map.cleanup)
187
187
 
188
- cluster_like_objects = [cluster.dict(by_alias=True) for cluster in clusters]
188
+ cluster_like_objects = [cluster.model_dump(by_alias=True) for cluster in clusters]
189
189
  ocm_map = OCMMap(
190
190
  clusters=cluster_like_objects,
191
191
  integration=QONTRACT_INTEGRATION,
reconcile/oum/labelset.py CHANGED
@@ -1,4 +1,5 @@
1
1
  from collections import defaultdict
2
+ from typing import Annotated
2
3
 
3
4
  from pydantic import BaseModel
4
5
 
@@ -22,9 +23,10 @@ class _GroupMappingLabelset(BaseModel):
22
23
  the sre-capabilities.user-mgmt.$provider prefix.
23
24
  """
24
25
 
25
- authz_roles: dict[str, CSV] | None = sre_capability_labels.labelset_groupfield(
26
- group_prefix="authz."
27
- )
26
+ authz_roles: Annotated[
27
+ dict[str, CSV] | None,
28
+ sre_capability_labels.labelset_groupfield(group_prefix="authz."),
29
+ ]
28
30
 
29
31
 
30
32
  def build_cluster_config_from_labels(
reconcile/oum/models.py CHANGED
@@ -56,7 +56,7 @@ class ClusterUserManagementSpec(BaseModel):
56
56
  errors: list[ClusterError] = Field(default_factory=list)
57
57
 
58
58
 
59
- class ClusterRoleReconcileResult(BaseModel):
59
+ class ClusterRoleReconcileResult(BaseModel, arbitrary_types_allowed=True):
60
60
  """
61
61
  Holds the result of a cluster role reconciliation.
62
62
  """
@@ -64,6 +64,3 @@ class ClusterRoleReconcileResult(BaseModel):
64
64
  users_added: int = 0
65
65
  users_removed: int = 0
66
66
  error: Exception | None = None
67
-
68
- class Config:
69
- arbitrary_types_allowed = True
@@ -56,7 +56,7 @@ class Test(BaseModel):
56
56
  rule_path: str
57
57
  rule: dict
58
58
  rule_length: int
59
- tests: list[TestContent] | None
59
+ tests: list[TestContent] | None = None
60
60
  result: CommandExecutionResult | None = None
61
61
  promtool_version: str
62
62
 
@@ -76,7 +76,7 @@ def fetch_rule_and_tests(
76
76
  openshift_resource = orb.fetch_openshift_resource(
77
77
  resource=rule.resource,
78
78
  parent=rule.namespace,
79
- settings=vault_settings.dict(by_alias=True),
79
+ settings=vault_settings.model_dump(by_alias=True),
80
80
  )
81
81
 
82
82
  rule_body = openshift_resource.body
@@ -96,7 +96,7 @@ def fetch_rule_and_tests(
96
96
  test_raw_yaml = process_extracurlyjinja2_template(
97
97
  body=test_raw_yaml,
98
98
  vars=variables,
99
- settings=vault_settings.dict(by_alias=True),
99
+ settings=vault_settings.model_dump(by_alias=True),
100
100
  )
101
101
 
102
102
  test_yaml_spec = yaml.safe_load(test_raw_yaml)
reconcile/quay_mirror.py CHANGED
@@ -66,7 +66,7 @@ class QuayMirror:
66
66
  }
67
67
  """
68
68
 
69
- response_cache: dict[tuple[str, str], Response] = {}
69
+ response_cache: dict[tuple[str, str | None], Response] = {}
70
70
 
71
71
  def __init__(
72
72
  self,
reconcile/queries.py CHANGED
@@ -476,8 +476,13 @@ AWS_ACCOUNTS_QUERY = """
476
476
  disable {
477
477
  integrations
478
478
  }
479
- disableKeys
480
479
  deleteKeys
480
+ organization {
481
+ payerAccount {
482
+ organizationAccountTags
483
+ }
484
+ tags
485
+ }
481
486
  {% if reset_passwords %}
482
487
  resetPasswords {
483
488
  user {
@@ -500,6 +505,12 @@ AWS_ACCOUNTS_QUERY = """
500
505
  name
501
506
  uid
502
507
  supportedDeploymentRegions
508
+ organization {
509
+ payerAccount {
510
+ organizationAccountTags
511
+ }
512
+ tags
513
+ }
503
514
  }
504
515
  ... on AWSAccountSharingOptionAMI_v1 {
505
516
  regex
@@ -607,6 +618,12 @@ awsInfrastructureManagementAccounts {
607
618
  version
608
619
  format
609
620
  }
621
+ organization {
622
+ payerAccount {
623
+ organizationAccountTags
624
+ }
625
+ tags
626
+ }
610
627
  }
611
628
  accessLevel
612
629
  default
@@ -637,6 +654,12 @@ awsInfrastructureAccess {
637
654
  version
638
655
  format
639
656
  }
657
+ organization {
658
+ payerAccount {
659
+ organizationAccountTags
660
+ }
661
+ tags
662
+ }
640
663
  }
641
664
  roles {
642
665
  users {
@@ -746,6 +769,12 @@ CLUSTERS_QUERY = """
746
769
  version
747
770
  format
748
771
  }
772
+ organization {
773
+ payerAccount {
774
+ organizationAccountTags
775
+ }
776
+ tags
777
+ }
749
778
  rosa {
750
779
  ocm_environments {
751
780
  ocm {
@@ -774,6 +803,7 @@ CLUSTERS_QUERY = """
774
803
  private
775
804
  provision_shard_id
776
805
  disable_user_workload_monitoring
806
+ fips
777
807
  }
778
808
  externalConfiguration {
779
809
  labels
@@ -830,6 +860,12 @@ CLUSTERS_QUERY = """
830
860
  version
831
861
  format
832
862
  }
863
+ organization {
864
+ payerAccount {
865
+ organizationAccountTags
866
+ }
867
+ tags
868
+ }
833
869
  }
834
870
  vpc_id
835
871
  cidr_block
@@ -848,6 +884,12 @@ CLUSTERS_QUERY = """
848
884
  version
849
885
  format
850
886
  }
887
+ organization {
888
+ payerAccount {
889
+ organizationAccountTags
890
+ }
891
+ tags
892
+ }
851
893
  }
852
894
  tags
853
895
  }
@@ -862,6 +904,12 @@ CLUSTERS_QUERY = """
862
904
  version
863
905
  format
864
906
  }
907
+ organization {
908
+ payerAccount {
909
+ organizationAccountTags
910
+ }
911
+ tags
912
+ }
865
913
  }
866
914
  tags
867
915
  cidrBlock
@@ -890,6 +938,12 @@ CLUSTERS_QUERY = """
890
938
  version
891
939
  format
892
940
  }
941
+ organization {
942
+ payerAccount {
943
+ organizationAccountTags
944
+ }
945
+ tags
946
+ }
893
947
  }
894
948
  }
895
949
  accessLevel
@@ -915,6 +969,12 @@ CLUSTERS_QUERY = """
915
969
  version
916
970
  format
917
971
  }
972
+ organization {
973
+ payerAccount {
974
+ organizationAccountTags
975
+ }
976
+ tags
977
+ }
918
978
  }
919
979
  }
920
980
  }
@@ -1068,6 +1128,12 @@ CLUSTER_PEERING_QUERY = """
1068
1128
  version
1069
1129
  format
1070
1130
  }
1131
+ organization {
1132
+ payerAccount {
1133
+ organizationAccountTags
1134
+ }
1135
+ tags
1136
+ }
1071
1137
  }
1072
1138
  accessLevel
1073
1139
  default
@@ -1089,6 +1155,12 @@ CLUSTER_PEERING_QUERY = """
1089
1155
  version
1090
1156
  format
1091
1157
  }
1158
+ organization {
1159
+ payerAccount {
1160
+ organizationAccountTags
1161
+ }
1162
+ tags
1163
+ }
1092
1164
  }
1093
1165
  }
1094
1166
  }
@@ -1113,6 +1185,12 @@ CLUSTER_PEERING_QUERY = """
1113
1185
  version
1114
1186
  format
1115
1187
  }
1188
+ organization {
1189
+ payerAccount {
1190
+ organizationAccountTags
1191
+ }
1192
+ tags
1193
+ }
1116
1194
  }
1117
1195
  vpc_id
1118
1196
  cidr_block
@@ -1132,6 +1210,12 @@ CLUSTER_PEERING_QUERY = """
1132
1210
  version
1133
1211
  format
1134
1212
  }
1213
+ organization {
1214
+ payerAccount {
1215
+ organizationAccountTags
1216
+ }
1217
+ tags
1218
+ }
1135
1219
  }
1136
1220
  tags
1137
1221
  assumeRole
@@ -1147,6 +1231,12 @@ CLUSTER_PEERING_QUERY = """
1147
1231
  version
1148
1232
  format
1149
1233
  }
1234
+ organization {
1235
+ payerAccount {
1236
+ organizationAccountTags
1237
+ }
1238
+ tags
1239
+ }
1150
1240
  }
1151
1241
  tags
1152
1242
  cidrBlock
@@ -1176,6 +1266,12 @@ CLUSTER_PEERING_QUERY = """
1176
1266
  version
1177
1267
  format
1178
1268
  }
1269
+ organization {
1270
+ payerAccount {
1271
+ organizationAccountTags
1272
+ }
1273
+ tags
1274
+ }
1179
1275
  }
1180
1276
  }
1181
1277
  }
@@ -1191,6 +1287,12 @@ CLUSTER_PEERING_QUERY = """
1191
1287
  version
1192
1288
  format
1193
1289
  }
1290
+ organization {
1291
+ payerAccount {
1292
+ organizationAccountTags
1293
+ }
1294
+ tags
1295
+ }
1194
1296
  }
1195
1297
  accessLevel
1196
1298
  default
@@ -1217,6 +1319,12 @@ CLUSTER_PEERING_QUERY = """
1217
1319
  version
1218
1320
  format
1219
1321
  }
1322
+ organization {
1323
+ payerAccount {
1324
+ organizationAccountTags
1325
+ }
1326
+ tags
1327
+ }
1220
1328
  }
1221
1329
  }
1222
1330
  }
@@ -1232,6 +1340,12 @@ CLUSTER_PEERING_QUERY = """
1232
1340
  version
1233
1341
  format
1234
1342
  }
1343
+ organization {
1344
+ payerAccount {
1345
+ organizationAccountTags
1346
+ }
1347
+ tags
1348
+ }
1235
1349
  }
1236
1350
  }
1237
1351
  }
@@ -2231,6 +2345,12 @@ JIRA_BOARDS_QUICK_QUERY = """
2231
2345
  version
2232
2346
  format
2233
2347
  }
2348
+ email {
2349
+ path
2350
+ field
2351
+ version
2352
+ format
2353
+ }
2234
2354
  }
2235
2355
  }
2236
2356
  }
@@ -2337,6 +2457,12 @@ DNS_ZONES_QUERY = """
2337
2457
  version
2338
2458
  format
2339
2459
  }
2460
+ organization {
2461
+ payerAccount {
2462
+ organizationAccountTags
2463
+ }
2464
+ tags
2465
+ }
2340
2466
  }
2341
2467
  vpc {
2342
2468
  vpc_id
@@ -2698,6 +2824,10 @@ APP_METADATA = """
2698
2824
  path
2699
2825
  field
2700
2826
  }
2827
+ email {
2828
+ path
2829
+ field
2830
+ }
2701
2831
  }
2702
2832
  }
2703
2833
  slackUserGroup {
reconcile/rhidp/common.py CHANGED
@@ -7,10 +7,7 @@ from enum import StrEnum
7
7
  from typing import Any
8
8
  from urllib.parse import urlparse
9
9
 
10
- from pydantic import (
11
- BaseModel,
12
- root_validator,
13
- )
10
+ from pydantic import BaseModel, model_validator
14
11
 
15
12
  from reconcile.gql_definitions.common.ocm_environments import (
16
13
  query as ocm_environment_query,
@@ -63,7 +60,8 @@ class ClusterAuth(BaseModel):
63
60
  issuer: str
64
61
  status: str
65
62
 
66
- @root_validator
63
+ @model_validator(mode="before")
64
+ @classmethod
67
65
  def name_no_spaces(
68
66
  cls, values: MutableMapping[str, Any]
69
67
  ) -> MutableMapping[str, Any]:
@@ -237,7 +237,7 @@ def create_sso_client(
237
237
  secret_reader.vault_client.write(
238
238
  secret={
239
239
  "path": secret.path,
240
- "data": sso_client.dict(),
240
+ "data": sso_client.model_dump(),
241
241
  },
242
242
  decode_base64=False,
243
243
  )
@@ -177,7 +177,7 @@ def is_namespace_addressed_by_selector(
177
177
  # json representation of namespace to filter on
178
178
  # remove all the None values to simplify the jsonpath expressions
179
179
  namespace_as_dict = {
180
- "namespace": [namespace.dict(by_alias=True, exclude_none=True)]
180
+ "namespace": [namespace.model_dump(by_alias=True, exclude_none=True)]
181
181
  }
182
182
 
183
183
  do_include = any(
@@ -2,7 +2,7 @@ import hashlib
2
2
  import logging
3
3
  from collections.abc import Iterable
4
4
  from dataclasses import dataclass
5
- from datetime import UTC, datetime, timedelta
5
+ from datetime import timedelta
6
6
 
7
7
  from croniter import croniter
8
8
 
@@ -13,6 +13,7 @@ from reconcile.saas_auto_promotions_manager.publisher import (
13
13
  DeploymentInfo,
14
14
  Publisher,
15
15
  )
16
+ from reconcile.utils.datetime_util import utc_now
16
17
  from reconcile.utils.slo_document_manager import SLODocumentManager
17
18
 
18
19
  CONTENT_HASH_LENGTH = 32
@@ -113,7 +114,7 @@ class Subscriber:
113
114
  We accumulate the time a ref is running on all publishers for this subscriber.
114
115
  We compare that accumulated time with the soak_days setting of the subscriber.
115
116
  """
116
- now = datetime.now(UTC)
117
+ now = utc_now()
117
118
  delta = timedelta(days=0)
118
119
  for channel in self.channels:
119
120
  for publisher in channel.publishers:
@@ -136,7 +137,7 @@ class Subscriber:
136
137
  self.schedule,
137
138
  )
138
139
  return False
139
- return croniter.match(self.schedule, datetime.now(UTC), day_or=False)
140
+ return croniter.match(self.schedule, utc_now(), day_or=False)
140
141
 
141
142
  def _compute_desired_ref(self) -> None:
142
143
  """