Skip to content

Commit db4b635

Browse files
authored
[Compute] az vm/vmss application set: Add new parameter --enable-automatic-upgrade to support enabling application automatic upgrade (#32394)
1 parent d7e1e40 commit db4b635

10 files changed

+8759
-2218
lines changed

src/azure-cli/azure/cli/command_modules/vm/_help.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1550,6 +1550,9 @@
15501550
text: az vm application set -g MyResourceGroup -n MyVm --app-version-ids /subscriptions/subid/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/galleries/myGallery1/applications/MyApplication1/versions/1.0 \
15511551
/subscriptions/subid/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/galleries/myGallery1/applications/MyApplication1/versions/1.1 \
15521552
--app-config-overrides https://mystorageaccount.blob.core.windows.net/configurations/settings.config null
1553+
- name: Set applications for vm with auto upgrade
1554+
text: az vm application set -g MyResourceGroup -n MyVm --app-version-ids /subscriptions/subid/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/galleries/myGallery1/applications/MyApplication1/versions/1.0 \
1555+
/subscriptions/subid/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/galleries/myGallery1/applications/MyApplication2/versions/1.1 --enable-automatic-upgrade True False
15531556
"""
15541557

15551558
helps['vm application list'] = """

src/azure-cli/azure/cli/command_modules/vm/_params.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,6 +1053,7 @@ def load_arguments(self, _):
10531053
'It should have the same number of items as the application version ids. Null is available for a application '
10541054
'which does not have a configuration override.')
10551055
c.argument('treat_deployment_as_failure', nargs='*', help="Space-separated list of true or false corresponding to the application version ids. If set to true, failure to install or update gallery application version operation will fail this operation")
1056+
c.argument('enable_automatic_upgrade', nargs='*', options_list=['--enable-automatic-upgrade', '--enable-auto-upgrade'], help='Space-separated list of true or false corresponding to the application version ids. If set to true, when a new Gallery Application version is available in PIR/SIG, it will be automatically updated for the VM/VMSS')
10561057

10571058
for scope in ['vm application list', 'vmss application list']:
10581059
with self.argument_context(scope) as c:

src/azure-cli/azure/cli/command_modules/vm/_validators.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1486,6 +1486,10 @@ def _validate_vm_vmss_set_applications(cmd, namespace): # pylint: disable=unuse
14861486
if boolean_value_in_string.lower() != 'true' and boolean_value_in_string.lower() != 'false':
14871487
raise ArgumentUsageError('usage error: --treat-deployment-as-failure only accepts a list of "true" or'
14881488
' "false" values')
1489+
if namespace.enable_automatic_upgrade:
1490+
if len(namespace.application_version_ids) != len(namespace.enable_automatic_upgrade):
1491+
raise ArgumentUsageError('usage error: --enable-automatic-upgrade should have the same number of items'
1492+
' as --application-version-ids')
14891493

14901494

14911495
def _resolve_role_id(cli_ctx, role, scope):

src/azure-cli/azure/cli/command_modules/vm/custom.py

Lines changed: 63 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5930,7 +5930,7 @@ def show_capacity_reservation_group(client, resource_group_name, capacity_reserv
59305930
expand=expand)
59315931

59325932

5933-
def set_vm_applications(cmd, vm_name, resource_group_name, application_version_ids, order_applications=False, application_configuration_overrides=None, treat_deployment_as_failure=None, no_wait=False):
5933+
def set_vm_applications(cmd, vm_name, resource_group_name, application_version_ids, order_applications=False, application_configuration_overrides=None, treat_deployment_as_failure=None, enable_automatic_upgrade=None, no_wait=False):
59345934
from .aaz.latest.vm import Update as _VMUpdate
59355935

59365936
class SetVMApplications(_VMUpdate):
@@ -5961,6 +5961,13 @@ def pre_instance_update(self, instance):
59615961
treat_as_failure.lower() == 'true'
59625962
index += 1
59635963

5964+
if enable_automatic_upgrade:
5965+
index = 0
5966+
for enable_auto_upgrade in enable_automatic_upgrade:
5967+
instance.properties.application_profile.gallery_applications[index]["enable_automatic_upgrade"] = \
5968+
enable_auto_upgrade.lower() == 'true'
5969+
index += 1
5970+
59645971
def _output(self, *args, **kwargs):
59655972
from azure.cli.core.aaz import AAZUndefined, has_value
59665973

@@ -5992,35 +5999,62 @@ def list_vm_applications(cmd, vm_name, resource_group_name):
59925999
return vm.get("applicationProfile", {})
59936000

59946001

