Giter VIP home page Giter VIP logo

armview-vscode's Introduction

๐Ÿ‘จโ€๐Ÿ’ป Hello! I'm Ben, I enjoy writing code!

  • โค Go, JS, Node, computer graphics, web dev (front and backend)
  • โค also ๐Ÿฑ ๐Ÿบ ๐ŸŽฒ ๐Ÿƒโ€ ๐Ÿ’ป ๐ŸŽน ๐ŸŽถ ๐ŸŽฎ
  • ๐Ÿ’ฌ My Blog - https://benc.dev/blog/
  • ๐Ÿ•Š Twitter - https://twitter.com/BenCodeGeek

armview-vscode's People

Contributors

benc-uk avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

armview-vscode's Issues

Nested Resources - Unable to Resolve Names

Describe the bug
Forgive me if I'm doing something wrong, but I've noticed a lot of our templates will fail to display the names correctly, even when parameters are provided. Turns out this seems to be because we use a lot of nested resources. It looks like the resource names are struggling to display when the resources are nested within a deployment resource. Is this a bug or am I using the extension incorrectly?
When the resource is nested:
image
When I move the resource to the root it's fine (but no longer linked to the parent):
image

Again, apologies if this is just me misunderstanding, but as far as I can see the names should resolve correctly?

To Reproduce

 {
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "asbResourceGroup": {
      "type": "string"
    }
  },
  "variables": {
    "topic-name": "my.topic"
  },
  "resources": [
    {
      "apiVersion": "2018-05-01",
      "name": "eunEntities",
      "type": "Microsoft.Resources/deployments",
      "resourceGroup": "[parameters('asbResourceGroup')]",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {},
          "resources": [
            {
              "type": "Microsoft.ServiceBus/namespaces/topics",
              "name": "[concat(variables('topic-name'))]",
              "apiVersion": "2018-05-01"
            }
          ]
        }
      }
    }
  ]
}

Is it possible to show the displayName text as label?

Hi Author,

this extension is super cool. But I use in my templates very often the tag displayname. This tag can contain a custom name. This will be interpreted for example by the vscode outline extension for ARM. It would be created if I can show this display names in the graph too.

Customize Icons for Linked Templates

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
I'm always frustrated when... I use link templates to organize my ARM templates, which ruin my visualizations.
image

Describe the solution you'd like
I wish I could do something to swap the pictures for the pictures that would should up for the nested templates. Ideally I would be able to mark this in a way that it would be saved. Perhaps in the metadata field of the linked template resource. Just being able to swap the default icon for the AKS icon would make it look much better for example.

Describe alternatives you've considered
if this could really dig into the nested templates, and figure out everything in there that would be even better.

Additional context
Nested template icons that aren't picked up
image

image

image

Database dependency not picked up

Describe the bug
My ARM template has a website which dependsOn a SQL Database (and a few other resources).
The other resources are displayed, but not the database connection

To Reproduce

            "dependsOn": [
                "[resourceId('Microsoft.Insights/components/', variables('appInsight'))]",
                "[resourceId('Microsoft.Web/serverfarms/', variables('hostingPlanName'))]",
                "[resourceId('Microsoft.Sql/servers/databases/', variables('dbServerName'), variables('dbName'))]"
            ],

image

I understand there are "known issues" with the dependsOn but here the 3 resources are expressed in the same way.

If not possible to fix, could you please tell me how to express that dependency so that it gets picked up?

Support for Bicep (with Modules!)

Is your feature request related to a problem? Please describe.
Something as useful as this is impeeded by the inability to process Bicep

Describe the solution you'd like
Same functionallity regardless of if template file is in bicep or json format

Describe alternatives you've considered
Compiling the files manually - but this really breaks the workflow

Additional context
As an Azure consltant, I find fewer and fewer hand writing json - most of the major efforts have been Bicep over the past 3 months and seems to becoming near exclusive...

Filter out by point&click

Hi.

I think it will be very useful to have a simple way to filter out elements than writing ARM strings in the filter-out textbox. I think that it would be intersting to have a button (or switch or whatever) inside the popup of the element detail, in such a way that you can decide to "filter out or filter in all elements of this type". It is specially useful when you are building a high level view of a deployment (for example show a cosmosDB but hide all databases and collections ). I attach a sample idea.

Thanks for your valuable work.

aaa

DependsOn Broken Due to Failure to Resolve ARM Template Functions

Describe the bug
The Dependency Graph has broken at some point (I suspect a recent VSCode Update as I'm pretty sure this was working). The root cause appears to be because of the resolution of ARM Template functions (such as concat and resourceId which from what I gather use the same code path) has broken.

You can see this most visibly if you look at the name of the resource:

image

Because of this break none of the dependency tree visualization will work (because none of the resolved dependsOn names will match). You can prove this by "hardcoding" all the names and the dependency tree visualization once again works.

To Reproduce
Here's the example from above that attempts to create a KeyVault and a secret that depends on that KeyVault:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
    },
    "variables": {
        "keyVaultName": "keyVault",
        "location": "northcentralus"
    },
    "resources": [
        {
            "type": "Microsoft.KeyVault/vaults",
            "apiVersion": "2022-07-01",
            "name": "[variables('keyVaultName')]",
            "location": "[variables('location')]",
            "properties": {
                "enabledForTemplateDeployment": true,
                "enableSoftDelete": true,
                "publicNetworkAccess": "Enabled",
                "sku": {
                    "family": "A",
                    "name": "Standard"
                },
                "softDeleteRetentionInDays": 90,
                "tenantId": "[subscription().tenantId]"
            }
        },
        {
            "type": "Microsoft.KeyVault/vaults/secrets",
            "apiVersion": "2022-07-01",
            "name": "[concat(variables('keyVaultName'), '/somesecret')]",
            "dependsOn": [
                "[resourceId('Microsoft.KeyVault/vaults', variables('keyVaultName'))]"
            ],
            "properties": {
                "value": "trustno1"
            }
        }
    ]
}

