in cli/azd/internal/repository/infra_confirm.go [26:143]
func (i *Initializer) infraSpecFromDetect(
ctx context.Context,
detect detectConfirm) (scaffold.InfraSpec, error) {
spec := scaffold.InfraSpec{}
hasDb := false
for database := range detect.Databases {
hasDb = true
if database == appdetect.DbRedis {
spec.DbRedis = &scaffold.DatabaseRedis{}
// no further configuration needed for redis
continue
}
dbPrompt:
for {
dbName, err := promptDbName(i.console, ctx, database)
if err != nil {
return scaffold.InfraSpec{}, err
}
switch database {
case appdetect.DbMongo:
spec.DbCosmosMongo = &scaffold.DatabaseCosmosMongo{
DatabaseName: dbName,
}
break dbPrompt
case appdetect.DbPostgres:
if dbName == "" {
i.console.Message(ctx, "Database name is required.")
continue
}
spec.DbPostgres = &scaffold.DatabasePostgres{
DatabaseName: dbName,
}
}
break dbPrompt
}
}
if hasDb {
spec.KeyVault = &scaffold.KeyVault{}
}
for _, svc := range detect.Services {
name := names.LabelName(filepath.Base(svc.Path))
serviceSpec := scaffold.ServiceSpec{
Name: name,
Port: -1,
Host: scaffold.ContainerAppKind,
}
port, err := add.PromptPort(i.console, ctx, name, svc)
if err != nil {
return scaffold.InfraSpec{}, err
}
serviceSpec.Port = port
for _, framework := range svc.Dependencies {
if framework.IsWebUIFramework() {
serviceSpec.Frontend = &scaffold.Frontend{}
}
}
for _, db := range svc.DatabaseDeps {
// filter out databases that were removed
if _, ok := detect.Databases[db]; !ok {
continue
}
switch db {
case appdetect.DbMongo:
serviceSpec.DbCosmosMongo = &scaffold.DatabaseReference{
DatabaseName: spec.DbCosmosMongo.DatabaseName,
}
case appdetect.DbPostgres:
serviceSpec.DbPostgres = &scaffold.DatabaseReference{
DatabaseName: spec.DbPostgres.DatabaseName,
}
case appdetect.DbRedis:
serviceSpec.DbRedis = &scaffold.DatabaseReference{
DatabaseName: "redis",
}
}
}
spec.Services = append(spec.Services, serviceSpec)
}
backends := []scaffold.ServiceReference{}
frontends := []scaffold.ServiceReference{}
for idx := range spec.Services {
if spec.Services[idx].Frontend == nil && spec.Services[idx].Port != 0 {
backends = append(backends, scaffold.ServiceReference{
Name: spec.Services[idx].Name,
})
spec.Services[idx].Backend = &scaffold.Backend{}
} else {
frontends = append(frontends, scaffold.ServiceReference{
Name: spec.Services[idx].Name,
})
}
}
// Link services together
for _, service := range spec.Services {
if service.Frontend != nil && len(backends) > 0 {
service.Frontend.Backends = backends
}
if service.Backend != nil && len(frontends) > 0 {
service.Backend.Frontends = frontends
}
}
return spec, nil
}