Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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: 1 addition & 1 deletion .github/workflows/go-test-for-sjad-branch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,4 @@ jobs:
- name: Run tests
run: |
cd ./cli/azd
go test $(go list ./... | grep -v github.com/azure/azure-dev/cli/azd/test/functional) -cover -v
go test $(go list ./... | grep -v github.com/azure/azure-dev/cli/azd/test/functional | grep -v github.com/azure/azure-dev/cli/azd/pkg/infra/provisioning/terraform) -cover -v
1 change: 1 addition & 0 deletions cli/azd/.vscode/cspell.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ words:
- sjad
- configserver
- chardata
- webflux
languageSettings:
- languageId: go
ignoreRegExpList:
Expand Down
3 changes: 2 additions & 1 deletion cli/azd/internal/appdetect/appdetect.go
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ func (a AzureDepStorageAccount) ResourceDisplay() string {

type Metadata struct {
ApplicationName string
ServerPort string
ServerPort int
DatabaseNameInPropertySpringDatasourceUrl map[DatabaseDep]string
ContainsDependencySpringCloudAzureStarter bool
ContainsDependencySpringCloudAzureStarterJdbcPostgresql bool
Expand All @@ -204,6 +204,7 @@ type Metadata struct {
ContainsDependencySpringCloudEurekaClient bool
ContainsDependencySpringCloudConfigServer bool
ContainsDependencySpringCloudConfigClient bool
ContainsDependencyAboutEmbeddedWebServer bool
}

type Project struct {
Expand Down
12 changes: 12 additions & 0 deletions cli/azd/internal/appdetect/appdetect_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ func TestDetect(t *testing.T) {
Options: map[string]interface{}{
JavaProjectOptionParentPomDir: filepath.Join(dir, "java-multimodules"),
},
Metadata: Metadata{
ContainsDependencyAboutEmbeddedWebServer: true,
},
},
{
Language: JavaScript,
Expand Down Expand Up @@ -180,6 +183,9 @@ func TestDetect(t *testing.T) {
Options: map[string]interface{}{
JavaProjectOptionParentPomDir: filepath.Join(dir, "java-multimodules"),
},
Metadata: Metadata{
ContainsDependencyAboutEmbeddedWebServer: true,
},
},
},
},
Expand Down Expand Up @@ -234,6 +240,9 @@ func TestDetect(t *testing.T) {
Options: map[string]interface{}{
JavaProjectOptionParentPomDir: filepath.Join(dir, "java-multimodules"),
},
Metadata: Metadata{
ContainsDependencyAboutEmbeddedWebServer: true,
},
},
},
},
Expand Down Expand Up @@ -291,6 +300,9 @@ func TestDetect(t *testing.T) {
Options: map[string]interface{}{
JavaProjectOptionParentPomDir: filepath.Join(dir, "java-multimodules"),
},
Metadata: Metadata{
ContainsDependencyAboutEmbeddedWebServer: true,
},
},
{
Language: Python,
Expand Down
27 changes: 26 additions & 1 deletion cli/azd/internal/appdetect/spring_boot.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"maps"
"regexp"
"slices"
"strconv"
"strings"
)

Expand Down Expand Up @@ -407,6 +408,7 @@ func detectMetadata(azdProject *Project, springBootProject *SpringBootProject) {
detectDependencySpringCloudAzureStarterJdbcPostgresql(azdProject, springBootProject)
detectDependencySpringCloudConfig(azdProject, springBootProject)
detectDependencySpringCloudEureka(azdProject, springBootProject)
detectDependencyAboutEmbeddedWebServer(azdProject, springBootProject)
}

func detectPropertySpringCloudAzureCosmosDatabase(azdProject *Project, springBootProject *SpringBootProject) {
Expand Down Expand Up @@ -553,7 +555,11 @@ func detectPropertySpringApplicationName(azdProject *Project, springBootProject
func detectPropertyServerPort(azdProject *Project, springBootProject *SpringBootProject) {
var targetPropertyName = "server.port"
if serverPort, ok := springBootProject.applicationProperties[targetPropertyName]; ok {
azdProject.Metadata.ServerPort = serverPort
if port, err := strconv.Atoi(serverPort); err == nil {
Comment thread
rujche marked this conversation as resolved.
azdProject.Metadata.ServerPort = port
} else {
log.Printf("Failed to convert the value of server.port to int. %v.", err)
}
}
}

Expand Down Expand Up @@ -589,6 +595,25 @@ func detectDependencySpringCloudConfig(azdProject *Project, springBootProject *S
}
}

func detectDependencyAboutEmbeddedWebServer(azdProject *Project, springBootProject *SpringBootProject) {
var targetGroupId = "org.springframework.boot"
var targetArtifactIds = []string{
"spring-boot-starter-web",
"spring-boot-starter-webflux",
"spring-boot-starter-tomcat",
"spring-boot-starter-jetty",
"spring-boot-starter-undertow",
"spring-boot-starter-reactor-netty",
Comment thread
haoozhang marked this conversation as resolved.
}
for _, targetArtifactId := range targetArtifactIds {
if hasDependency(springBootProject, targetGroupId, targetArtifactId) {
azdProject.Metadata.ContainsDependencyAboutEmbeddedWebServer = true
logMetadataUpdated("ContainsDependencyAboutEmbeddedWebServer = true")
return
}
}
}

func logServiceAddedAccordingToMavenDependency(resourceName, groupId string, artifactId string) {
logServiceAddedAccordingToMavenDependencyAndExtraCondition(resourceName, groupId, artifactId, "")
}
Expand Down
106 changes: 106 additions & 0 deletions cli/azd/internal/appdetect/spring_boot_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package appdetect

import (
"context"
"path/filepath"
"testing"

"github.com/azure/azure-dev/cli/azd/pkg/exec"
"github.com/azure/azure-dev/cli/azd/pkg/tools/maven"
)

func TestGetDatabaseName(t *testing.T) {
Expand Down Expand Up @@ -62,3 +67,104 @@ func TestIsValidDatabaseName(t *testing.T) {
})
}
}