Additional context
I really feel like this worked not even a few weeks ago; looking at the code base it appears you have to do a lot of work to emulate the execution of ARM Functions such as contact and resourceId as seen here:

private funcConcat(funcParams: string, joinStr: string): string {

The code that is showing up there looks like its coming from a library as I cannot find such code in the code base. Perhaps an update to Visual Studio Code's security policies to avoid code execution or some such?

**EDIT
Editing to add VSCode Version Information:

Version: 1.75.1 (user setup)
Commit: 441438abd1ac652551dbe4d408dfcec8a499b8bf
Date: 2023-02-08T21:32:34.589Z
Electron: 19.1.9
Chromium: 102.0.5005.194
Node.js: 16.14.2
V8: 10.2.154.23-electron.0
OS: Windows_NT x64 10.0.19044
Sandboxed: Yes

I've got another box that is running an older version of Visual Studio Code in which this works here's the version information from that:

Version: 1.72.2 (system setup)
Commit: d045a5eda657f4d7b676dedbfa7aab8207f8a075
Date: 2022-10-12T22:15:18.074Z
Electron: 19.0.17
Chromium: 102.0.5005.167
Node.js: 16.14.2
V8: 10.2.154.15-electron.0
OS: Windows_NT x64 10.0.19044
Sandboxed: No

Params button should support .jsonc

Is your feature request related to a problem? Please describe.
I save my params in .jsonc so editors don't complain about my comments, but I cannot select it with ARM Viewer because it allows json only

Describe the solution you'd like
Allow both json and jsonc in the file picker

Describe alternatives you've considered
Rename to .json, doing it now for a workaround but not desirable

Allow visibility of resource to be toggled by type

I have some Arm templates that include a few resources such as SQL, storage container but also include a keyvault with many secrets defined in the template - the large number of key vault secrets distorts the layout - it would be nice to say toggle the visibility of a resource (in my case microsoft.keyvault/vaults/microsoft.keyvault/vaults/secrets ) to false and hide them

export the graphic as a .png or .svg

FEATURE REQUEST
Additional value could be given to the extension when being able to export to PNG, GIF, SVG,

from the graph provide a button with export , or ... provide a context menu extension to export the graph

screensnips work too, but it's better to have a direct export as resolution can be better

Parser Error: updatedStack.replace is not a function

Describe the bug
I just installed the extension today and encounter the following error on the first two templates I tried to visualize.

Parser Error: updatedStack.replace is not a function

To Reproduce
I started commenting out resources from my template one by one and noticed as soon as I removed the below Cosmos DB container resource the viewer would render:

{
            "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers",
            "name": "[concat(variables('accountName'), '/', parameters('cosmosDatabaseName'), '/', parameters('containerName'))]",
            "apiVersion": "2019-08-01",
            "dependsOn": [
            ],
            "properties": {
                "resource": {
                    "id": "[parameters('containerName')]",
                    "partitionKey": {
                        "paths": [
                            "/partitionKey"
                        ],
                        "kind": "Hash"
                    },
                    "indexingPolicy": {
                        "indexingMode": "consistent",
                        "includedPaths": [
                            {
                                "path": "/*",
                                "indexes": [
                                    {
                                        "kind": "Hash",
                                        "dataType": "String",
                                        "precision": -1
                                    }
                                ]
                            }
                        ]
                    }
                },
                "options": {
                }
            }
        }

I also encounter the issue with the below template to add an access policy to key vault:

        {
            "type": "Microsoft.KeyVault/vaults/accessPolicies",
            "name": "[concat(parameters('keyVaultName'), '/add')]",
            "apiVersion": "2018-02-14",
            "dependsOn": [
                "[resourceId('Microsoft.Web/Sites', parameters('apiFunctionAppName'))]",
                "[resourceId('Microsoft.Web/sites/slots', parameters('apiFunctionAppName'), 'staging')]"
            ],
            "properties": {
                "accessPolicies": [
                    {
                        "tenantId": "[reference(resourceId('Microsoft.Web/Sites', parameters('apiFunctionAppName')), '2016-08-01', 'Full').identity.tenantId]",
                        "objectId": "[reference(resourceId('Microsoft.Web/Sites', parameters('apiFunctionAppName')), '2016-08-01', 'Full').identity.principalId]",
                        "permissions": {
                            "secrets": [
                                "list",
                                "get"
                            ]
                        }
                    },
                    {
                        "tenantId": "[reference(resourceId('Microsoft.Web/sites/slots', parameters('apiFunctionAppName'), 'staging'), '2016-08-01', 'Full').identity.tenantId]",
                        "objectId": "[reference(resourceId('Microsoft.Web/sites/slots', parameters('apiFunctionAppName'), 'staging'), '2016-08-01', 'Full').identity.principalId]",
                        "permissions": {
                            "secrets": [
                                "list",
                                "get"
                            ]
                        }
                    }
                ]
            }
        },

Customize arrow- and/or background-color

When using the exported .png file in an markdown (with white background) the arrows disappears,

image

A solution to this would be the posibility to customize the color of the arrows in the diagram

Not working with comments

Unfortunately when an ARM Template has a comment in its content like "// comment here" then the error shows up:
"Parser error on line XX:
Expecting 'STRING', got 'undefined'"

Resource text is unreadable in ANY form in light mode

Describe the bug
the font for the asset/resource naming has a bold outline resulting in unreadable text. HOWEVER this works when you go in DARK modes

To Reproduce
with any template just open it and look at the output. I am running latest versions of both the extension and VSCode and have for i don't remember how long. See images attached for the issue

Additional context
Add any other context about the problem here.
image
image

Feature Request: Implement Tenant scope icons

Some resources in the Tenant scope don't seem to have icons yet. The ones I have personally ran into are:

Microsoft.Management/managementGroups
Microsoft.Management/managementGroups/subscriptions

It would be nice to have them. I have a template that describes management group, subscription and resource group structure. It is hard to exactly visualise the image because the default icon looks a lot like a resource group. See graphic below containing a management group, subscription and deployment with two resource groups.

image

Support new ARM template language server

Hey Ben,

I am a PM on the ARM template deployments team at Microsoft.

In a few days, the Azure Resource Manager Tools extension (azurerm-vscode-tools, repo at https://github.com/microsoft/vscode-azurearmtools) will be updated to introduce a new language server for ARM template files. When the extension is installed, deployment templates will automatically be detected via the $schema and the editor language will be set to "arm-deployment" to enable this new language server.

How this affects other extensions that work with deployment templates files
Any extension that wants to have an editing experience for ARM templates should support the "arm-template" language ID instead of (if it depends on azurerm-vscode-tools being installed), or in addition to json/jsonc (if it wants to run with or without the azurerm-vscode-tools extension being installed).

Also note that with this update to the extension we are introducing better support for // comments and multi-line strings. Even though JSON does not support these features, they are accepted by the ARM deployment API because our JSON deserializer is Json.NET which accepts a more lenient version of JSON. I noticed that the library you are using throws an error when either of these occur in a template.

Let us know if you have any questions,
Alex

Icons need updating

Azure and its Icons have been updated since the last Icon update in Sept 19. I have looked at how the icons are associated to the resource type and the file naming. The problem is that the icons have not been updated, an it appears the linking of updates is a manual task as the official files do not follow that used within the app.

Provide Parameters When Viewing ARM Template

Describe the solution you'd like
Either when you load a template or maybe as an extension setting I would like to set the parameter file used for the template visualization.

Additional context
This would be very useful when you have multiple environments which may have many parameter files.

Add a CLI

Is your feature request related to a problem? Please describe.
If this extension had a CLI, we could automatically generate these diagrams as part of our pipeline. At the moment you have to manually export from VS Code.

Describe the solution you'd like
A CLI that allowed us to specify the input file and parameters file and call the Export function to generate the .png. File path would probably be a relevant command line parameter too.

Describe alternatives you've considered
We have looked other extensions, but this one is the best.

String replace uses regex

Describe the bug
When using the string replace function it seems like a regex replace is being used in the viewer.

To Reproduce
This is a simple template just to reproduce the problem. With this the name should be a-b-c, but instead I get ----- because the . is treated as any character in regex.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        {
            "type": "foo",
            "name": "[replace('a.b.c', '.', '-')]"
        }
    ]
}

