Skip to content

Commit 06302d2

Browse files
committed
Ability to resolve expression with properties
1 parent 126dd7b commit 06302d2

File tree

2 files changed

+82
-19
lines changed

2 files changed

+82
-19
lines changed

src/app/main/ArmTemplate.spec.js

Lines changed: 71 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,88 @@
33
/// <reference path="ArmTemplate.ts" />
44
/// <reference path="Resource.ts" />
55

6-
describe('ArmTemplate', function(){
7-
it("Should handle resources without depencies", function() {
6+
describe('ArmTemplate', function () {
7+
it("Should handle resources without depencies", function () {
88
var at = new ArmViz.ArmTemplate({});
99
var deps = at.getDependencies(new ArmViz.Resource());
1010

1111
expect(deps).toEqual([]);
1212
});
1313

1414
it('should process concat expression', function () {
15-
var ep = new ArmViz.ExpressionParser();
16-
var exp = ep.parse("[concat('Microsoft.Network/networkInterfaces/', parameters('nicNamePrefix'))]");
15+
var ep = new ArmViz.ExpressionParser();
16+
var exp = ep.parse("[concat('Microsoft.Network/networkInterfaces/', parameters('nicNamePrefix'))]");
1717

18-
var at = new ArmViz.ArmTemplate({});
19-
var dependsOn = at.resolveDependsOnId(exp);
20-
expect(dependsOn.type).toEqual("Microsoft.Network/networkInterfaces");
21-
expect(dependsOn.name).toEqual("nicNamePrefix")
18+
var at = new ArmViz.ArmTemplate({});
19+
var dependsOn = at.resolveDependsOnId(exp);
20+
expect(dependsOn.type).toEqual("Microsoft.Network/networkInterfaces");
21+
expect(dependsOn.name).toEqual("nicNamePrefix")
2222
});
2323

2424
it('should process nested parameters in concat', function () {
25-
var ep = new ArmViz.ExpressionParser();
26-
var exp = ep.parse("resourceId('Microsoft.Web/sites', concat(parameters('endpointName'), 'gateway'))");
25+
var ep = new ArmViz.ExpressionParser();
26+
var exp = ep.parse("resourceId('Microsoft.Web/sites', concat(parameters('endpointName'), 'gateway'))");
27+
28+
var at = new ArmViz.ArmTemplate({});
29+
var dependsOn = at.resolveDependsOnId(exp);
30+
expect(dependsOn.type).toEqual("Microsoft.Web/sites");
31+
expect(dependsOn.name).toEqual("endpointNamegateway");
32+
});
33+
34+
it('should resolve name with variables expression with properties', function () {
35+
var source = "[variables('nic').prefix.name]";
36+
var templateData = {
37+
variables: {
38+
nic: {
39+
prefix: {
40+
name: 'nicName'
41+
}
42+
}
43+
}
44+
};
45+
46+
var at = new ArmViz.ArmTemplate(templateData);
47+
var name = at.resolveName(source);
48+
49+
expect(name).toEqual('nicName');
50+
});
51+
52+
it('should resolve dependencies with concat expression with properties', function () {
53+
var source = "[concat('Microsoft.Compute/virtualMachines/', variables('vm').name)]";
54+
var templateData = {
55+
variables: {
56+
vm: {
57+
name: 'vmName'
58+
}
59+
}
60+
}
61+
62+
var at = new ArmViz.ArmTemplate(templateData);
63+
var ep = new ArmViz.ExpressionParser();
64+
var exp = ep.parse(source);
65+
var dependsOn = at.resolveDependsOnId(exp);
66+
67+
expect(dependsOn.type).toEqual("Microsoft.Compute/virtualMachines");
68+
expect(dependsOn.name).toEqual('vmName');
69+
});
70+
71+
it('should multi-nested dependency in concat with properties', function () {
72+
var source = "resourceId('Microsoft.Web/sites', concat(variables('endpoint').name, 'Gateway'))";
73+
var templateData = {
74+
parameters: { },
75+
variables: {
76+
endpoint: {
77+
name: "[concat(parameters(endpointPrefix), concat('-', endpointName))]"
78+
}
79+
}
80+
};
81+
82+
var at = new ArmViz.ArmTemplate(templateData);
83+
var ep = new ArmViz.ExpressionParser();
84+
var exp = ep.parse(source);
85+
var dependsOn = at.resolveDependsOnId(exp);
2786

28-
var at = new ArmViz.ArmTemplate({});
29-
var dependsOn = at.resolveDependsOnId(exp);
30-
expect(dependsOn.type).toEqual("Microsoft.Web/sites");
31-
expect(dependsOn.name).toEqual("endpointNamegateway");
87+
expect(dependsOn.type).toEqual("Microsoft.Web/sites");
88+
expect(dependsOn.name).toEqual("endpointPrefix-endpointNameGateway");
3289
});
3390
});

src/app/main/ArmTemplate.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,20 @@ module ArmViz {
123123
}
124124
}
125125
} else if (expression.operator === 'variables') {
126-
if (expression.operands.length <= 0) {
126+
if (expression.operands.length === 0) {
127127
console.error("no variable name specified");
128128
}
129-
// return value of requested variable, should probably make sure it exists
130-
let templateVar = this.templateData.variables[<string>expression.operands[0]];
131-
if (templateVar && !(templateVar instanceof Array)) { //TODO: need ot handle varible that's an array
129+
if (expression.operands.length > 1) {
130+
console.error("too many variable names specified");
131+
}
132+
133+
let templateVar: Object = this.templateData.variables[<string>expression.operands[0]];
134+
if (templateVar) {
135+
for (let property of expression.properties) {
136+
templateVar = templateVar[property];
137+
}
132138
let ep = new ExpressionParser();
133-
let exp = ep.parse(this.templateData.variables[<string>expression.operands[0]]);
139+
let exp = ep.parse(<string>templateVar);
134140
ret += this.resolveExpression(exp);
135141
}
136142
} else if (expression.operator === 'parameters') {

0 commit comments

Comments
 (0)