Azure / Azure/bicep

bicep crash trying to implement output feature in DesiredStateConfiguration

Open
#17,670 0 comments 0 reactions 0 assignees View on GitHub
DSC V3
Dominant language
Bicep
Stars
3.6k
Forks
830
Avg merge
1d 21m
Merged PRs (30d)
79

Description

**Bicep version**
```console
Bicep CLI version 0.36.177 (09988bb4ae)
```

**Describe the bug**
Stack trace indicates a problem trying to create the resourceId for DSC

**To Reproduce**
```bicep
// This is a very simple example Bicep file for testing

targetScope = 'desiredStateConfiguration'

// use workaround where Bicep currently requires version in date format
resource echo 'Microsoft.DSC.Debug/Echo@2025-01-01' = {
name: 'exampleEcho'
properties: {
output: 'Hello, world!'
}
}

output exampleOutput string = echo.properties.output
```

**Additional context**
```console
WARNING: The following experimental Bicep features have been enabled: Enable defining Desired State Configuration documents. Experimental features should be enabled for testing purposes only, as there are no guarantees about the quality or stability of these features. Do not enable these settings for any production usage, or your production environment may be subject to breaking.
/Users/steve/repos/DSC/dsc/examples/hello_world.dsc.bicep(6,15) : Warning BCP081: Resource type "Microsoft.DSC.Debug/Echo@2025-01-01" does not have types available. Bicep is unable to validate resource properties prior to deployment, but this will not block the resource from being deployed. [https://aka.ms/bicep/core-diagnostics#BCP081]
Unhandled exception. System.InvalidOperationException: Cannot format resourceId for scope DesiredStateConfiguration
at Bicep.Core.Emit.ScopeHelper.FormatFullyQualifiedResourceId(EmitterContext context, ExpressionConverter converter, ScopeData scopeData, String fullyQualifiedType, IEnumerable`1 nameSegments)
at Bicep.Core.Emit.ExpressionConverter.GetFullyQualifiedResourceId(ResourceMetadata resource)
at Bicep.Core.Emit.ExpressionConverter.GetReferenceExpression(ResourceMetadata resource, IndexReplacementContext indexContext, Boolean full)
at Bicep.Core.Emit.ExpressionConverter.ConvertResourcePropertyAccess(ResourceReferenceExpression reference, PropertyAccessExpression expression)
at Bicep.Core.Emit.ExpressionConverter.ConvertPropertyAccessExpression(PropertyAccessExpression exp)
at Bicep.Core.Emit.ExpressionConverter.ConvertExpression(Expression expression)
at Bicep.Core.Emit.ExpressionConverter.ConvertAccessExpression(AccessExpression expression)
at Bicep.Core.Emit.ExpressionConverter.ConvertPropertyAccessExpression(PropertyAccessExpression exp)
at Bicep.Core.Emit.ExpressionConverter.ConvertExpression(Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.EmitLanguageExpression(Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.EmitExpression(Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.<>c__DisplayClass24_0.b__0()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WritePropertyWithPosition(IPositionable keyPosition, String name, Action valueFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitPropertyInternal(LanguageExpression expressionKey, Action valueFunc, IPositionable location, Boolean skipCopyCheck)
at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(Expression name, Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(String name, Expression expression)
at Bicep.Core.Emit.TemplateWriter.<>c__DisplayClass79_0.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.ExpressionEmitter.<>c__DisplayClass34_0.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.EmitOutput(ExpressionEmitter emitter, DeclaredOutputExpression output)
at Bicep.Core.Emit.TemplateWriter.<>c__DisplayClass78_0.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.ExpressionEmitter.<>c__DisplayClass34_0.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.EmitOutputsIfPresent(ExpressionEmitter emitter, ImmutableArray`1 outputs)
at Bicep.Core.Emit.TemplateWriter.GenerateTemplateWithoutHash(PositionTrackingJsonTextWriter jsonWriter)
at Bicep.Core.Emit.TemplateWriter.Write(SourceAwareJsonTextWriter writer)
at Bicep.Core.Emit.TemplateEmitter.<>c__DisplayClass8_0.b__0()
at Bicep.Core.Emit.TemplateEmitter.EmitOrFail(Func`1 write)
at Bicep.Core.Emit.TemplateEmitter.Emit(TextWriter textWriter)
at Bicep.Core.Emit.CompilationEmitter.Template(SemanticModel model)
at Bicep.Core.Emit.CompilationEmitter.Template()
at Bicep.Cli.Services.OutputWriter.TemplateToStdout(Compilation compilation)
at Bicep.Cli.Commands.BuildCommand.Compile(Uri inputUri, Uri outputUri, Boolean noRestore, Nullable`1 diagnosticsFormat, Boolean outputToStdOut)
at Bicep.Cli.Commands.BuildCommand.RunAsync(BuildArguments args)
at Bicep.Cli.Program.RunAsync(String[] args, CancellationToken cancellationToken)
at Bicep.Cli.Program.<>c__DisplayClass3_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Bicep.Cli.Program.RunWithCancellationAsync(Func`2 runFunc)
at Bicep.Cli.Program.Main(String[] args)
at Bicep.Cli.Program.(String[] args)
```

Contributor guide

Open the contributing guide

Research direction

Start at ScopeHelper.FormatFullyQualifiedResourceId and ExpressionConverter.GetFullyQualifiedResourceId, which appear in the reported stack trace during output property access. Reproduce the crash with the DesiredStateConfiguration Bicep example, then add a regression test covering echo.properties.output and verify compilation completes without the InvalidOperationException.

Written by the indexing model from the issue text.

Assessment

Tech stack
azure
Domain
compilers
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.