Skip to content

Conversation

@joslinmicrosoft
Copy link
Member

@joslinmicrosoft joslinmicrosoft commented Oct 28, 2025

Related command
az appservice plan create/update
az appservice plan identity assign/remove/list/set-default
az appservice plan managed-instance install-script list/add/remove
az appservice plan managed-instance storage-mount list/add/remove
az appservice plan managed-instance registry-adapter list/add/remove
az appservice plan managed-instance network show/add/remove
az appservice plan managed-instance instance list/recycle/connect

Description
Managed Instances on App Service is a special kind of App Service Plan (Microsoft.Web/serverFarms) resource. It is characterized by setting the property isCustomMode: true.

These types of app service plan support several new features, including:

  • Managed Identity
  • Installation scripts collection
  • Storage mounts collection
  • Registry adapter collection
  • Virtual network integration
  • Instance listing, recycling, and connecting (native RDP experience)

Testing Guide
Description and examples of these commands can be found in src/azure-cli/azure/cli/command_modules/appservice/_help.py.

Specifically for az appservice plan create changes:

az appservice plan create -n MyAppServicePlan -g MyResourceGroup --number-of-workers 1 --sku P1V4 --location eastus2euap --is-managed-instance --mi-system-assigned --mi-user-assigned "<my MI resource id>" --default-identity "[system]" --rdp-enabled --subnet MySubnetResourceId --registry-adapter registry-key="HKEY_LOCAL_MACHINE/Software/App1/Key1" type="String" secret-uri="https://myvault.vault.azure.net/secrets/mysecret/myversion" --install-script name="Script1" source-uri="https://mystorageaccount.blob.core.windows.net/scripts/script1.ps1" --storage-mount mount-name="Mount1" source="\\mystorageaccount.file.core.windows.net\share1" destination-path="D:\mount1" secret-uri=https://myvault.vault.azure.net/secrets/mystoragemountsecret/myversion

This creates an Managed Instance App Service plan using flag --is-managed-instance. It:

  • Assigns a system assigned identity through --mi-system-assigned and user assigned identity through --mi-user-assigned
  • Marks a default managed identity using --default-identity
  • Enables RDP using -rdp-enabled
  • Sets up networking using --subnet
  • Creates a registry adapter using --registry-adapter
  • Creates an installation script using --install-script
  • Creates a storage mount using --storage-mount

Tested all other commands as well in private test subscription and created integration tests with coverage across all new commands and arguments. Verified and re-recorded tests as necessary with azdev test appservice.


This checklist is used to make sure that common guidelines for a pull request are followed.

Copilot AI review requested due to automatic review settings October 28, 2025 23:50
@azure-client-tools-bot-prd
Copy link

azure-client-tools-bot-prd bot commented Oct 28, 2025

