Skip to content

Commit

Permalink
chore: init to depend on add.Configure (#4698)
Browse files Browse the repository at this point in the history
Reshares UI prompting logic between `init` and `add`.

`init` can be thought of as a series of `add` calls, though this is not reflected in practice due to difference in UX design considerations.

This is a pure refactor and does not introduce any functional changes. The UI prompting is covered by existing tests.
  • Loading branch information
weikanglim authored Jan 18, 2025
1 parent 0978fb2 commit a6eb179
Show file tree
Hide file tree
Showing 8 changed files with 222 additions and 247 deletions.
8 changes: 2 additions & 6 deletions cli/azd/internal/cmd/add/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import (

"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/repository"
"github.com/azure/azure-dev/cli/azd/pkg/account"
"github.com/azure/azure-dev/cli/azd/pkg/alpha"
"github.com/azure/azure-dev/cli/azd/pkg/environment"
Expand Down Expand Up @@ -50,7 +49,6 @@ type AddAction struct {
alphaManager *alpha.FeatureManager
creds account.SubscriptionCredentialProvider
rm infra.ResourceManager
appInit *repository.Initializer
armClientOptions *arm.ClientOptions
prompter prompt.Prompter
console input.Console
Expand Down Expand Up @@ -93,7 +91,7 @@ func (a *AddAction) Run(ctx context.Context) (*actions.ActionResult, error) {
resourceToAdd := &project.ResourceConfig{}
var serviceToAdd *project.ServiceConfig

promptOpts := promptOptions{prj: prjConfig}
promptOpts := PromptOptions{PrjConfig: prjConfig}
if strings.EqualFold(selected.Namespace, "host") {
svc, r, err := a.configureHost(a.console, ctx, promptOpts)
if err != nil {
Expand All @@ -111,7 +109,7 @@ func (a *AddAction) Run(ctx context.Context) (*actions.ActionResult, error) {
resourceToAdd = r
}

resourceToAdd, err = configure(ctx, resourceToAdd, a.console, promptOpts)
resourceToAdd, err = Configure(ctx, resourceToAdd, a.console, promptOpts)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -368,7 +366,6 @@ func NewAddAction(
prompter prompt.Prompter,
rm infra.ResourceManager,
armClientOptions *arm.ClientOptions,
appInit *repository.Initializer,
azd workflow.AzdCommandRunner,
console input.Console) actions.Action {
return &AddAction{
Expand All @@ -381,7 +378,6 @@ func NewAddAction(
prompter: prompter,
rm: rm,
armClientOptions: armClientOptions,
appInit: appInit,
creds: creds,
azd: azd,
}
Expand Down
44 changes: 26 additions & 18 deletions cli/azd/internal/cmd/add/add_configure.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,32 @@ import (
"strings"
"unicode"

"github.com/azure/azure-dev/cli/azd/internal/appdetect"
"github.com/azure/azure-dev/cli/azd/pkg/input"
"github.com/azure/azure-dev/cli/azd/pkg/output"
"github.com/azure/azure-dev/cli/azd/pkg/project"
"github.com/fatih/color"
)

// promptOptions contains common options for prompting.
type promptOptions struct {
// prj is the current project configuration.
prj *project.ProjectConfig
// DbMap is a map of supported database dependencies.
var DbMap = map[appdetect.DatabaseDep]project.ResourceType{
appdetect.DbMongo: project.ResourceTypeDbMongo,
appdetect.DbPostgres: project.ResourceTypeDbPostgres,
appdetect.DbRedis: project.ResourceTypeDbRedis,
}

// configure fills in the fields for a resource.
func configure(
// PromptOptions contains common options for prompting.
type PromptOptions struct {
// PrjConfig is the current project configuration.
PrjConfig *project.ProjectConfig
}

// Configure fills in the fields for a resource.
func Configure(
ctx context.Context,
r *project.ResourceConfig,
console input.Console,
p promptOptions) (*project.ResourceConfig, error) {
p PromptOptions) (*project.ResourceConfig, error) {
switch r.Type {
case project.ResourceTypeHostContainerApp:
return fillUses(ctx, r, console, p)
Expand All @@ -34,7 +42,7 @@ func configure(
project.ResourceTypeDbMongo:
return fillDatabaseName(ctx, r, console, p)
case project.ResourceTypeDbRedis:
if _, exists := p.prj.Resources["redis"]; exists {
if _, exists := p.PrjConfig.Resources["redis"]; exists {
return nil, fmt.Errorf("only one Redis resource is allowed at this time")
}

Expand All @@ -49,7 +57,7 @@ func fillDatabaseName(
ctx context.Context,
r *project.ResourceConfig,
console input.Console,
p promptOptions) (*project.ResourceConfig, error) {
p PromptOptions) (*project.ResourceConfig, error) {
if r.Name != "" {
return r, nil
}
Expand All @@ -65,7 +73,7 @@ func fillDatabaseName(
return r, err
}

if err := validateResourceName(dbName, p.prj); err != nil {
if err := validateResourceName(dbName, p.PrjConfig); err != nil {
console.Message(ctx, err.Error())
continue
}
Expand All @@ -81,7 +89,7 @@ func fillAiModelName(
ctx context.Context,
r *project.ResourceConfig,
console input.Console,
p promptOptions) (*project.ResourceConfig, error) {
p PromptOptions) (*project.ResourceConfig, error) {
if r.Name != "" {
return r, nil
}
Expand All @@ -94,7 +102,7 @@ func fillAiModelName(
defaultName = modelProps.Model.Name
i := 1
for {
if _, exists := p.prj.Resources[defaultName]; exists {
if _, exists := p.PrjConfig.Resources[defaultName]; exists {
i++
defaultName = fmt.Sprintf("%s-%d", defaultName, i)
} else {
Expand All @@ -112,7 +120,7 @@ func fillAiModelName(
return nil, err
}

if err := validateResourceName(modelName, p.prj); err != nil {
if err := validateResourceName(modelName, p.PrjConfig); err != nil {
console.Message(ctx, err.Error())
continue
}
Expand All @@ -128,13 +136,13 @@ func fillUses(
ctx context.Context,
r *project.ResourceConfig,
console input.Console,
p promptOptions) (*project.ResourceConfig, error) {
p PromptOptions) (*project.ResourceConfig, error) {
type resourceDisplay struct {
Resource *project.ResourceConfig
Display string
}
res := make([]resourceDisplay, 0, len(p.prj.Resources))
for _, r := range p.prj.Resources {
res := make([]resourceDisplay, 0, len(p.PrjConfig.Resources))
for _, r := range p.PrjConfig.Resources {
res = append(res, resourceDisplay{
Resource: r,
Display: fmt.Sprintf(
Expand Down Expand Up @@ -190,9 +198,9 @@ func promptUsedBy(
ctx context.Context,
r *project.ResourceConfig,
console input.Console,
p promptOptions) ([]string, error) {
p PromptOptions) ([]string, error) {
svc := []string{}
for _, other := range p.prj.Resources {
for _, other := range p.PrjConfig.Resources {
if strings.HasPrefix(string(other.Type), "host.") && !slices.Contains(r.Uses, other.Name) {
svc = append(svc, other.Name)
}
Expand Down
Loading

0 comments on commit a6eb179

Please sign in to comment.