Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Instance functions on resource typed params and outputs crash the build and are not proposed as completions #10994

Closed
jeskew opened this issue Jun 16, 2023 Discussed in #10992 · 3 comments · Fixed by #11031
Assignees
Labels
bug Something isn't working
Milestone

Comments

@jeskew
Copy link
Contributor

jeskew commented Jun 16, 2023

Discussed in #10992

Originally posted by jikuja June 16, 2023
I just used resourceTypedParamsAndOutputs experimental feature to simplify our PoC template. Here is the diff of the relevant changes: jikuja/azure-data-factory-runtime-aci@security-1...jikuja:azure-data-factory-runtime-aci:bicep-resource-param-outputs

The only issue I encountered is the fact that secureValue: ir.listAuthKeys().authKey1 is valid code according to intellisense but bicep build will crash. Changing that code to listAuthKeys(ir.id, ir.apiVersion).authKey1 solved the issue.

Feelings: This is a cool feature addition for Bicep. Passing resources instead of resource id and usage of existing key word is too verbose.


Alternative approach: jikuja/azure-data-factory-runtime-aci@security-1...jikuja:azure-data-factory-runtime-aci:id-plust-list-functions

  • Does not require experimental features
  • On our use case requires passing more parameters into module

Feelings: Usage pattern documentation of list*() methods without resource accessor is really limited. I should have noticed this approach earlier.

@brwilkinson
Copy link
Collaborator

Adding visual example/repro ...

  • only properties are available on resourceTypedParams

Example1 - resourceTypedParamsAndOutputs - No Function?

param ir resource 'Microsoft.DataFactory/factories/integrationRuntimes@2018-06-01'
output authkeys object = ir.

image

Example2 - existing - Function

resource irexisting 'Microsoft.DataFactory/factories/integrationRuntimes@2018-06-01' existing = {
  name: ir.name
}
output authkeysexisting object = irexisting.

image

@jikuja
Copy link

jikuja commented Jun 17, 2023

Other screenshot for example 1. After writing list*() manually intellisense displays correct types
image


The crash with jikuja/azure-data-factory-runtime-aci@5d6b68a

                                                                                                                                                                                                           azure-data-factory-runtime-aci  bicep --version
Bicep CLI version 0.18.4 (1620479ac6)
                                                                                                                                                                                                         azure-data-factory-runtime-aci  bicep build ./deploy/main.bicep
