/** * Admin Panel: Azure Integration Readiness (GET/POST /admin/azure-readiness*). * * One composed status per Azure integration -- see azure_readiness.py's * module docstring for the full 9-state vocabulary (NOT_CONFIGURED, * AUTHENTICATION_REQUIRED, READY, etc.) and exactly what evidence each * state requires. This page never runs a check on load -- GET only * reads already-cached results -- and "Validate" never creates an Azure * resource; only the Ephemeral Tests tab's provision/execute action can * do that, and only after explicit approval. */ var READINESS_BADGE_CLASS = { READY: "badge-good", PARTIALLY_VERIFIED: "badge-neutral", DEGRADED: "badge-neutral", NOT_CONFIGURED: "badge-bad", AUTHENTICATION_REQUIRED: "badge-bad", PERMISSION_DENIED: "badge-bad", CONNECTION_FAILED: "badge-bad", NOT_INTEGRATED: "badge-neutral", UNKNOWN: "badge-neutral", }; function AzureReadiness(props) { var api = props.api; var permissions = props.permissions || []; var canValidate = permissions.indexOf("azure.manage") !== -1; var tabState = React.useState("services"); var tab = tabState[0]; var setTab = tabState[1]; return (

Azure Readiness

Centralized Azure integration readiness: one composed status per service (configuration, authentication, permissions, and connectivity), real Azure CLI login detection, and the ephemeral provision-test-destroy workflow for integrations a read-only check can't fully verify.

{tab === "services" && } {tab === "ai_observability" && } {tab === "ephemeral" && } {tab === "cost" && }
); } function AzureReadinessServicesTab(props) { var api = props.api; // Persistent snapshot, per the "no loading flash on revisit" report // requirement -- layered on top of the existing in-memory azureCache // (still used to dedupe concurrent calls within a session). `validate` // actions below invalidate azureCache AND call these hooks' refresh() // so a validate click always shows its own real, fresh result. var listSnapshot = CDPI_REPORT_SNAPSHOT.useReportSnapshot("azure_readiness_services", function () { return window.CDPI_AZURE_CACHE.get("azure-readiness:list", function () { return api.getAzureReadiness(); }); }); var cliSnapshot = CDPI_REPORT_SNAPSHOT.useReportSnapshot("azure_readiness_cli_status", function () { return window.CDPI_AZURE_CACHE.get("azure-readiness:cli-status", function () { return api.getAzureReadinessCliStatus(); }); }); var data = { loading: listSnapshot.state.loading && !listSnapshot.state.data, error: listSnapshot.state.error, data: listSnapshot.state.data }; var cliStatus = cliSnapshot.state.data; var validatingState = React.useState(null); var validatingId = validatingState[0]; var setValidatingId = validatingState[1]; function reloadAfterValidate() { window.CDPI_AZURE_CACHE.invalidate("azure-readiness:list"); window.CDPI_AZURE_CACHE.invalidate("azure-readiness:cli-status"); return Promise.all([listSnapshot.refresh(), cliSnapshot.refresh()]); } function validateOne(integrationId) { setValidatingId(integrationId); api.validateAzureReadiness(integrationId).then(reloadAfterValidate).catch(function (err) { window.alert(err.message); }).then(function () { setValidatingId(null); }); } function validateAll() { setValidatingId("__all__"); api.validateAllAzureReadiness().then(reloadAfterValidate).catch(function (err) { window.alert(err.message); }).then(function () { setValidatingId(null); }); } if (data.loading) return

Loading…

; if (data.error && !data.data) return
Couldn't load Azure readiness: {data.error}
; return (
{cliStatus && (

Azure CLI

{cliStatus.account.authenticated ? "Authenticated" : "Not authenticated"}

{cliStatus.account.detail}

{cliStatus.account.authenticated && (

Subscription: {cliStatus.account.subscription_name} ({cliStatus.account.subscription_id})

)}
)}
{props.canValidate && ( )} Snapshot from {listSnapshot.state.lastUpdated ? new Date(listSnapshot.state.lastUpdated).toLocaleString() : "just now"}
{data.data.services.map(function (svc) { return ( ); })}
ServiceStatusReasonLast validatedNext action
{svc.service_name} {svc.status} {svc.reason} {svc.last_validated_at || "Never"} {svc.recommended_next_action} {props.canValidate && svc.integration_id && ( )}
); } function AzureAiAndObservabilityTab(props) { var api = props.api; var permissions = props.permissions || []; var canTestAi = permissions.indexOf("azure.manage") !== -1; var canTestTelemetry = permissions.indexOf("observability.read") !== -1; var aiState = React.useState(null); var aiResult = aiState[0]; var setAiResult = aiState[1]; var aiBusyState = React.useState(false); var aiBusy = aiBusyState[0]; var setAiBusy = aiBusyState[1]; var telState = React.useState(null); var telResult = telState[0]; var setTelResult = telState[1]; var telBusyState = React.useState(false); var telBusy = telBusyState[0]; var setTelBusy = telBusyState[1]; function runAiTest() { setAiBusy(true); api.testAzureAiFoundry().then(setAiResult).catch(function (err) { window.alert(err.message); }).then(function () { setAiBusy(false); }); } function runTelemetryTest() { setTelBusy(true); api.testApplicationInsightsTelemetry().then(setTelResult).catch(function (err) { window.alert(err.message); }).then(function () { setTelBusy(false); }); } return (

Azure OpenAI / AI Foundry

Sends ONE real, minimal chat completion and embedding request to the configured Azure OpenAI endpoint -- never run automatically (this is a real, billable Azure call). Reports an honest "not configured" result if AZURE_OPENAI_ENDPOINT/AZURE_OPENAI_API_KEY/AZURE_OPENAI_CHAT_DEPLOYMENT aren't all set.

{canTestAi && ( )} {aiResult && (
{!aiResult.configured &&

Not configured.

} {aiResult.configured && (
  • Chat: {aiResult.chat ? aiResult.chat.outcome : "n/a"}
  • Embedding: {aiResult.embedding ? aiResult.embedding.outcome : "n/a"}
)}
)}

Application Insights Telemetry

Emits one real span through this app's normal telemetry path with a unique correlation ID. Confirms the span was written locally and (if configured) handed to the Application Insights exporter -- never claims Azure actually finished ingesting it, since that needs checking Application Insights itself a few minutes later.

{canTestTelemetry && ( )} {telResult && (

Correlation ID: {telResult.correlation_id}

{telResult.application_insights_handed_off ? "Handed to Application Insights" : "Local log only"}

{telResult.note}

)}
); } function AzureCostUsageTab(props) { var api = props.api; var dataState = React.useState(null); var data = dataState[0]; var setData = dataState[1]; var busyState = React.useState(false); var busy = busyState[0]; var setBusy = busyState[1]; var errorState = React.useState(null); var error = errorState[0]; var setError = errorState[1]; function load(bypassCache) { if (bypassCache) window.CDPI_AZURE_CACHE.invalidate("azure-cost-usage"); setBusy(true); setError(null); window.CDPI_AZURE_CACHE.get("azure-cost-usage", function () { return api.getAzureCostUsage(); }) .then(setData) .catch(function (err) { setError(err.message); }) .then(function () { setBusy(false); }); } React.useEffect(function () { load(false); }, []); return (

Real Resources & Month-to-Date Cost

Live `az resource list` + a direct call to the Azure Cost Management Query API, scoped to AZURE_RESOURCE_GROUP -- never a fabricated or cached total. Requires a local `az login` session (see the Services tab's CLI status) and only works in real mode.

{error &&

{error}

}
{data && !data.configured && (

{data.resources.detail}

)} {data && data.configured && (

Resource group: {data.resource_group}

{data.resources.detail}

{data.resources.resources.map(function (r) { return ( ); })}
NameTypeLocationStatus
{r.name} {r.type} {r.location} {r.status}

Month-to-date cost

{!data.cost.available &&

{data.cost.detail}

} {data.cost.available && (

Total: {data.cost.total} {data.cost.currency}

{data.cost.detail}

{data.cost.by_resource.map(function (r) { return ( ); })}
ResourceCost ({data.cost.currency})
{r.name} {r.cost}
)}
)}
); } function AzureReadinessEphemeralTab(props) { var api = props.api; var state = React.useState({ loading: true, error: null, data: null }); var data = state[0]; var setData = state[1]; var regionState = React.useState("eastus"); var region = regionState[0]; var setRegion = regionState[1]; var busyState = React.useState(null); var busyRunId = busyState[0]; var setBusyRunId = busyState[1]; function load() { api.listEphemeralTests() .then(function (result) { setData({ loading: false, error: null, data: result }); }) .catch(function (err) { setData({ loading: false, error: err.message, data: null }); }); } React.useEffect(function () { load(); }, []); function plan() { setBusyRunId("__plan__"); api.planEphemeralTest("blob_storage_test", region).then(load).catch(function (err) { window.alert(err.message); }).then(function () { setBusyRunId(null); }); } function approve(runId) { setBusyRunId(runId); api.approveEphemeralTest(runId).then(load).catch(function (err) { window.alert(err.message); }).then(function () { setBusyRunId(null); }); } function execute(runId) { setBusyRunId(runId); api.executeEphemeralTest(runId).then(load).catch(function (err) { window.alert(err.message); }).then(function () { setBusyRunId(null); }); } function cleanup(runId) { setBusyRunId(runId); api.cleanupEphemeralTest(runId).then(load).catch(function (err) { window.alert(err.message); }).then(function () { setBusyRunId(null); }); } if (data.loading) return

Loading…

; if (data.error) return
Couldn't load ephemeral test runs: {data.error}
; return (
Mode C: provision -> test -> destroy. "Plan" is pure local computation (no Azure call). "Execute" is the ONLY action anywhere in this app that can create real Azure resources, and only after you explicitly approve the plan -- it will honestly report a BLOCKED status with the exact reason if Azure CLI authentication or the CLI itself isn't available, rather than fabricating a successful deployment.
{props.canValidate && (
)}
{data.data.runs.length === 0 && } {data.data.runs.map(function (run) { return ( ); })}
RunStatusResource groupApprovedDetailActions
No ephemeral test runs yet.
{run.run_id} {run.status} {run.resource_group_name} {run.approved ? "Yes" : "No"} {run.blocked_reason || run.test_detail || "-"} {props.canValidate && run.status === "AWAITING_APPROVAL" && !run.approved && ( )} {props.canValidate && run.approved && (run.status === "AWAITING_APPROVAL" || run.status === "PLANNED") && ( )} {props.canValidate && ["PROVISIONED", "TESTING", "TEST_PASSED", "TEST_FAILED", "CLEANUP_IN_PROGRESS", "CLEANUP_FAILED"].indexOf(run.status) !== -1 && ( )}
); }