Show full labels

Is your feature request related to a problem? Please describe.
For really long labels like: cb-development-2022-vnet/Dev2-spoke-peer it is getting truncated in the ARM viewer down to: cb-development-2022-vnet...

Describe the solution you'd like
Allow us to show the full label text regardless of length

Describe alternatives you've considered
I went through my template and replace all cb-development-2022-vnet references with vnet so it gets me by, but I don't like this solution.

Additional context
none

Feature Request: Reverse Dependency Arrows

If a dependsOn is used in a template (e.g. a reference to a network interface in a VM template), then the arrow is drawn from the VM to the network interface. The dependency is actually the opposite and the diagram would make more sense if the arrow went from the network interface to the VM

image

The arrow direction could be a toggleable feature depending on preference.

Awesome module! I use it every day.

Running the contributed command: 'armView.start' failed

Describe the bug
I got this error upon clicking the eye icon button on an opened template json file.

To Reproduce
Is there some way to tell what's the reason behind the error? any verbose logging option?

Additional context
Name: ARM Template Viewer
Id: bencoleman.armview
Description: Graphically display ARM templates in an interactive map view
Version: 0.4.2
Publisher: Ben Coleman
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=bencoleman.armview

https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#

image

Feature Request: Circular dependencies

Is your feature request related to a problem? Please describe.
It would be helpful to identify circular dependencies. Particularly as when a deployment errors for this reason, only one resource is listed as the culprit, and not those related to it.

Describe the solution you'd like
Red arrows pointing out the circular dependency.

Describe alternatives you've considered
Briefly hoping that Microsoft will make ARM templates easier to troubleshoot.

Additional context
N/A

Support multi-line strings in templates

Multi-line strings are not part of the JSON spec however they are supported by ARM and the vscode-azurearmtools extension. Today their use is very small.

Currently I use a standard JSON parser which can not handle this format, and will bork at any multi-lines it finds.

With the new language server in vscode-azurearmtools, use of multi-line strings in templates is expected to grow.

A solution needs to be found

Improve variable handling

  • Pre process variables step
  • If objects are returned mutate variable object with real results not flattened string
  • Recursively walk down object property tree, resolving expressions as we go
  • Would probably require two passes to deal with returned objects that contain as yet un-resolved expressions

ManagedDisks do not show up at all nor attached to the VM

Describe the bug
First of all, AWESOME tool!!! Love it! Your tool shows more dependent objects than Microsoft Resource Visualizer which does not display subnets relationship to Vnets!!! The tool even picks up VM extensions and draws the dependencies!!!

The issue I ran into is that OS and Data Disks associated with VMs are not detected as objects so not shown. It will be great if you can add the ability to display OS/Data disks attached to VMs.

To Reproduce
Please attach your ARM template causing the issue here. If you are not comfortable posting it publicly, then if possible email it to me at [email protected].

Some non relevant resource objects are removed.