WARNING: Resource-typed parameters and outputs in ARM are experimental, and should be enabled for testing purposes only. Do not enable this setting for any production usage, or you may be unexpectedly broken at any time!
Unhandled exception. System.InvalidOperationException: Unrecognized base expression Parameter
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertFunctionDirect(FunctionCallSyntaxBase functionCall)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertFunction(FunctionCallSyntaxBase functionCall)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertWithoutLowering(SyntaxBase syntax)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertPropertyAccess(PropertyAccessSyntax propertyAccess)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertWithoutLowering(SyntaxBase syntax)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertObjectProperty(ObjectPropertySyntax syntax)
   at System.Linq.Enumerable.SelectEnumerableIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.CreateRange[T](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.ToImmutableArray[TSource](IEnumerable`1)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertObject(ObjectSyntax object)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertWithoutLowering(SyntaxBase syntax)
   at Bicep.Core.Intermediate.ExpressionBuilder.<ConvertWithoutLowering>b__10_0(ArrayItemSyntax x)
   at System.Linq.Enumerable.SelectEnumerableIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.CreateRange[T](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.ToImmutableArray[TSource](IEnumerable`1)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertWithoutLowering(SyntaxBase syntax)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertObjectProperty(ObjectPropertySyntax syntax)
   at System.Linq.Enumerable.SelectEnumerableIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.CreateRange[T](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.ToImmutableArray[TSource](IEnumerable`1)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertObject(ObjectSyntax object)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertWithoutLowering(SyntaxBase syntax)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertObjectProperty(ObjectPropertySyntax syntax)
   at System.Linq.Enumerable.SelectEnumerableIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.CreateRange[T](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.ToImmutableArray[TSource](IEnumerable`1)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertObject(ObjectSyntax object)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertWithoutLowering(SyntaxBase syntax)
   at Bicep.Core.Intermediate.ExpressionBuilder.<ConvertWithoutLowering>b__10_0(ArrayItemSyntax x)
   at System.Linq.Enumerable.SelectEnumerableIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.CreateRange[T](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.ToImmutableArray[TSource](IEnumerable`1)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertWithoutLowering(SyntaxBase syntax)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertVariableAccess(VariableAccessSyntax variableAccessSyntax)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertWithoutLowering(SyntaxBase syntax)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertObjectProperty(ObjectPropertySyntax syntax)
   at System.Linq.Enumerable.SelectEnumerableIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.CreateRange[T](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.ToImmutableArray[TSource](IEnumerable`1)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertObject(ObjectSyntax object)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertWithoutLowering(SyntaxBase syntax)
   at Bicep.Core.Intermediate.ExpressionBuilder.<ConvertFunctionDirect>b__19_0(FunctionArgumentSyntax a)
   at System.Linq.Enumerable.SelectArrayIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.CreateRange[T](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.ToImmutableArray[TSource](IEnumerable`1)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertFunctionDirect(FunctionCallSyntaxBase functionCall)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertFunction(FunctionCallSyntaxBase functionCall)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertWithoutLowering(SyntaxBase syntax)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertObjectProperty(ObjectPropertySyntax syntax)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.CreateRange[T](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.ToImmutableArray[TSource](IEnumerable`1)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertResource(ResourceDeclarationSyntax syntax)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertWithoutLowering(SyntaxBase syntax)
   at Bicep.Core.Intermediate.ExpressionBuilder.<ConvertProgram>b__13_7(DeclaredResourceMetadata x)
   at System.Linq.Enumerable.SelectArrayIterator`2.MoveNext()
   at System.Linq.Enumerable.OfTypeIterator[TResult](IEnumerable)+MoveNext()
   at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1)
   at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.CreateRange[T](IEnumerable`1)
   at System.Collections.Immutable.ImmutableArray.ToImmutableArray[TSource](IEnumerable`1)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertProgram(ProgramSyntax syntax)
   at Bicep.Core.Intermediate.ExpressionBuilder.ConvertWithoutLowering(SyntaxBase syntax)
   at Bicep.Core.Intermediate.ExpressionBuilder.Convert(SyntaxBase syntax)
   at Bicep.Core.Emit.TemplateWriter.GenerateTemplateWithoutHash(PositionTrackingJsonTextWriter jsonWriter)
   at Bicep.Core.Emit.TemplateWriter.Write(SourceAwareJsonTextWriter writer)
   at Bicep.Core.Emit.TemplateWriter.<>c__DisplayClass51_0.<EmitModule>b__2()
   at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WriteObjectWithPosition(IPositionable sourcePosition, Action propertiesFunc)
   at Bicep.Core.Emit.ExpressionEmitter.EmitObject(Action writePropertiesFunc, IPositionable position)
   at Bicep.Core.Emit.ExpressionEmitter.<>c__DisplayClass32_0.<EmitObjectProperty>b__0()
   at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WritePropertyWithPosition(IPositionable keyPosition, String name, Action valueFunc)
   at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(String propertyName, Action writeValueFunc, IPositionable position)
   at Bicep.Core.Emit.ExpressionEmitter.EmitObjectProperty(String propertyName, Action writePropertiesFunc, IPositionable position)
   at Bicep.Core.Emit.TemplateWriter.<>c__DisplayClass51_0.<EmitModule>b__0()
   at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WriteObjectWithPosition(IPositionable sourcePosition, Action propertiesFunc)
   at Bicep.Core.Emit.ExpressionEmitter.EmitObject(Action writePropertiesFunc, IPositionable position)
   at Bicep.Core.Emit.TemplateWriter.EmitModule(PositionTrackingJsonTextWriter jsonWriter, DeclaredModuleExpression module, ExpressionEmitter emitter)
   at Bicep.Core.Emit.TemplateWriter.<>c__DisplayClass48_0.<EmitResources>b__0()
   at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WriteArrayWithPosition(IPositionable sourcePosition, Action itemsFunc)
   at Bicep.Core.Emit.ExpressionEmitter.EmitArray(Action writeItemsFunc, IPositionable position)
   at Bicep.Core.Emit.ExpressionEmitter.<>c__DisplayClass33_0.<EmitArrayProperty>b__0()
   at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WritePropertyWithPosition(IPositionable keyPosition, String name, Action valueFunc)
   at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(String propertyName, Action writeValueFunc, IPositionable position)
   at Bicep.Core.Emit.ExpressionEmitter.EmitArrayProperty(String propertyName, Action writeItemsFunc, IPositionable position)
   at Bicep.Core.Emit.TemplateWriter.EmitResources(PositionTrackingJsonTextWriter jsonWriter, ExpressionEmitter emitter, ImmutableArray`1 resources, ImmutableArray`1 modules)
   at Bicep.Core.Emit.TemplateWriter.GenerateTemplateWithoutHash(PositionTrackingJsonTextWriter jsonWriter)
   at Bicep.Core.Emit.TemplateWriter.Write(SourceAwareJsonTextWriter writer)
   at Bicep.Core.Emit.TemplateEmitter.<>c__DisplayClass8_0.<Emit>b__0()
   at Bicep.Core.Emit.TemplateEmitter.EmitOrFail(Func`1 write)
   at Bicep.Core.Emit.TemplateEmitter.Emit(TextWriter textWriter)
   at Bicep.Core.Emit.TemplateEmitter.Emit(Stream stream)
   at Bicep.Cli.Services.CompilationWriter.ToStream(SemanticModel model, Stream stream)
   at Bicep.Cli.Services.CompilationWriter.ToFile(SemanticModel model, String outputPath)
   at Bicep.Cli.Services.CompilationWriter.ToFile(Compilation compilation, String outputPath)
   at Bicep.Cli.Commands.BuildCommand.RunAsync(BuildArguments args)
   at Bicep.Cli.Program.RunAsync(String[] args)
   at Bicep.Cli.Program.Main(String[] args)
   at Bicep.Cli.Program.<Main>(String[] args)

@jeskew jeskew added the bug Something isn't working label Jun 20, 2023
@jeskew jeskew self-assigned this Jun 20, 2023
@stephaniezyen stephaniezyen added this to the v0.19 milestone Jun 21, 2023
jeskew added a commit that referenced this issue Jun 23, 2023
Resolves #10994 

Although instance functions on resource-typed outputs and parameters
currently raise no diagnostics, they are not proposed as completions and
lead to an unhandled exception when the syntax is converted to the Bicep
IR.

This PR fixes up resource-typed params and outputs instance function
support with three changes:
* The IR conversion for `InstanceFunctionCallSyntax` is updated to
support all resources, not just those of type
`DeclaredResourceMetadata`.
* A check is added to `EmitLimitationCalculator` to raise an error
diagnostic when an instance function is called on a resource-typed
module output, as `list*(reference(...).outputs. ...)` is blocked by
ARM's dependency graph processor. (The `getSecret()` function doesn't
result in nested runtime functions and so is permitted.)
* The language server completion provider is updated to suggest known
resource functions on resource-typed params and outputs.

###### Microsoft Reviewers: [Open in
CodeFlow](https://portal.fabricbot.ms/api/codeflow?pullrequest=https://github.com/Azure/bicep/pull/11031)
@jikuja
Copy link

jikuja commented Jun 23, 2023

Tested building PoC: https://github.com/jikuja/azure-data-factory-runtime-aci/tree/archive-resourceTypedParamsAndOutputs-1

 azure-data-factory-runtime-aci  b/bicep build deploy/main.bicep
WARNING: Resource-typed parameters and outputs in ARM are experimental, and should be enabled for testing purposes only. Do not enable this setting for any production usage, or you may be unexpectedly broken at any time!
 azure-data-factory-runtime-aci  b/bicep --version
Bicep CLI version 0.18.62 (f8da7da55a)

All 🆗

Also deployed build results to Azure as extra testing. TYVM

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
Archived in project
Development

Successfully merging a pull request may close this issue.

4 participants