5995-
def set_vmss_applications(cmd, vmss_name, resource_group_name, application_version_ids, order_applications=False, application_configuration_overrides=None, treat_deployment_as_failure=None, no_wait=False):
5996-
client = _compute_client_factory(cmd.cli_ctx)
5997-
ApplicationProfile, VMGalleryApplication = cmd.get_models('ApplicationProfile', 'VMGalleryApplication')
5998-
try:
5999-
vmss = client.virtual_machine_scale_sets.get(resource_group_name, vmss_name)
6000-
except ResourceNotFoundError:
6001-
raise ResourceNotFoundError('Could not find vmss {}.'.format(vmss_name))
6002+
def set_vmss_applications(cmd, vmss_name, resource_group_name, application_version_ids, order_applications=False, application_configuration_overrides=None, treat_deployment_as_failure=None, enable_automatic_upgrade=None, no_wait=False):
6003+
from .aaz.latest.vmss import Update as _VMSSUpdate
6004+
6005+
class SetVMSSApplications(_VMSSUpdate):
6006+
def pre_operations(self):
6007+
args = self.ctx.args
6008+
args.no_wait = no_wait
60026009

6003-
vmss.virtual_machine_profile.application_profile = ApplicationProfile(gallery_applications=[VMGalleryApplication(package_reference_id=avid) for avid in application_version_ids])
6004-
6005-
if order_applications:
6006-
index = 1
6007-
for app in vmss.virtual_machine_profile.application_profile.gallery_applications:
6008-
app.order = index
6009-
index += 1
6010-
6011-
if application_configuration_overrides:
6012-
index = 0
6013-
for over_ride in application_configuration_overrides:
6014-
if over_ride or over_ride.lower() != 'null':
6015-
vmss.virtual_machine_profile.application_profile.gallery_applications[index].configuration_reference = over_ride
6016-
index += 1
6017-
6018-
if treat_deployment_as_failure:
6019-
index = 0
6020-
for treat_as_failure in treat_deployment_as_failure:
6021-
vmss.virtual_machine_profile.application_profile.gallery_applications[index].treat_failure_as_deployment_failure = treat_as_failure.lower() == 'true'
6022-
index += 1
6023-
return sdk_no_wait(no_wait, client.virtual_machine_scale_sets.begin_create_or_update, resource_group_name, vmss_name, vmss)
6010+
def pre_instance_update(self, instance):
6011+
instance.properties.virtualMachineProfile.application_profile.gallery_applications = [{"package_reference_id": avid} for avid in application_version_ids]
6012+
6013+
if order_applications:
6014+
index = 1
6015+
for app in instance.properties.virtualMachineProfile.application_profile.gallery_applications:
6016+
app["order"] = index
6017+
index += 1
6018+
6019+
if application_configuration_overrides:
6020+
index = 0
6021+
for over_ride in application_configuration_overrides:
6022+
if over_ride or over_ride.lower() != 'null':
6023+
instance.properties.virtual_machine_profile.application_profile.gallery_applications[index]["configuration_reference"] = over_ride
6024+
index += 1
6025+
6026+
if treat_deployment_as_failure:
6027+
index = 0
6028+
for treat_as_failure in treat_deployment_as_failure:
6029+
instance.properties.virtual_machine_profile.application_profile.gallery_applications[index]["treat_failure_as_deployment_failure"] = \
6030+
treat_as_failure.lower() == 'true'
6031+
index += 1
6032+
6033+
if enable_automatic_upgrade:
6034+
index = 0
6035+
for enable_auto_upgrade in enable_automatic_upgrade:
6036+
instance.properties.virtual_machine_profile.application_profile.gallery_applications[index]["enable_automatic_upgrade"] = \
6037+
enable_auto_upgrade.lower() == 'true'
6038+
index += 1
6039+
6040+
def _output(self, *args, **kwargs):
6041+
from azure.cli.core.aaz import AAZUndefined, has_value
6042+
6043+
# Resolve flatten conflict
6044+
# When the type field conflicts, the type in inner layer is ignored and the outer layer is applied
6045+
print(self.ctx.vars.instance.properties.virtual_machine_profile.extension_profile.extensions)
6046+
if has_value(self.ctx.vars.instance.properties.virtual_machine_profile.extension_profile.extensions):
6047+
for extension in self.ctx.vars.instance.properties.virtual_machine_profile.extension_profile.extensions:
6048+
if has_value(extension.type):
6049+
extension.type = AAZUndefined
6050+
6051+
result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True)
6052+
return result
6053+
6054+
return SetVMSSApplications(cli_ctx=cmd.cli_ctx)(command_args={
6055+
"resource_group": resource_group_name,
6056+
"vm_scale_set_name": vmss_name,
6057+
})
60246058

60256059

60266060
def list_vmss_applications(cmd, vmss_name, resource_group_name):

0 commit comments

Comments
 (0)