️✔️AzureCLI-FullTest
️✔️acr
️✔️latest
️✔️3.12
️✔️3.13
️✔️acs
️✔️latest
️✔️3.12
️✔️3.13
️✔️advisor
️✔️latest
️✔️3.12
️✔️3.13
️✔️ams
️✔️latest
️✔️3.12
️✔️3.13
️✔️apim
️✔️latest
️✔️3.12
️✔️3.13
️✔️appconfig
️✔️latest
️✔️3.12
️✔️3.13
️✔️appservice
️✔️latest
️✔️3.12
️✔️3.13
️✔️aro
️✔️latest
️✔️3.12
️✔️3.13
️✔️backup
️✔️latest
️✔️3.12
️✔️3.13
️✔️batch
️✔️latest
️✔️3.12
️✔️3.13
️✔️batchai
️✔️latest
️✔️3.12
️✔️3.13
️✔️billing
️✔️latest
️✔️3.12
️✔️3.13
️✔️botservice
️✔️latest
️✔️3.12
️✔️3.13
️✔️cdn
️✔️latest
️✔️3.12
️✔️3.13
️✔️cloud
️✔️latest
️✔️3.12
️✔️3.13
️✔️cognitiveservices
️✔️latest
️✔️3.12
️✔️3.13
️✔️compute_recommender
️✔️latest
️✔️3.12
️✔️3.13
️✔️computefleet
️✔️latest
️✔️3.12
️✔️3.13
️✔️config
️✔️latest
️✔️3.12
️✔️3.13
️✔️configure
️✔️latest
️✔️3.12
️✔️3.13
️✔️consumption
️✔️latest
️✔️3.12
️✔️3.13
️✔️container
️✔️latest
️✔️3.12
️✔️3.13
️✔️containerapp
️✔️latest
️✔️3.12
️✔️3.13
️✔️core
️✔️latest
️✔️3.12
️✔️3.13
️✔️cosmosdb
️✔️latest
️✔️3.12
️✔️3.13
️✔️databoxedge
️✔️latest
️✔️3.12
️✔️3.13
️✔️dls
️✔️latest
️✔️3.12
️✔️3.13
️✔️dms
️✔️latest
️✔️3.12
️✔️3.13
️✔️eventgrid
️✔️latest
️✔️3.12
️✔️3.13
️✔️eventhubs
️✔️latest
️✔️3.12
️✔️3.13
️✔️feedback
️✔️latest
️✔️3.12
️✔️3.13
️✔️find
️✔️latest
️✔️3.12
️✔️3.13
️✔️hdinsight
️✔️latest
️✔️3.12
️✔️3.13
️✔️identity
️✔️latest
️✔️3.12
️✔️3.13
️✔️iot
️✔️latest
️✔️3.12
️✔️3.13
️✔️keyvault
️✔️latest
️✔️3.12
️✔️3.13
️✔️lab
️✔️latest
️✔️3.12
️✔️3.13
️✔️managedservices
️✔️latest
️✔️3.12
️✔️3.13
️✔️maps
️✔️latest
️✔️3.12
️✔️3.13
️✔️marketplaceordering
️✔️latest
️✔️3.12
️✔️3.13
️✔️monitor
️✔️latest
️✔️3.12
️✔️3.13
️✔️mysql
️✔️latest
️✔️3.12
️✔️3.13
️✔️netappfiles
️✔️latest
️✔️3.12
️✔️3.13
️✔️network
️✔️latest
️✔️3.12
️✔️3.13
️✔️policyinsights
️✔️latest
️✔️3.12
️✔️3.13
️✔️privatedns
️✔️latest
️✔️3.12
️✔️3.13
️✔️profile
️✔️latest
️✔️3.12
️✔️3.13
️✔️rdbms
️✔️latest
️✔️3.12
️✔️3.13
️✔️redis
️✔️latest
️✔️3.12
️✔️3.13
️✔️relay
️✔️latest
️✔️3.12
️✔️3.13
️✔️resource
️✔️latest
️✔️3.12
️✔️3.13
️✔️role
️✔️latest
️✔️3.12
️✔️3.13
️✔️search
️✔️latest
️✔️3.12
️✔️3.13
️✔️security
️✔️latest
️✔️3.12
️✔️3.13
️✔️servicebus
️✔️latest
️✔️3.12
️✔️3.13
️✔️serviceconnector
️✔️latest
️✔️3.12
️✔️3.13
️✔️servicefabric
️✔️latest
️✔️3.12
️✔️3.13
️✔️signalr
️✔️latest
️✔️3.12
️✔️3.13
️✔️sql
️✔️latest
️✔️3.12
️✔️3.13
️✔️sqlvm
️✔️latest
️✔️3.12
️✔️3.13
️✔️storage
️✔️latest
️✔️3.12
️✔️3.13
️✔️synapse
️✔️latest
️✔️3.12
️✔️3.13
️✔️telemetry
️✔️latest
️✔️3.12
️✔️3.13
️✔️util
️✔️latest
️✔️3.12
️✔️3.13
️✔️vm
️✔️latest
️✔️3.12
️✔️3.13

