Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
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
2 changes: 2 additions & 0 deletions cli/azd/.vscode/cspell.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ words:
- unmarshals
- usgovcloudapi
- jdbc
- bicept
- springframework
languageSettings:
- languageId: go
ignoreRegExpList:
Expand Down
7 changes: 4 additions & 3 deletions cli/azd/cmd/show.go
Original file line number Diff line number Diff line change
Expand Up @@ -421,12 +421,13 @@ func showModelDeployment(
if account.Properties.Endpoint != nil {
console.Message(ctx, color.HiMagentaString("%s (Azure AI Services Model Deployment)", id.Name))
console.Message(ctx, " Endpoint:")
console.Message(ctx, color.HiBlueString(fmt.Sprintf(" AZURE_OPENAI_ENDPOINT=%s", *account.Properties.Endpoint)))
console.Message(ctx,
color.HiBlueString(fmt.Sprintf(" %s=%s", internal.EnvNameAzureOpenAiUrl, *account.Properties.Endpoint)))
console.Message(ctx, " Access:")
console.Message(ctx, " Keyless (Microsoft Entra ID)")
//nolint:lll
console.Message(ctx, output.WithGrayFormat(" Hint: To access locally, use DefaultAzureCredential. To learn more, visit https://learn.microsoft.com/en-us/azure/ai-services/openai/supported-languages"))

console.Message(ctx, output.WithGrayFormat(" Hint: To access locally, use DefaultAzureCredential. "+
"To learn more, visit https://learn.microsoft.com/en-us/azure/ai-services/openai/supported-languages"))
console.Message(ctx, "")
}

Expand Down
6 changes: 6 additions & 0 deletions cli/azd/internal/appdetect/appdetect.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,9 @@ func (f Dependency) IsWebUIFramework() bool {
return false
}

type RawProject interface {
}

// A type of database that is inferred through heuristics while scanning project information.
type DatabaseDep string

Expand Down Expand Up @@ -139,6 +142,9 @@ type Project struct {
// Dependencies scanned in the project.
Dependencies []Dependency

// RawProject scanned in the project.
RawProject RawProject

// Experimental: Database dependencies inferred through heuristics while scanning dependencies in the project.
DatabaseDeps []DatabaseDep

Expand Down
9 changes: 8 additions & 1 deletion cli/azd/internal/appdetect/appdetect_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,14 @@ func TestDetect(t *testing.T) {
tt.want[i].Path = filepath.Join(dir, tt.want[i].Path)
}

require.Equal(t, tt.want, projects)
require.Equal(t, len(tt.want), len(projects))
for i := range tt.want {
require.Equal(t, tt.want[i].Language, projects[i].Language)
require.Equal(t, tt.want[i].Path, projects[i].Path)
require.Equal(t, tt.want[i].DetectionRule, projects[i].DetectionRule)
require.Equal(t, tt.want[i].Dependencies, projects[i].Dependencies)
require.Equal(t, tt.want[i].DatabaseDeps, projects[i].DatabaseDeps)
}
})
}
}
Expand Down
26 changes: 13 additions & 13 deletions cli/azd/internal/appdetect/java.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (

type javaDetector struct {
mvnCli *maven.Cli
rootProjects []mavenProject
rootProjects []MavenProject
}

func (jd *javaDetector) Language() Language {
Expand All @@ -41,7 +41,7 @@ func (jd *javaDetector) DetectProject(ctx context.Context, path string, entries
return nil, nil
}

var currentRoot *mavenProject
var currentRoot *MavenProject
for _, rootProject := range jd.rootProjects {
// we can say that the project is in the root project if the path is under the project
if inRoot := strings.HasPrefix(pomFile, rootProject.path); inRoot {
Expand All @@ -66,8 +66,8 @@ func (jd *javaDetector) DetectProject(ctx context.Context, path string, entries
return nil, nil
}

// mavenProject represents the top-level structure of a Maven POM file.
type mavenProject struct {
// MavenProject represents the top-level structure of a Maven POM file.
type MavenProject struct {
XmlName xml.Name `xml:"project"`
Parent parent `xml:"parent"`
Modules []string `xml:"modules>module"` // Capture the modules
Expand Down Expand Up @@ -109,37 +109,37 @@ type plugin struct {
Version string `xml:"version"`
}

func readMavenProject(ctx context.Context, mvnCli *maven.Cli, filePath string) (*mavenProject, error) {
func readMavenProject(ctx context.Context, mvnCli *maven.Cli, filePath string) (*MavenProject, error) {
effectivePom, err := mvnCli.EffectivePom(ctx, filePath)
if err != nil {
return nil, err
}
var project mavenProject
var project MavenProject
if err := xml.Unmarshal([]byte(effectivePom), &project); err != nil {
return nil, fmt.Errorf("parsing xml: %w", err)
}
project.path = filepath.Dir(filePath)
return &project, nil
}

func detectDependencies(mavenProject *mavenProject, project *Project) (*Project, error) {
func detectDependencies(mavenProject *MavenProject, project *Project) (*Project, error) {
databaseDepMap := map[DatabaseDep]struct{}{}
for _, dep := range mavenProject.Dependencies {
if dep.GroupId == "com.mysql" && dep.ArtifactId == "mysql-connector-j" {
name := dep.GroupId + ":" + dep.ArtifactId
switch name {
case "com.mysql:mysql-connector-j":
databaseDepMap[DbMySql] = struct{}{}
}

if dep.GroupId == "org.postgresql" && dep.ArtifactId == "postgresql" {
case "org.postgresql:postgresql",
"com.azure.spring:spring-cloud-azure-starter-jdbc-postgresql":
databaseDepMap[DbPostgres] = struct{}{}
}
}

if len(databaseDepMap) > 0 {
project.DatabaseDeps = slices.SortedFunc(maps.Keys(databaseDepMap),
func(a, b DatabaseDep) int {
return strings.Compare(string(a), string(b))
})
}

project.RawProject = *mavenProject
return project, nil
}
3 changes: 3 additions & 0 deletions cli/azd/internal/appdetect/java_test.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package appdetect

import (
Expand Down
27 changes: 14 additions & 13 deletions cli/azd/internal/cmd/add/add_preview.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"strings"
"text/tabwriter"

"github.com/azure/azure-dev/cli/azd/internal"
"github.com/azure/azure-dev/cli/azd/pkg/infra/provisioning"
"github.com/azure/azure-dev/cli/azd/pkg/input"
"github.com/azure/azure-dev/cli/azd/pkg/output"
Expand Down Expand Up @@ -41,31 +42,31 @@ func Metadata(r *project.ResourceConfig) resourceMeta {
case project.ResourceTypeDbRedis:
res.AzureResourceType = "Microsoft.Cache/redis"
res.UseEnvVars = []string{
"REDIS_HOST",
"REDIS_PORT",
"REDIS_ENDPOINT",
"REDIS_PASSWORD",
"REDIS_URL",
internal.EnvNameRedisHost,
internal.EnvNameRedisPort,
internal.EnvNameRedisEndpoint,
internal.EnvNameRedisPassword,
internal.EnvNameRedisUrl,
}
case project.ResourceTypeDbPostgres:
res.AzureResourceType = "Microsoft.DBforPostgreSQL/flexibleServers/databases"
res.UseEnvVars = []string{
"POSTGRES_HOST",
"POSTGRES_USERNAME",
"POSTGRES_DATABASE",
"POSTGRES_PASSWORD",
"POSTGRES_PORT",
"POSTGRES_URL",
internal.EnvNamePostgresHost,
internal.EnvNamePostgresUsername,
internal.EnvNamePostgresDatabase,
internal.EnvNamePostgresPassword,
internal.EnvNamePostgresPort,
internal.EnvNamePostgresUrl,
}
case project.ResourceTypeDbMongo:
res.AzureResourceType = "Microsoft.DocumentDB/databaseAccounts/mongodbDatabases"
res.UseEnvVars = []string{
"MONGODB_URL",
internal.EnvNameMongoDbUrl,
}
case project.ResourceTypeOpenAiModel:
res.AzureResourceType = "Microsoft.CognitiveServices/accounts/deployments"
res.UseEnvVars = []string{
"AZURE_OPENAI_ENDPOINT",
internal.EnvNameAzureOpenAiUrl,
}
}
return res
Expand Down
29 changes: 29 additions & 0 deletions cli/azd/internal/env.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package internal

// todo: keep single source for env name in go lang code and resources.bicept

const EnvNamePostgresHost = "POSTGRES_HOST"
const EnvNamePostgresPort = "POSTGRES_PORT"
const EnvNamePostgresUrl = "POSTGRES_URL"
const EnvNamePostgresDatabase = "POSTGRES_DATABASE"
const EnvNamePostgresUsername = "POSTGRES_USERNAME"

// nolint:gosec
const EnvNamePostgresPassword = "POSTGRES_PASSWORD"

const EnvNameRedisHost = "REDIS_HOST"
const EnvNameRedisPort = "REDIS_PORT"
const EnvNameRedisEndpoint = "REDIS_ENDPOINT"
const EnvNameRedisPassword = "REDIS_PASSWORD"
const EnvNameRedisUrl = "REDIS_URL"

const EnvNameMongoDbUrl = "MONGODB_URL"

const EnvNameAzureOpenAiUrl = "AZURE_OPENAI_ENDPOINT"

func ToEnvPlaceHolder(envName string) string {
return "${" + envName + "}"
}
Loading