"parameters": {
"virtualMachines_SQL01_name": {
"defaultValue": "SQL01",
"type": "String"
},
"virtualMachines_WEB01_name": {
"defaultValue": "WEB01",
"type": "String"
},
"virtualMachines_MGMT01_name": {
"defaultValue": "MGMT01",
"type": "String"
},
....

    "networkInterfaces_nic_SQL01_name": {
        "defaultValue": "nic-SQL01",
        "type": "String"
    },
    "networkInterfaces_nic_WEB01_name": {
        "defaultValue": "nic-WEB01",
        "type": "String"
    },
    "virtualNetworks_vnet_testjy_name": {
        "defaultValue": "vnet-testjy",
        "type": "String"
    },
    "networkInterfaces_nic_MGMT01_name": {
        "defaultValue": "nic-MGMT01",
        "type": "String"
    },
    "networkSecurityGroups_nsg_web_name": {
        "defaultValue": "nsg-web",
        "type": "String"
    },

    "networkSecurityGroups_nsg_database_name": {
        "defaultValue": "nsg-database",
        "type": "String"
    },

    "networkSecurityGroups_nsg_management_name": {
        "defaultValue": "nsg-management",
        "type": "String"
    },

},
"variables": {},
"resources": [

    {
        "type": "Microsoft.Network/networkSecurityGroups",
        "apiVersion": "2022-05-01",
        "name": "[parameters('networkSecurityGroups_nsg_database_name')]",
        "location": "northeurope",
        "tags": {
            "BusinessArea": "Enterprise Architect",
            "BusinessCritical": "False",
            "Environment": "TestJY",
            "OutofHourShutdown": "False",
            "Project": "Terraform JY Test Subcription"
        },
        "properties": {
            "securityRules": []
        }
    },
    {
        "type": "Microsoft.Network/networkSecurityGroups",
        "apiVersion": "2022-05-01",
        "name": "[parameters('networkSecurityGroups_nsg_web_name')]",
        "location": "northeurope",
        "tags": {
            "BusinessArea": "Enterprise Architect",
            "BusinessCritical": "False",
            "Environment": "TestJY",
            "OutofHourShutdown": "False",
            "Project": "Terraform JY Test Subcription"
        },
        "properties": {
            "securityRules": []
        }
    },


    {
        "type": "Microsoft.Network/networkInterfaces",
        "apiVersion": "2022-05-01",
        "name": "[parameters('networkInterfaces_nic_MGMT01_name')]",
        "location": "northeurope",
        "dependsOn": [
            "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworks_vnet_testjy_name'), 'management')]"
        ],
        "kind": "Regular",
        "properties": {
            "ipConfigurations": [
                {
                    "name": "internal",
                    "id": "[concat(resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaces_nic_MGMT01_name')), '/ipConfigurations/internal')]",
                    "etag": "W/\"8ae78523-775a-4a58-a497-1f1179b457a5\"",
                    "type": "Microsoft.Network/networkInterfaces/ipConfigurations",
                    "properties": {
                        "provisioningState": "Succeeded",
                        "privateIPAddress": "10.4.3.4",
                        "privateIPAllocationMethod": "Dynamic",
                        "subnet": {
                            "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworks_vnet_testjy_name'), 'management')]"
                        },
                        "primary": true,
                        "privateIPAddressVersion": "IPv4"
                    }
                }
            ],
            "dnsSettings": {
                "dnsServers": []
            },
            "enableAcceleratedNetworking": false,
            "enableIPForwarding": false,
            "disableTcpStateTracking": false,
            "nicType": "Standard"
        }
    },
    {
        "type": "Microsoft.Network/networkInterfaces",
        "apiVersion": "2022-05-01",
        "name": "[parameters('networkInterfaces_nic_SQL01_name')]",
        "location": "northeurope",
        "dependsOn": [
            "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworks_vnet_testjy_name'), 'database')]"
        ],
        "kind": "Regular",
        "properties": {
            "ipConfigurations": [
                {
                    "name": "internal",
                    "id": "[concat(resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaces_nic_SQL01_name')), '/ipConfigurations/internal')]",
                    "etag": "W/\"4ab06398-37fb-479a-8754-69907b91ec84\"",
                    "type": "Microsoft.Network/networkInterfaces/ipConfigurations",
                    "properties": {
                        "provisioningState": "Succeeded",
                        "privateIPAddress": "10.4.2.4",
                        "privateIPAllocationMethod": "Dynamic",
                        "subnet": {
                            "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworks_vnet_testjy_name'), 'database')]"
                        },
                        "primary": true,
                        "privateIPAddressVersion": "IPv4"
                    }
                }
            ],
            "dnsSettings": {
                "dnsServers": []
            },
            "enableAcceleratedNetworking": false,
            "enableIPForwarding": false,
            "disableTcpStateTracking": false,
            "nicType": "Standard"
        }
    },
    {
        "type": "Microsoft.Network/networkInterfaces",
        "apiVersion": "2022-05-01",
        "name": "[parameters('networkInterfaces_nic_WEB01_name')]",
        "location": "northeurope",
        "dependsOn": [
            "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworks_vnet_testjy_name'), 'web')]"
        ],
        "kind": "Regular",
        "properties": {
            "ipConfigurations": [
                {
                    "name": "internal",
                    "id": "[concat(resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaces_nic_WEB01_name')), '/ipConfigurations/internal')]",
                    "etag": "W/\"8faa0fae-1912-4fec-a888-e058ad93cd18\"",
                    "type": "Microsoft.Network/networkInterfaces/ipConfigurations",
                    "properties": {
                        "provisioningState": "Succeeded",
                        "privateIPAddress": "10.4.1.4",
                        "privateIPAllocationMethod": "Dynamic",
                        "subnet": {
                            "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworks_vnet_testjy_name'), 'web')]"
                        },
                        "primary": true,
                        "privateIPAddressVersion": "IPv4"
                    }
                }
            ],
            "dnsSettings": {
                "dnsServers": []
            },
            "enableAcceleratedNetworking": false,
            "enableIPForwarding": false,
            "disableTcpStateTracking": false,
            "nicType": "Standard"
        }
    },
    {
        "type": "Microsoft.Network/networkSecurityGroups",
        "apiVersion": "2022-05-01",
        "name": "[parameters('networkSecurityGroups_nsg_management_name')]",
        "location": "northeurope",
        "dependsOn": [
            "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_management_name'), 'RDP')]"
        ],
        "tags": {
            "BusinessArea": "Enterprise Architect",
            "BusinessCritical": "False",
            "Environment": "TestJY",
            "OutofHourShutdown": "False",
            "Project": "Terraform JY Test Subcription"
        },
        "properties": {
            "securityRules": [
                {
                    "name": "RDP",
                    "id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_management_name'), 'RDP')]",
                    "type": "Microsoft.Network/networkSecurityGroups/securityRules",
                    "properties": {
                        "protocol": "Tcp",
                        "sourcePortRange": "*",
                        "destinationPortRange": "3389",
                        "destinationAddressPrefix": "*",
                        "access": "Allow",
                        "priority": 100,
                        "direction": "Inbound",
                        "sourcePortRanges": [],
                        "destinationPortRanges": [],
                        "sourceAddressPrefixes": [
                            "73.115.86.200"
                        ],
                        "destinationAddressPrefixes": []
                    }
                }
            ]
        }
    },
    {
        "type": "Microsoft.Network/networkSecurityGroups/securityRules",
        "apiVersion": "2022-05-01",
        "name": "[concat(parameters('networkSecurityGroups_nsg_management_name'), '/RDP')]",
        "dependsOn": [
            "[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_management_name'))]"
        ],
        "properties": {
            "protocol": "Tcp",
            "sourcePortRange": "*",
            "destinationPortRange": "3389",
            "destinationAddressPrefix": "*",
            "access": "Allow",
            "priority": 100,
            "direction": "Inbound",
            "sourcePortRanges": [],
            "destinationPortRanges": [],
            "sourceAddressPrefixes": [
                "73.115.86.200"
            ],
            "destinationAddressPrefixes": []
        }
    },
    {
        "type": "Microsoft.RecoveryServices/vaults/backupPolicies",
        "apiVersion": "2022-03-01",
        "name": "[concat(parameters('vaults_asrvTestJY16888_name'), '/asrv-policy-TestJY16888')]",
        "dependsOn": [
            "[resourceId('Microsoft.RecoveryServices/vaults', parameters('vaults_asrvTestJY16888_name'))]"
        ],
 
    {
        "type": "Microsoft.Compute/virtualMachines",
        "apiVersion": "2022-08-01",
        "name": "[parameters('virtualMachines_MGMT01_name')]",
        "location": "northeurope",
        "dependsOn": [
            "[resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaces_nic_MGMT01_name'))]",
            "[resourceId('Microsoft.Storage/StorageAccounts', parameters('storageAccounts_stgtestjy16888diag_name'))]"
        ],
        "tags": {
            "BusinessArea": "Enterprise Architect",
            "BusinessCritical": "False",
            "Environment": "TestJY",
            "OutofHourShutdown": "False",
            "Project": "Terraform JY Test Subcription"
        },
        "properties": {
            "hardwareProfile": {
                "vmSize": "Standard_D3_v2"
            },
            "storageProfile": {
                "imageReference": {
                    "publisher": "MicrosoftWindowsServer",
                    "offer": "WindowsServer",
                    "sku": "2019-Datacenter",
                    "version": "latest"
                },
                "osDisk": {
                    "osType": "Windows",
                    "name": "[concat(parameters('virtualMachines_MGMT01_name'), '_OsDisk_1_8d0522a87f5e4b01bd67ae8976420fef')]",
                    "createOption": "FromImage",
                    "caching": "ReadWrite",
                    "writeAcceleratorEnabled": false,
                    "managedDisk": {
                        "id": "[resourceId('Microsoft.Compute/disks', concat(parameters('virtualMachines_MGMT01_name'), '_OsDisk_1_8d0522a87f5e4b01bd67ae8976420fef'))]"
                    },
                    "deleteOption": "Detach"
                },
                "dataDisks": []
            },
            "osProfile": {
                "computerName": "[parameters('virtualMachines_MGMT01_name')]",
                "adminUsername": "adminuser",
                "windowsConfiguration": {
                    "provisionVMAgent": true,
                    "enableAutomaticUpdates": true,
                    "patchSettings": {
                        "patchMode": "AutomaticByOS",
                        "assessmentMode": "ImageDefault",
                        "enableHotpatching": false
                    },
                    "winRM": {
                        "listeners": []
                    },
                    "enableVMAgentPlatformUpdates": false
                },
                "secrets": [],
                "allowExtensionOperations": true,
                "requireGuestProvisionSignal": true
            },
            "networkProfile": {
                "networkInterfaces": [
                    {
                        "id": "[resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaces_nic_MGMT01_name'))]",
                        "properties": {
                            "primary": true
                        }
                    }
                ]
            },
            "diagnosticsProfile": {
                "bootDiagnostics": {
                    "enabled": true,
                    "storageUri": "[concat('https://', parameters('storageAccounts_stgtestjy16888diag_name'), '.blob.core.windows.net/')]"
                }
            },
            "priority": "Regular",
            "extensionsTimeBudget": "PT1H30M"
        }
    },
    {
        "type": "Microsoft.Compute/virtualMachines",
        "apiVersion": "2022-08-01",
        "name": "[parameters('virtualMachines_SQL01_name')]",
        "location": "northeurope",
        "dependsOn": [
            "[resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaces_nic_SQL01_name'))]",
            "[resourceId('Microsoft.Storage/StorageAccounts', parameters('storageAccounts_stgtestjy16888diag_name'))]"
        ],
        "tags": {
            "BusinessArea": "Enterprise Architect",
            "BusinessCritical": "False",
            "Environment": "TestJY",
            "OutofHourShutdown": "False",
            "Project": "Terraform JY Test Subcription"
        },
        "properties": {
            "hardwareProfile": {
                "vmSize": "Standard_D3_v2"
            },
            "storageProfile": {
                "imageReference": {
                    "publisher": "MicrosoftSQLServer",
                    "offer": "sql2019-ws2019",
                    "sku": "enterprise",
                    "version": "latest"
                },
                "osDisk": {
                    "osType": "Windows",
                    "name": "[concat(parameters('virtualMachines_SQL01_name'), '_OsDisk_1_9326fc156e3d480cb13ac5c6b05b71eb')]",
                    "createOption": "FromImage",
                    "caching": "ReadWrite",
                    "writeAcceleratorEnabled": false,
                    "managedDisk": {
                        "id": "[resourceId('Microsoft.Compute/disks', concat(parameters('virtualMachines_SQL01_name'), '_OsDisk_1_9326fc156e3d480cb13ac5c6b05b71eb'))]"
                    },
                    "deleteOption": "Detach"
                },
                "dataDisks": [
                    {
                        "lun": 11,
                        "name": "[concat(parameters('virtualMachines_SQL01_name'), '-Disk2')]",
                        "createOption": "Attach",
                        "caching": "ReadWrite",
                        "writeAcceleratorEnabled": false,
                        "managedDisk": {
                            "id": "[resourceId('Microsoft.Compute/disks', concat(parameters('virtualMachines_SQL01_name'), '-Disk2'))]"
                        },
                        "deleteOption": "Detach",
                        "toBeDetached": false
                    },
                    {
                        "lun": 10,
                        "name": "[concat(parameters('virtualMachines_SQL01_name'), '-Disk1')]",
                        "createOption": "Attach",
                        "caching": "ReadWrite",
                        "writeAcceleratorEnabled": false,
                        "managedDisk": {
                            "id": "[resourceId('Microsoft.Compute/disks', concat(parameters('virtualMachines_SQL01_name'), '-Disk1'))]"
                        },
                        "deleteOption": "Detach",
                        "toBeDetached": false
                    }
                ]
            },
            "osProfile": {
                "computerName": "[parameters('virtualMachines_SQL01_name')]",
                "adminUsername": "adminuser",
                "windowsConfiguration": {
                    "provisionVMAgent": true,
                    "enableAutomaticUpdates": true,
                    "patchSettings": {
                        "patchMode": "AutomaticByOS",
                        "assessmentMode": "ImageDefault",
                        "enableHotpatching": false
                    },
                    "winRM": {
                        "listeners": []
                    },
                    "enableVMAgentPlatformUpdates": false
                },
                "secrets": [],
                "allowExtensionOperations": true,
                "requireGuestProvisionSignal": true
            },
            "networkProfile": {
                "networkInterfaces": [
                    {
                        "id": "[resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaces_nic_SQL01_name'))]",
                        "properties": {
                            "primary": true
                        }
                    }
                ]
            },
            "diagnosticsProfile": {
                "bootDiagnostics": {
                    "enabled": true,
                    "storageUri": "[concat('https://', parameters('storageAccounts_stgtestjy16888diag_name'), '.blob.core.windows.net/')]"
                }
            },
            "priority": "Regular",
            "extensionsTimeBudget": "PT1H30M"
        }
    },
    {
        "type": "Microsoft.Compute/virtualMachines",
        "apiVersion": "2022-08-01",
        "name": "[parameters('virtualMachines_WEB01_name')]",
        "location": "northeurope",
        "dependsOn": [
            "[resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaces_nic_WEB01_name'))]",
            "[resourceId('Microsoft.Storage/StorageAccounts', parameters('storageAccounts_stgtestjy16888diag_name'))]"
        ],
        "tags": {
            "BusinessArea": "Enterprise Architect",
            "BusinessCritical": "False",
            "Environment": "TestJY",
            "OutofHourShutdown": "False",
            "Project": "Terraform JY Test Subcription"
        },
        "properties": {
            "hardwareProfile": {
                "vmSize": "Standard_D3_v2"
            },
            "storageProfile": {
                "imageReference": {
                    "publisher": "MicrosoftWindowsServer",
                    "offer": "WindowsServer",
                    "sku": "2019-Datacenter",
                    "version": "latest"
                },
                "osDisk": {
                    "osType": "Windows",
                    "name": "[concat(parameters('virtualMachines_WEB01_name'), '_OsDisk_1_ef654b864da24fdd834ada03bdcd8d69')]",
                    "createOption": "FromImage",
                    "caching": "ReadWrite",
                    "writeAcceleratorEnabled": false,
                    "managedDisk": {
                        "id": "[resourceId('Microsoft.Compute/disks', concat(parameters('virtualMachines_WEB01_name'), '_OsDisk_1_ef654b864da24fdd834ada03bdcd8d69'))]"
                    },
                    "deleteOption": "Detach"
                },
                "dataDisks": []
            },
            "osProfile": {
                "computerName": "[parameters('virtualMachines_WEB01_name')]",
                "adminUsername": "adminuser",
                "windowsConfiguration": {
                    "provisionVMAgent": true,
                    "enableAutomaticUpdates": true,
                    "patchSettings": {
                        "patchMode": "AutomaticByOS",
                        "assessmentMode": "ImageDefault",
                        "enableHotpatching": false
                    },
                    "winRM": {
                        "listeners": []
                    },
                    "enableVMAgentPlatformUpdates": false
                },
                "secrets": [],
                "allowExtensionOperations": true,
                "requireGuestProvisionSignal": true
            },
            "networkProfile": {
                "networkInterfaces": [
                    {
                        "id": "[resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaces_nic_WEB01_name'))]",
                        "properties": {
                            "primary": true
                        }
                    }
                ]
            },
            "diagnosticsProfile": {
                "bootDiagnostics": {
                    "enabled": true,
                    "storageUri": "[concat('https://', parameters('storageAccounts_stgtestjy16888diag_name'), '.blob.core.windows.net/')]"
                }
            },
            "priority": "Regular",
            "extensionsTimeBudget": "PT1H30M"
        }
    },
    {
        "type": "Microsoft.Compute/virtualMachines/extensions",
        "apiVersion": "2022-08-01",
        "name": "[concat(parameters('virtualMachines_MGMT01_name'), '/InitialBuild')]",
        "location": "northeurope",
        "dependsOn": [
            "[resourceId('Microsoft.Compute/virtualMachines', parameters('virtualMachines_MGMT01_name'))]",
            "[resourceId('Microsoft.Storage/StorageAccounts', parameters('storageAccounts_stgtestjy16888guest_name'))]"
        ],
        "properties": {
            "autoUpgradeMinorVersion": false,
            "publisher": "Microsoft.Compute",
            "type": "CustomScriptExtension",
            "typeHandlerVersion": "1.10",
            "settings": {
                "commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -file MGMT01.ps1",
                "fileUris": [
                    "[concat('https://', parameters('storageAccounts_stgtestjy16888guest_name'), '.blob.core.windows.net/scripts/MGMT01.ps1')]"
                ]
            },
            "protectedSettings": {}
        }
    },
    {
        "type": "Microsoft.Compute/virtualMachines/extensions",
        "apiVersion": "2022-08-01",
        "name": "[concat(parameters('virtualMachines_SQL01_name'), '/InitialBuild')]",
        "location": "northeurope",
        "dependsOn": [
            "[resourceId('Microsoft.Compute/virtualMachines', parameters('virtualMachines_SQL01_name'))]",
            "[resourceId('Microsoft.Storage/StorageAccounts', parameters('storageAccounts_stgtestjy16888guest_name'))]"
        ],
        "properties": {
            "autoUpgradeMinorVersion": false,
            "publisher": "Microsoft.Compute",
            "type": "CustomScriptExtension",
            "typeHandlerVersion": "1.10",
            "settings": {
                "commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -file SQL01.ps1",
                "fileUris": [
                    "[concat('https://', parameters('storageAccounts_stgtestjy16888guest_name'), '.blob.core.windows.net/scripts/SQL01.ps1')]"
                ]
            },
            "protectedSettings": {}
        }
    },
    {
        "type": "Microsoft.Compute/virtualMachines/extensions",
        "apiVersion": "2022-08-01",
        "name": "[concat(parameters('virtualMachines_WEB01_name'), '/InitialBuild')]",
        "location": "northeurope",
        "dependsOn": [
            "[resourceId('Microsoft.Compute/virtualMachines', parameters('virtualMachines_WEB01_name'))]",
            "[resourceId('Microsoft.Storage/StorageAccounts', parameters('storageAccounts_stgtestjy16888guest_name'))]"
        ],
        "properties": {
            "autoUpgradeMinorVersion": false,
            "publisher": "Microsoft.Compute",
            "type": "CustomScriptExtension",
            "typeHandlerVersion": "1.10",
            "settings": {
                "commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -file WEB01.ps1",
                "fileUris": [
                    "[concat('https://', parameters('storageAccounts_stgtestjy16888guest_name'), '.blob.core.windows.net/scripts/WEB01.ps1')]"
                ]
            },
            "protectedSettings": {}
        }
    },
    {
        "type": "Microsoft.Network/virtualNetworks/subnets",
        "apiVersion": "2022-05-01",
        "name": "[concat(parameters('virtualNetworks_vnet_testjy_name'), '/database')]",
        "dependsOn": [
            "[resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworks_vnet_testjy_name'))]",
            "[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_database_name'))]"
        ],
        "properties": {
            "addressPrefix": "10.4.2.0/24",
            "networkSecurityGroup": {
                "id": "[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_database_name'))]"
            },
            "serviceEndpoints": [],
            "delegations": [],
            "privateEndpointNetworkPolicies": "Enabled",
            "privateLinkServiceNetworkPolicies": "Enabled"
        }
    },
    {
        "type": "Microsoft.Network/virtualNetworks/subnets",
        "apiVersion": "2022-05-01",
        "name": "[concat(parameters('virtualNetworks_vnet_testjy_name'), '/management')]",
        "dependsOn": [
            "[resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworks_vnet_testjy_name'))]",
            "[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_management_name'))]"
        ],
        "properties": {
            "addressPrefix": "10.4.3.0/24",
            "networkSecurityGroup": {
                "id": "[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_management_name'))]"
            },
            "serviceEndpoints": [],
            "delegations": [],
            "privateEndpointNetworkPolicies": "Enabled",
            "privateLinkServiceNetworkPolicies": "Enabled"
        }
    },
    {
        "type": "Microsoft.Network/virtualNetworks/subnets",
        "apiVersion": "2022-05-01",
        "name": "[concat(parameters('virtualNetworks_vnet_testjy_name'), '/web')]",
        "dependsOn": [
            "[resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworks_vnet_testjy_name'))]",
            "[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_web_name'))]"
        ],
        "properties": {
            "addressPrefix": "10.4.1.0/24",
            "networkSecurityGroup": {
                "id": "[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_web_name'))]"
            },
            "serviceEndpoints": [],
            "delegations": [],
            "privateEndpointNetworkPolicies": "Enabled",
            "privateLinkServiceNetworkPolicies": "Enabled"
        }
    },

Additional context
Add any other context about the problem here.

Viewer doesn't refresh if ARM file isn't focused

Issue Type: Bug

If I'm using something like farmer to generate an ARM file, if ARM viewer is running, it won't refresh unless I change focus to the arm file in vscode.

It should be able to poll the file and refresh on changes regardless of the vscode window state.

Extension version: 0.4.4
VS Code version: Code - Insiders 1.49.0-insider (8e872f41d4ba7807e58938bbf861ca6a22d534aa, 2020-08-20T05:37:43.249Z)
OS version: Windows_NT x64 10.0.19041

System Info
Item Value
CPUs Intel(R) Core(TM) i5-1035G7 CPU @ 1.20GHz (8 x 1498)
GPU Status 2d_canvas: enabled
flash_3d: enabled
flash_stage3d: enabled
flash_stage3d_baseline: enabled
gpu_compositing: enabled
multiple_raster_threads: enabled_on
oop_rasterization: disabled_off
opengl: enabled_on
protected_video_decode: enabled
rasterization: enabled
skia_renderer: disabled_off_ok
video_decode: enabled
vulkan: disabled_off
webgl: enabled
webgl2: enabled
Load (avg) undefined
Memory (System) 7.60GB (1.56GB free)
Process Argv --crash-reporter-id c46712d6-a98d-4728-ab12-732cb7b0c555
Screen Reader no
VM 0%

Overlapping items when using nested templates

Describe the bug
The diagrams overlap with nested templates
image

To Reproduce

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
  },
  "functions": [
  ],
  "variables": {
  },
  "resources": [
    {
      "name": "RootCA",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2019-10-01",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "compute/VM-2019Core.arm.json",
          "contentVersion": "1.0.0.0"
        },
        "parameterLink": {
          "uri": "RootCA.parameters.json",
          "contentVersion": "1.0.0.0"
        }
      }
    },
    {
      "name": "SubCA01",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2019-10-01",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "compute/VM-2019Core.arm.json",
          "contentVersion": "1.0.0.0"
        },
        "parameterLink": {
          "uri": "SubCA01.parameters.json",
          "contentVersion": "1.0.0.0"
        }
      }
    },
    {
      "name": "SubCA02",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2019-10-01",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "compute/VM-2019Core.arm.json",
          "contentVersion": "1.0.0.0"
        },
        "parameterLink": {
          "uri": "SubCA02.parameters.json",
          "contentVersion": "1.0.0.0"
        }
      }
    }
  ],
  "outputs": {
  }
}

