Azure / Azure/bicep

Requesting a change in dependsOn expression

Open
#7,573 2 comments 0 reactions 0 assignees View on GitHub
story: decompiler
Dominant language
Bicep
Stars
3.6k
Forks
830
Avg merge
1d 21m
Merged PRs (30d)
79

Description

**Bicep version**
Bicep CLI version 0.8.9 (33a85174de)

**Describe the bug**
I found an issue while decompiling an ARM Template (PlExample01_Original.json) using below command. I found that reference to PlExample02 is not taken care.

```bicep decompile PlExample01_Original.json --outfile PlExample01.bicep --force```

**The error message**
```PlExample01.bicep(52,5) : Error BCP034: The enclosing array expected an item of type "module[] | (resource | module) | resource[]", but the provided item was of type "string".```

**To Reproduce**
```bicep decompile PlExample01_Original.json --outfile PlExample01.bicep --force```

**Manual correction**
I explicitly mentioned the dependsOn field to a resource in bicep file (PlExample01_corrected.bicep). After correction build action produced the dependsOn property as shown below, expression result in valid value but long expression with unnecessary split functions.

```json
"dependsOn": [
"[resourceId('Microsoft.DataFactory/factories/pipelines', split(format('{0}/PlExample02', parameters('factoryName')), '/')[0], split(format('{0}/PlExample02', parameters('factoryName')), '/')[1])]"
]
```

**PlExample01_Original.json**
```json
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"factoryName": {
"type": "string",
"metadata": "Data Factory name"
}
},
"variables": {
"factoryId": "[concat('Microsoft.DataFactory/factories/', parameters('factoryName'))]"
},
"resources": [
{
"name": "[concat(parameters('factoryName'), '/PlExample01')]",
"type": "Microsoft.DataFactory/factories/pipelines",
"apiVersion": "2018-06-01",
"properties": {
"activities": [
{
"name": "Wait1",
"type": "Wait",
"dependsOn": [],
"userProperties": [],
"typeProperties": {
"waitTimeInSeconds": {
"value": "@pipeline().parameters.TimeToWait",
"type": "Expression"
}
}
},
{
"name": "Execute Pipeline1",
"type": "ExecutePipeline",
"dependsOn": [
{
"activity": "Wait1",
"dependencyConditions": [
"Succeeded"
]
}
],
"userProperties": [],
"typeProperties": {
"pipeline": {
"referenceName": "PlExample02",
"type": "PipelineReference"
},
"waitOnCompletion": true
}
}
],
"parameters": {
"TimeToWait": {
"type": "Int",
"defaultValue": 5
}
},
"annotations": [],
"lastPublishTime": "2022-07-14T12:46:14Z"
},
"dependsOn": [
"[concat(variables('factoryId'), '/pipelines/PlExample02')]"
]
},
{
"name": "[concat(parameters('factoryName'), '/PlExample02')]",
"type": "Microsoft.DataFactory/factories/pipelines",
"apiVersion": "2018-06-01",
"properties": {
"activities": [
{
"name": "Wait1",
"type": "Wait",
"dependsOn": [],
"userProperties": [],
"typeProperties": {
"waitTimeInSeconds": 1
}
}
],
"annotations": []
},
"dependsOn": []
}
]
}
```

