az vm image terms and its subcommands can be issued with either individual options to specify the marketplace product (--offer, --plan, etc.) - or instead provide the fully qualified URN using --urn. However, when passing a malformed URN, such as one that is missing the version component, the command hard fails:
# Example URN which works as intended
$ az vm image terms show --urn Canonical:0001-com-ubuntu-pro-jammy:pro-22_04-lts:22.04.202305310
# Example URN which hard fails with a less than obvious error message
$ az vm image terms show --urn Canonical:0001-com-ubuntu-pro-jammy:pro-22_04-lts:
The command failed with an unexpected error. Here is the traceback:
(", AttributeError: 'list' object has no attribute 'get'", 'Unable to deserialize to object: type', AttributeError("'list' object has no attribute 'get'"))
Traceback (most recent call last):
File "/opt/az/lib/python3.10/site-packages/azure/mgmt/compute/_serialization.py", line 1430, in _deserialize
found_value = key_extractor(attr, attr_desc, data)
File "/opt/az/lib/python3.10/site-packages/azure/mgmt/compute/_serialization.py", line 1177, in rest_key_extractor
return working_data.get(key)
AttributeError: 'list' object has no attribute 'get'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/opt/az/lib/python3.10/site-packages/knack/cli.py", line 233, in invoke
cmd_result = self.invocation.execute(args)
File "/opt/az/lib/python3.10/site-packages/azure/cli/core/commands/__init__.py", line 663, in execute
raise ex
File "/opt/az/lib/python3.10/site-packages/azure/cli/core/commands/__init__.py", line 726, in _run_jobs_serially
results.append(self._run_job(expanded_arg, cmd_copy))
File "/opt/az/lib/python3.10/site-packages/azure/cli/core/commands/__init__.py", line 697, in _run_job
result = cmd_copy(params)
File "/opt/az/lib/python3.10/site-packages/azure/cli/core/commands/__init__.py", line 333, in __call__
return self.handler(*args, **kwargs)
File "/opt/az/lib/python3.10/site-packages/azure/cli/core/commands/command_operation.py", line 363, in handler
show_exception_handler(ex)
File "/opt/az/lib/python3.10/site-packages/azure/cli/core/commands/arm.py", line 429, in show_exception_handler
raise ex
File "/opt/az/lib/python3.10/site-packages/azure/cli/core/commands/command_operation.py", line 361, in handler
return op(**command_args)
File "/opt/az/lib/python3.10/site-packages/azure/cli/command_modules/vm/custom.py", line 2441, in get_terms
publisher, offer, plan = _terms_prepare(cmd, urn, publisher, offer, plan)
File "/opt/az/lib/python3.10/site-packages/azure/cli/command_modules/vm/custom.py", line 2377, in _terms_prepare
image = show_vm_image(cmd, urn)
File "/opt/az/lib/python3.10/site-packages/azure/cli/command_modules/vm/custom.py", line 2327, in show_vm_image
return client.virtual_machine_images.get(location, publisher, offer, sku, version)
File "/opt/az/lib/python3.10/site-packages/azure/core/tracing/decorator.py", line 78, in wrapper_use_tracer
return func(*args, **kwargs)
File "/opt/az/lib/python3.10/site-packages/azure/mgmt/compute/v2022_11_01/operations/_virtual_machine_images_operations.py", line 320, in get
deserialized = self._deserialize("VirtualMachineImage", pipeline_response)
File "/opt/az/lib/python3.10/site-packages/azure/mgmt/compute/_serialization.py", line 1375, in __call__
return self._deserialize(target_obj, data)
File "/opt/az/lib/python3.10/site-packages/azure/mgmt/compute/_serialization.py", line 1445, in _deserialize
raise_with_traceback(DeserializationError, msg, err)
File "/opt/az/lib/python3.10/site-packages/azure/core/exceptions.py", line 78, in raise_with_traceback
raise error.with_traceback(exc_traceback)
File "/opt/az/lib/python3.10/site-packages/azure/mgmt/compute/_serialization.py", line 1430, in _deserialize
found_value = key_extractor(attr, attr_desc, data)
File "/opt/az/lib/python3.10/site-packages/azure/mgmt/compute/_serialization.py", line 1177, in rest_key_extractor
return working_data.get(key)
azure.core.exceptions.DeserializationError: (", AttributeError: 'list' object has no attribute 'get'", 'Unable to deserialize to object: type', AttributeError("'list' object has no attribute 'get'"))
To check existing issues, please visit: https://github.com/Azure/azure-cli/issues
This issue is not to be confused with an URN with an invalid version. The command also correctly handles some incomplete URNs:
# A better error message
$ az vm image terms show --urn Canonical:0001-com-ubuntu-pro-jammy:
usage error: urn should be in the format of publisher:offer:sku:version.
# Not as good as the previous error, but much better than the one which is being reported
$ az vm image terms show --urn Canonical:0001-com-ubuntu-pro-jammy::
(BadRequest) The request URL is not valid.
Code: BadRequest
Message: The request URL is not valid.
Inner error: {
"internalErrorCode": "RequestUrlInvalid"
}
The Solution
Azure Marketplace URNs are well defined, and Azure CLI should report that the URN is incomplete:
# An error message that tells the user what the URN is missing
$ az vm image terms show --urn Canonical:0001-com-ubuntu-pro-jammy:pro-22_04-lts:
usage error: urn is missing "version" in the publisher:offer:sku:version format
Other Considerations
This is a low impact enhancement. Users should be smart enough to input a valid URN (once again, the documentation is very clear on what an URN is comprised of), but I can attest to this error message being an issue for those who are less-than-familiar with Azure.
The Command
az vm image terms
and its subcommands.The Issue
az vm image terms
and its subcommands can be issued with either individual options to specify the marketplace product (--offer
,--plan
, etc.) - or instead provide the fully qualified URN using--urn
. However, when passing a malformed URN, such as one that is missing theversion
component, the command hard fails:This issue is not to be confused with an URN with an invalid version. The command also correctly handles some incomplete URNs:
The Solution
Azure Marketplace URNs are well defined, and Azure CLI should report that the URN is incomplete:
Other Considerations
This is a low impact enhancement. Users should be smart enough to input a valid URN (once again, the documentation is very clear on what an URN is comprised of), but I can attest to this error message being an issue for those who are less-than-familiar with Azure.