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.
- {qontract_reconcile-0.10.2.dev349.dist-info → qontract_reconcile-0.10.2.dev414.dist-info}/METADATA +12 -11
- {qontract_reconcile-0.10.2.dev349.dist-info → qontract_reconcile-0.10.2.dev414.dist-info}/RECORD +356 -350
- reconcile/acs_rbac.py +2 -2
- reconcile/aus/advanced_upgrade_service.py +15 -12
- reconcile/aus/base.py +26 -27
- reconcile/aus/cluster_version_data.py +15 -5
- reconcile/aus/models.py +1 -1
- reconcile/automated_actions/config/integration.py +15 -3
- 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 +2 -2
- reconcile/aws_iam_keys.py +7 -41
- reconcile/aws_saml_idp/integration.py +12 -4
- reconcile/aws_saml_roles/integration.py +32 -25
- reconcile/aws_version_sync/integration.py +6 -12
- 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 +11 -3
- reconcile/cli.py +33 -8
- reconcile/dashdotdb_dora.py +5 -12
- reconcile/dashdotdb_slo.py +1 -1
- reconcile/database_access_manager.py +123 -117
- 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 +24 -10
- reconcile/external_resources/meta.py +0 -1
- reconcile/external_resources/metrics.py +1 -1
- reconcile/external_resources/model.py +13 -13
- reconcile/external_resources/reconciler.py +7 -4
- reconcile/external_resources/secrets_sync.py +6 -8
- reconcile/external_resources/state.py +60 -17
- 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 +5 -5
- reconcile/gql_definitions/acs/acs_policies.py +5 -5
- reconcile/gql_definitions/acs/acs_rbac.py +5 -5
- reconcile/gql_definitions/advanced_upgrade_service/aus_clusters.py +5 -5
- reconcile/gql_definitions/advanced_upgrade_service/aus_organization.py +5 -5
- reconcile/gql_definitions/app_interface_metrics_exporter/onboarding_status.py +5 -5
- 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 +46 -7
- reconcile/gql_definitions/aws_account_manager/aws_accounts.py +5 -5
- reconcile/gql_definitions/aws_ami_cleanup/aws_accounts.py +15 -5
- reconcile/gql_definitions/aws_cloudwatch_log_retention/aws_accounts.py +27 -66
- reconcile/gql_definitions/aws_saml_idp/aws_accounts.py +15 -5
- reconcile/gql_definitions/aws_saml_roles/aws_accounts.py +15 -5
- reconcile/gql_definitions/aws_saml_roles/roles.py +5 -5
- reconcile/gql_definitions/aws_version_sync/clusters.py +5 -5
- 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 +5 -5
- reconcile/gql_definitions/cluster_auth_rhidp/clusters.py +5 -5
- reconcile/gql_definitions/common/alerting_services_settings.py +5 -5
- 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 +5 -5
- reconcile/gql_definitions/common/app_interface_state_settings.py +5 -5
- 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 +15 -5
- reconcile/gql_definitions/common/aws_vpcs.py +5 -5
- reconcile/gql_definitions/common/clusters.py +7 -5
- reconcile/gql_definitions/common/clusters_minimal.py +5 -5
- reconcile/gql_definitions/common/clusters_with_dms.py +5 -5
- reconcile/gql_definitions/common/clusters_with_peering.py +5 -5
- reconcile/gql_definitions/common/github_orgs.py +5 -5
- reconcile/gql_definitions/common/jira_settings.py +5 -5
- reconcile/gql_definitions/common/jiralert_settings.py +5 -5
- reconcile/gql_definitions/common/ldap_settings.py +5 -5
- reconcile/gql_definitions/common/namespaces.py +5 -5
- reconcile/gql_definitions/common/namespaces_minimal.py +7 -5
- reconcile/gql_definitions/common/ocm_env_telemeter.py +5 -5
- reconcile/gql_definitions/common/ocm_environments.py +5 -5
- reconcile/gql_definitions/common/pagerduty_instances.py +5 -5
- reconcile/gql_definitions/common/pgp_reencryption_settings.py +5 -5
- reconcile/gql_definitions/common/pipeline_providers.py +5 -5
- 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 +5 -5
- reconcile/gql_definitions/common/saas_target_namespaces.py +5 -5
- 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 +5 -5
- reconcile/gql_definitions/common/state_aws_account.py +5 -5
- 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 +5 -5
- reconcile/gql_definitions/dashdotdb_slo/slo_documents_query.py +5 -5
- reconcile/gql_definitions/dynatrace_token_provider/dynatrace_bootstrap_tokens.py +5 -5
- 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 +5 -5
- reconcile/gql_definitions/email_sender/users.py +5 -5
- reconcile/gql_definitions/endpoints_discovery/apps.py +5 -5
- reconcile/gql_definitions/external_resources/aws_accounts.py +5 -5
- reconcile/gql_definitions/external_resources/external_resources_modules.py +5 -5
- reconcile/gql_definitions/external_resources/external_resources_namespaces.py +89 -6
- reconcile/gql_definitions/external_resources/external_resources_settings.py +7 -5
- reconcile/gql_definitions/external_resources/fragments/external_resources_module_overrides.py +5 -5
- reconcile/gql_definitions/fleet_labeler/fleet_labels.py +5 -5
- 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_organization.py +33 -0
- reconcile/gql_definitions/fragments/aws_vpc.py +5 -5
- reconcile/gql_definitions/fragments/aws_vpc_request.py +7 -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 +5 -5
- reconcile/gql_definitions/gcp/gcp_projects.py +5 -5
- reconcile/gql_definitions/gitlab_members/gitlab_instances.py +5 -5
- reconcile/gql_definitions/gitlab_members/permissions.py +5 -5
- reconcile/gql_definitions/glitchtip/glitchtip_instance.py +5 -5
- reconcile/gql_definitions/glitchtip/glitchtip_project.py +5 -5
- reconcile/gql_definitions/glitchtip_project_alerts/glitchtip_project.py +5 -5
- reconcile/gql_definitions/integrations/integrations.py +5 -5
- reconcile/gql_definitions/introspection.json +2137 -1053
- reconcile/gql_definitions/jenkins_configs/jenkins_configs.py +5 -5
- reconcile/gql_definitions/jenkins_configs/jenkins_instances.py +5 -5
- reconcile/gql_definitions/jira/jira_servers.py +5 -5
- reconcile/gql_definitions/jira_permissions_validator/jira_boards_for_permissions_validator.py +9 -5
- reconcile/gql_definitions/jumphosts/jumphosts.py +5 -5
- reconcile/gql_definitions/ldap_groups/roles.py +5 -5
- reconcile/gql_definitions/ldap_groups/settings.py +5 -5
- reconcile/gql_definitions/maintenance/maintenances.py +5 -5
- reconcile/gql_definitions/membershipsources/roles.py +5 -5
- reconcile/gql_definitions/ocm_labels/clusters.py +5 -5
- reconcile/gql_definitions/ocm_labels/organizations.py +5 -5
- reconcile/gql_definitions/openshift_cluster_bots/clusters.py +5 -5
- reconcile/gql_definitions/openshift_groups/managed_groups.py +5 -5
- reconcile/gql_definitions/openshift_groups/managed_roles.py +5 -5
- reconcile/gql_definitions/openshift_serviceaccount_tokens/tokens.py +5 -5
- reconcile/gql_definitions/quay_membership/quay_membership.py +5 -5
- reconcile/gql_definitions/rhcs/certs.py +5 -5
- reconcile/gql_definitions/rhidp/organizations.py +5 -5
- reconcile/gql_definitions/service_dependencies/jenkins_instance_fragment.py +5 -5
- reconcile/gql_definitions/service_dependencies/service_dependencies.py +5 -5
- reconcile/gql_definitions/sharding/aws_accounts.py +5 -5
- reconcile/gql_definitions/sharding/ocm_organization.py +5 -5
- reconcile/gql_definitions/skupper_network/site_controller_template.py +5 -5
- reconcile/gql_definitions/skupper_network/skupper_networks.py +5 -5
- reconcile/gql_definitions/slack_usergroups/clusters.py +5 -5
- reconcile/gql_definitions/slack_usergroups/permissions.py +5 -5
- 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 +5 -5
- reconcile/gql_definitions/statuspage/statuspages.py +5 -5
- 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 +5 -5
- reconcile/gql_definitions/terraform_cloudflare_dns/terraform_cloudflare_zones.py +5 -5
- reconcile/gql_definitions/terraform_cloudflare_resources/terraform_cloudflare_accounts.py +5 -5
- reconcile/gql_definitions/terraform_cloudflare_resources/terraform_cloudflare_resources.py +5 -5
- reconcile/gql_definitions/terraform_cloudflare_users/app_interface_setting_cloudflare_and_vault.py +5 -5
- reconcile/gql_definitions/terraform_cloudflare_users/terraform_cloudflare_roles.py +5 -5
- reconcile/gql_definitions/terraform_init/aws_accounts.py +19 -5
- reconcile/gql_definitions/terraform_repo/terraform_repo.py +5 -5
- reconcile/gql_definitions/terraform_resources/database_access_manager.py +5 -5
- reconcile/gql_definitions/terraform_resources/terraform_resources_namespaces.py +38 -6
- reconcile/gql_definitions/terraform_tgw_attachments/aws_accounts.py +15 -5
- reconcile/gql_definitions/unleash_feature_toggles/feature_toggles.py +5 -5
- reconcile/gql_definitions/vault_instances/vault_instances.py +5 -5
- reconcile/gql_definitions/vault_policies/vault_policies.py +5 -5
- reconcile/gql_definitions/vpc_peerings_validator/vpc_peerings_validator.py +5 -5
- reconcile/gql_definitions/vpc_peerings_validator/vpc_peerings_validator_peered_cluster_fragment.py +5 -5
- reconcile/integrations_manager.py +3 -3
- reconcile/jenkins_worker_fleets.py +10 -8
- 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 +23 -23
- reconcile/openshift_base.py +53 -2
- reconcile/openshift_cluster_bots.py +3 -2
- reconcile/openshift_namespace_labels.py +1 -1
- reconcile/openshift_namespaces.py +97 -101
- reconcile/openshift_resources_base.py +6 -2
- reconcile/openshift_rhcs_certs.py +5 -5
- reconcile/openshift_rolebindings.py +7 -11
- 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 +2 -2
- reconcile/openshift_upgrade_watcher.py +4 -4
- reconcile/oum/labelset.py +5 -3
- reconcile/oum/models.py +1 -4
- reconcile/prometheus_rules_tester/integration.py +3 -3
- reconcile/quay_mirror.py +1 -1
- reconcile/queries.py +131 -1
- reconcile/rhidp/common.py +3 -5
- reconcile/rhidp/sso_client/base.py +1 -1
- reconcile/saas_auto_promotions_manager/merge_request_manager/renderer.py +1 -1
- reconcile/saas_auto_promotions_manager/subscriber.py +4 -3
- reconcile/skupper_network/integration.py +2 -2
- reconcile/slack_usergroups.py +35 -14
- reconcile/sql_query.py +1 -0
- 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 +4 -0
- reconcile/templates/rosa-hcp-cluster-creation.sh.j2 +3 -0
- reconcile/templating/lib/rendering.py +3 -3
- reconcile/templating/renderer.py +4 -3
- reconcile/terraform_aws_route53.py +7 -1
- reconcile/terraform_cloudflare_dns.py +3 -3
- reconcile/terraform_cloudflare_resources.py +5 -5
- reconcile/terraform_cloudflare_users.py +3 -2
- reconcile/terraform_init/integration.py +187 -23
- reconcile/terraform_repo.py +16 -12
- reconcile/terraform_resources.py +17 -7
- reconcile/terraform_tgw_attachments.py +27 -19
- reconcile/terraform_users.py +7 -0
- reconcile/terraform_vpc_peerings.py +14 -3
- reconcile/terraform_vpc_resources/integration.py +10 -1
- 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 -54
- 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/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/gql.py +4 -7
- reconcile/utils/helm.py +2 -1
- reconcile/utils/helpers.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/jinja2/utils.py +6 -101
- reconcile/utils/jira_client.py +82 -63
- reconcile/utils/jjb_client.py +9 -12
- reconcile/utils/jobcontroller/controller.py +1 -1
- reconcile/utils/jobcontroller/models.py +17 -1
- reconcile/utils/json.py +70 -0
- 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/app_interface_reporter.py +2 -2
- reconcile/utils/mr/base.py +2 -2
- reconcile/utils/mr/notificator.py +3 -3
- reconcile/utils/mr/update_access_report_base.py +3 -4
- reconcile/utils/mr/user_maintenance.py +3 -2
- reconcile/utils/oc.py +118 -97
- reconcile/utils/oc_filters.py +3 -3
- reconcile/utils/ocm/addons.py +0 -1
- reconcile/utils/ocm/base.py +17 -20
- 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/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/openshift_resource.py +10 -5
- 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 +1 -1
- reconcile/utils/rhcsv2_certs.py +1 -4
- reconcile/utils/runtime/integration.py +2 -3
- 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 +35 -24
- reconcile/utils/slack_api.py +26 -4
- reconcile/utils/sloth.py +171 -2
- reconcile/utils/sqs_gateway.py +2 -1
- reconcile/utils/state.py +2 -1
- reconcile/utils/structs.py +1 -1
- reconcile/utils/terraform_client.py +5 -4
- reconcile/utils/terrascript_aws_client.py +171 -114
- reconcile/utils/unleash/server.py +2 -8
- reconcile/utils/vault.py +5 -12
- reconcile/utils/vcs.py +8 -8
- reconcile/vault_replication.py +107 -42
- 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 +3 -1
- tools/cli_commands/systems_and_tools.py +5 -1
- tools/qontract_cli.py +31 -18
- tools/template_validation.py +3 -1
- {qontract_reconcile-0.10.2.dev349.dist-info → qontract_reconcile-0.10.2.dev414.dist-info}/WHEEL +0 -0
- {qontract_reconcile-0.10.2.dev349.dist-info → qontract_reconcile-0.10.2.dev414.dist-info}/entry_points.txt +0 -0
reconcile/utils/json.py
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
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
|
+
|
|
11
|
+
JSON_COMPACT_SEPARATORS = (",", ":")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def pydantic_encoder(obj: Any) -> Any:
|
|
15
|
+
if isinstance(obj, BaseModel):
|
|
16
|
+
return obj.model_dump()
|
|
17
|
+
|
|
18
|
+
if is_dataclass(obj):
|
|
19
|
+
return asdict(obj) # type: ignore
|
|
20
|
+
|
|
21
|
+
if isinstance(obj, (datetime, date)):
|
|
22
|
+
return obj.isoformat()
|
|
23
|
+
|
|
24
|
+
if isinstance(obj, Enum):
|
|
25
|
+
return obj.value
|
|
26
|
+
|
|
27
|
+
if isinstance(obj, Decimal):
|
|
28
|
+
return float(obj)
|
|
29
|
+
|
|
30
|
+
raise TypeError(
|
|
31
|
+
f"Object of type '{obj.__class__.__name__}' is not JSON serializable"
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def json_dumps(
|
|
36
|
+
data: Any,
|
|
37
|
+
*,
|
|
38
|
+
compact: bool = False,
|
|
39
|
+
indent: int | None = None,
|
|
40
|
+
cls: type[json.JSONEncoder] | None = None,
|
|
41
|
+
defaults: Callable | None = None,
|
|
42
|
+
# BaseModel dump parameters
|
|
43
|
+
by_alias: bool = True,
|
|
44
|
+
exclude_none: bool = False,
|
|
45
|
+
mode: Literal["json", "python"] = "json",
|
|
46
|
+
) -> str:
|
|
47
|
+
"""
|
|
48
|
+
Serialize `data` to a consistent JSON formatted `str` with dict keys sorted.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
data: The data to serialize.
|
|
52
|
+
compact: If True, use compact separators (no spaces after commas or colons).
|
|
53
|
+
indent: If specified, pretty-print the JSON with this many spaces of indentation.
|
|
54
|
+
cls: A custom JSONEncoder subclass to use for serialization.
|
|
55
|
+
Returns:
|
|
56
|
+
A JSON formatted string.
|
|
57
|
+
"""
|
|
58
|
+
if isinstance(data, BaseModel):
|
|
59
|
+
data = data.model_dump(mode=mode, by_alias=by_alias, exclude_none=exclude_none)
|
|
60
|
+
if mode == "python":
|
|
61
|
+
defaults = pydantic_encoder
|
|
62
|
+
separators = JSON_COMPACT_SEPARATORS if compact else None
|
|
63
|
+
return json.dumps(
|
|
64
|
+
data,
|
|
65
|
+
indent=indent,
|
|
66
|
+
separators=separators,
|
|
67
|
+
sort_keys=True,
|
|
68
|
+
cls=cls,
|
|
69
|
+
default=defaults,
|
|
70
|
+
)
|
|
@@ -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
|
)
|