qontract-reconcile 0.10.2.dev299__py3-none-any.whl → 0.10.2.dev430__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.dev299.dist-info → qontract_reconcile-0.10.2.dev430.dist-info}/METADATA +13 -12
- {qontract_reconcile-0.10.2.dev299.dist-info → qontract_reconcile-0.10.2.dev430.dist-info}/RECORD +399 -394
- 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 +4 -4
- 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 +8 -11
- 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 +23 -10
- 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 +492 -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 +10 -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 +3050 -1393
- 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 +448 -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 +5 -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 +4 -0
- reconcile/templates/rosa-hcp-cluster-creation.sh.j2 +3 -0
- 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 +27 -19
- reconcile/terraform_users.py +29 -21
- reconcile/terraform_vpc_peerings.py +16 -4
- reconcile/terraform_vpc_resources/integration.py +32 -2
- 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 +59 -43
- 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 +27 -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/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 +4 -4
- reconcile/utils/terraform_client.py +32 -29
- reconcile/utils/terrascript_aws_client.py +658 -480
- reconcile/utils/three_way_diff_strategy.py +1 -1
- reconcile/utils/throughput.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
- reconcile/vpc_peerings_validator.py +2 -2
- 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/sre_checkpoints/util.py +5 -3
- 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.dev299.dist-info → qontract_reconcile-0.10.2.dev430.dist-info}/WHEEL +0 -0
- {qontract_reconcile-0.10.2.dev299.dist-info → qontract_reconcile-0.10.2.dev430.dist-info}/entry_points.txt +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Generated by qenerate plugin=
|
|
2
|
+
Generated by qenerate plugin=pydantic_v2. DO NOT MODIFY MANUALLY!
|
|
3
3
|
"""
|
|
4
4
|
from collections.abc import Callable # noqa: F401 # pylint: disable=W0611
|
|
5
5
|
from datetime import datetime # noqa: F401 # pylint: disable=W0611
|
|
@@ -12,7 +12,7 @@ from typing import ( # noqa: F401 # pylint: disable=W0611
|
|
|
12
12
|
|
|
13
13
|
from pydantic import ( # noqa: F401 # pylint: disable=W0611
|
|
14
14
|
BaseModel,
|
|
15
|
-
|
|
15
|
+
ConfigDict,
|
|
16
16
|
Field,
|
|
17
17
|
Json,
|
|
18
18
|
)
|
|
@@ -37,7 +37,7 @@ fragment AWSAccountCommon on AWSAccount_v1 {
|
|
|
37
37
|
email
|
|
38
38
|
}
|
|
39
39
|
automationToken {
|
|
40
|
-
...
|
|
40
|
+
...VaultSecret
|
|
41
41
|
}
|
|
42
42
|
enableDeletion
|
|
43
43
|
deletionApprovals {
|
|
@@ -51,6 +51,16 @@ fragment AWSAccountCommon on AWSAccount_v1 {
|
|
|
51
51
|
deleteKeys
|
|
52
52
|
premiumSupport
|
|
53
53
|
partition
|
|
54
|
+
organization {
|
|
55
|
+
...AWSOrganization
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
fragment AWSOrganization on AWSOrganization_v1 {
|
|
60
|
+
payerAccount {
|
|
61
|
+
organizationAccountTags
|
|
62
|
+
}
|
|
63
|
+
tags
|
|
54
64
|
}
|
|
55
65
|
|
|
56
66
|
fragment TerraformState on TerraformStateAWS_v1 {
|
|
@@ -64,21 +74,17 @@ fragment TerraformState on TerraformStateAWS_v1 {
|
|
|
64
74
|
}
|
|
65
75
|
|
|
66
76
|
fragment VaultSecret on VaultSecret_v1 {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
77
|
+
path
|
|
78
|
+
field
|
|
79
|
+
version
|
|
80
|
+
format
|
|
71
81
|
}
|
|
72
82
|
|
|
73
83
|
query AWSAccounts($name: String) {
|
|
74
|
-
accounts: awsaccounts_v1
|
|
75
|
-
|
|
76
|
-
name: $name
|
|
77
|
-
)
|
|
78
|
-
{
|
|
79
|
-
... AWSAccountCommon
|
|
84
|
+
accounts: awsaccounts_v1(name: $name) {
|
|
85
|
+
...AWSAccountCommon
|
|
80
86
|
terraformState {
|
|
81
|
-
...
|
|
87
|
+
...TerraformState
|
|
82
88
|
}
|
|
83
89
|
}
|
|
84
90
|
}
|
|
@@ -86,9 +92,9 @@ query AWSAccounts($name: String) {
|
|
|
86
92
|
|
|
87
93
|
|
|
88
94
|
class ConfiguredBaseModel(BaseModel):
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
95
|
+
model_config = ConfigDict(
|
|
96
|
+
extra='forbid'
|
|
97
|
+
)
|
|
92
98
|
|
|
93
99
|
|
|
94
100
|
class AWSAccountV1(AWSAccountCommon):
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Generated by qenerate plugin=
|
|
2
|
+
Generated by qenerate plugin=pydantic_v2. DO NOT MODIFY MANUALLY!
|
|
3
3
|
"""
|
|
4
4
|
from collections.abc import Callable # noqa: F401 # pylint: disable=W0611
|
|
5
5
|
from datetime import datetime # noqa: F401 # pylint: disable=W0611
|
|
@@ -12,7 +12,7 @@ from typing import ( # noqa: F401 # pylint: disable=W0611
|
|
|
12
12
|
|
|
13
13
|
from pydantic import ( # noqa: F401 # pylint: disable=W0611
|
|
14
14
|
BaseModel,
|
|
15
|
-
|
|
15
|
+
ConfigDict,
|
|
16
16
|
Field,
|
|
17
17
|
Json,
|
|
18
18
|
)
|
|
@@ -22,10 +22,10 @@ from reconcile.gql_definitions.fragments.vault_secret import VaultSecret
|
|
|
22
22
|
|
|
23
23
|
DEFINITION = """
|
|
24
24
|
fragment VaultSecret on VaultSecret_v1 {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
path
|
|
26
|
+
field
|
|
27
|
+
version
|
|
28
|
+
format
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
query UnleashFeatureToggles {
|
|
@@ -57,9 +57,9 @@ query UnleashFeatureToggles {
|
|
|
57
57
|
|
|
58
58
|
|
|
59
59
|
class ConfiguredBaseModel(BaseModel):
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
model_config = ConfigDict(
|
|
61
|
+
extra='forbid'
|
|
62
|
+
)
|
|
63
63
|
|
|
64
64
|
|
|
65
65
|
class UnleashFeatureToggleV1(ConfiguredBaseModel):
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Generated by qenerate plugin=
|
|
2
|
+
Generated by qenerate plugin=pydantic_v2. DO NOT MODIFY MANUALLY!
|
|
3
3
|
"""
|
|
4
4
|
from collections.abc import Callable # noqa: F401 # pylint: disable=W0611
|
|
5
5
|
from datetime import datetime # noqa: F401 # pylint: disable=W0611
|
|
@@ -12,7 +12,7 @@ from typing import ( # noqa: F401 # pylint: disable=W0611
|
|
|
12
12
|
|
|
13
13
|
from pydantic import ( # noqa: F401 # pylint: disable=W0611
|
|
14
14
|
BaseModel,
|
|
15
|
-
|
|
15
|
+
ConfigDict,
|
|
16
16
|
Field,
|
|
17
17
|
Json,
|
|
18
18
|
)
|
|
@@ -22,10 +22,10 @@ from reconcile.gql_definitions.fragments.vault_secret import VaultSecret
|
|
|
22
22
|
|
|
23
23
|
DEFINITION = """
|
|
24
24
|
fragment VaultSecret on VaultSecret_v1 {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
path
|
|
26
|
+
field
|
|
27
|
+
version
|
|
28
|
+
format
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
query VaultInstances {
|
|
@@ -37,77 +37,77 @@ query VaultInstances {
|
|
|
37
37
|
provider
|
|
38
38
|
secretEngine
|
|
39
39
|
... on VaultInstanceAuthApprole_v1 {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
40
|
+
roleID {
|
|
41
|
+
...VaultSecret
|
|
42
|
+
}
|
|
43
|
+
secretID {
|
|
44
|
+
...VaultSecret
|
|
45
|
+
}
|
|
45
46
|
}
|
|
46
47
|
}
|
|
47
|
-
}
|
|
48
48
|
replication {
|
|
49
49
|
vaultInstance {
|
|
50
50
|
name
|
|
51
51
|
address
|
|
52
52
|
auth {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
53
|
+
provider
|
|
54
|
+
secretEngine
|
|
55
|
+
... on VaultInstanceAuthApprole_v1 {
|
|
56
|
+
roleID {
|
|
57
|
+
...VaultSecret
|
|
58
|
+
}
|
|
59
|
+
secretID {
|
|
60
|
+
...VaultSecret
|
|
62
61
|
}
|
|
63
62
|
}
|
|
63
|
+
}
|
|
64
64
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
destAuth {
|
|
78
|
-
provider
|
|
79
|
-
secretEngine
|
|
80
|
-
... on VaultInstanceAuthApprole_v1 {
|
|
81
|
-
roleID {
|
|
82
|
-
... VaultSecret
|
|
65
|
+
sourceAuth {
|
|
66
|
+
provider
|
|
67
|
+
secretEngine
|
|
68
|
+
... on VaultInstanceAuthApprole_v1 {
|
|
69
|
+
roleID {
|
|
70
|
+
...VaultSecret
|
|
71
|
+
}
|
|
72
|
+
secretID {
|
|
73
|
+
...VaultSecret
|
|
74
|
+
}
|
|
75
|
+
}
|
|
83
76
|
}
|
|
84
|
-
|
|
85
|
-
|
|
77
|
+
destAuth {
|
|
78
|
+
provider
|
|
79
|
+
secretEngine
|
|
80
|
+
... on VaultInstanceAuthApprole_v1 {
|
|
81
|
+
roleID {
|
|
82
|
+
...VaultSecret
|
|
83
|
+
}
|
|
84
|
+
secretID {
|
|
85
|
+
...VaultSecret
|
|
86
|
+
}
|
|
87
|
+
}
|
|
86
88
|
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
89
|
paths {
|
|
90
90
|
provider
|
|
91
|
-
...on VaultReplicationJenkins_v1 {
|
|
92
|
-
|
|
93
|
-
name
|
|
94
|
-
serverUrl
|
|
95
|
-
}
|
|
96
|
-
policy {
|
|
97
|
-
name
|
|
98
|
-
instance {
|
|
91
|
+
... on VaultReplicationJenkins_v1 {
|
|
92
|
+
jenkinsInstance {
|
|
99
93
|
name
|
|
100
|
-
|
|
94
|
+
serverUrl
|
|
95
|
+
}
|
|
96
|
+
policy {
|
|
97
|
+
name
|
|
98
|
+
instance {
|
|
99
|
+
name
|
|
100
|
+
address
|
|
101
|
+
}
|
|
101
102
|
}
|
|
102
103
|
}
|
|
103
|
-
|
|
104
|
-
...on VaultReplicationPolicy_v1 {
|
|
104
|
+
... on VaultReplicationPolicy_v1 {
|
|
105
105
|
policy {
|
|
106
|
+
name
|
|
107
|
+
instance {
|
|
106
108
|
name
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
address
|
|
110
|
-
}
|
|
109
|
+
address
|
|
110
|
+
}
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
}
|
|
@@ -118,9 +118,9 @@ query VaultInstances {
|
|
|
118
118
|
|
|
119
119
|
|
|
120
120
|
class ConfiguredBaseModel(BaseModel):
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
121
|
+
model_config = ConfigDict(
|
|
122
|
+
extra='forbid'
|
|
123
|
+
)
|
|
124
124
|
|
|
125
125
|
|
|
126
126
|
class VaultInstanceAuthV1(ConfiguredBaseModel):
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Generated by qenerate plugin=
|
|
2
|
+
Generated by qenerate plugin=pydantic_v2. DO NOT MODIFY MANUALLY!
|
|
3
3
|
"""
|
|
4
4
|
from collections.abc import Callable # noqa: F401 # pylint: disable=W0611
|
|
5
5
|
from datetime import datetime # noqa: F401 # pylint: disable=W0611
|
|
@@ -12,7 +12,7 @@ from typing import ( # noqa: F401 # pylint: disable=W0611
|
|
|
12
12
|
|
|
13
13
|
from pydantic import ( # noqa: F401 # pylint: disable=W0611
|
|
14
14
|
BaseModel,
|
|
15
|
-
|
|
15
|
+
ConfigDict,
|
|
16
16
|
Field,
|
|
17
17
|
Json,
|
|
18
18
|
)
|
|
@@ -20,21 +20,21 @@ from pydantic import ( # noqa: F401 # pylint: disable=W0611
|
|
|
20
20
|
|
|
21
21
|
DEFINITION = """
|
|
22
22
|
query VaultPolicies {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
rules
|
|
23
|
+
policy: vault_policies_v1 {
|
|
24
|
+
name
|
|
25
|
+
instance {
|
|
26
|
+
name
|
|
29
27
|
}
|
|
28
|
+
rules
|
|
29
|
+
}
|
|
30
30
|
}
|
|
31
31
|
"""
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
class ConfiguredBaseModel(BaseModel):
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
model_config = ConfigDict(
|
|
36
|
+
extra='forbid'
|
|
37
|
+
)
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
class VaultInstanceV1(ConfiguredBaseModel):
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Generated by qenerate plugin=
|
|
2
|
+
Generated by qenerate plugin=pydantic_v2. DO NOT MODIFY MANUALLY!
|
|
3
3
|
"""
|
|
4
4
|
from collections.abc import Callable # noqa: F401 # pylint: disable=W0611
|
|
5
5
|
from datetime import datetime # noqa: F401 # pylint: disable=W0611
|
|
@@ -12,7 +12,7 @@ from typing import ( # noqa: F401 # pylint: disable=W0611
|
|
|
12
12
|
|
|
13
13
|
from pydantic import ( # noqa: F401 # pylint: disable=W0611
|
|
14
14
|
BaseModel,
|
|
15
|
-
|
|
15
|
+
ConfigDict,
|
|
16
16
|
Field,
|
|
17
17
|
Json,
|
|
18
18
|
)
|
|
@@ -51,7 +51,7 @@ query VpcPeeringsValidator {
|
|
|
51
51
|
name
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
-
... on ClusterPeeringConnectionAccountVPCMesh_v1{
|
|
54
|
+
... on ClusterPeeringConnectionAccountVPCMesh_v1 {
|
|
55
55
|
name
|
|
56
56
|
account {
|
|
57
57
|
name
|
|
@@ -61,12 +61,12 @@ query VpcPeeringsValidator {
|
|
|
61
61
|
}
|
|
62
62
|
... on ClusterPeeringConnectionClusterRequester_v1 {
|
|
63
63
|
cluster {
|
|
64
|
-
...
|
|
64
|
+
...VpcPeeringsValidatorPeeredCluster
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
... on ClusterPeeringConnectionClusterAccepter_v1 {
|
|
68
68
|
cluster {
|
|
69
|
-
...
|
|
69
|
+
...VpcPeeringsValidatorPeeredCluster
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
}
|
|
@@ -77,9 +77,9 @@ query VpcPeeringsValidator {
|
|
|
77
77
|
|
|
78
78
|
|
|
79
79
|
class ConfiguredBaseModel(BaseModel):
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
80
|
+
model_config = ConfigDict(
|
|
81
|
+
extra='forbid'
|
|
82
|
+
)
|
|
83
83
|
|
|
84
84
|
|
|
85
85
|
class ClusterNetworkV1(ConfiguredBaseModel):
|
reconcile/gql_definitions/vpc_peerings_validator/vpc_peerings_validator_peered_cluster_fragment.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Generated by qenerate plugin=
|
|
2
|
+
Generated by qenerate plugin=pydantic_v2. DO NOT MODIFY MANUALLY!
|
|
3
3
|
"""
|
|
4
4
|
from collections.abc import Callable # noqa: F401 # pylint: disable=W0611
|
|
5
5
|
from datetime import datetime # noqa: F401 # pylint: disable=W0611
|
|
@@ -12,16 +12,16 @@ from typing import ( # noqa: F401 # pylint: disable=W0611
|
|
|
12
12
|
|
|
13
13
|
from pydantic import ( # noqa: F401 # pylint: disable=W0611
|
|
14
14
|
BaseModel,
|
|
15
|
-
|
|
15
|
+
ConfigDict,
|
|
16
16
|
Field,
|
|
17
17
|
Json,
|
|
18
18
|
)
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class ConfiguredBaseModel(BaseModel):
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
model_config = ConfigDict(
|
|
23
|
+
extra='forbid'
|
|
24
|
+
)
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
class ClusterNetworkV1(ConfiguredBaseModel):
|
|
@@ -122,7 +122,7 @@ def _build_helm_integration_spec(
|
|
|
122
122
|
managed: IntegrationManagedV1,
|
|
123
123
|
shard_manager: IntegrationShardManager,
|
|
124
124
|
) -> HelmIntegrationSpec:
|
|
125
|
-
integration_spec = managed.spec.
|
|
125
|
+
integration_spec = managed.spec.model_dump(by_alias=True)
|
|
126
126
|
shard_specs = shard_manager.build_integration_shards(integration_name, managed)
|
|
127
127
|
his = HelmIntegrationSpec(
|
|
128
128
|
**integration_spec, name=integration_name, shard_specs=shard_specs
|
|
@@ -143,7 +143,7 @@ def build_helm_values(specs: Iterable[HelmIntegrationSpec]) -> dict:
|
|
|
143
143
|
else:
|
|
144
144
|
values.integrations.append(s)
|
|
145
145
|
|
|
146
|
-
return values.
|
|
146
|
+
return values.model_dump(exclude_none=True, by_alias=True)
|
|
147
147
|
|
|
148
148
|
|
|
149
149
|
class IntegrationsEnvironment(BaseModel):
|
|
@@ -273,7 +273,7 @@ def run(
|
|
|
273
273
|
|
|
274
274
|
ri, oc_map = ob.fetch_current_state(
|
|
275
275
|
namespaces=[
|
|
276
|
-
ie.namespace.
|
|
276
|
+
ie.namespace.model_dump(by_alias=True) for ie in integration_environments
|
|
277
277
|
],
|
|
278
278
|
thread_pool_size=thread_pool_size,
|
|
279
279
|
integration=QONTRACT_INTEGRATION,
|
reconcile/jenkins_job_builder.py
CHANGED
|
@@ -81,7 +81,7 @@ def run(
|
|
|
81
81
|
if not print_only and config_name is not None:
|
|
82
82
|
raise Exception("--config-name must works with --print-only mode")
|
|
83
83
|
secret_reader = SecretReader(queries.get_secret_reader_settings())
|
|
84
|
-
jjb
|
|
84
|
+
jjb = init_jjb(secret_reader, instance_name, config_name, print_only)
|
|
85
85
|
if defer:
|
|
86
86
|
defer(jjb.cleanup)
|
|
87
87
|
|
|
@@ -1,14 +1,12 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
import logging
|
|
2
|
-
from
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from typing import Any, cast
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
6
8
|
|
|
7
9
|
from reconcile import queries
|
|
8
|
-
from reconcile.jenkins.types import (
|
|
9
|
-
JenkinsWorkerFleet,
|
|
10
|
-
SSHConnector,
|
|
11
|
-
)
|
|
12
10
|
from reconcile.utils.external_resources import get_external_resource_specs
|
|
13
11
|
from reconcile.utils.jenkins_api import JenkinsApi
|
|
14
12
|
from reconcile.utils.secret_reader import SecretReader
|
|
@@ -17,6 +15,72 @@ from reconcile.utils.terrascript_aws_client import TerrascriptClient as Terrascr
|
|
|
17
15
|
QONTRACT_INTEGRATION = "jenkins-worker-fleets"
|
|
18
16
|
|
|
19
17
|
|
|
18
|
+
class SSHHostKeyVerificationStrategy(Enum):
|
|
19
|
+
MANUALLY_TRUSTED_KEY_VERIFICATION_STRATEGY = (
|
|
20
|
+
"manuallyTrustedKeyVerificationStrategy"
|
|
21
|
+
)
|
|
22
|
+
MANUALLY_PROVIDED_KEY_VERIFICATION_STRATEGY = (
|
|
23
|
+
"manuallyProvidedKeyVerificationStrategy"
|
|
24
|
+
)
|
|
25
|
+
NON_VERIFYING_KEY_VERIFICATION_STRATEGY = "nonVerifyingKeyVerificationStrategy"
|
|
26
|
+
KNOWN_HOSTS_FILE_KEY_VERIFICATION_STRATEGY = "knownHostsFileKeyVerificationStrategy"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class SSHConnector(BaseModel, use_enum_values=True):
|
|
30
|
+
credentials_id: str = Field(..., alias="credentialsId")
|
|
31
|
+
launch_timeout_seconds: int | None = Field(None, alias="launchTimeoutSeconds")
|
|
32
|
+
max_num_retries: int | None = Field(None, alias="maxNumRetries")
|
|
33
|
+
retry_wait_time: int | None = Field(None, alias="retryWaitTime")
|
|
34
|
+
port: int | None = 22
|
|
35
|
+
jvm_options: str | None = Field(None, alias="jvmOptions")
|
|
36
|
+
ssh_host_key_verification_strategy: SSHHostKeyVerificationStrategy = Field(
|
|
37
|
+
SSHHostKeyVerificationStrategy.NON_VERIFYING_KEY_VERIFICATION_STRATEGY,
|
|
38
|
+
alias="sshHostKeyVerificationStrategy",
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class ComputerConnector(BaseModel):
|
|
43
|
+
# alias name is defined by jcasc schema
|
|
44
|
+
ssh_connector: SSHConnector = Field(..., alias="sSHConnector")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class JenkinsWorkerFleet(BaseModel):
|
|
48
|
+
# following options comes form https://github.com/jenkinsci/ec2-fleet-plugin/blob/master/docs/
|
|
49
|
+
name: str
|
|
50
|
+
fleet: str
|
|
51
|
+
region: str
|
|
52
|
+
min_size: int = Field(..., alias="minSize")
|
|
53
|
+
max_size: int = Field(..., alias="maxSize")
|
|
54
|
+
computer_connector: ComputerConnector = Field(..., alias="computerConnector")
|
|
55
|
+
fs_root: str = Field(..., alias="fsRoot")
|
|
56
|
+
label_string: str = Field(..., alias="labelString")
|
|
57
|
+
num_executors: int = Field(2, alias="numExecutors")
|
|
58
|
+
idle_minutes: int = Field(30, alias="idleMinutes")
|
|
59
|
+
min_spare_size: int = Field(0, alias="minSpareSize")
|
|
60
|
+
max_total_uses: int = Field(-1, alias="maxTotalUses")
|
|
61
|
+
no_delay_provision: bool = Field(False, alias="noDelayProvision")
|
|
62
|
+
add_node_only_if_running: bool = Field(True, alias="addNodeOnlyIfRunning")
|
|
63
|
+
always_reconnect: bool = Field(True, alias="alwaysReconnect")
|
|
64
|
+
private_ip_used: bool = Field(True, alias="privateIpUsed")
|
|
65
|
+
restrict_usage: bool = Field(True, alias="restrictUsage")
|
|
66
|
+
|
|
67
|
+
def __lt__(self, other: JenkinsWorkerFleet) -> bool:
|
|
68
|
+
return self.fleet < other.fleet
|
|
69
|
+
|
|
70
|
+
def __eq__(self, other: object) -> bool:
|
|
71
|
+
if not isinstance(other, JenkinsWorkerFleet):
|
|
72
|
+
raise NotImplementedError(
|
|
73
|
+
"Cannot compare to non JenkinsWorkerFleet objects."
|
|
74
|
+
)
|
|
75
|
+
return self.fleet == other.fleet and self.region == other.region
|
|
76
|
+
|
|
77
|
+
def __hash__(self) -> int:
|
|
78
|
+
return hash(self.fleet + self.region)
|
|
79
|
+
|
|
80
|
+
def differ(self, other: JenkinsWorkerFleet) -> bool:
|
|
81
|
+
return self.model_dump(mode="json") != other.model_dump(mode="json")
|
|
82
|
+
|
|
83
|
+
|
|
20
84
|
def get_current_state(jenkins: JenkinsApi) -> list[JenkinsWorkerFleet]:
|
|
21
85
|
current_state = []
|
|
22
86
|
|
|
@@ -92,8 +156,8 @@ def act(
|
|
|
92
156
|
current_fleet = current_state[current_state.index(f)]
|
|
93
157
|
desired_fleet = desired_state[desired_state.index(f)]
|
|
94
158
|
if current_fleet.differ(desired_fleet):
|
|
95
|
-
logging.debug("CURRENT: " + str(current_fleet.
|
|
96
|
-
logging.debug("DESIRED: " + str(desired_fleet.
|
|
159
|
+
logging.debug("CURRENT: " + str(current_fleet.model_dump(by_alias=True)))
|
|
160
|
+
logging.debug("DESIRED: " + str(desired_fleet.model_dump(by_alias=True)))
|
|
97
161
|
to_update.append(desired_fleet)
|
|
98
162
|
|
|
99
163
|
if to_add or to_delete or to_update:
|
|
@@ -106,7 +170,11 @@ def act(
|
|
|
106
170
|
|
|
107
171
|
if not dry_run:
|
|
108
172
|
d_clouds = [
|
|
109
|
-
{
|
|
173
|
+
{
|
|
174
|
+
"eC2Fleet": d.model_dump(
|
|
175
|
+
mode="json", by_alias=True, exclude_none=True
|
|
176
|
+
)
|
|
177
|
+
}
|
|
110
178
|
for d in desired_state
|
|
111
179
|
]
|
|
112
180
|
config = {"jenkins": {"clouds": d_clouds}}
|
|
@@ -128,6 +196,7 @@ def run(dry_run: bool) -> None:
|
|
|
128
196
|
accounts=[],
|
|
129
197
|
settings=settings,
|
|
130
198
|
prefetch_resources_by_schemas=["/aws/asg-defaults-1.yml"],
|
|
199
|
+
default_tags=None,
|
|
131
200
|
)
|
|
132
201
|
|
|
133
202
|
for instance in jenkins_instances:
|