Design note (historical): background on the ARM/REST refactor that replaced PowerShell/Bicep provisioning. For current usage, see docs/usage.md and docs/advanced.md.
This release extends laravel-microsoft-azure so the Flows portal can drive the entire
tenant provisioning lifecycle over REST (retiring the PowerShell CLI + standalone Bicep step).
Everything follows the existing CognitiveServices group/item gateway pattern: Saloon Request →
AzurePayload::toAzureBody() → AzureData::fromAzure(), fluent entry in
InteractsWithResources, @method in the Azure facade, ARM scope reused (no new token
audience).
Enums/ApiVersion— added constants:ARM_STORAGE,ARM_KEY_VAULT_VAULTS,ARM_LOG_ANALYTICS,ARM_APP_INSIGHTS,ARM_MANAGED_IDENTITY,ARM_COST_MANAGEMENT,ARM_CONSUMPTION,ARM_MONITOR_METRICS. (ARM_SQLreused for SQL server/db.)Concerns/HandlesLongRunningOperations— reusable LRO polling:awaitProvisioningState(fetch, timeout, interval, onTick)— re-reads a DTO untilprovisioningState->isTerminal(); throwsLongRunningOperationExceptionon Failed/Canceled/timeout.awaitAsyncOperation(Response, …)— follows theAzure-AsyncOperation/Locationheader, honoringRetry-After.- Mixed into
DeploymentsResource(->await($name)) andSubscriptionAliasesResource(->await($name)), replacing the hand-rolled poll loops. - Test seams
now()/sleepSeconds()(interval0= no real sleep in tests).
Resources/Resource::mapPaginated()— followsnextLink/@odata.nextLinkto the end (with amaxPagesrunaway guard). Absolute Azure URLs are normalized to a path+query endpoint relative to the ARM base viaRequests/Arm/Support/AbsoluteArmUrl(Saloon rejects absolute endpoints; the raw query is preserved so Azure's$skiptoken/$filtersurvive). Same helper backsPollAsyncOperationandGetNextPage.Data/Arm/DeploymentData— now deserializesproperties.outputs+properties.error; addedoutput(string $name)so the portal reads webhook URL / SQL FQDN straight from the deployment result.
- Cost Management —
costManagement($scope)->query($from, $to, $grouping = 'ServiceName')(POST ActualCost query; zips columns→rows intoCostQueryResultData). - Monitor metrics —
metrics($resourceId)->get($names, $timespan, $interval, $aggregation)and->definitions()(MetricResultData). - Consumption —
consumption($scope)->usageDetails($filter)(paginated viamapPaginated).
storageAccounts (accounts, keys, blob containers, lifecycle policy), vaults (Key Vault
control plane), sqlServers + extended sqlDatabases (create/delete), logAnalyticsWorkspaces,
applicationInsights, managedIdentities. SqlDatabaseData enriched additively with
currentServiceObjectiveName + autoPauseDelay.
- DB migrations + flow seeding stay in the .NET runner/seeder (not an Azure-management concern). Deploy the schema via that runner or reimplement against the tenant SQL.
- Service "Verify" health checks (DocuWare / MCP / Mistral) live in the portal, not here.
See ENDPOINTS.md §7 for the new gateways. Regenerate generated docs with
composer docs:api and composer inventory:parity after any request change.
New Pest coverage under tests/Unit/Requests/* (endpoint + api-version datasets) and
tests/Unit/Resources/* (MockClient gateway + DTO mapping), plus
tests/Unit/Concerns/LongRunningOperationsTest and tests/Unit/Resources/FluentResourceEntriesTest.
Suite: composer test (312 passing), composer analyse (PHPStan clean), vendor/bin/pint.