fdai-deployment-cli 0.1.2__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.
- fdai_deployment_cli/__about__.py +3 -0
- fdai_deployment_cli/__init__.py +5 -0
- fdai_deployment_cli/__main__.py +5 -0
- fdai_deployment_cli/acr_publish.py +585 -0
- fdai_deployment_cli/aks_catalog_review.py +137 -0
- fdai_deployment_cli/aks_historical_reconciliation.py +732 -0
- fdai_deployment_cli/aks_job_environment.py +59 -0
- fdai_deployment_cli/aks_job_execution.py +794 -0
- fdai_deployment_cli/aks_kubernetes_defaults.py +66 -0
- fdai_deployment_cli/aks_preflight.py +422 -0
- fdai_deployment_cli/aks_readiness.py +220 -0
- fdai_deployment_cli/aks_service_update.py +180 -0
- fdai_deployment_cli/aks_workload_jobs.py +281 -0
- fdai_deployment_cli/application_state_adoption.py +347 -0
- fdai_deployment_cli/azure_actor.py +61 -0
- fdai_deployment_cli/azure_naming.py +252 -0
- fdai_deployment_cli/azure_retail_prices.py +173 -0
- fdai_deployment_cli/bootstrap_approval.py +99 -0
- fdai_deployment_cli/bootstrap_channel.py +321 -0
- fdai_deployment_cli/bootstrap_executor.py +311 -0
- fdai_deployment_cli/bootstrap_plan.py +237 -0
- fdai_deployment_cli/bootstrap_reconcile.py +402 -0
- fdai_deployment_cli/bootstrap_support.py +138 -0
- fdai_deployment_cli/bootstrap_worker.py +448 -0
- fdai_deployment_cli/bundle.py +352 -0
- fdai_deployment_cli/capacity.py +143 -0
- fdai_deployment_cli/catalog_review_profile.py +306 -0
- fdai_deployment_cli/cli.py +798 -0
- fdai_deployment_cli/cli_help.py +214 -0
- fdai_deployment_cli/cli_parser.py +791 -0
- fdai_deployment_cli/cli_plan.py +450 -0
- fdai_deployment_cli/compiler.py +99 -0
- fdai_deployment_cli/console_artifact.py +218 -0
- fdai_deployment_cli/console_config.py +214 -0
- fdai_deployment_cli/console_update.py +832 -0
- fdai_deployment_cli/contracts.py +307 -0
- fdai_deployment_cli/control_package.py +140 -0
- fdai_deployment_cli/deadline_transport.py +70 -0
- fdai_deployment_cli/deployment_cost.py +131 -0
- fdai_deployment_cli/deployment_deadline.py +28 -0
- fdai_deployment_cli/deployment_kit.py +790 -0
- fdai_deployment_cli/deployment_kit_cache.py +191 -0
- fdai_deployment_cli/deployment_progress.py +648 -0
- fdai_deployment_cli/development_authority_cli.py +56 -0
- fdai_deployment_cli/development_authority_profile.py +319 -0
- fdai_deployment_cli/doctor.py +136 -0
- fdai_deployment_cli/entitlement_preflight.py +68 -0
- fdai_deployment_cli/entitlement_transport.py +49 -0
- fdai_deployment_cli/entra_bootstrap.py +579 -0
- fdai_deployment_cli/entra_control_profile.py +214 -0
- fdai_deployment_cli/entra_graph.py +349 -0
- fdai_deployment_cli/entra_profiles.py +215 -0
- fdai_deployment_cli/entra_source.py +244 -0
- fdai_deployment_cli/execution_bundle.py +478 -0
- fdai_deployment_cli/execution_copies.py +63 -0
- fdai_deployment_cli/foundation_adoption.py +438 -0
- fdai_deployment_cli/foundation_adoption_evidence.py +245 -0
- fdai_deployment_cli/foundation_adoption_host.py +157 -0
- fdai_deployment_cli/foundation_adoption_transport.py +51 -0
- fdai_deployment_cli/foundation_failure.py +72 -0
- fdai_deployment_cli/foundation_image.py +168 -0
- fdai_deployment_cli/foundation_input.py +235 -0
- fdai_deployment_cli/foundation_output.py +154 -0
- fdai_deployment_cli/foundation_plan.py +381 -0
- fdai_deployment_cli/foundation_process.py +64 -0
- fdai_deployment_cli/foundation_progress.py +231 -0
- fdai_deployment_cli/github_actions.py +171 -0
- fdai_deployment_cli/github_apply_artifact.py +259 -0
- fdai_deployment_cli/github_artifact_io.py +48 -0
- fdai_deployment_cli/github_dispatch.py +248 -0
- fdai_deployment_cli/github_plan_artifact.py +181 -0
- fdai_deployment_cli/github_provider_artifact.py +170 -0
- fdai_deployment_cli/github_transport.py +46 -0
- fdai_deployment_cli/github_workflow_values.py +312 -0
- fdai_deployment_cli/hub_image_deploy.py +354 -0
- fdai_deployment_cli/hub_image_stage.py +162 -0
- fdai_deployment_cli/hub_image_trust.py +281 -0
- fdai_deployment_cli/hub_ownership.py +161 -0
- fdai_deployment_cli/hub_workload_handoff.py +264 -0
- fdai_deployment_cli/hub_workload_handoff_inputs.py +227 -0
- fdai_deployment_cli/identity_profile.py +227 -0
- fdai_deployment_cli/image_targets.py +197 -0
- fdai_deployment_cli/installation_scope.py +280 -0
- fdai_deployment_cli/license.py +311 -0
- fdai_deployment_cli/license_issue.py +239 -0
- fdai_deployment_cli/lifecycle_authorization.py +252 -0
- fdai_deployment_cli/lifecycle_commands.py +173 -0
- fdai_deployment_cli/lifecycle_configuration.py +722 -0
- fdai_deployment_cli/lifecycle_configuration_artifact.py +45 -0
- fdai_deployment_cli/lifecycle_configuration_cli.py +324 -0
- fdai_deployment_cli/lifecycle_configuration_document.py +74 -0
- fdai_deployment_cli/lifecycle_configuration_entities.py +146 -0
- fdai_deployment_cli/lifecycle_configuration_package.py +492 -0
- fdai_deployment_cli/lifecycle_configuration_publication.py +277 -0
- fdai_deployment_cli/lifecycle_configuration_publication_cli.py +191 -0
- fdai_deployment_cli/lifecycle_configuration_sealing.py +127 -0
- fdai_deployment_cli/lifecycle_enrollment.py +45 -0
- fdai_deployment_cli/lifecycle_infrastructure_agent.py +174 -0
- fdai_deployment_cli/lifecycle_installation_binding.py +65 -0
- fdai_deployment_cli/lifecycle_native.py +247 -0
- fdai_deployment_cli/lifecycle_native_reconciliation.py +568 -0
- fdai_deployment_cli/lifecycle_native_transition.py +339 -0
- fdai_deployment_cli/lifecycle_ownership_exclusion.py +78 -0
- fdai_deployment_cli/lifecycle_plan.py +800 -0
- fdai_deployment_cli/lifecycle_promotion.py +185 -0
- fdai_deployment_cli/lifecycle_release.py +308 -0
- fdai_deployment_cli/lifecycle_self_upgrade.py +202 -0
- fdai_deployment_cli/lifecycle_upgrade_bundle.py +176 -0
- fdai_deployment_cli/notification_recipients_input.py +222 -0
- fdai_deployment_cli/observer_artifact.py +106 -0
- fdai_deployment_cli/oci_archive.py +353 -0
- fdai_deployment_cli/offline_kit.py +797 -0
- fdai_deployment_cli/offline_prepare.py +135 -0
- fdai_deployment_cli/operational_evidence_verifier_input.py +575 -0
- fdai_deployment_cli/plan_input.py +101 -0
- fdai_deployment_cli/private_output.py +192 -0
- fdai_deployment_cli/profile.py +70 -0
- fdai_deployment_cli/progress.py +183 -0
- fdai_deployment_cli/readiness.py +286 -0
- fdai_deployment_cli/run_command_receiver.py +418 -0
- fdai_deployment_cli/runtime_build.py +386 -0
- fdai_deployment_cli/runtime_profile.py +287 -0
- fdai_deployment_cli/runtime_release.py +745 -0
- fdai_deployment_cli/runtime_stage.py +82 -0
- fdai_deployment_cli/runtime_support_installation.py +215 -0
- fdai_deployment_cli/simulation.py +80 -0
- fdai_deployment_cli/source_application_inputs.py +397 -0
- fdai_deployment_cli/source_azure.py +586 -0
- fdai_deployment_cli/source_change_cli.py +107 -0
- fdai_deployment_cli/source_change_parser.py +75 -0
- fdai_deployment_cli/source_change_plan.py +181 -0
- fdai_deployment_cli/source_changed_update.py +196 -0
- fdai_deployment_cli/source_deploy.py +170 -0
- fdai_deployment_cli/source_foundation.py +174 -0
- fdai_deployment_cli/source_host_tools.py +163 -0
- fdai_deployment_cli/source_image_stage.py +400 -0
- fdai_deployment_cli/source_input.py +173 -0
- fdai_deployment_cli/source_projection.py +164 -0
- fdai_deployment_cli/source_receiver.py +76 -0
- fdai_deployment_cli/source_recovery.py +264 -0
- fdai_deployment_cli/source_runtime.py +81 -0
- fdai_deployment_cli/source_runtime_support.py +368 -0
- fdai_deployment_cli/source_service_update.py +726 -0
- fdai_deployment_cli/source_service_update_cli.py +47 -0
- fdai_deployment_cli/source_snapshot.py +178 -0
- fdai_deployment_cli/source_teardown.py +574 -0
- fdai_deployment_cli/source_terraform.py +85 -0
- fdai_deployment_cli/source_transport.py +399 -0
- fdai_deployment_cli/standalone_aks_inventory.py +558 -0
- fdai_deployment_cli/standalone_aks_job_execution.py +769 -0
- fdai_deployment_cli/standalone_aks_nodepool_guard.py +141 -0
- fdai_deployment_cli/standalone_application.py +977 -0
- fdai_deployment_cli/standalone_application_completion.py +151 -0
- fdai_deployment_cli/standalone_application_input_recovery.py +107 -0
- fdai_deployment_cli/standalone_application_recovery.py +116 -0
- fdai_deployment_cli/standalone_approval_input.py +24 -0
- fdai_deployment_cli/standalone_catalog_checkpoint.py +122 -0
- fdai_deployment_cli/standalone_catalog_review.py +251 -0
- fdai_deployment_cli/standalone_checkpoint_failure.py +127 -0
- fdai_deployment_cli/standalone_console_publish.py +174 -0
- fdai_deployment_cli/standalone_database_principals.py +41 -0
- fdai_deployment_cli/standalone_deploy.py +638 -0
- fdai_deployment_cli/standalone_development_authority.py +166 -0
- fdai_deployment_cli/standalone_foundation_adoption.py +87 -0
- fdai_deployment_cli/standalone_foundation_transition.py +767 -0
- fdai_deployment_cli/standalone_host.py +4608 -0
- fdai_deployment_cli/standalone_host_rebind.py +226 -0
- fdai_deployment_cli/standalone_host_residual.py +104 -0
- fdai_deployment_cli/standalone_host_state.py +145 -0
- fdai_deployment_cli/standalone_host_values.py +563 -0
- fdai_deployment_cli/standalone_kubernetes_tools.py +100 -0
- fdai_deployment_cli/standalone_license_installation.py +177 -0
- fdai_deployment_cli/standalone_management_egress.py +83 -0
- fdai_deployment_cli/standalone_migration_evidence.py +38 -0
- fdai_deployment_cli/standalone_operational_evidence.py +356 -0
- fdai_deployment_cli/standalone_planned_outputs.py +147 -0
- fdai_deployment_cli/standalone_private_access_probe.py +100 -0
- fdai_deployment_cli/standalone_product_profile.py +110 -0
- fdai_deployment_cli/standalone_remote_prepare.py +442 -0
- fdai_deployment_cli/standalone_residual_apply.py +540 -0
- fdai_deployment_cli/standalone_residual_successor.py +431 -0
- fdai_deployment_cli/standalone_review.py +266 -0
- fdai_deployment_cli/standalone_service_update_finalization.py +116 -0
- fdai_deployment_cli/standalone_service_update_recovery.py +277 -0
- fdai_deployment_cli/standalone_stage_targets.py +325 -0
- fdai_deployment_cli/standalone_status.py +67 -0
- fdai_deployment_cli/standalone_terraform_environment.py +237 -0
- fdai_deployment_cli/standalone_transfer_cleanup.py +237 -0
- fdai_deployment_cli/standalone_trial_activation.py +193 -0
- fdai_deployment_cli/state.py +434 -0
- fdai_deployment_cli/state_handoff.py +253 -0
- fdai_deployment_cli/status_projection.py +97 -0
- fdai_deployment_cli/support_install.py +257 -0
- fdai_deployment_cli/target.py +46 -0
- fdai_deployment_cli/trust/capabilities.json +62 -0
- fdai_deployment_cli/trust/deployment-bundle-root.pub +3 -0
- fdai_deployment_cli/trust/deployment-release-root.pub +3 -0
- fdai_deployment_cli/trust/upstream-signing-key.pub +3 -0
- fdai_deployment_cli/trust_roots.py +50 -0
- fdai_deployment_cli-0.1.2.dist-info/METADATA +112 -0
- fdai_deployment_cli-0.1.2.dist-info/RECORD +203 -0
- fdai_deployment_cli-0.1.2.dist-info/WHEEL +4 -0
- fdai_deployment_cli-0.1.2.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"""Read back AKS node pools before runtime effects."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import re
|
|
7
|
+
import subprocess
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from fdai_deployment_cli import standalone_planned_outputs
|
|
11
|
+
from fdai_deployment_cli.standalone_checkpoint_failure import (
|
|
12
|
+
ManagedHostCheckpointError,
|
|
13
|
+
sanitize_failure_text,
|
|
14
|
+
)
|
|
15
|
+
from fdai_deployment_cli.standalone_host_state import private_json
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def guard_existing_runtime_node_pools(context: dict[str, object], work_dir: Path) -> None:
|
|
19
|
+
if _runtime_platform(context) != "aks":
|
|
20
|
+
return
|
|
21
|
+
application_values = private_json(
|
|
22
|
+
work_dir / "application.auto.tfvars.json", "application variables"
|
|
23
|
+
)
|
|
24
|
+
cluster_name = (
|
|
25
|
+
f"aks-{application_values['workload']}-{application_values['env']}-"
|
|
26
|
+
f"{application_values['region_short']}"
|
|
27
|
+
)
|
|
28
|
+
resource_group = str(
|
|
29
|
+
context.get("resource_group_name") or application_values.get("resource_group_name")
|
|
30
|
+
)
|
|
31
|
+
if not resource_group or "None" in resource_group:
|
|
32
|
+
resource_group = str(
|
|
33
|
+
standalone_planned_outputs.read_output(
|
|
34
|
+
Path(str(context["infra"])),
|
|
35
|
+
"resource_group_name",
|
|
36
|
+
raw=True,
|
|
37
|
+
reason="runtime resource group readback failed",
|
|
38
|
+
)
|
|
39
|
+
)
|
|
40
|
+
pools = _aks_node_pools(
|
|
41
|
+
context=context,
|
|
42
|
+
work_dir=work_dir,
|
|
43
|
+
resource_group=resource_group,
|
|
44
|
+
cluster_name=cluster_name,
|
|
45
|
+
)
|
|
46
|
+
if "runtime" not in pools:
|
|
47
|
+
return
|
|
48
|
+
if _runtime_node_pool_in_state(Path(str(context["runtime_infra"]))):
|
|
49
|
+
return
|
|
50
|
+
raise ManagedHostCheckpointError(
|
|
51
|
+
"aks_node_pool_exists_outside_state",
|
|
52
|
+
(
|
|
53
|
+
"AKS node pool runtime already exists outside Terraform state. "
|
|
54
|
+
"Removing it needs explicit Owner confirmation before any apply."
|
|
55
|
+
),
|
|
56
|
+
excerpt=(
|
|
57
|
+
"AKS node pool runtime already exists outside Terraform state. "
|
|
58
|
+
"Removing it needs explicit Owner confirmation before any apply."
|
|
59
|
+
),
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _aks_node_pools(
|
|
64
|
+
*,
|
|
65
|
+
context: dict[str, object],
|
|
66
|
+
work_dir: Path,
|
|
67
|
+
resource_group: str,
|
|
68
|
+
cluster_name: str,
|
|
69
|
+
) -> set[str]:
|
|
70
|
+
completed = subprocess.run(
|
|
71
|
+
(
|
|
72
|
+
"az",
|
|
73
|
+
"aks",
|
|
74
|
+
"nodepool",
|
|
75
|
+
"list",
|
|
76
|
+
"--subscription",
|
|
77
|
+
str(context["subscription_id"]),
|
|
78
|
+
"--resource-group",
|
|
79
|
+
resource_group,
|
|
80
|
+
"--cluster-name",
|
|
81
|
+
cluster_name,
|
|
82
|
+
"--query",
|
|
83
|
+
"[].name",
|
|
84
|
+
"--output",
|
|
85
|
+
"json",
|
|
86
|
+
"--only-show-errors",
|
|
87
|
+
),
|
|
88
|
+
cwd=work_dir,
|
|
89
|
+
check=False,
|
|
90
|
+
capture_output=True,
|
|
91
|
+
text=True,
|
|
92
|
+
timeout=120,
|
|
93
|
+
)
|
|
94
|
+
if completed.returncode != 0:
|
|
95
|
+
message = f"{completed.stdout}\n{completed.stderr}"
|
|
96
|
+
if re.search(r"(?i)(not\s+found|resourcenotfound|could not be found)", message):
|
|
97
|
+
return set()
|
|
98
|
+
raise ManagedHostCheckpointError(
|
|
99
|
+
"aks_node_pool_readback_failed",
|
|
100
|
+
"AKS node pool readback failed",
|
|
101
|
+
excerpt=sanitize_failure_text(message),
|
|
102
|
+
)
|
|
103
|
+
try:
|
|
104
|
+
value = json.loads(completed.stdout)
|
|
105
|
+
except json.JSONDecodeError as exc:
|
|
106
|
+
raise ManagedHostCheckpointError(
|
|
107
|
+
"aks_node_pool_readback_failed",
|
|
108
|
+
"AKS node pool readback returned invalid JSON",
|
|
109
|
+
excerpt="AKS node pool readback returned invalid JSON",
|
|
110
|
+
) from exc
|
|
111
|
+
if not isinstance(value, list) or any(not isinstance(item, str) for item in value):
|
|
112
|
+
raise ManagedHostCheckpointError(
|
|
113
|
+
"aks_node_pool_readback_failed",
|
|
114
|
+
"AKS node pool readback returned an invalid shape",
|
|
115
|
+
excerpt="AKS node pool readback returned an invalid shape",
|
|
116
|
+
)
|
|
117
|
+
return set(value)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _runtime_node_pool_in_state(runtime_infra: Path) -> bool:
|
|
121
|
+
completed = subprocess.run(
|
|
122
|
+
("terraform", "state", "list"),
|
|
123
|
+
cwd=runtime_infra,
|
|
124
|
+
check=False,
|
|
125
|
+
capture_output=True,
|
|
126
|
+
text=True,
|
|
127
|
+
timeout=300,
|
|
128
|
+
)
|
|
129
|
+
if completed.returncode != 0:
|
|
130
|
+
return False
|
|
131
|
+
return "azurerm_kubernetes_cluster_node_pool.user" in set(completed.stdout.split())
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _runtime_platform(context: dict[str, object]) -> str:
|
|
135
|
+
value = context.get("runtime_profile")
|
|
136
|
+
if value is None:
|
|
137
|
+
return "container-apps"
|
|
138
|
+
platform = value.get("runtime_platform") if isinstance(value, dict) else None
|
|
139
|
+
if platform not in {"container-apps", "aks"}:
|
|
140
|
+
raise ValueError("runtime deployment platform is invalid")
|
|
141
|
+
return str(platform)
|