qontract-reconcile 0.10.2.dev310__py3-none-any.whl → 0.10.2.dev439__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.
Potentially problematic release.
This version of qontract-reconcile might be problematic. Click here for more details.
- {qontract_reconcile-0.10.2.dev310.dist-info → qontract_reconcile-0.10.2.dev439.dist-info}/METADATA +13 -12
- {qontract_reconcile-0.10.2.dev310.dist-info → qontract_reconcile-0.10.2.dev439.dist-info}/RECORD +396 -391
- reconcile/acs_rbac.py +2 -2
- reconcile/aus/advanced_upgrade_service.py +18 -12
- reconcile/aus/base.py +134 -32
- reconcile/aus/cluster_version_data.py +15 -5
- reconcile/aus/models.py +3 -1
- reconcile/aus/ocm_addons_upgrade_scheduler_org.py +1 -0
- reconcile/aus/ocm_upgrade_scheduler.py +8 -1
- reconcile/aus/ocm_upgrade_scheduler_org.py +20 -5
- reconcile/aus/version_gates/sts_version_gate_handler.py +54 -1
- reconcile/automated_actions/config/integration.py +16 -4
- reconcile/aws_account_manager/integration.py +8 -8
- reconcile/aws_account_manager/reconciler.py +3 -3
- reconcile/aws_ami_cleanup/integration.py +8 -12
- reconcile/aws_ami_share.py +69 -62
- reconcile/aws_cloudwatch_log_retention/integration.py +155 -126
- reconcile/aws_ecr_image_pull_secrets.py +5 -5
- reconcile/aws_iam_keys.py +1 -0
- reconcile/aws_saml_idp/integration.py +12 -4
- reconcile/aws_saml_roles/integration.py +32 -25
- reconcile/aws_version_sync/integration.py +125 -84
- reconcile/change_owners/bundle.py +3 -3
- reconcile/change_owners/change_log_tracking.py +3 -2
- reconcile/change_owners/change_owners.py +1 -1
- reconcile/change_owners/diff.py +2 -4
- reconcile/checkpoint.py +12 -4
- reconcile/cli.py +111 -18
- reconcile/cluster_deployment_mapper.py +2 -3
- reconcile/dashdotdb_dora.py +5 -12
- reconcile/dashdotdb_slo.py +1 -1
- reconcile/database_access_manager.py +125 -121
- reconcile/deadmanssnitch.py +1 -5
- reconcile/dynatrace_token_provider/integration.py +1 -1
- reconcile/endpoints_discovery/integration.py +4 -1
- reconcile/endpoints_discovery/merge_request.py +1 -1
- reconcile/endpoints_discovery/merge_request_manager.py +9 -11
- reconcile/external_resources/factories.py +5 -12
- reconcile/external_resources/integration.py +1 -1
- reconcile/external_resources/manager.py +8 -5
- reconcile/external_resources/meta.py +0 -1
- reconcile/external_resources/metrics.py +1 -1
- reconcile/external_resources/model.py +20 -20
- reconcile/external_resources/reconciler.py +7 -4
- reconcile/external_resources/secrets_sync.py +10 -14
- reconcile/external_resources/state.py +26 -16
- reconcile/fleet_labeler/integration.py +1 -1
- reconcile/gabi_authorized_users.py +8 -5
- reconcile/gcp_image_mirror.py +2 -2
- reconcile/github_org.py +1 -1
- reconcile/github_owners.py +4 -0
- reconcile/gitlab_housekeeping.py +13 -15
- reconcile/gitlab_members.py +6 -12
- reconcile/gitlab_mr_sqs_consumer.py +2 -2
- reconcile/gitlab_owners.py +15 -11
- reconcile/gitlab_permissions.py +8 -12
- reconcile/glitchtip_project_alerts/integration.py +3 -1
- reconcile/gql_definitions/acs/acs_instances.py +10 -10
- reconcile/gql_definitions/acs/acs_policies.py +5 -5
- reconcile/gql_definitions/acs/acs_rbac.py +6 -6
- reconcile/gql_definitions/advanced_upgrade_service/aus_clusters.py +32 -32
- reconcile/gql_definitions/advanced_upgrade_service/aus_organization.py +26 -26
- reconcile/gql_definitions/app_interface_metrics_exporter/onboarding_status.py +6 -7
- reconcile/gql_definitions/app_sre_tekton_access_revalidation/roles.py +5 -5
- reconcile/gql_definitions/app_sre_tekton_access_revalidation/users.py +5 -5
- reconcile/gql_definitions/automated_actions/instance.py +51 -12
- reconcile/gql_definitions/aws_account_manager/aws_accounts.py +11 -11
- reconcile/gql_definitions/aws_ami_cleanup/aws_accounts.py +20 -10
- reconcile/gql_definitions/aws_cloudwatch_log_retention/aws_accounts.py +28 -68
- reconcile/gql_definitions/aws_saml_idp/aws_accounts.py +20 -10
- reconcile/gql_definitions/aws_saml_roles/aws_accounts.py +20 -10
- reconcile/gql_definitions/aws_saml_roles/roles.py +5 -5
- reconcile/gql_definitions/aws_version_sync/clusters.py +10 -10
- reconcile/gql_definitions/aws_version_sync/namespaces.py +5 -5
- reconcile/gql_definitions/change_owners/queries/change_types.py +5 -5
- reconcile/gql_definitions/change_owners/queries/self_service_roles.py +9 -9
- reconcile/gql_definitions/cluster_auth_rhidp/clusters.py +18 -18
- reconcile/gql_definitions/common/alerting_services_settings.py +9 -9
- reconcile/gql_definitions/common/app_code_component_repos.py +5 -5
- reconcile/gql_definitions/common/app_interface_custom_messages.py +5 -5
- reconcile/gql_definitions/common/app_interface_dms_settings.py +5 -5
- reconcile/gql_definitions/common/app_interface_repo_settings.py +5 -5
- reconcile/gql_definitions/common/app_interface_roles.py +120 -0
- reconcile/gql_definitions/common/app_interface_state_settings.py +10 -10
- reconcile/gql_definitions/common/app_interface_vault_settings.py +5 -5
- reconcile/gql_definitions/common/app_quay_repos_escalation_policies.py +5 -5
- reconcile/gql_definitions/common/apps.py +5 -5
- reconcile/gql_definitions/common/aws_vpc_requests.py +22 -9
- reconcile/gql_definitions/common/aws_vpcs.py +11 -11
- reconcile/gql_definitions/common/clusters.py +37 -35
- reconcile/gql_definitions/common/clusters_minimal.py +14 -14
- reconcile/gql_definitions/common/clusters_with_dms.py +6 -6
- reconcile/gql_definitions/common/clusters_with_peering.py +29 -30
- reconcile/gql_definitions/common/github_orgs.py +10 -10
- reconcile/gql_definitions/common/jira_settings.py +10 -10
- reconcile/gql_definitions/common/jiralert_settings.py +5 -5
- reconcile/gql_definitions/common/ldap_settings.py +5 -5
- reconcile/gql_definitions/common/namespaces.py +42 -44
- reconcile/gql_definitions/common/namespaces_minimal.py +15 -13
- reconcile/gql_definitions/common/ocm_env_telemeter.py +12 -12
- reconcile/gql_definitions/common/ocm_environments.py +19 -19
- reconcile/gql_definitions/common/pagerduty_instances.py +9 -9
- reconcile/gql_definitions/common/pgp_reencryption_settings.py +6 -6
- reconcile/gql_definitions/common/pipeline_providers.py +29 -29
- reconcile/gql_definitions/common/quay_instances.py +5 -5
- reconcile/gql_definitions/common/quay_orgs.py +5 -5
- reconcile/gql_definitions/common/reserved_networks.py +5 -5
- reconcile/gql_definitions/common/rhcs_provider_settings.py +5 -5
- reconcile/gql_definitions/common/saas_files.py +44 -44
- reconcile/gql_definitions/common/saas_target_namespaces.py +10 -10
- reconcile/gql_definitions/common/saasherder_settings.py +5 -5
- reconcile/gql_definitions/common/slack_workspaces.py +5 -5
- reconcile/gql_definitions/common/smtp_client_settings.py +19 -19
- reconcile/gql_definitions/common/state_aws_account.py +7 -8
- reconcile/gql_definitions/common/users.py +5 -5
- reconcile/gql_definitions/common/users_with_paths.py +5 -5
- reconcile/gql_definitions/cost_report/app_names.py +5 -5
- reconcile/gql_definitions/cost_report/cost_namespaces.py +5 -5
- reconcile/gql_definitions/cost_report/settings.py +9 -9
- reconcile/gql_definitions/dashdotdb_slo/slo_documents_query.py +43 -43
- reconcile/gql_definitions/dynatrace_token_provider/dynatrace_bootstrap_tokens.py +10 -10
- reconcile/gql_definitions/dynatrace_token_provider/token_specs.py +5 -5
- reconcile/gql_definitions/email_sender/apps.py +5 -5
- reconcile/gql_definitions/email_sender/emails.py +8 -8
- reconcile/gql_definitions/email_sender/users.py +6 -6
- reconcile/gql_definitions/endpoints_discovery/apps.py +10 -10
- reconcile/gql_definitions/external_resources/aws_accounts.py +9 -9
- reconcile/gql_definitions/external_resources/external_resources_modules.py +23 -23
- reconcile/gql_definitions/external_resources/external_resources_namespaces.py +494 -410
- reconcile/gql_definitions/external_resources/external_resources_settings.py +28 -26
- reconcile/gql_definitions/external_resources/fragments/external_resources_module_overrides.py +5 -5
- reconcile/gql_definitions/fleet_labeler/fleet_labels.py +40 -40
- reconcile/gql_definitions/fragments/aus_organization.py +5 -5
- reconcile/gql_definitions/fragments/aws_account_common.py +7 -5
- reconcile/gql_definitions/fragments/aws_account_managed.py +5 -5
- reconcile/gql_definitions/fragments/aws_account_sso.py +5 -5
- reconcile/gql_definitions/fragments/aws_infra_management_account.py +5 -5
- reconcile/gql_definitions/fragments/{aws_vpc_request_subnet.py → aws_organization.py} +12 -8
- reconcile/gql_definitions/fragments/aws_vpc.py +5 -5
- reconcile/gql_definitions/fragments/aws_vpc_request.py +12 -5
- reconcile/gql_definitions/fragments/container_image_mirror.py +5 -5
- reconcile/gql_definitions/fragments/deploy_resources.py +5 -5
- reconcile/gql_definitions/fragments/disable.py +5 -5
- reconcile/gql_definitions/fragments/email_service.py +5 -5
- reconcile/gql_definitions/fragments/email_user.py +5 -5
- reconcile/gql_definitions/fragments/jumphost_common_fields.py +5 -5
- reconcile/gql_definitions/fragments/membership_source.py +5 -5
- reconcile/gql_definitions/fragments/minimal_ocm_organization.py +5 -5
- reconcile/gql_definitions/fragments/oc_connection_cluster.py +5 -5
- reconcile/gql_definitions/fragments/ocm_environment.py +5 -5
- reconcile/gql_definitions/fragments/pipeline_provider_retention.py +5 -5
- reconcile/gql_definitions/fragments/prometheus_instance.py +5 -5
- reconcile/gql_definitions/fragments/resource_limits_requirements.py +5 -5
- reconcile/gql_definitions/fragments/resource_requests_requirements.py +5 -5
- reconcile/gql_definitions/fragments/resource_values.py +5 -5
- reconcile/gql_definitions/fragments/saas_slo_document.py +5 -5
- reconcile/gql_definitions/fragments/saas_target_namespace.py +5 -5
- reconcile/gql_definitions/fragments/serviceaccount_token.py +5 -5
- reconcile/gql_definitions/fragments/terraform_state.py +5 -5
- reconcile/gql_definitions/fragments/upgrade_policy.py +5 -5
- reconcile/gql_definitions/fragments/user.py +5 -5
- reconcile/gql_definitions/fragments/vault_secret.py +5 -5
- reconcile/gql_definitions/gcp/gcp_docker_repos.py +9 -9
- reconcile/gql_definitions/gcp/gcp_projects.py +9 -9
- reconcile/gql_definitions/gitlab_members/gitlab_instances.py +9 -9
- reconcile/gql_definitions/gitlab_members/permissions.py +9 -9
- reconcile/gql_definitions/glitchtip/glitchtip_instance.py +9 -9
- reconcile/gql_definitions/glitchtip/glitchtip_project.py +11 -11
- reconcile/gql_definitions/glitchtip_project_alerts/glitchtip_project.py +9 -9
- reconcile/gql_definitions/integrations/integrations.py +48 -51
- reconcile/gql_definitions/introspection.json +3510 -1865
- reconcile/gql_definitions/jenkins_configs/jenkins_configs.py +11 -11
- reconcile/gql_definitions/jenkins_configs/jenkins_instances.py +10 -10
- reconcile/gql_definitions/jira/jira_servers.py +5 -5
- reconcile/gql_definitions/jira_permissions_validator/jira_boards_for_permissions_validator.py +14 -10
- reconcile/gql_definitions/jumphosts/jumphosts.py +13 -13
- reconcile/gql_definitions/ldap_groups/roles.py +5 -5
- reconcile/gql_definitions/ldap_groups/settings.py +9 -9
- reconcile/gql_definitions/maintenance/maintenances.py +5 -5
- reconcile/gql_definitions/membershipsources/roles.py +5 -5
- reconcile/gql_definitions/ocm_labels/clusters.py +18 -19
- reconcile/gql_definitions/ocm_labels/organizations.py +5 -5
- reconcile/gql_definitions/openshift_cluster_bots/clusters.py +22 -22
- reconcile/gql_definitions/openshift_groups/managed_groups.py +5 -5
- reconcile/gql_definitions/openshift_groups/managed_roles.py +6 -6
- reconcile/gql_definitions/openshift_serviceaccount_tokens/tokens.py +10 -10
- reconcile/gql_definitions/quay_membership/quay_membership.py +6 -6
- reconcile/gql_definitions/rhcs/certs.py +33 -87
- reconcile/gql_definitions/rhcs/openshift_resource_rhcs_cert.py +43 -0
- reconcile/gql_definitions/rhidp/organizations.py +18 -18
- reconcile/gql_definitions/service_dependencies/jenkins_instance_fragment.py +5 -5
- reconcile/gql_definitions/service_dependencies/service_dependencies.py +8 -8
- reconcile/gql_definitions/sharding/aws_accounts.py +10 -10
- reconcile/gql_definitions/sharding/ocm_organization.py +8 -8
- reconcile/gql_definitions/skupper_network/site_controller_template.py +5 -5
- reconcile/gql_definitions/skupper_network/skupper_networks.py +10 -10
- reconcile/gql_definitions/slack_usergroups/clusters.py +5 -5
- reconcile/gql_definitions/slack_usergroups/permissions.py +9 -9
- reconcile/gql_definitions/slack_usergroups/users.py +5 -5
- reconcile/gql_definitions/slo_documents/slo_documents.py +5 -5
- reconcile/gql_definitions/status_board/status_board.py +6 -7
- reconcile/gql_definitions/statuspage/statuspages.py +9 -9
- reconcile/gql_definitions/templating/template_collection.py +5 -5
- reconcile/gql_definitions/templating/templates.py +5 -5
- reconcile/gql_definitions/terraform_cloudflare_dns/app_interface_cloudflare_dns_settings.py +6 -6
- reconcile/gql_definitions/terraform_cloudflare_dns/terraform_cloudflare_zones.py +11 -11
- reconcile/gql_definitions/terraform_cloudflare_resources/terraform_cloudflare_accounts.py +11 -11
- reconcile/gql_definitions/terraform_cloudflare_resources/terraform_cloudflare_resources.py +20 -25
- reconcile/gql_definitions/terraform_cloudflare_users/app_interface_setting_cloudflare_and_vault.py +6 -6
- reconcile/gql_definitions/terraform_cloudflare_users/terraform_cloudflare_roles.py +12 -12
- reconcile/gql_definitions/terraform_init/aws_accounts.py +23 -9
- reconcile/gql_definitions/terraform_repo/terraform_repo.py +9 -9
- reconcile/gql_definitions/terraform_resources/database_access_manager.py +5 -5
- reconcile/gql_definitions/terraform_resources/terraform_resources_namespaces.py +450 -402
- reconcile/gql_definitions/terraform_tgw_attachments/aws_accounts.py +23 -17
- reconcile/gql_definitions/unleash_feature_toggles/feature_toggles.py +9 -9
- reconcile/gql_definitions/vault_instances/vault_instances.py +61 -61
- reconcile/gql_definitions/vault_policies/vault_policies.py +11 -11
- reconcile/gql_definitions/vpc_peerings_validator/vpc_peerings_validator.py +8 -8
- reconcile/gql_definitions/vpc_peerings_validator/vpc_peerings_validator_peered_cluster_fragment.py +5 -5
- reconcile/integrations_manager.py +3 -3
- reconcile/jenkins_job_builder.py +1 -1
- reconcile/jenkins_worker_fleets.py +80 -11
- reconcile/jira_permissions_validator.py +237 -122
- reconcile/ldap_groups/integration.py +1 -1
- reconcile/ocm/types.py +35 -56
- reconcile/ocm_aws_infrastructure_access.py +1 -1
- reconcile/ocm_clusters.py +4 -4
- reconcile/ocm_labels/integration.py +3 -2
- reconcile/ocm_machine_pools.py +33 -27
- reconcile/openshift_base.py +122 -10
- reconcile/openshift_cluster_bots.py +5 -5
- reconcile/openshift_groups.py +5 -0
- reconcile/openshift_limitranges.py +1 -1
- reconcile/openshift_namespace_labels.py +1 -1
- reconcile/openshift_namespaces.py +97 -101
- reconcile/openshift_resources_base.py +10 -5
- reconcile/openshift_rhcs_certs.py +77 -40
- reconcile/openshift_rolebindings.py +230 -130
- reconcile/openshift_saas_deploy.py +6 -7
- reconcile/openshift_saas_deploy_change_tester.py +9 -7
- reconcile/openshift_saas_deploy_trigger_cleaner.py +3 -5
- reconcile/openshift_serviceaccount_tokens.py +8 -7
- reconcile/openshift_tekton_resources.py +1 -1
- reconcile/openshift_upgrade_watcher.py +4 -4
- reconcile/openshift_users.py +5 -3
- reconcile/oum/labelset.py +5 -3
- reconcile/oum/models.py +1 -4
- reconcile/oum/providers.py +1 -1
- reconcile/prometheus_rules_tester/integration.py +4 -4
- reconcile/quay_mirror.py +1 -1
- reconcile/queries.py +131 -0
- reconcile/requests_sender.py +8 -3
- reconcile/resource_scraper.py +1 -5
- reconcile/rhidp/common.py +3 -5
- reconcile/rhidp/sso_client/base.py +19 -10
- reconcile/saas_auto_promotions_manager/merge_request_manager/renderer.py +1 -1
- reconcile/saas_auto_promotions_manager/subscriber.py +4 -3
- reconcile/sendgrid_teammates.py +20 -9
- reconcile/skupper_network/integration.py +2 -2
- reconcile/slack_usergroups.py +35 -14
- reconcile/sql_query.py +1 -0
- reconcile/status.py +2 -2
- reconcile/status_board.py +6 -6
- reconcile/statuspage/atlassian.py +7 -7
- reconcile/statuspage/integrations/maintenances.py +4 -3
- reconcile/statuspage/page.py +4 -9
- reconcile/statuspage/status.py +5 -8
- reconcile/templates/rosa-classic-cluster-creation.sh.j2 +5 -1
- reconcile/templates/rosa-hcp-cluster-creation.sh.j2 +4 -1
- reconcile/templating/lib/merge_request_manager.py +2 -2
- reconcile/templating/lib/rendering.py +3 -3
- reconcile/templating/renderer.py +12 -13
- reconcile/terraform_aws_route53.py +18 -8
- reconcile/terraform_cloudflare_dns.py +3 -3
- reconcile/terraform_cloudflare_resources.py +12 -13
- reconcile/terraform_cloudflare_users.py +3 -2
- reconcile/terraform_init/integration.py +187 -23
- reconcile/terraform_repo.py +16 -12
- reconcile/terraform_resources.py +18 -10
- reconcile/terraform_tgw_attachments.py +28 -20
- reconcile/terraform_users.py +27 -22
- reconcile/terraform_vpc_peerings.py +15 -3
- reconcile/terraform_vpc_resources/integration.py +23 -8
- reconcile/typed_queries/app_interface_roles.py +10 -0
- reconcile/typed_queries/aws_account_tags.py +41 -0
- reconcile/typed_queries/cost_report/app_names.py +1 -1
- reconcile/typed_queries/cost_report/cost_namespaces.py +2 -2
- reconcile/typed_queries/saas_files.py +13 -13
- reconcile/typed_queries/status_board.py +2 -2
- reconcile/unleash_feature_toggles/integration.py +4 -2
- reconcile/utils/acs/base.py +6 -3
- reconcile/utils/acs/policies.py +2 -2
- reconcile/utils/aggregated_list.py +4 -3
- reconcile/utils/aws_api.py +51 -20
- reconcile/utils/aws_api_typed/api.py +38 -9
- reconcile/utils/aws_api_typed/cloudformation.py +149 -0
- reconcile/utils/aws_api_typed/logs.py +73 -0
- reconcile/utils/aws_api_typed/organization.py +4 -2
- reconcile/utils/binary.py +7 -12
- reconcile/utils/datetime_util.py +67 -0
- reconcile/utils/deadmanssnitch_api.py +1 -1
- reconcile/utils/differ.py +2 -3
- reconcile/utils/early_exit_cache.py +11 -12
- reconcile/utils/expiration.py +7 -3
- reconcile/utils/external_resource_spec.py +24 -1
- reconcile/utils/filtering.py +1 -1
- reconcile/utils/gitlab_api.py +7 -5
- reconcile/utils/glitchtip/client.py +6 -2
- reconcile/utils/glitchtip/models.py +25 -28
- reconcile/utils/gpg.py +5 -3
- reconcile/utils/gql.py +4 -7
- reconcile/utils/helm.py +2 -1
- reconcile/utils/helpers.py +1 -1
- reconcile/utils/imap_client.py +1 -1
- reconcile/utils/instrumented_wrappers.py +1 -1
- reconcile/utils/internal_groups/client.py +2 -2
- reconcile/utils/internal_groups/models.py +8 -17
- reconcile/utils/jenkins_api.py +24 -1
- reconcile/utils/jinja2/utils.py +6 -8
- reconcile/utils/jira_client.py +82 -63
- reconcile/utils/jjb_client.py +78 -46
- reconcile/utils/jobcontroller/controller.py +2 -2
- reconcile/utils/jobcontroller/models.py +17 -1
- reconcile/utils/json.py +74 -0
- reconcile/utils/ldap_client.py +4 -3
- reconcile/utils/lean_terraform_client.py +3 -1
- reconcile/utils/membershipsources/app_interface_resolver.py +4 -2
- reconcile/utils/membershipsources/models.py +16 -23
- reconcile/utils/membershipsources/resolver.py +4 -2
- reconcile/utils/merge_request_manager/merge_request_manager.py +4 -4
- reconcile/utils/merge_request_manager/parser.py +6 -6
- reconcile/utils/metrics.py +5 -5
- reconcile/utils/models.py +304 -82
- reconcile/utils/mr/__init__.py +3 -1
- reconcile/utils/mr/app_interface_reporter.py +6 -3
- reconcile/utils/mr/aws_access.py +1 -1
- reconcile/utils/mr/base.py +7 -13
- reconcile/utils/mr/clusters_updates.py +4 -2
- reconcile/utils/mr/notificator.py +3 -3
- reconcile/utils/mr/ocm_upgrade_scheduler_org_updates.py +4 -1
- reconcile/utils/mr/promote_qontract.py +28 -12
- reconcile/utils/mr/update_access_report_base.py +3 -4
- reconcile/utils/mr/user_maintenance.py +7 -6
- reconcile/utils/oc.py +445 -336
- reconcile/utils/oc_filters.py +3 -3
- reconcile/utils/ocm/addons.py +0 -1
- reconcile/utils/ocm/base.py +18 -21
- reconcile/utils/ocm/cluster_groups.py +1 -1
- reconcile/utils/ocm/identity_providers.py +2 -2
- reconcile/utils/ocm/labels.py +1 -1
- reconcile/utils/ocm/ocm.py +81 -71
- reconcile/utils/ocm/products.py +9 -3
- reconcile/utils/ocm/search_filters.py +3 -6
- reconcile/utils/ocm/service_log.py +4 -6
- reconcile/utils/ocm/sre_capability_labels.py +20 -13
- reconcile/utils/ocm_base_client.py +4 -4
- reconcile/utils/openshift_resource.py +83 -52
- reconcile/utils/openssl.py +2 -2
- reconcile/utils/output.py +3 -2
- reconcile/utils/pagerduty_api.py +10 -7
- reconcile/utils/promotion_state.py +6 -11
- reconcile/utils/raw_github_api.py +11 -8
- reconcile/utils/repo_owners.py +21 -29
- reconcile/utils/rhcsv2_certs.py +138 -35
- reconcile/utils/rosa/session.py +16 -0
- reconcile/utils/runtime/integration.py +2 -3
- reconcile/utils/runtime/meta.py +2 -1
- reconcile/utils/runtime/runner.py +2 -2
- reconcile/utils/saasherder/interfaces.py +13 -20
- reconcile/utils/saasherder/models.py +25 -21
- reconcile/utils/saasherder/saasherder.py +60 -32
- reconcile/utils/secret_reader.py +6 -6
- reconcile/utils/sharding.py +1 -1
- reconcile/utils/slack_api.py +26 -4
- reconcile/utils/sloth.py +224 -0
- reconcile/utils/sqs_gateway.py +16 -11
- reconcile/utils/state.py +2 -1
- reconcile/utils/structs.py +1 -1
- reconcile/utils/terraform_client.py +29 -26
- reconcile/utils/terrascript_aws_client.py +200 -116
- reconcile/utils/three_way_diff_strategy.py +1 -1
- reconcile/utils/unleash/server.py +2 -8
- reconcile/utils/vault.py +44 -41
- reconcile/utils/vcs.py +8 -8
- reconcile/vault_replication.py +119 -58
- tools/app_interface_reporter.py +4 -4
- tools/cli_commands/cost_report/cost_management_api.py +3 -3
- tools/cli_commands/cost_report/view.py +7 -6
- tools/cli_commands/erv2.py +1 -1
- tools/cli_commands/gpg_encrypt.py +4 -1
- tools/cli_commands/systems_and_tools.py +5 -1
- tools/qontract_cli.py +36 -21
- tools/template_validation.py +3 -1
- reconcile/gql_definitions/ocm_oidc_idp/__init__.py +0 -0
- reconcile/gql_definitions/ocm_subscription_labels/__init__.py +0 -0
- reconcile/jenkins/__init__.py +0 -0
- reconcile/jenkins/types.py +0 -77
- {qontract_reconcile-0.10.2.dev310.dist-info → qontract_reconcile-0.10.2.dev439.dist-info}/WHEEL +0 -0
- {qontract_reconcile-0.10.2.dev310.dist-info → qontract_reconcile-0.10.2.dev439.dist-info}/entry_points.txt +0 -0
reconcile/utils/json.py
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from collections.abc import Callable
|
|
3
|
+
from dataclasses import asdict, is_dataclass
|
|
4
|
+
from datetime import date, datetime
|
|
5
|
+
from decimal import Decimal
|
|
6
|
+
from enum import Enum
|
|
7
|
+
from typing import Any, Literal
|
|
8
|
+
|
|
9
|
+
from pydantic import BaseModel
|
|
10
|
+
from pydantic.main import IncEx
|
|
11
|
+
|
|
12
|
+
JSON_COMPACT_SEPARATORS = (",", ":")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def pydantic_encoder(obj: Any) -> Any:
|
|
16
|
+
if isinstance(obj, BaseModel):
|
|
17
|
+
return obj.model_dump()
|
|
18
|
+
|
|
19
|
+
if is_dataclass(obj):
|
|
20
|
+
return asdict(obj) # type: ignore
|
|
21
|
+
|
|
22
|
+
if isinstance(obj, (datetime, date)):
|
|
23
|
+
return obj.isoformat()
|
|
24
|
+
|
|
25
|
+
if isinstance(obj, Enum):
|
|
26
|
+
return obj.value
|
|
27
|
+
|
|
28
|
+
if isinstance(obj, Decimal):
|
|
29
|
+
return float(obj)
|
|
30
|
+
|
|
31
|
+
raise TypeError(
|
|
32
|
+
f"Object of type '{obj.__class__.__name__}' is not JSON serializable"
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def json_dumps(
|
|
37
|
+
data: Any,
|
|
38
|
+
*,
|
|
39
|
+
compact: bool = False,
|
|
40
|
+
indent: int | None = None,
|
|
41
|
+
cls: type[json.JSONEncoder] | None = None,
|
|
42
|
+
defaults: Callable | None = None,
|
|
43
|
+
# BaseModel dump parameters
|
|
44
|
+
by_alias: bool = True,
|
|
45
|
+
exclude_none: bool = False,
|
|
46
|
+
exclude: IncEx | None = None,
|
|
47
|
+
mode: Literal["json", "python"] = "json",
|
|
48
|
+
) -> str:
|
|
49
|
+
"""
|
|
50
|
+
Serialize `data` to a consistent JSON formatted `str` with dict keys sorted.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
data: The data to serialize.
|
|
54
|
+
compact: If True, use compact separators (no spaces after commas or colons).
|
|
55
|
+
indent: If specified, pretty-print the JSON with this many spaces of indentation.
|
|
56
|
+
cls: A custom JSONEncoder subclass to use for serialization.
|
|
57
|
+
Returns:
|
|
58
|
+
A JSON formatted string.
|
|
59
|
+
"""
|
|
60
|
+
if isinstance(data, BaseModel):
|
|
61
|
+
data = data.model_dump(
|
|
62
|
+
mode=mode, by_alias=by_alias, exclude_none=exclude_none, exclude=exclude
|
|
63
|
+
)
|
|
64
|
+
if mode == "python":
|
|
65
|
+
defaults = pydantic_encoder
|
|
66
|
+
separators = JSON_COMPACT_SEPARATORS if compact else None
|
|
67
|
+
return json.dumps(
|
|
68
|
+
data,
|
|
69
|
+
indent=indent,
|
|
70
|
+
separators=separators,
|
|
71
|
+
sort_keys=True,
|
|
72
|
+
cls=cls,
|
|
73
|
+
default=defaults,
|
|
74
|
+
)
|
reconcile/utils/ldap_client.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from collections import defaultdict
|
|
2
2
|
from collections.abc import Iterable
|
|
3
|
+
from typing import Any, Self
|
|
3
4
|
|
|
4
5
|
from ldap3 import (
|
|
5
6
|
ALL,
|
|
@@ -17,15 +18,15 @@ class LdapClient:
|
|
|
17
18
|
appropriately.
|
|
18
19
|
"""
|
|
19
20
|
|
|
20
|
-
def __init__(self, base_dn: str, connection: Connection):
|
|
21
|
+
def __init__(self, base_dn: str, connection: Connection) -> None:
|
|
21
22
|
self.base_dn = base_dn
|
|
22
23
|
self.connection = connection
|
|
23
24
|
|
|
24
|
-
def __enter__(self):
|
|
25
|
+
def __enter__(self) -> Self:
|
|
25
26
|
self.connection.bind()
|
|
26
27
|
return self
|
|
27
28
|
|
|
28
|
-
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
29
|
+
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
|
|
29
30
|
self.connection.unbind()
|
|
30
31
|
|
|
31
32
|
def get_users(self, uids: Iterable[str]) -> set[str]:
|
|
@@ -6,7 +6,9 @@ from collections.abc import Mapping
|
|
|
6
6
|
from typing import Any
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
def state_rm_access_key(
|
|
9
|
+
def state_rm_access_key(
|
|
10
|
+
working_dirs: Mapping[str, str], account: str, user: str
|
|
11
|
+
) -> bool:
|
|
10
12
|
wd = working_dirs[account]
|
|
11
13
|
init_result = subprocess.run(["terraform", "init"], check=False, cwd=wd)
|
|
12
14
|
if init_result.returncode != 0:
|
|
@@ -55,6 +55,8 @@ def resolve_app_interface_membership_source(
|
|
|
55
55
|
|
|
56
56
|
def build_member_list(role: RoleV1) -> list[RoleMember]:
|
|
57
57
|
members: list[RoleMember] = []
|
|
58
|
-
members.extend([RoleUser(**u.
|
|
59
|
-
members.extend([
|
|
58
|
+
members.extend([RoleUser(**u.model_dump()) for u in role.users or []])
|
|
59
|
+
members.extend([
|
|
60
|
+
RoleBot(**b.model_dump()) for b in role.bots or [] if b.org_username
|
|
61
|
+
])
|
|
60
62
|
return members
|
|
@@ -7,7 +7,6 @@ from typing import (
|
|
|
7
7
|
|
|
8
8
|
from pydantic import (
|
|
9
9
|
BaseModel,
|
|
10
|
-
Extra,
|
|
11
10
|
)
|
|
12
11
|
|
|
13
12
|
from reconcile.gql_definitions.fragments.membership_source import (
|
|
@@ -23,7 +22,7 @@ class User(Protocol):
|
|
|
23
22
|
@property
|
|
24
23
|
def org_username(self) -> str: ...
|
|
25
24
|
|
|
26
|
-
def
|
|
25
|
+
def model_dump(self, *, by_alias: bool = False) -> dict[str, Any]: ...
|
|
27
26
|
|
|
28
27
|
|
|
29
28
|
class Bot(Protocol):
|
|
@@ -33,7 +32,7 @@ class Bot(Protocol):
|
|
|
33
32
|
@property
|
|
34
33
|
def org_username(self) -> str | None: ...
|
|
35
34
|
|
|
36
|
-
def
|
|
35
|
+
def model_dump(self, *, by_alias: bool = False) -> dict[str, Any]: ...
|
|
37
36
|
|
|
38
37
|
|
|
39
38
|
class RoleWithMemberships(Protocol):
|
|
@@ -50,33 +49,27 @@ class RoleWithMemberships(Protocol):
|
|
|
50
49
|
def member_sources(self) -> Sequence[RoleMembershipSource] | None: ...
|
|
51
50
|
|
|
52
51
|
|
|
53
|
-
class RoleUser(BaseModel):
|
|
52
|
+
class RoleUser(BaseModel, extra="ignore"):
|
|
54
53
|
name: str
|
|
55
54
|
org_username: str
|
|
56
|
-
github_username: str | None
|
|
57
|
-
quay_username: str | None
|
|
58
|
-
pagerduty_username: str | None
|
|
59
|
-
aws_username: str | None
|
|
60
|
-
cloudflare_user: str | None
|
|
61
|
-
public_gpg_key: str | None
|
|
55
|
+
github_username: str | None = None
|
|
56
|
+
quay_username: str | None = None
|
|
57
|
+
pagerduty_username: str | None = None
|
|
58
|
+
aws_username: str | None = None
|
|
59
|
+
cloudflare_user: str | None = None
|
|
60
|
+
public_gpg_key: str | None = None
|
|
62
61
|
tag_on_cluster_updates: bool | None = False
|
|
63
62
|
tag_on_merge_requests: bool | None = False
|
|
64
63
|
|
|
65
|
-
class Config:
|
|
66
|
-
extra = Extra.ignore
|
|
67
64
|
|
|
68
|
-
|
|
69
|
-
class RoleBot(BaseModel):
|
|
65
|
+
class RoleBot(BaseModel, extra="ignore"):
|
|
70
66
|
name: str
|
|
71
|
-
description: str | None
|
|
72
|
-
org_username: str | None
|
|
73
|
-
github_username: str | None
|
|
74
|
-
gitlab_username: str | None
|
|
75
|
-
openshift_serviceaccount: str | None
|
|
76
|
-
quay_username: str | None
|
|
77
|
-
|
|
78
|
-
class Config:
|
|
79
|
-
extra = Extra.ignore
|
|
67
|
+
description: str | None = None
|
|
68
|
+
org_username: str | None = None
|
|
69
|
+
github_username: str | None = None
|
|
70
|
+
gitlab_username: str | None = None
|
|
71
|
+
openshift_serviceaccount: str | None = None
|
|
72
|
+
quay_username: str | None = None
|
|
80
73
|
|
|
81
74
|
|
|
82
75
|
RoleMember = RoleUser | RoleBot
|
|
@@ -98,8 +98,10 @@ def resolve_role_members(
|
|
|
98
98
|
members: list[RoleMember] = []
|
|
99
99
|
|
|
100
100
|
# bring in the local users and bots ...
|
|
101
|
-
members.extend(RoleUser(**u.
|
|
102
|
-
members.extend(
|
|
101
|
+
members.extend(RoleUser(**u.model_dump()) for u in r.users or [])
|
|
102
|
+
members.extend(
|
|
103
|
+
RoleBot(**b.model_dump()) for b in r.bots or [] if b.org_username
|
|
104
|
+
)
|
|
103
105
|
|
|
104
106
|
# ... and enhance with the ones from member sources
|
|
105
107
|
for ms in r.member_sources or []:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from abc import abstractmethod
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Any,
|
|
4
|
+
from typing import Any, TypeVar
|
|
5
5
|
|
|
6
6
|
from gitlab.v4.objects import ProjectMergeRequest
|
|
7
7
|
from pydantic import BaseModel
|
|
@@ -17,12 +17,12 @@ T = TypeVar("T", bound=BaseModel)
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
@dataclass
|
|
20
|
-
class OpenMergeRequest
|
|
20
|
+
class OpenMergeRequest[T: BaseModel]:
|
|
21
21
|
raw: ProjectMergeRequest
|
|
22
22
|
mr_info: T
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
class MergeRequestManagerBase
|
|
25
|
+
class MergeRequestManagerBase[T: BaseModel]:
|
|
26
26
|
""" """
|
|
27
27
|
|
|
28
28
|
def __init__(self, vcs: VCS, parser: Parser, mr_label: str):
|
|
@@ -42,7 +42,7 @@ class MergeRequestManagerBase(Generic[T]):
|
|
|
42
42
|
expected_data: dict[str, Any],
|
|
43
43
|
) -> OpenMergeRequest | None:
|
|
44
44
|
for mr in self._open_mrs:
|
|
45
|
-
mr_info_dict = mr.mr_info.
|
|
45
|
+
mr_info_dict = mr.mr_info.model_dump()
|
|
46
46
|
if all(mr_info_dict.get(k) == expected_data.get(k) for k in expected_data):
|
|
47
47
|
return mr
|
|
48
48
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import re
|
|
2
|
-
from typing import
|
|
2
|
+
from typing import TypeVar
|
|
3
3
|
|
|
4
4
|
from pydantic import BaseModel
|
|
5
5
|
|
|
@@ -17,7 +17,7 @@ class ParserVersionError(Exception):
|
|
|
17
17
|
T = TypeVar("T", bound=BaseModel)
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
class Parser
|
|
20
|
+
class Parser[T: BaseModel]:
|
|
21
21
|
"""This class is only concerned with parsing an MR description rendered by the Renderer."""
|
|
22
22
|
|
|
23
23
|
def __init__(
|
|
@@ -60,8 +60,8 @@ class Parser(Generic[T]):
|
|
|
60
60
|
|
|
61
61
|
if self.expected_version != self._find_by_name(self.version_ref, parts[1]):
|
|
62
62
|
raise ParserVersionError("Version is outdated")
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
self.klass, self._data_from_description(parts[1]), use_defaults=False
|
|
66
|
-
)
|
|
63
|
+
data = data_default_none(
|
|
64
|
+
self.klass, self._data_from_description(parts[1]), use_defaults=False
|
|
67
65
|
)
|
|
66
|
+
assert isinstance(data, dict)
|
|
67
|
+
return self.klass(**data)
|
reconcile/utils/metrics.py
CHANGED
|
@@ -144,7 +144,7 @@ class GaugeMetric(BaseMetric):
|
|
|
144
144
|
|
|
145
145
|
@classmethod
|
|
146
146
|
def metric_family(cls) -> GaugeMetricFamily:
|
|
147
|
-
labels = [f.alias for f in cls.
|
|
147
|
+
labels = [f.alias or name for name, f in cls.model_fields.items()]
|
|
148
148
|
return GaugeMetricFamily(cls.name(), cls.__doc__ or "", labels=labels)
|
|
149
149
|
|
|
150
150
|
@classmethod
|
|
@@ -167,7 +167,7 @@ class CounterMetric(BaseMetric):
|
|
|
167
167
|
|
|
168
168
|
@classmethod
|
|
169
169
|
def metric_family(cls) -> CounterMetricFamily:
|
|
170
|
-
labels = [f.alias for f in cls.
|
|
170
|
+
labels = [f.alias or name for name, f in cls.model_fields.items()]
|
|
171
171
|
return CounterMetricFamily(cls.name(), cls.__doc__ or "", labels=labels)
|
|
172
172
|
|
|
173
173
|
@classmethod
|
|
@@ -198,7 +198,7 @@ class MetricsContainer:
|
|
|
198
198
|
"""
|
|
199
199
|
Sets the value of the given gauge metric to the given value.
|
|
200
200
|
"""
|
|
201
|
-
label_values = tuple(metric.
|
|
201
|
+
label_values = tuple(metric.model_dump(by_alias=True).values())
|
|
202
202
|
self._gauges[metric.__class__][label_values] = value
|
|
203
203
|
|
|
204
204
|
def set_info(self, metric: InfoMetric) -> None:
|
|
@@ -213,7 +213,7 @@ class MetricsContainer:
|
|
|
213
213
|
Increases the value of the given counter by the given amount.
|
|
214
214
|
"""
|
|
215
215
|
# all label values need to be strings, so lets convert them
|
|
216
|
-
label_values = tuple(str(v) for v in counter.
|
|
216
|
+
label_values = tuple(str(v) for v in counter.model_dump(by_alias=True).values())
|
|
217
217
|
current_value = self._counters[counter.__class__].get(label_values) or 0
|
|
218
218
|
self._counters[counter.__class__][label_values] = current_value + by
|
|
219
219
|
|
|
@@ -270,7 +270,7 @@ class MetricsContainer:
|
|
|
270
270
|
(
|
|
271
271
|
metric_class(**{
|
|
272
272
|
key: labels[i]
|
|
273
|
-
for i, key in enumerate(metric_class.
|
|
273
|
+
for i, key in enumerate(metric_class.model_fields.keys())
|
|
274
274
|
}),
|
|
275
275
|
value,
|
|
276
276
|
)
|