Support for linked templates

Investigate how to handle linked templates.
This is a LOT of work, but many people have requested it

Challenges are numerous:

  • How to display/render the nested templates? Using Cytoscape groups?
  • Recursively calling ARMParser has never been done
  • The value of templateLink.uri in vast majority of cases will be dynamic, involve parameters or SAS tokens. I short - we can't use it
  • Discovery of the linked templates from within the local filesystem remains the only choice. But where do we look?
    • How do we "look"? what does the VSCode API allow?
    • Same folder as template being show?
    • Parent folder? Sub-folders? How far do we search?
    • As the json filename is the only reliable key we'll have, what happens with multiple files with same name in different folders? [Suggestion: discount this as an edge case]

Display name with whitespace are not encoded

Describe the bug
If you use the tag displayname (like described in #2 ) and your value has whitespaces like this SQL server the result is not encoded and looks like: SQL%20server.

To Reproduce

snippet to reproduce:

  {
            "type": "Microsoft.Sql/servers/databases/transparentDataEncryption",
            "tags": {
                "displayname": "SQL Database Transparent Data Encryption"
            },
            "apiVersion": "2014-04-01",
            "name": "[concat(variables('servers_DbServer_name'), '/', variables('DbName'), '/current')]",
            "location": "[resourceGroup().location]",
            "dependsOn": [
                "[resourceId('Microsoft.Sql/servers/databases', variables('servers_DbServer_name'), variables('DbName'))]"
            ],
            "properties": {
                "status": "Enabled"
            }
        },

The graph looks like:

image

Resolving variable names

Is your feature request related to a problem? Please describe.
Resolving names based on variables. It's not as much of a problem, more a nice to have feature.

Describe the solution you'd like
I would like to see that my variables, when labels are shown or in general, will be resolved from the current format(variables('longName'), 'kv', '001') to kv-namingconvention-001, as demonstrated below:

"parameters": {
    "NamingConvention": {
        "type": "string",
        "defaultValue": "{0}-namingconvention-{1}",
    }
}

"variables": {
    "longName": "[parameters('NamingConvention')]",
    "storageAccount": "[replace(tolower(format(variables('longName'), 'st', '001')), '-', '')]",
    "keyVaultName": "[format(variables('longName'), 'kv', '001')]"
}

Resolved names:
stnamingconvention001
kv-namingconvention-001

Please do let me know if a better description is needed!

Better Support for Evaluating Variables

Is your feature request related to a problem? Please describe.
The extension currently supports parameter files which is useful. We have a lot of situations where we use variables to generate resource names based on a naming convention. The extension seems to support variables derived with โ€˜concatโ€™ bit not with โ€˜replaceโ€™ or โ€˜takeโ€™.

This affects not just the labels, but the dependencies as well.

Describe the solution you'd like
Replicate the logic of the Azure ARM processor and support full variable derivation.

Describe alternatives you've considered
Our current workaround is to manually supply all the resource names in the parameters file. This is fine for smaller projects, but for larger projects with 10s of resources (or more) is a lot of manual work and we prefer to automatically generate (or change) resource names based on naming convention.

Additional context
Here is an example of one that is working fine in our scenario:
arm-viewer1

Here is an example of one that is not working:
arm-viewer2

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.