func TestDetectDependencyAboutEmbeddedWebServer(t *testing.T) {
tests := []struct {
name string
testPoms []testPom
expected bool
}{
{
name: "no web dependency",
testPoms: []testPom{
{
pomFilePath: "pom.xml",
pomContentString: `
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>example-project</artifactId>
<version>1.0.0</version>
</project>
`,
},
},
expected: false,
},
{
name: "has dependency: spring-boot-starter-web",
testPoms: []testPom{
{
pomFilePath: "pom.xml",
pomContentString: `
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>example-project</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
</project>
`,
},
},
expected: true,
},
{
name: "has dependency: spring-boot-starter-webflux",
testPoms: []testPom{
{
pomFilePath: "pom.xml",
pomContentString: `
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>example-project</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
</project>
`,
},
},
expected: true,
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
workingDir, err := prepareTestPomFiles(tt.testPoms)
if err != nil {
t.Fatalf("%v", err)
}
for _, testPom := range tt.testPoms {
pomFilePath := filepath.Join(workingDir, testPom.pomFilePath)
mavenProject, err := createMavenProject(context.TODO(), maven.NewCli(exec.NewCommandRunner(nil)),
pomFilePath)
if err != nil {
t.Fatalf("%v", err)
}
project := Project{
Language: Java,
Path: pomFilePath,
DetectionRule: "Inferred by presence of: pom.xml",
}
detectAzureDependenciesByAnalyzingSpringBootProject(mavenProject, &project)
if project.Metadata.ContainsDependencyAboutEmbeddedWebServer != tt.expected {
t.Errorf("\nExpected: %v\nActual: %v", tt.expected,
project.Metadata.ContainsDependencyAboutEmbeddedWebServer)
}
}
})
}
}
18 changes: 5 additions & 13 deletions cli/azd/internal/repository/app_init_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ package repository
import (
"context"
"fmt"
"github.com/azure/azure-dev/cli/azd/internal/scaffold"
"os"
"path/filepath"
"strings"
"testing"

"github.com/azure/azure-dev/cli/azd/internal"
"github.com/azure/azure-dev/cli/azd/internal/appdetect"
"github.com/azure/azure-dev/cli/azd/internal/scaffold"
"github.com/azure/azure-dev/cli/azd/pkg/input"
"github.com/azure/azure-dev/cli/azd/pkg/project"
"github.com/stretchr/testify/require"
Expand Down Expand Up @@ -98,13 +98,7 @@ func TestInitializer_prjConfigFromDetect(t *testing.T) {
},
},
},
interactions: []string{
// prompt for port -- hit multiple validation cases
"notAnInteger",
"-2",
"65536",
"1234",
},
interactions: []string{},
want: project.ProjectConfig{
Services: map[string]*project.ServiceConfig{
"dotnet": {
Expand All @@ -118,11 +112,9 @@ func TestInitializer_prjConfigFromDetect(t *testing.T) {
},
Resources: map[string]*project.ResourceConfig{
"dotnet": {
Type: project.ResourceTypeHostContainerApp,
Name: "dotnet",
Props: project.ContainerAppProps{
Port: 1234,
},
Type: project.ResourceTypeHostContainerApp,
Name: "dotnet",
Props: project.ContainerAppProps{},
},
},
},
Expand Down
38 changes: 22 additions & 16 deletions cli/azd/internal/repository/infra_confirm.go
Original file line number Diff line number Diff line change
Expand Up @@ -275,17 +275,10 @@ func GetOrPromptPort(
ctx context.Context,
name string,
svc appdetect.Project) (int, error) {
if svc.Metadata.ServerPort != "" {
return strconv.Atoi(svc.Metadata.ServerPort)
}
if svc.Docker == nil || svc.Docker.Path == "" { // using default builder from azd
if svc.Language == appdetect.Java || svc.Language == appdetect.DotNet {
if svc.Metadata.ContainsDependencySpringCloudEurekaServer {
return 8761, nil
}
if svc.Metadata.ContainsDependencySpringCloudConfigServer {
return 8888, nil
}
if svc.Language == appdetect.Java {
return getJavaApplicationPort(svc), nil
} else if svc.Language == appdetect.DotNet {
return 8080, nil
}
return 80, nil
Expand All @@ -296,12 +289,8 @@ func GetOrPromptPort(
switch len(ports) {
case 1: // only one port was exposed, that's the one
return ports[0].Number, nil
case 0: // no ports exposed, prompt for port
port, err := promptPortNumber(console, ctx, "What port does '"+name+"' listen on?")
if err != nil {
return -1, err
}
return port, nil
case 0: // no ports exposed, not expose port
return 0, nil
}

// multiple ports exposed, prompt for selection
Expand Down Expand Up @@ -332,6 +321,23 @@ func GetOrPromptPort(
return port, nil
}

func getJavaApplicationPort(svc appdetect.Project) int {
if !shouldExposePort(svc) {
return 0
}
if svc.Metadata.ServerPort != 0 {
return svc.Metadata.ServerPort
} else {
return 8080
}
}

func shouldExposePort(svc appdetect.Project) bool {
return svc.Metadata.ContainsDependencySpringCloudEurekaServer ||
svc.Metadata.ContainsDependencySpringCloudConfigServer ||
svc.Metadata.ContainsDependencyAboutEmbeddedWebServer
}

func (i *Initializer) buildInfraSpecByAzureDep(
ctx context.Context,
azureDep appdetect.AzureDep,
Expand Down
Loading