Skip to content

Commit 0bdb540

Browse files
authored
Added helper func to get infra config with defaults applied (#6255)
* Added helper func to get infra config with defaults applied * Fixes linting issues
1 parent 42e1af1 commit 0bdb540

File tree

9 files changed

+449
-57
lines changed

9 files changed

+449
-57
lines changed

cli/azd/internal/cmd/add/add.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import (
1414
"slices"
1515
"strings"
1616

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

288-
mergedOptions := provisioning.Options{}
289-
mergo.Merge(&mergedOptions, prjConfig.Infra)
290-
mergo.Merge(&mergedOptions, project.DefaultProvisioningOptions)
287+
infraOptions, err := prjConfig.Infra.GetWithDefaults()
288+
if err != nil {
289+
return nil, err
290+
}
291291

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

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

406-
mergedOptions := provisioning.Options{}
407-
mergo.Merge(&mergedOptions, prjConfig.Infra)
408-
mergo.Merge(&mergedOptions, project.DefaultProvisioningOptions)
406+
mergedOptions, err := prjConfig.Infra.GetWithDefaults()
407+
if err != nil {
408+
return err
409+
}
409410

410411
infraRoot := mergedOptions.Path
411412
if !filepath.IsAbs(infraRoot) {

cli/azd/pkg/infra/provisioning/bicep/bicep_provider.go

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"strings"
2121
"time"
2222

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

4847
type bicepFileMode int
4948

50-
var (
51-
defaultOptions = provisioning.Options{
52-
Module: "main",
53-
Path: "infra",
54-
}
55-
)
56-
5749
const (
5850
bicepMode bicepFileMode = iota
5951
bicepparamMode
@@ -96,33 +88,34 @@ func (p *BicepProvider) Name() string {
9688
// Initialize initializes provider state from the options.
9789
// It also calls EnsureEnv, which ensures the client-side state is ready for provisioning.
9890
func (p *BicepProvider) Initialize(ctx context.Context, projectPath string, opt provisioning.Options) error {
99-
mergedOptions := provisioning.Options{}
100-
mergo.Merge(&mergedOptions, opt)
101-
mergo.Merge(&mergedOptions, defaultOptions)
91+
infraOptions, err := opt.GetWithDefaults()
92+
if err != nil {
93+
return err
94+
}
10295

103-
if !filepath.IsAbs(mergedOptions.Path) {
104-
mergedOptions.Path = filepath.Join(projectPath, mergedOptions.Path)
96+
if !filepath.IsAbs(infraOptions.Path) {
97+
infraOptions.Path = filepath.Join(projectPath, infraOptions.Path)
10598
}
10699

107-
bicepparam := mergedOptions.Module + ".bicepparam"
108-
bicepFile := mergedOptions.Module + ".bicep"
100+
bicepparam := infraOptions.Module + ".bicepparam"
101+
bicepFile := infraOptions.Module + ".bicep"
109102

110103
// Check if there's a <moduleName>.bicepparam first. It will be preferred over a <moduleName>.bicep
111-
if _, err := os.Stat(filepath.Join(mergedOptions.Path, bicepparam)); err == nil {
112-
p.path = filepath.Join(mergedOptions.Path, bicepparam)
104+
if _, err := os.Stat(filepath.Join(infraOptions.Path, bicepparam)); err == nil {
105+
p.path = filepath.Join(infraOptions.Path, bicepparam)
113106
p.mode = bicepparamMode
114107
} else {
115-
p.path = filepath.Join(mergedOptions.Path, bicepFile)
108+
p.path = filepath.Join(infraOptions.Path, bicepFile)
116109
p.mode = bicepMode
117110
}
118111

119112
p.projectPath = projectPath
120-
p.layer = mergedOptions.Name
121-
p.options = mergedOptions
122-
p.ignoreDeploymentState = mergedOptions.IgnoreDeploymentState
113+
p.layer = infraOptions.Name
114+
p.options = infraOptions
115+
p.ignoreDeploymentState = infraOptions.IgnoreDeploymentState
123116

124117
p.console.ShowSpinner(ctx, "Initialize bicep provider", input.Step)
125-
err := p.EnsureEnv(ctx)
118+
err = p.EnsureEnv(ctx)
126119
p.console.StopSpinner(ctx, "", input.Step)
127120
return err
128121
}

cli/azd/pkg/infra/provisioning/manager.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"os"
1212
"path/filepath"
1313

14-
"dario.cat/mergo"
1514
"github.com/azure/azure-dev/cli/azd/pkg/alpha"
1615
"github.com/azure/azure-dev/cli/azd/pkg/azapi"
1716
"github.com/azure/azure-dev/cli/azd/pkg/azsdk/storage"
@@ -51,20 +50,21 @@ var (
5150
)
5251

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

5858
m.projectPath = projectPath
59-
m.options = &mergedOptions
59+
m.options = &infraOptions
6060

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

6666
m.provider = provider
67-
return m.provider.Initialize(ctx, projectPath, mergedOptions)
67+
return m.provider.Initialize(ctx, projectPath, infraOptions)
6868
}
6969

7070
// Parameters gets the list of parameters and its value which will be used to provision the infrastructure.

cli/azd/pkg/infra/provisioning/provider.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"context"
88
"fmt"
99
"strings"
10+
11+
"dario.cat/mergo"
1012
)
1113

1214
type ProviderKind string
@@ -34,6 +36,30 @@ type Options struct {
3436
Layers []Options `yaml:"layers,omitempty"`
3537
}
3638

39+
// GetWithDefaults merges the provided infra options with the default provisioning options
40+
func (o Options) GetWithDefaults(other ...Options) (Options, error) {
41+
mergedOptions := Options{}
42+
43+
// Merge in the provided infra options first
44+
if err := mergo.Merge(&mergedOptions, o); err != nil {
45+
return Options{}, fmt.Errorf("merging infra options: %w", err)
46+
}
47+
48+
// Merge in any other provided options
49+
for _, opt := range other {
50+
if err := mergo.Merge(&mergedOptions, opt); err != nil {
51+
return Options{}, fmt.Errorf("merging other options: %w", err)
52+
}
53+
}
54+
55+
// Finally, merge in the default provisioning options
56+
if err := mergo.Merge(&mergedOptions, defaultOptions); err != nil {
57+
return Options{}, fmt.Errorf("merging default infra options: %w", err)
58+
}
59+
60+
return mergedOptions, nil
61+
}
62+
3763
// GetLayers return the provisioning layers defined.
3864
// When [Options.Layers] is not defined, it returns the single layer defined.
3965
//

0 commit comments

Comments
 (0)