**PlExample01.bicep**
```bicep
param factoryName string

var factoryId = 'Microsoft.DataFactory/factories/${factoryName}'

resource factoryName_PlExample01 'Microsoft.DataFactory/factories/pipelines@2018-06-01' = {
name: '${factoryName}/PlExample01'
properties: {
activities: [
{
name: 'Wait1'
type: 'Wait'
dependsOn: []
userProperties: []
typeProperties: {
waitTimeInSeconds: {
value: '@pipeline().parameters.TimeToWait'
type: 'Expression'
}
}
}
{
name: 'Execute Pipeline1'
type: 'ExecutePipeline'
dependsOn: [
{
activity: 'Wait1'
dependencyConditions: [
'Succeeded'
]
}
]
userProperties: []
typeProperties: {
pipeline: {
referenceName: 'PlExample02'
type: 'PipelineReference'
}
waitOnCompletion: true
}
}
]
parameters: {
TimeToWait: {
type: 'Int'
defaultValue: 5
}
}
annotations: []
lastPublishTime: '2022-07-14T12:46:14Z'
}
dependsOn: [
'${factoryId}/pipelines/PlExample02'
]
}

resource factoryName_PlExample02 'Microsoft.DataFactory/factories/pipelines@2018-06-01' = {
name: '${factoryName}/PlExample02'
properties: {
activities: [
{
name: 'Wait1'
type: 'Wait'
dependsOn: []
userProperties: []
typeProperties: {
waitTimeInSeconds: 1
}
}
]
annotations: []
}
dependsOn: []
}
```
**PlExample01_corrected.bicep**
```bicep
param factoryName string

var factoryId = 'Microsoft.DataFactory/factories/${factoryName}'

resource factoryName_PlExample01 'Microsoft.DataFactory/factories/pipelines@2018-06-01' = {
name: '${factoryName}/PlExample01'
properties: {
activities: [
{
name: 'Wait1'
type: 'Wait'
dependsOn: []
userProperties: []
typeProperties: {
waitTimeInSeconds: {
value: '@pipeline().parameters.TimeToWait'
type: 'Expression'
}
}
}
{
name: 'Execute Pipeline1'
type: 'ExecutePipeline'
dependsOn: [
{
activity: 'Wait1'
dependencyConditions: [
'Succeeded'
]
}
]
userProperties: []
typeProperties: {
pipeline: {
referenceName: 'PlExample02'
type: 'PipelineReference'
}
waitOnCompletion: true
}
}
]
parameters: {
TimeToWait: {
type: 'Int'
defaultValue: 5
}
}
annotations: []
lastPublishTime: '2022-07-14T12:46:14Z'
}
dependsOn: [
factoryName_PlExample02
]
}

resource factoryName_PlExample02 'Microsoft.DataFactory/factories/pipelines@2018-06-01' = {
name: '${factoryName}/PlExample02'
properties: {
activities: [
{
name: 'Wait1'
type: 'Wait'
dependsOn: []
userProperties: []
typeProperties: {
waitTimeInSeconds: 1
}
}
]
annotations: []
}
dependsOn: []
}
```

**PlExample01_corrected.json**
```json
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"metadata": {
"_generator": {
"name": "bicep",
"version": "0.8.9.13224",
"templateHash": "5656674683713888465"
}
},
"parameters": {
"factoryName": {
"type": "string"
}
},
"variables": {
"factoryId": "[format('Microsoft.DataFactory/factories/{0}', parameters('factoryName'))]"
},
"resources": [
{
"type": "Microsoft.DataFactory/factories/pipelines",
"apiVersion": "2018-06-01",
"name": "[format('{0}/PlExample01', parameters('factoryName'))]",
"properties": {
"activities": [
{
"name": "Wait1",
"type": "Wait",
"dependsOn": [],
"userProperties": [],
"typeProperties": {
"waitTimeInSeconds": {
"value": "@pipeline().parameters.TimeToWait",
"type": "Expression"
}
}
},
{
"name": "Execute Pipeline1",
"type": "ExecutePipeline",
"dependsOn": [
{
"activity": "Wait1",
"dependencyConditions": [
"Succeeded"
]
}
],
"userProperties": [],
"typeProperties": {
"pipeline": {
"referenceName": "PlExample02",
"type": "PipelineReference"
},
"waitOnCompletion": true
}
}
],
"parameters": {
"TimeToWait": {
"type": "Int",
"defaultValue": 5
}
},
"annotations": [],
"lastPublishTime": "2022-07-14T12:46:14Z"
},
"dependsOn": [
"[resourceId('Microsoft.DataFactory/factories/pipelines', split(format('{0}/PlExample02', parameters('factoryName')), '/')[0], split(format('{0}/PlExample02', parameters('factoryName')), '/')[1])]"
]
},
{
"type": "Microsoft.DataFactory/factories/pipelines",
"apiVersion": "2018-06-01",
"name": "[format('{0}/PlExample02', parameters('factoryName'))]",
"properties": {
"activities": [
{
"name": "Wait1",
"type": "Wait",
"dependsOn": [],
"userProperties": [],
"typeProperties": {
"waitTimeInSeconds": 1
}
}
],
"annotations": []
}
}
]
}
```

Contributor guide

Open the contributing guide

Research direction

Run `bicep decompile PlExample01_Original.json --outfile PlExample01.bicep --force` and compare the result with `PlExample01_corrected.bicep` and `PlExample01_corrected.json`. Trace the Bicep CLI decompilation entry point for the resource-level `dependsOn` value; done means the generated `PlExample01.bicep` preserves the dependency on `PlExample02` and builds without BCP034.

Written by the indexing model from the issue text.

Assessment

Tech stack
azure
Domain
cloud, tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.