@azure-client-tools-bot-prd
Copy link

azure-client-tools-bot-prd bot commented Oct 28, 2025

⚠️AzureCLI-BreakingChangeTest
⚠️appservice
rule cmd_name rule_message suggest_message
⚠️ 1015 - SubgroupPropUpdate appservice plan sub group appservice plan updated property sub_groups from {} to {'appservice plan managed-instance': {'name': 'appservice plan managed-instance', 'commands': {}, 'sub_groups': {'appservice plan managed-instance instance': {'name': 'appservice plan managed-instance instance', 'commands': {'appservice plan managed-instance instance list': {'name': 'appservice plan managed-instance instance list', 'is_aaz': True, 'parameters': [{'name': 'name', 'options': ['--name'], 'required': True, 'aaz_type': 'string', 'type': 'string'}, {'name': 'resource_group', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True, 'aaz_type': 'string', 'type': 'string'}]}, 'appservice plan managed-instance instance connect': {'name': 'appservice plan managed-instance instance connect', 'is_aaz': True, 'is_preview': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'id_part': 'name', 'has_completer': True}, {'name': 'instance_name', 'options': ['--instance-name'], 'required': True}, {'name': 'bastion_name', 'options': ['--bastion-name'], 'required': True}, {'name': 'bastion_resource_group_name', 'options': ['--bastion-resource-group']}]}, 'appservice plan managed-instance instance recycle': {'name': 'appservice plan managed-instance instance recycle', 'is_aaz': True, 'is_preview': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'id_part': 'name', 'has_completer': True}, {'name': 'instance_name', 'options': ['--instance-name'], 'required': True}]}}, 'sub_groups': {}}, 'appservice plan managed-instance install-script': {'name': 'appservice plan managed-instance install-script', 'commands': {'appservice plan managed-instance install-script list': {'name': 'appservice plan managed-instance install-script list', 'is_aaz': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'has_completer': True}]}, 'appservice plan managed-instance install-script add': {'name': 'appservice plan managed-instance install-script add', 'is_aaz': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'id_part': 'name', 'has_completer': True}, {'name': 'install_script_name', 'options': ['--install-script-name'], 'required': True}, {'name': 'source_uri', 'options': ['--source-uri'], 'required': True}, {'name': 'install_script_type', 'options': ['--type'], 'required': True, 'choices': ['PlatformStorage', 'RemoteAzureBlob']}]}, 'appservice plan managed-instance install-script remove': {'name': 'appservice plan managed-instance install-script remove', 'is_aaz': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'id_part': 'name', 'has_completer': True}, {'name': 'install_script_name', 'options': ['--install-script-name'], 'required': True}]}}, 'sub_groups': {}}, 'appservice plan managed-instance storage-mount': {'name': 'appservice plan managed-instance storage-mount', 'commands': {'appservice plan managed-instance storage-mount list': {'name': 'appservice plan managed-instance storage-mount list', 'is_aaz': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'has_completer': True}]}, 'appservice plan managed-instance storage-mount add': {'name': 'appservice plan managed-instance storage-mount add', 'is_aaz': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'id_part': 'name', 'has_completer': True}, {'name': 'mount_name', 'options': ['--mount-name'], 'required': True}, {'name': 'mount_type', 'options': ['--type'], 'required': True, 'choices': ['AzureFiles', 'FileShare', 'LocalStorage']}, {'name': 'destination_path', 'options': ['--destination-path'], 'required': True}, {'name': 'source', 'options': ['--source']}, {'name': 'credentials_secret_uri', 'options': ['--credentials-secret-uri']}]}, 'appservice plan managed-instance storage-mount remove': {'name': 'appservice plan managed-instance storage-mount remove', 'is_aaz': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'id_part': 'name', 'has_completer': True}, {'name': 'mount_name', 'options': ['--mount-name'], 'required': True}]}}, 'sub_groups': {}}, 'appservice plan managed-instance registry-adapter': {'name': 'appservice plan managed-instance registry-adapter', 'commands': {'appservice plan managed-instance registry-adapter list': {'name': 'appservice plan managed-instance registry-adapter list', 'is_aaz': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'has_completer': True}]}, 'appservice plan managed-instance registry-adapter add': {'name': 'appservice plan managed-instance registry-adapter add', 'is_aaz': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'id_part': 'name', 'has_completer': True}, {'name': 'registry_key', 'options': ['--registry-key'], 'required': True}, {'name': 'adapter_type', 'options': ['--type'], 'required': True, 'choices': ['Binary', 'DWord', 'Expand_String', 'Multi_String', 'QWord', 'String']}, {'name': 'secret_uri', 'options': ['--secret-uri'], 'required': True}]}, 'appservice plan managed-instance registry-adapter remove': {'name': 'appservice plan managed-instance registry-adapter remove', 'is_aaz': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'id_part': 'name', 'has_completer': True}, {'name': 'registry_key', 'options': ['--registry-key'], 'required': True}]}}, 'sub_groups': {}}, 'appservice plan managed-instance network': {'name': 'appservice plan managed-instance network', 'commands': {'appservice plan managed-instance network show': {'name': 'appservice plan managed-instance network show', 'is_aaz': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'id_part': 'name', 'has_completer': True}]}, 'appservice plan managed-instance network add': {'name': 'appservice plan managed-instance network add', 'is_aaz': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'id_part': 'name', 'has_completer': True}, {'name': 'vnet', 'options': ['--vnet']}, {'name': 'subnet', 'options': ['--subnet']}]}, 'appservice plan managed-instance network remove': {'name': 'appservice plan managed-instance network remove', 'is_aaz': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'id_part': 'name', 'has_completer': True}]}}, 'sub_groups': {}}}}, 'appservice plan identity': {'name': 'appservice plan identity', 'commands': {'appservice plan identity show': {'name': 'appservice plan identity show', 'is_aaz': True, 'is_preview': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'id_part': 'name', 'has_completer': True}]}, 'appservice plan identity assign': {'name': 'appservice plan identity assign', 'is_aaz': True, 'is_preview': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'id_part': 'name', 'has_completer': True}, {'name': 'system_assigned', 'options': ['--system-assigned']}, {'name': 'user_assigned', 'options': ['--user-assigned'], 'nargs': '+'}]}, 'appservice plan identity remove': {'name': 'appservice plan identity remove', 'is_aaz': True, 'is_preview': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'id_part': 'name', 'has_completer': True}, {'name': 'system_assigned', 'options': ['--system-assigned']}, {'name': 'user_assigned', 'options': ['--user-assigned'], 'nargs': '*'}]}, 'appservice plan identity set-default': {'name': 'appservice plan identity set-default', 'is_aaz': True, 'is_preview': True, 'parameters': [{'name': 'resource_group_name', 'options': ['--resource-group', '-g'], 'required': True, 'id_part': 'resource_group', 'has_completer': True}, {'name': 'name', 'options': ['--name', '-n'], 'required': True, 'id_part': 'name', 'has_completer': True}, {'name': 'identity', 'options': ['--identity']}]}}, 'sub_groups': {}}}
⚠️ 1006 - ParaAdd appservice plan create cmd appservice plan create added parameter default_identity
⚠️ 1006 - ParaAdd appservice plan create cmd appservice plan create added parameter install_scripts
⚠️ 1006 - ParaAdd appservice plan create cmd appservice plan create added parameter is_managed_instance
⚠️ 1006 - ParaAdd appservice plan create cmd appservice plan create added parameter mi_system_assigned
⚠️ 1006 - ParaAdd appservice plan create cmd appservice plan create added parameter mi_user_assigned
⚠️ 1006 - ParaAdd appservice plan create cmd appservice plan create added parameter rdp_enabled
⚠️ 1006 - ParaAdd appservice plan create cmd appservice plan create added parameter registry_adapters
⚠️ 1006 - ParaAdd appservice plan create cmd appservice plan create added parameter storage_mounts
⚠️ 1006 - ParaAdd appservice plan create cmd appservice plan create added parameter subnet
⚠️ 1006 - ParaAdd appservice plan create cmd appservice plan create added parameter vnet
⚠️ 1006 - ParaAdd appservice plan update cmd appservice plan update added parameter default_identity
⚠️ 1006 - ParaAdd appservice plan update cmd appservice plan update added parameter install_scripts
⚠️ 1006 - ParaAdd appservice plan update cmd appservice plan update added parameter rdp_enabled
⚠️ 1006 - ParaAdd appservice plan update cmd appservice plan update added parameter registry_adapters
⚠️ 1006 - ParaAdd appservice plan update cmd appservice plan update added parameter storage_mounts
⚠️ 1006 - ParaAdd appservice plan update cmd appservice plan update added parameter subnet
⚠️ 1006 - ParaAdd appservice plan update cmd appservice plan update added parameter vnet

