Skip to content

Commit 72bc498

Browse files
authored
Adds support for Azure Deployment stacks (#4165)
1 parent e879c96 commit 72bc498

File tree

72 files changed

+12114
-8013
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+12114
-8013
lines changed

cli/azd/.vscode/cspell-azd-dictionary.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ armappconfiguration
2121
armappplatform
2222
armcognitiveservices
2323
armcosmos
24+
armdeploymentstacks
2425
armmachinelearning
2526
armresourcegraph
2627
armsql
@@ -145,6 +146,7 @@ notrail
145146
omitempty
146147
oneauth
147148
oneline
149+
onmicrosoft
148150
opentelemetry
149151
ostest
150152
osutil
@@ -209,6 +211,7 @@ trafficmanager
209211
Truef
210212
typeflag
211213
unhide
214+
unmanage
212215
unmarshaled
213216
unmarshalled
214217
unmarshalling

cli/azd/.vscode/cspell.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ overrides:
109109
- filename: test/functional/testdata/samples/funcapp/getting_started.md
110110
words:
111111
- funcignore
112+
- filename: internal/vsrpc/handler.go
113+
words:
114+
- arity
112115
ignorePaths:
113116
- "**/*_test.go"
114117
- "**/mock*.go"

cli/azd/cmd/container.go

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -583,8 +583,8 @@ func registerCommonDependencies(container *ioc.NestedContainer) {
583583

584584
// Tools
585585
container.MustRegisterSingleton(azcli.NewAzCli)
586-
container.MustRegisterSingleton(azapi.NewDeployments)
587-
container.MustRegisterSingleton(azapi.NewDeploymentOperations)
586+
587+
// Tools
588588
container.MustRegisterSingleton(azapi.NewResourceService)
589589
container.MustRegisterSingleton(docker.NewCli)
590590
container.MustRegisterSingleton(dotnet.NewCli)
@@ -603,6 +603,43 @@ func registerCommonDependencies(container *ioc.NestedContainer) {
603603
container.MustRegisterScoped(project.NewAiHelper)
604604

605605
// Provisioning
606+
container.MustRegisterSingleton(func(
607+
serviceLocator ioc.ServiceLocator,
608+
featureManager *alpha.FeatureManager,
609+
) (azapi.DeploymentService, error) {
610+
deploymentsType := azapi.DeploymentTypeStandard
611+
612+
if featureManager.IsEnabled(azapi.FeatureDeploymentStacks) {
613+
deploymentsType = azapi.DeploymentTypeStacks
614+
}
615+
616+
var deployments azapi.DeploymentService
617+
if err := serviceLocator.ResolveNamed(string(deploymentsType), &deployments); err != nil {
618+
return nil, err
619+
}
620+
621+
return deployments, nil
622+
})
623+
624+
container.MustRegisterSingleton(azapi.NewResourceService)
625+
626+
// Register Deployment Services
627+
deploymentServiceTypes := map[azapi.DeploymentType]any{
628+
azapi.DeploymentTypeStandard: func(deploymentService *azapi.StandardDeployments) azapi.DeploymentService {
629+
return deploymentService
630+
},
631+
azapi.DeploymentTypeStacks: func(deploymentService *azapi.StackDeployments) azapi.DeploymentService {
632+
return deploymentService
633+
},
634+
}
635+
636+
for deploymentType, constructor := range deploymentServiceTypes {
637+
container.MustRegisterNamedSingleton(string(deploymentType), constructor)
638+
}
639+
640+
container.MustRegisterSingleton(azapi.NewStandardDeployments)
641+
container.MustRegisterSingleton(azapi.NewStackDeployments)
642+
container.MustRegisterSingleton(infra.NewDeploymentManager)
606643
container.MustRegisterSingleton(infra.NewAzureResourceManager)
607644
container.MustRegisterScoped(provisioning.NewManager)
608645
container.MustRegisterScoped(provisioning.NewPrincipalIdProvider)

cli/azd/cmd/down.go

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/azure/azure-dev/cli/azd/cmd/actions"
99
"github.com/azure/azure-dev/cli/azd/internal"
1010
"github.com/azure/azure-dev/cli/azd/pkg/alpha"
11+
"github.com/azure/azure-dev/cli/azd/pkg/azapi"
1112
"github.com/azure/azure-dev/cli/azd/pkg/environment"
1213
"github.com/azure/azure-dev/cli/azd/pkg/infra/provisioning"
1314
"github.com/azure/azure-dev/cli/azd/pkg/input"
@@ -53,12 +54,13 @@ func newDownCmd() *cobra.Command {
5354
}
5455

5556
type downAction struct {
56-
flags *downFlags
57-
provisionManager *provisioning.Manager
58-
importManager *project.ImportManager
59-
env *environment.Environment
60-
console input.Console
61-
projectConfig *project.ProjectConfig
57+
flags *downFlags
58+
provisionManager *provisioning.Manager
59+
importManager *project.ImportManager
60+
env *environment.Environment
61+
console input.Console
62+
projectConfig *project.ProjectConfig
63+
alphaFeatureManager *alpha.FeatureManager
6264
}
6365

6466
func newDownAction(
@@ -71,12 +73,13 @@ func newDownAction(
7173
importManager *project.ImportManager,
7274
) actions.Action {
7375
return &downAction{
74-
flags: flags,
75-
provisionManager: provisionManager,
76-
env: env,
77-
console: console,
78-
projectConfig: projectConfig,
79-
importManager: importManager,
76+
flags: flags,
77+
provisionManager: provisionManager,
78+
env: env,
79+
console: console,
80+
projectConfig: projectConfig,
81+
importManager: importManager,
82+
alphaFeatureManager: alphaFeatureManager,
8083
}
8184
}
8285

@@ -99,6 +102,10 @@ func (a *downAction) Run(ctx context.Context) (*actions.ActionResult, error) {
99102
return nil, fmt.Errorf("initializing provisioning manager: %w", err)
100103
}
101104

105+
if a.alphaFeatureManager.IsEnabled(azapi.FeatureDeploymentStacks) {
106+
a.console.WarnForFeature(ctx, azapi.FeatureDeploymentStacks)
107+
}
108+
102109
destroyOptions := provisioning.NewDestroyOptions(a.flags.forceDelete, a.flags.purgeDelete)
103110
if _, err := a.provisionManager.Destroy(ctx, destroyOptions); err != nil {
104111
return nil, fmt.Errorf("deleting infrastructure: %w", err)

cli/azd/cmd/monitor.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ type monitorAction struct {
6464
azdCtx *azdcontext.AzdContext
6565
env *environment.Environment
6666
subResolver account.SubscriptionTenantResolver
67+
resourceManager infra.ResourceManager
6768
resourceService *azapi.ResourceService
68-
deploymentOperations azapi.DeploymentOperations
6969
console input.Console
7070
flags *monitorFlags
7171
portalUrlBase string
@@ -76,8 +76,8 @@ func newMonitorAction(
7676
azdCtx *azdcontext.AzdContext,
7777
env *environment.Environment,
7878
subResolver account.SubscriptionTenantResolver,
79+
resourceManager infra.ResourceManager,
7980
resourceService *azapi.ResourceService,
80-
deploymentOperations azapi.DeploymentOperations,
8181
console input.Console,
8282
flags *monitorFlags,
8383
cloud *cloud.Cloud,
@@ -86,8 +86,8 @@ func newMonitorAction(
8686
return &monitorAction{
8787
azdCtx: azdCtx,
8888
env: env,
89+
resourceManager: resourceManager,
8990
resourceService: resourceService,
90-
deploymentOperations: deploymentOperations,
9191
console: console,
9292
flags: flags,
9393
subResolver: subResolver,
@@ -113,15 +113,13 @@ func (m *monitorAction) Run(ctx context.Context) (*actions.ActionResult, error)
113113
return nil, nil
114114
}
115115

116-
resourceManager := infra.NewAzureResourceManager(m.resourceService, m.deploymentOperations)
117-
resourceGroups, err := resourceManager.GetResourceGroupsForEnvironment(
118-
ctx, m.env.GetSubscriptionId(), m.env.Name())
116+
resourceGroups, err := m.resourceManager.GetResourceGroupsForEnvironment(ctx, m.env.GetSubscriptionId(), m.env.Name())
119117
if err != nil {
120118
return nil, fmt.Errorf("discovering resource groups from deployment: %w", err)
121119
}
122120

123-
var insightsResources []azapi.Resource
124-
var portalResources []azapi.Resource
121+
var insightsResources []*azapi.Resource
122+
var portalResources []*azapi.Resource
125123

126124
for _, resourceGroup := range resourceGroups {
127125
resources, err := m.resourceService.ListResourceGroupResources(

cli/azd/cmd/show.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ type showAction struct {
6060
writer io.Writer
6161
resourceService *azapi.ResourceService
6262
envManager environment.Manager
63-
deploymentOperations azapi.DeploymentOperations
63+
infraResourceManager infra.ResourceManager
6464
azdCtx *azdcontext.AzdContext
6565
flags *showFlags
6666
lazyServiceManager *lazy.Lazy[project.ServiceManager]
@@ -74,7 +74,7 @@ func newShowAction(
7474
writer io.Writer,
7575
resourceService *azapi.ResourceService,
7676
envManager environment.Manager,
77-
deploymentOperations azapi.DeploymentOperations,
77+
infraResourceManager infra.ResourceManager,
7878
projectConfig *project.ProjectConfig,
7979
importManager *project.ImportManager,
8080
azdCtx *azdcontext.AzdContext,
@@ -91,7 +91,7 @@ func newShowAction(
9191
writer: writer,
9292
resourceService: resourceService,
9393
envManager: envManager,
94-
deploymentOperations: deploymentOperations,
94+
infraResourceManager: infraResourceManager,
9595
azdCtx: azdCtx,
9696
flags: flags,
9797
lazyServiceManager: lazyServiceManager,
@@ -160,11 +160,14 @@ func (s *showAction) Run(ctx context.Context) (*actions.ActionResult, error) {
160160
if subId = env.GetSubscriptionId(); subId == "" {
161161
log.Printf("provision has not been run, resource ids will not be available")
162162
} else {
163-
azureResourceManager := infra.NewAzureResourceManager(s.resourceService, s.deploymentOperations)
164-
resourceManager := project.NewResourceManager(env, s.resourceService, s.deploymentOperations)
163+
resourceManager, err := s.lazyResourceManager.GetValue()
164+
if err != nil {
165+
return nil, err
166+
}
167+
165168
envName := env.Name()
166169

167-
rgName, err = azureResourceManager.FindResourceGroupForEnvironment(ctx, subId, envName)
170+
rgName, err = s.infraResourceManager.FindResourceGroupForEnvironment(ctx, subId, envName)
168171
if err == nil {
169172
for _, serviceConfig := range stableServices {
170173
svcName := serviceConfig.Name

cli/azd/internal/cmd/provision.go

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import (
1313
"github.com/azure/azure-dev/cli/azd/cmd/actions"
1414
"github.com/azure/azure-dev/cli/azd/internal"
1515
"github.com/azure/azure-dev/cli/azd/pkg/account"
16+
"github.com/azure/azure-dev/cli/azd/pkg/alpha"
17+
"github.com/azure/azure-dev/cli/azd/pkg/azapi"
1618
"github.com/azure/azure-dev/cli/azd/pkg/cloud"
1719
"github.com/azure/azure-dev/cli/azd/pkg/environment"
1820
"github.com/azure/azure-dev/cli/azd/pkg/infra/provisioning"
@@ -93,19 +95,20 @@ func NewProvisionCmd() *cobra.Command {
9395
}
9496

9597
type ProvisionAction struct {
96-
flags *ProvisionFlags
97-
provisionManager *provisioning.Manager
98-
projectManager project.ProjectManager
99-
resourceManager project.ResourceManager
100-
env *environment.Environment
101-
envManager environment.Manager
102-
formatter output.Formatter
103-
projectConfig *project.ProjectConfig
104-
writer io.Writer
105-
console input.Console
106-
subManager *account.SubscriptionsManager
107-
importManager *project.ImportManager
108-
portalUrlBase string
98+
flags *ProvisionFlags
99+
provisionManager *provisioning.Manager
100+
projectManager project.ProjectManager
101+
resourceManager project.ResourceManager
102+
env *environment.Environment
103+
envManager environment.Manager
104+
formatter output.Formatter
105+
projectConfig *project.ProjectConfig
106+
writer io.Writer
107+
console input.Console
108+
subManager *account.SubscriptionsManager
109+
importManager *project.ImportManager
110+
alphaFeatureManager *alpha.FeatureManager
111+
portalUrlBase string
109112
}
110113

111114
func NewProvisionAction(
@@ -121,22 +124,24 @@ func NewProvisionAction(
121124
formatter output.Formatter,
122125
writer io.Writer,
123126
subManager *account.SubscriptionsManager,
127+
alphaFeatureManager *alpha.FeatureManager,
124128
cloud *cloud.Cloud,
125129
) actions.Action {
126130
return &ProvisionAction{
127-
flags: flags,
128-
provisionManager: provisionManager,
129-
projectManager: projectManager,
130-
resourceManager: resourceManager,
131-
env: env,
132-
envManager: envManager,
133-
formatter: formatter,
134-
projectConfig: projectConfig,
135-
writer: writer,
136-
console: console,
137-
subManager: subManager,
138-
importManager: importManager,
139-
portalUrlBase: cloud.PortalUrlBase,
131+
flags: flags,
132+
provisionManager: provisionManager,
133+
projectManager: projectManager,
134+
resourceManager: resourceManager,
135+
env: env,
136+
envManager: envManager,
137+
formatter: formatter,
138+
projectConfig: projectConfig,
139+
writer: writer,
140+
console: console,
141+
subManager: subManager,
142+
importManager: importManager,
143+
alphaFeatureManager: alphaFeatureManager,
144+
portalUrlBase: cloud.PortalUrlBase,
140145
}
141146
}
142147

@@ -233,6 +238,10 @@ func (p *ProvisionAction) Run(ctx context.Context) (*actions.ActionResult, error
233238
},
234239
}
235240

241+
if p.alphaFeatureManager.IsEnabled(azapi.FeatureDeploymentStacks) {
242+
p.console.WarnForFeature(ctx, azapi.FeatureDeploymentStacks)
243+
}
244+
236245
err = p.projectConfig.Invoke(ctx, project.ProjectEventProvision, projectEventArgs, func() error {
237246
var err error
238247
if previewMode {

cli/azd/internal/vsrpc/environment_service.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/azure/azure-dev/cli/azd/internal"
1313
"github.com/azure/azure-dev/cli/azd/pkg/environment"
1414
"github.com/azure/azure-dev/cli/azd/pkg/environment/azdcontext"
15+
"github.com/azure/azure-dev/cli/azd/pkg/infra"
1516
"github.com/azure/azure-dev/cli/azd/pkg/infra/provisioning"
1617
"github.com/azure/azure-dev/cli/azd/pkg/project"
1718
)
@@ -161,20 +162,20 @@ func (s *environmentService) DeleteEnvironmentAsync(
161162
if mode&DeleteModeAzureResources > 0 {
162163
_ = observer.OnNext(ctx, newImportantProgressMessage("Removing Azure resources"))
163164

164-
infra, err := c.importManager.ProjectInfrastructure(ctx, c.projectConfig)
165+
projectInfra, err := c.importManager.ProjectInfrastructure(ctx, c.projectConfig)
165166
if err != nil {
166167
return false, err
167168
}
168-
defer func() { _ = infra.Cleanup() }()
169+
defer func() { _ = projectInfra.Cleanup() }()
169170

170-
if err := c.provisionManager.Initialize(ctx, c.projectConfig.Path, infra.Options); err != nil {
171+
if err := c.provisionManager.Initialize(ctx, c.projectConfig.Path, projectInfra.Options); err != nil {
171172
return false, fmt.Errorf("initializing provisioning manager: %w", err)
172173
}
173174

174175
// Enable force and purge options
175176
destroyOptions := provisioning.NewDestroyOptions(true, true)
176177
_, err = c.provisionManager.Destroy(ctx, destroyOptions)
177-
if errors.Is(err, provisioning.ErrDeploymentsNotFound) {
178+
if errors.Is(err, infra.ErrDeploymentsNotFound) {
178179
_ = observer.OnNext(ctx, newInfoProgressMessage("No Azure resources were found"))
179180
} else if err != nil {
180181
return false, fmt.Errorf("deleting infrastructure: %w", err)

cli/azd/internal/vsrpc/environment_service_refresh.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"log"
1010

1111
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
12-
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources"
1312
"github.com/azure/azure-dev/cli/azd/internal"
1413
"github.com/azure/azure-dev/cli/azd/pkg/azapi"
1514
"github.com/azure/azure-dev/cli/azd/pkg/environment"
@@ -94,9 +93,9 @@ func (s *environmentService) refreshEnvironmentAsync(
9493
log.Printf("failed to get latest deployment result: %v", err)
9594
} else {
9695
env.LastDeployment = &DeploymentResult{
97-
DeploymentId: *deployment.ID,
98-
Success: *deployment.Properties.ProvisioningState == armresources.ProvisioningStateSucceeded,
99-
Time: *deployment.Properties.Timestamp,
96+
DeploymentId: deployment.Id,
97+
Success: deployment.ProvisioningState == azapi.DeploymentProvisioningStateSucceeded,
98+
Time: deployment.Timestamp,
10099
}
101100
}
102101

0 commit comments

Comments
 (0)