Search code examples
jsonazurecommand-lineazure-iot-hubazure-iot-edge

Nested JSON path with dot/period in azure


The goal is to use the az iot edge deployment update command to change a module in an azure iot hub/edge deployment. The attempt to do this uses the property-path within the deployment configuration json to replace the image path. The problem is that there is a dot in a json property properties.desired and attempts of escaping it have been futile. The file is a default azure deployment configuration file.

Command format

az iot edge deployment update --deployment-id <name-of-deployment> --hub-name <name-of-iot-hub> --set <json-path>=<new-value>

First part of the deployment configuration (json) The goal is to change the value of image

{
    "content": {
        "modulesContent": {
            "$edgeAgent": {
                "properties.desired": {
                    "modules": {
                        "demoimage1-latest": {
                            "settings": {
                                "image": "demoworkspac2478a907.azurecr.io/demoimage1:6",

The most obvious attempt

az iot edge deployment update --deployment-id demoimage1-6 --hub-name iot-hubski --set content.modulesContent.'$edgeAgent'.'properties.desired'.modules.'demoimage1-latest'.settings.image=demoworkspac2478a907.azurecr.io/demoimage1:5

Gives

Couldn't find 'properties' in 'content.modulesContent.$edgeAgent.properties.desired.modules.demoimage1-latest'. Available options: ['properties.desired']

Status

Many things have been tried using both bash (ubuntu LTS vm) and powershell (win10)

  • [properties.desired]
  • '[properties.desired]'
  • ['properties.desired']
  • properties\.desired
  • properties.desired`
  • properties.desired
  • '..."properties.desired"...'
  • '...\"properties.desired\"...'
  • '$edgeAgent'[properties.desired]
  • '$edgeAgent'['properties.desired']
  • ^[properties.desired^]
  • ^^[properties.desired^^]
  • ``[properties.desired]
  • ```[properties.desired``]`

Solution

  • you need to manually strinigying the $edgeHub JSON.

    az iot edge deployment update --deployment-id testedge --hub-name microwaves --set content.modulesContent.'$edgeHub'="{'properties.desired': {'routes': {'route': 'FROM /messages/* INTO $upstream'},'schemaVersion': '1.0','storeAndForwardConfiguration': {'timeToLiveSecs': 7201}}}"
    

    However it doesn't do anything because of content being immutable. Items that can be updated by az iot edge deployment update command: labels, metrics, priority and targetCondition. labels and metrics do not allow values with ‘.’ in the name.