@yonzhan
Copy link
Collaborator

yonzhan commented Oct 28, 2025

Thank you for your contribution! We will review the pull request and get back to you soon.

@github-actions
Copy link

The git hooks are available for azure-cli and azure-cli-extensions repos. They could help you run required checks before creating the PR.

Please sync the latest code with latest dev branch (for azure-cli) or main branch (for azure-cli-extensions).
After that please run the following commands to enable git hooks:

pip install azdev --upgrade
azdev setup -c <your azure-cli repo path> -r <your azure-cli-extensions repo path>

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR adds comprehensive support for managed instance App Service plans, introducing new commands and functionality to manage custom mode App Service plans with additional configuration options.

  • Introduces managed instance App Service plan support with RDP, identity, and network integration capabilities
  • Adds new command groups for managing install scripts, storage mounts, registry adapters, and network configurations
  • Implements identity management operations (assign, remove, show, set-default) for App Service plans
  • Includes extensive test coverage with 720 lines of new test cases

Reviewed Changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
test_appservice_plan_managedinstance_commands.py Comprehensive test suite covering all managed instance functionality
custom.py Core implementation of managed instance operations and plan creation logic
commands.py Command registration for new managed instance command groups
actions.py New action classes for parsing complex argument structures
_params.py Parameter definitions for managed instance commands
_help.py Help documentation for new command groups
aaz/latest/appservice/plan/* Auto-generated AAZ command implementations

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@yonzhan yonzhan assigned zhoxing-ms and unassigned jiasli Oct 29, 2025
@joslinmicrosoft joslinmicrosoft force-pushed the feature-appservice-managedinstances branch 2 times, most recently from 906645a to e4c05b2 Compare October 30, 2025 21:44
@joslinmicrosoft
Copy link
Member Author

/azp run

@azure-pipelines
Copy link

Commenter does not have sufficient privileges for PR 32344 in repo Azure/azure-cli

@yanzhudd
Copy link
Contributor

yanzhudd commented Nov 3, 2025

/azp run

@azure-pipelines
Copy link

Azure Pipelines successfully started running 3 pipeline(s).

@joslinmicrosoft joslinmicrosoft force-pushed the feature-appservice-managedinstances branch from 23b61e6 to fccd2be Compare November 4, 2025 16:23
@yanzhudd
Copy link
Contributor

yanzhudd commented Nov 4, 2025

/azp run

@azure-pipelines
Copy link

Azure Pipelines successfully started running 3 pipeline(s).

@yanzhudd yanzhudd merged commit 0999b7d into Azure:dev Nov 6, 2025
48 checks passed
@joslinmicrosoft joslinmicrosoft deleted the feature-appservice-managedinstances branch November 6, 2025 00:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Auto-Assign Auto assign by bot

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants