Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions cli/azd/internal/cmd/add/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import (
"slices"
"strings"

"dario.cat/mergo"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"
"github.com/azure/azure-dev/cli/azd/cmd/actions"
"github.com/azure/azure-dev/cli/azd/internal"
Expand Down Expand Up @@ -285,11 +284,12 @@ func (a *AddAction) Run(ctx context.Context) (*actions.ActionResult, error) {
SuccessMessage: "azure.yaml updated.",
})

mergedOptions := provisioning.Options{}
mergo.Merge(&mergedOptions, prjConfig.Infra)
mergo.Merge(&mergedOptions, project.DefaultProvisioningOptions)
infraOptions, err := prjConfig.Infra.GetWithDefaults()
if err != nil {
return nil, err
}

infraRoot := mergedOptions.Path
infraRoot := infraOptions.Path
if !filepath.IsAbs(infraRoot) {
infraRoot = filepath.Join(prjConfig.Path, infraRoot)
}
Expand All @@ -302,7 +302,7 @@ func (a *AddAction) Run(ctx context.Context) (*actions.ActionResult, error) {
"\nRun '%s' to add a secret to the key vault.",
output.WithHighLightFormat("azd env set-secret <name>"))

if _, err := pathHasInfraModule(infraRoot, mergedOptions.Module); err == nil {
if _, err := pathHasInfraModule(infraRoot, infraOptions.Module); err == nil {
followUpMessage = fmt.Sprintf(
"Run '%s' to re-generate the infrastructure, "+
"then run '%s' to provision these changes anytime later.",
Expand Down Expand Up @@ -403,9 +403,10 @@ func ensureCompatibleProject(
}
}

mergedOptions := provisioning.Options{}
mergo.Merge(&mergedOptions, prjConfig.Infra)
mergo.Merge(&mergedOptions, project.DefaultProvisioningOptions)
mergedOptions, err := prjConfig.Infra.GetWithDefaults()
if err != nil {
return err
}

infraRoot := mergedOptions.Path
if !filepath.IsAbs(infraRoot) {
Expand Down
37 changes: 15 additions & 22 deletions cli/azd/pkg/infra/provisioning/bicep/bicep_provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import (
"strings"
"time"

"dario.cat/mergo"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/cognitiveservices/armcognitiveservices"
Expand All @@ -47,13 +46,6 @@ import (

type bicepFileMode int

var (
defaultOptions = provisioning.Options{
Module: "main",
Path: "infra",
}
)

const (
bicepMode bicepFileMode = iota
bicepparamMode
Expand Down Expand Up @@ -96,33 +88,34 @@ func (p *BicepProvider) Name() string {
// Initialize initializes provider state from the options.
// It also calls EnsureEnv, which ensures the client-side state is ready for provisioning.
func (p *BicepProvider) Initialize(ctx context.Context, projectPath string, opt provisioning.Options) error {
mergedOptions := provisioning.Options{}
mergo.Merge(&mergedOptions, opt)
mergo.Merge(&mergedOptions, defaultOptions)
infraOptions, err := opt.GetWithDefaults()
if err != nil {
return err
}

if !filepath.IsAbs(mergedOptions.Path) {
mergedOptions.Path = filepath.Join(projectPath, mergedOptions.Path)
if !filepath.IsAbs(infraOptions.Path) {
infraOptions.Path = filepath.Join(projectPath, infraOptions.Path)
}

bicepparam := mergedOptions.Module + ".bicepparam"
bicepFile := mergedOptions.Module + ".bicep"
bicepparam := infraOptions.Module + ".bicepparam"
bicepFile := infraOptions.Module + ".bicep"

// Check if there's a <moduleName>.bicepparam first. It will be preferred over a <moduleName>.bicep
if _, err := os.Stat(filepath.Join(mergedOptions.Path, bicepparam)); err == nil {
p.path = filepath.Join(mergedOptions.Path, bicepparam)
if _, err := os.Stat(filepath.Join(infraOptions.Path, bicepparam)); err == nil {
p.path = filepath.Join(infraOptions.Path, bicepparam)
p.mode = bicepparamMode
} else {
p.path = filepath.Join(mergedOptions.Path, bicepFile)
p.path = filepath.Join(infraOptions.Path, bicepFile)
p.mode = bicepMode
}

p.projectPath = projectPath
p.layer = mergedOptions.Name
p.options = mergedOptions
p.ignoreDeploymentState = mergedOptions.IgnoreDeploymentState
p.layer = infraOptions.Name
p.options = infraOptions
p.ignoreDeploymentState = infraOptions.IgnoreDeploymentState

p.console.ShowSpinner(ctx, "Initialize bicep provider", input.Step)
err := p.EnsureEnv(ctx)
err = p.EnsureEnv(ctx)
p.console.StopSpinner(ctx, "", input.Step)
return err
}
Expand Down
12 changes: 6 additions & 6 deletions cli/azd/pkg/infra/provisioning/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"os"
"path/filepath"

"dario.cat/mergo"
"github.com/azure/azure-dev/cli/azd/pkg/alpha"
"github.com/azure/azure-dev/cli/azd/pkg/azapi"
"github.com/azure/azure-dev/cli/azd/pkg/azsdk/storage"
Expand Down Expand Up @@ -51,20 +50,21 @@ var (
)

func (m *Manager) Initialize(ctx context.Context, projectPath string, options Options) error {
mergedOptions := Options{}
mergo.Merge(&mergedOptions, options)
mergo.Merge(&mergedOptions, defaultOptions)
infraOptions, err := options.GetWithDefaults()
if err != nil {
return err
}

m.projectPath = projectPath
m.options = &mergedOptions
m.options = &infraOptions

provider, err := m.newProvider(ctx)
if err != nil {
return fmt.Errorf("initializing infrastructure provider: %w", err)
}

m.provider = provider
return m.provider.Initialize(ctx, projectPath, mergedOptions)
return m.provider.Initialize(ctx, projectPath, infraOptions)
}

// Parameters gets the list of parameters and its value which will be used to provision the infrastructure.
Expand Down
26 changes: 26 additions & 0 deletions cli/azd/pkg/infra/provisioning/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"context"
"fmt"
"strings"

"dario.cat/mergo"
)

type ProviderKind string
Expand Down Expand Up @@ -34,6 +36,30 @@ type Options struct {
Layers []Options `yaml:"layers,omitempty"`
}

// GetWithDefaults merges the provided infra options with the default provisioning options
func (o Options) GetWithDefaults(other ...Options) (Options, error) {
mergedOptions := Options{}

// Merge in the provided infra options first
if err := mergo.Merge(&mergedOptions, o); err != nil {
return Options{}, fmt.Errorf("merging infra options: %w", err)
}

// Merge in any other provided options
for _, opt := range other {
if err := mergo.Merge(&mergedOptions, opt); err != nil {
return Options{}, fmt.Errorf("merging other options: %w", err)
}
}

// Finally, merge in the default provisioning options
if err := mergo.Merge(&mergedOptions, defaultOptions); err != nil {
return Options{}, fmt.Errorf("merging default infra options: %w", err)
}

return mergedOptions, nil
}

// GetLayers return the provisioning layers defined.
// When [Options.Layers] is not defined, it returns the single layer defined.
//
Expand Down
Loading
Loading