qontract-reconcile 0.10.2.dev394__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.dev394.dist-info → qontract_reconcile-0.10.2.dev414.dist-info}/METADATA +4 -3
- {qontract_reconcile-0.10.2.dev394.dist-info → qontract_reconcile-0.10.2.dev414.dist-info}/RECORD +308 -308
- reconcile/acs_rbac.py +2 -2
- reconcile/aus/advanced_upgrade_service.py +15 -12
- reconcile/aus/base.py +9 -13
- 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 +6 -6
- reconcile/aws_account_manager/reconciler.py +3 -3
- reconcile/aws_ami_cleanup/integration.py +2 -5
- reconcile/aws_ami_share.py +69 -62
- reconcile/aws_saml_idp/integration.py +5 -3
- reconcile/aws_saml_roles/integration.py +23 -22
- 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/dashdotdb_dora.py +1 -1
- reconcile/dashdotdb_slo.py +1 -1
- reconcile/database_access_manager.py +8 -9
- 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 +1 -1
- reconcile/external_resources/integration.py +1 -1
- reconcile/external_resources/manager.py +19 -7
- reconcile/external_resources/metrics.py +1 -1
- reconcile/external_resources/model.py +6 -6
- reconcile/external_resources/reconciler.py +7 -4
- reconcile/external_resources/secrets_sync.py +2 -2
- reconcile/external_resources/state.py +56 -14
- reconcile/fleet_labeler/integration.py +1 -1
- reconcile/gcp_image_mirror.py +2 -2
- reconcile/github_org.py +1 -1
- reconcile/github_owners.py +4 -0
- reconcile/gitlab_members.py +6 -12
- 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 +5 -5
- reconcile/gql_definitions/aws_cloudwatch_log_retention/aws_accounts.py +5 -5
- reconcile/gql_definitions/aws_saml_idp/aws_accounts.py +5 -5
- reconcile/gql_definitions/aws_saml_roles/aws_accounts.py +5 -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 +5 -5
- reconcile/gql_definitions/common/aws_vpcs.py +5 -5
- reconcile/gql_definitions/common/clusters.py +5 -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 +5 -5
- reconcile/gql_definitions/external_resources/external_resources_settings.py +5 -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 +5 -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 +5 -5
- reconcile/gql_definitions/fragments/aws_vpc.py +5 -5
- reconcile/gql_definitions/fragments/aws_vpc_request.py +5 -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 +231 -0
- 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 +5 -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 +5 -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 +5 -5
- reconcile/gql_definitions/terraform_tgw_attachments/aws_accounts.py +5 -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 +9 -8
- reconcile/jira_permissions_validator.py +2 -2
- reconcile/ldap_groups/integration.py +1 -1
- reconcile/ocm/types.py +35 -57
- 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 +1 -1
- 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 +4 -5
- reconcile/openshift_saas_deploy_change_tester.py +9 -7
- reconcile/openshift_serviceaccount_tokens.py +2 -2
- reconcile/openshift_upgrade_watcher.py +1 -1
- 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 +6 -0
- 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/skupper_network/integration.py +2 -2
- reconcile/slack_usergroups.py +31 -11
- reconcile/status_board.py +6 -6
- reconcile/statuspage/atlassian.py +7 -7
- reconcile/statuspage/page.py +4 -9
- reconcile/templating/lib/rendering.py +3 -3
- reconcile/templating/renderer.py +2 -2
- 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 +2 -2
- reconcile/terraform_repo.py +16 -12
- reconcile/terraform_resources.py +6 -6
- reconcile/terraform_tgw_attachments.py +20 -18
- reconcile/terraform_vpc_resources/integration.py +3 -1
- 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 +11 -11
- 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/aws_api.py +51 -20
- reconcile/utils/aws_api_typed/organization.py +4 -2
- reconcile/utils/deadmanssnitch_api.py +1 -1
- reconcile/utils/early_exit_cache.py +8 -10
- 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/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 +2 -5
- reconcile/utils/jobcontroller/controller.py +1 -1
- reconcile/utils/jobcontroller/models.py +17 -1
- reconcile/utils/json.py +39 -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 +1 -1
- reconcile/utils/merge_request_manager/parser.py +4 -4
- reconcile/utils/metrics.py +5 -5
- reconcile/utils/models.py +304 -82
- reconcile/utils/mr/notificator.py +1 -1
- reconcile/utils/mr/user_maintenance.py +3 -2
- reconcile/utils/oc.py +112 -92
- 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 +8 -8
- reconcile/utils/ocm/service_log.py +1 -1
- reconcile/utils/ocm/sre_capability_labels.py +20 -13
- reconcile/utils/openshift_resource.py +5 -0
- reconcile/utils/pagerduty_api.py +5 -2
- 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 +1 -1
- reconcile/utils/saasherder/interfaces.py +13 -20
- reconcile/utils/saasherder/models.py +23 -20
- reconcile/utils/saasherder/saasherder.py +26 -17
- reconcile/utils/slack_api.py +2 -2
- reconcile/utils/structs.py +1 -1
- reconcile/utils/terraform_client.py +1 -1
- reconcile/utils/terrascript_aws_client.py +47 -43
- reconcile/utils/unleash/server.py +2 -8
- reconcile/utils/vault.py +4 -11
- reconcile/utils/vcs.py +8 -8
- reconcile/vault_replication.py +1 -1
- 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/qontract_cli.py +6 -5
- tools/template_validation.py +3 -1
- {qontract_reconcile-0.10.2.dev394.dist-info → qontract_reconcile-0.10.2.dev414.dist-info}/WHEEL +0 -0
- {qontract_reconcile-0.10.2.dev394.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 = [
|
|
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.
|
|
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.
|
|
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
|
]
|
|
@@ -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.
|
|
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.
|
|
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
|
-
|
|
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])
|
|
@@ -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 = [
|
|
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.
|
|
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
|
|
@@ -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.
|
|
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.
|
|
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,
|
|
@@ -185,7 +185,7 @@ def run(
|
|
|
185
185
|
if defer:
|
|
186
186
|
defer(oc_map.cleanup)
|
|
187
187
|
|
|
188
|
-
cluster_like_objects = [cluster.
|
|
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:
|
|
26
|
-
|
|
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.
|
|
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.
|
|
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
reconcile/queries.py
CHANGED
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
|
-
@
|
|
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]:
|
|
@@ -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.
|
|
180
|
+
"namespace": [namespace.model_dump(by_alias=True, exclude_none=True)]
|
|
181
181
|
}
|
|
182
182
|
|
|
183
183
|
do_include = any(
|
|
@@ -85,7 +85,7 @@ def compile_skupper_sites(
|
|
|
85
85
|
or skupper_network.site_controller_templates
|
|
86
86
|
):
|
|
87
87
|
tmpl_vars = tmpl.variables or {}
|
|
88
|
-
tmpl_vars["resource"] = {"namespace": ns.
|
|
88
|
+
tmpl_vars["resource"] = {"namespace": ns.model_dump(by_alias=True)}
|
|
89
89
|
|
|
90
90
|
site_controller_objects.append(
|
|
91
91
|
load_site_controller_template(tmpl.path, tmpl_vars)
|
|
@@ -304,6 +304,6 @@ def early_exit_desired_state(*args: Any, **kwargs: Any) -> dict[str, Any]:
|
|
|
304
304
|
skupper_networks = get_skupper_networks(gqlapi.query)
|
|
305
305
|
return {
|
|
306
306
|
"skupper_sites": [
|
|
307
|
-
site.
|
|
307
|
+
site.model_dump() for site in compile_skupper_sites(skupper_networks)
|
|
308
308
|
],
|
|
309
309
|
}
|
reconcile/slack_usergroups.py
CHANGED
|
@@ -3,18 +3,19 @@ import sys
|
|
|
3
3
|
from collections.abc import (
|
|
4
4
|
Callable,
|
|
5
5
|
Iterable,
|
|
6
|
+
MutableMapping,
|
|
6
7
|
Sequence,
|
|
7
8
|
)
|
|
8
9
|
from datetime import datetime
|
|
9
10
|
from typing import (
|
|
10
11
|
Any,
|
|
11
12
|
TypedDict,
|
|
13
|
+
TypeVar,
|
|
12
14
|
)
|
|
13
15
|
|
|
14
16
|
from github.GithubException import UnknownObjectException
|
|
15
17
|
from pydantic import BaseModel
|
|
16
|
-
from
|
|
17
|
-
from sretoolbox.utils import retry
|
|
18
|
+
from sretoolbox.utils import datatransformation, retry
|
|
18
19
|
|
|
19
20
|
from reconcile import (
|
|
20
21
|
openshift_users,
|
|
@@ -75,6 +76,26 @@ INTEGRATION_VERSION = "0.1.0"
|
|
|
75
76
|
|
|
76
77
|
error_occurred = False
|
|
77
78
|
|
|
79
|
+
KeyType = TypeVar("KeyType")
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def deep_update(
|
|
83
|
+
mapping: dict[KeyType, Any],
|
|
84
|
+
*updating_mappings: MutableMapping[KeyType, Any],
|
|
85
|
+
) -> dict[KeyType, Any]:
|
|
86
|
+
updated_mapping = mapping.copy()
|
|
87
|
+
for updating_mapping in updating_mappings:
|
|
88
|
+
for k, v in updating_mapping.items():
|
|
89
|
+
if (
|
|
90
|
+
k in updated_mapping
|
|
91
|
+
and isinstance(updated_mapping[k], dict)
|
|
92
|
+
and isinstance(v, dict)
|
|
93
|
+
):
|
|
94
|
+
updated_mapping[k] = deep_update(updated_mapping[k], v)
|
|
95
|
+
else:
|
|
96
|
+
updated_mapping[k] = v
|
|
97
|
+
return updated_mapping
|
|
98
|
+
|
|
78
99
|
|
|
79
100
|
def get_git_api(url: str) -> GithubRepositoryApi | GitLabApi:
|
|
80
101
|
"""Return GitHub/GitLab API based on url."""
|
|
@@ -123,15 +144,12 @@ class State(BaseModel):
|
|
|
123
144
|
SlackState = dict[str, dict[str, State]]
|
|
124
145
|
|
|
125
146
|
|
|
126
|
-
class WorkspaceSpec(BaseModel):
|
|
147
|
+
class WorkspaceSpec(BaseModel, arbitrary_types_allowed=True):
|
|
127
148
|
"""Slack workspace spec."""
|
|
128
149
|
|
|
129
150
|
slack: SlackApi
|
|
130
151
|
managed_usergroups: list[str] = []
|
|
131
152
|
|
|
132
|
-
class Config:
|
|
133
|
-
arbitrary_types_allowed = True
|
|
134
|
-
|
|
135
153
|
|
|
136
154
|
SlackMap = dict[str, WorkspaceSpec]
|
|
137
155
|
|
|
@@ -820,7 +838,9 @@ def run(
|
|
|
820
838
|
desired_usergroup_name=usergroup_name,
|
|
821
839
|
)
|
|
822
840
|
# merge the two desired states recursively
|
|
823
|
-
desired_state =
|
|
841
|
+
desired_state = datatransformation.deep_merge(
|
|
842
|
+
desired_state, desired_state_cluster_usergroups
|
|
843
|
+
)
|
|
824
844
|
|
|
825
845
|
runner_params: RunnerParams = {
|
|
826
846
|
"dry_run": dry_run,
|
|
@@ -892,10 +912,10 @@ def early_exit_desired_state(*args: Any, **kwargs: Any) -> dict[str, Any]:
|
|
|
892
912
|
if role.tag_on_cluster_updates is not False
|
|
893
913
|
]
|
|
894
914
|
return {
|
|
895
|
-
"permissions": [p.
|
|
915
|
+
"permissions": [p.model_dump() for p in get_permissions(gqlapi.query)],
|
|
896
916
|
"pagerduty_instances": [
|
|
897
|
-
p.
|
|
917
|
+
p.model_dump() for p in get_pagerduty_instances(gqlapi.query)
|
|
898
918
|
],
|
|
899
|
-
"users": [u.
|
|
900
|
-
"clusters": [c.
|
|
919
|
+
"users": [u.model_dump() for u in users],
|
|
920
|
+
"clusters": [c.model_dump() for c in get_clusters(gqlapi.query)],
|
|
901
921
|
}
|
reconcile/status_board.py
CHANGED
|
@@ -52,7 +52,7 @@ class AbstractStatusBoard(ABC, BaseModel):
|
|
|
52
52
|
"""Abstract class for upgrade policies
|
|
53
53
|
Used to create and delete upgrade policies in OCM."""
|
|
54
54
|
|
|
55
|
-
id: str | None
|
|
55
|
+
id: str | None = None
|
|
56
56
|
name: str
|
|
57
57
|
fullname: str
|
|
58
58
|
|
|
@@ -88,7 +88,7 @@ class AbstractStatusBoard(ABC, BaseModel):
|
|
|
88
88
|
|
|
89
89
|
|
|
90
90
|
class Product(AbstractStatusBoard):
|
|
91
|
-
applications: list["Application"] | None
|
|
91
|
+
applications: list["Application"] | None = None
|
|
92
92
|
|
|
93
93
|
def create(self, ocm: OCMBaseClient) -> None:
|
|
94
94
|
spec = self.to_ocm_spec()
|
|
@@ -121,7 +121,7 @@ class Product(AbstractStatusBoard):
|
|
|
121
121
|
|
|
122
122
|
class Application(AbstractStatusBoard):
|
|
123
123
|
product: Product
|
|
124
|
-
services: list["Service"] | None
|
|
124
|
+
services: list["Service"] | None = None
|
|
125
125
|
|
|
126
126
|
def create(self, ocm: OCMBaseClient) -> None:
|
|
127
127
|
if self.product.id:
|
|
@@ -214,9 +214,9 @@ class Service(AbstractStatusBoard):
|
|
|
214
214
|
|
|
215
215
|
|
|
216
216
|
# Resolve forward references after class definitions
|
|
217
|
-
Product.
|
|
218
|
-
Application.
|
|
219
|
-
Service.
|
|
217
|
+
Product.model_rebuild()
|
|
218
|
+
Application.model_rebuild()
|
|
219
|
+
Service.model_rebuild()
|
|
220
220
|
|
|
221
221
|
|
|
222
222
|
class UpdateNotSupportedError(Exception):
|
|
@@ -29,12 +29,12 @@ class AtlassianRawComponent(BaseModel):
|
|
|
29
29
|
|
|
30
30
|
id: str
|
|
31
31
|
name: str
|
|
32
|
-
description: str | None
|
|
32
|
+
description: str | None = None
|
|
33
33
|
position: int
|
|
34
34
|
status: str
|
|
35
|
-
automation_email: str | None
|
|
36
|
-
group_id: str | None
|
|
37
|
-
group: bool | None
|
|
35
|
+
automation_email: str | None = None
|
|
36
|
+
group_id: str | None = None
|
|
37
|
+
group: bool | None = None
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
class AtlassianRawMaintenanceUpdate(BaseModel):
|
|
@@ -56,9 +56,9 @@ class AtlassianRawMaintenance(BaseModel):
|
|
|
56
56
|
scheduled_until: str
|
|
57
57
|
incident_updates: list[AtlassianRawMaintenanceUpdate]
|
|
58
58
|
components: list[AtlassianRawComponent]
|
|
59
|
-
auto_transition_deliver_notifications_at_end: bool | None
|
|
60
|
-
auto_transition_deliver_notifications_at_start: bool | None
|
|
61
|
-
scheduled_remind_prior: bool | None
|
|
59
|
+
auto_transition_deliver_notifications_at_end: bool | None = None
|
|
60
|
+
auto_transition_deliver_notifications_at_start: bool | None = None
|
|
61
|
+
scheduled_remind_prior: bool | None = None
|
|
62
62
|
|
|
63
63
|
|
|
64
64
|
class AtlassianAPI:
|
reconcile/statuspage/page.py
CHANGED
|
@@ -19,19 +19,17 @@ from reconcile.statuspage.status import (
|
|
|
19
19
|
PROVIDER_NAME = "statuspage"
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
class StatusComponent(BaseModel):
|
|
22
|
+
class StatusComponent(BaseModel, arbitrary_types_allowed=True):
|
|
23
23
|
"""
|
|
24
24
|
Represents a status page component from the desired state.
|
|
25
25
|
"""
|
|
26
26
|
|
|
27
27
|
name: str
|
|
28
28
|
display_name: str
|
|
29
|
-
description: str | None
|
|
30
|
-
group_name: str | None
|
|
29
|
+
description: str | None = None
|
|
30
|
+
group_name: str | None = None
|
|
31
|
+
# Status provider configs hold different ways for a component to determine its status
|
|
31
32
|
status_provider_configs: list[StatusProvider]
|
|
32
|
-
"""
|
|
33
|
-
Status provider configs hold different ways for a component to determine its status
|
|
34
|
-
"""
|
|
35
33
|
|
|
36
34
|
def status_management_enabled(self) -> bool:
|
|
37
35
|
"""
|
|
@@ -49,9 +47,6 @@ class StatusComponent(BaseModel):
|
|
|
49
47
|
return "operational"
|
|
50
48
|
return None
|
|
51
49
|
|
|
52
|
-
class Config:
|
|
53
|
-
arbitrary_types_allowed = True
|
|
54
|
-
|
|
55
50
|
def __eq__(self, other: object) -> bool:
|
|
56
51
|
if not isinstance(other, StatusComponent):
|
|
57
52
|
raise NotImplementedError("Cannot compare to non StatusComponent objects.")
|
|
@@ -18,7 +18,7 @@ from reconcile.utils.secret_reader import SecretReaderBase
|
|
|
18
18
|
|
|
19
19
|
class TemplateData(BaseModel):
|
|
20
20
|
variables: dict[str, Any]
|
|
21
|
-
current: dict[str, Any] | None
|
|
21
|
+
current: dict[str, Any] | None = None
|
|
22
22
|
current_with_explicit_start: bool | None = False
|
|
23
23
|
|
|
24
24
|
|
|
@@ -26,7 +26,7 @@ class TemplatePatch(Protocol):
|
|
|
26
26
|
path: str
|
|
27
27
|
identifier: str | None
|
|
28
28
|
|
|
29
|
-
def
|
|
29
|
+
def model_dump(self) -> dict[str, str]: ...
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
class Template(Protocol):
|
|
@@ -36,7 +36,7 @@ class Template(Protocol):
|
|
|
36
36
|
template: str
|
|
37
37
|
overwrite: bool | None
|
|
38
38
|
|
|
39
|
-
def
|
|
39
|
+
def model_dump(self) -> dict[str, str]: ...
|
|
40
40
|
|
|
41
41
|
@property
|
|
42
42
|
def patch(self) -> TemplatePatch | None:
|
reconcile/templating/renderer.py
CHANGED
|
@@ -239,8 +239,8 @@ def unpack_dynamic_variables(
|
|
|
239
239
|
|
|
240
240
|
class TemplateRendererIntegrationParams(PydanticRunParams):
|
|
241
241
|
clone_repo: bool = False
|
|
242
|
-
app_interface_root_path: str | None
|
|
243
|
-
template_collection_name: str | None
|
|
242
|
+
app_interface_root_path: str | None = None
|
|
243
|
+
template_collection_name: str | None = None
|
|
244
244
|
|
|
245
245
|
|
|
246
246
|
def join_path(base: str, sub: str) -> str:
|
|
@@ -155,7 +155,7 @@ class TerraformCloudflareDNSIntegration(
|
|
|
155
155
|
|
|
156
156
|
accts_per_zone = []
|
|
157
157
|
for zone in query_zones.zones or []:
|
|
158
|
-
acct = zone.account.
|
|
158
|
+
acct = zone.account.model_dump(by_alias=True)
|
|
159
159
|
acct["name"] = f"{zone.account.name}-{zone.identifier}"
|
|
160
160
|
accts_per_zone.append(acct)
|
|
161
161
|
|
|
@@ -369,11 +369,11 @@ def cloudflare_dns_zone_to_external_resource(
|
|
|
369
369
|
provision_provider=DEFAULT_PROVISIONER_PROVIDER,
|
|
370
370
|
provisioner={"name": f"{zone.account.name}-{zone.identifier}"},
|
|
371
371
|
namespace=DEFAULT_NAMESPACE,
|
|
372
|
-
resource=zone.
|
|
372
|
+
resource=zone.model_dump(by_alias=True, exclude=DEFAULT_EXCLUDE_KEY),
|
|
373
373
|
)
|
|
374
374
|
external_resource_spec.resource["provider"] = DEFAULT_PROVIDER
|
|
375
375
|
external_resource_spec.resource["records"] = [
|
|
376
|
-
record.
|
|
376
|
+
record.model_dump(by_alias=True) for record in zone.records or []
|
|
377
377
|
]
|
|
378
378
|
external_resource_specs.append(external_resource_spec)
|
|
379
379
|
return external_resource_specs
|
|
@@ -168,7 +168,7 @@ def _build_oc_resources(
|
|
|
168
168
|
internal=internal,
|
|
169
169
|
)
|
|
170
170
|
|
|
171
|
-
namespace_mapping = [ns.
|
|
171
|
+
namespace_mapping = [ns.model_dump() for ns in cloudflare_namespaces]
|
|
172
172
|
|
|
173
173
|
state_specs = init_specs_to_fetch(
|
|
174
174
|
ri, oc_map, namespaces=namespace_mapping, override_managed_types=["Secret"]
|
|
@@ -338,7 +338,7 @@ def run(
|
|
|
338
338
|
)
|
|
339
339
|
|
|
340
340
|
if not cloudflare_namespaces:
|
|
341
|
-
logging.
|
|
341
|
+
logging.debug("No cloudflare namespaces were detected, nothing to do.")
|
|
342
342
|
sys.exit(ExitCodes.SUCCESS)
|
|
343
343
|
|
|
344
344
|
# Build Cloudflare clients
|
|
@@ -351,7 +351,7 @@ def run(
|
|
|
351
351
|
spec
|
|
352
352
|
for namespace in query_resources.namespaces
|
|
353
353
|
for spec in get_external_resource_specs(
|
|
354
|
-
namespace.
|
|
354
|
+
namespace.model_dump(by_alias=True), PROVIDER_CLOUDFLARE
|
|
355
355
|
)
|
|
356
356
|
if not selected_account or spec.provisioner_name == selected_account
|
|
357
357
|
]
|
|
@@ -383,7 +383,7 @@ def run(
|
|
|
383
383
|
QONTRACT_INTEGRATION_VERSION,
|
|
384
384
|
QONTRACT_TF_PREFIX,
|
|
385
385
|
[
|
|
386
|
-
acct.
|
|
386
|
+
acct.model_dump(by_alias=True) # convert CloudflareAccountV1 to dict
|
|
387
387
|
for acct in query_accounts.accounts or []
|
|
388
388
|
if acct.name in cf_clients.dump() # use only if it is a registered client
|
|
389
389
|
],
|
|
@@ -442,4 +442,4 @@ def _get_cloudflare_desired_state() -> tuple[
|
|
|
442
442
|
def early_exit_desired_state(*args: Any, **kwargs: Any) -> dict[str, Any]:
|
|
443
443
|
desired_state = _get_cloudflare_desired_state()
|
|
444
444
|
|
|
445
|
-
return {state
|
|
445
|
+
return {str(state): state.model_dump() for state in desired_state}
|
|
@@ -88,7 +88,7 @@ class TerraformCloudflareUsers(
|
|
|
88
88
|
if not settings.settings:
|
|
89
89
|
raise RuntimeError("App interface setting not defined")
|
|
90
90
|
|
|
91
|
-
early_exit_desired_state = cloudflare_roles.
|
|
91
|
+
early_exit_desired_state = cloudflare_roles.model_dump()
|
|
92
92
|
early_exit_desired_state.update({
|
|
93
93
|
CLOUDFLARE_EMAIL_DOMAIN_ALLOW_LIST_KEY: settings.settings
|
|
94
94
|
})
|
|
@@ -149,7 +149,8 @@ class TerraformCloudflareUsers(
|
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
accounts = [
|
|
152
|
-
acct.
|
|
152
|
+
acct.model_dump(by_alias=True)
|
|
153
|
+
for _, acct in account_names_to_account.items()
|
|
153
154
|
]
|
|
154
155
|
|
|
155
156
|
self._run_terraform(
|
|
@@ -34,7 +34,7 @@ QONTRACT_INTEGRATION_VERSION = make_semver(1, 0, 0)
|
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
class TerraformInitIntegrationParams(PydanticRunParams):
|
|
37
|
-
account_name: str | None
|
|
37
|
+
account_name: str | None = None
|
|
38
38
|
# To avoid the accidental deletion of the resource file, explicitly set the
|
|
39
39
|
# qontract.cli option in the integration extraArgs!
|
|
40
40
|
state_tmpl_resource: str = "/terraform-init/terraform-state.yml"
|
|
@@ -64,7 +64,7 @@ class TerraformInitIntegration(
|
|
|
64
64
|
query_func = gql.get_api().query
|
|
65
65
|
return {
|
|
66
66
|
"accounts": [
|
|
67
|
-
account.
|
|
67
|
+
account.model_dump() for account in self.get_aws_accounts(query_func)
|
|
68
68
|
],
|
|
69
69
|
}
|
|
70
70
|
|