Skip to content

Commit 27a0b82

Browse files
authored
Keep compose as-is (#523)
* wip: keep compose as-is separate fixup from conversion deprecate old compose proto messages revert buf.gen.yaml remove obsolete functions add healthcheck times to test add type aliases Fix getUnreferencedManagedResources tests Keep the yaml Update cli.nix vendorHash remarks Update src/pkg/cli/client/byoc/do/byoc.go Update src/protos/io/defang/v1/fabric.proto For now, use Ports in ServiceInfo * fix unit test * update cli.nix * move compose constants to compose package
1 parent 0acb864 commit 27a0b82

File tree

77 files changed

+1712
-1444
lines changed

Some content is hidden

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

77 files changed

+1712
-1444
lines changed

src/cmd/cli/command/commands.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,10 @@ import (
2525
defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1"
2626
"github.com/aws/smithy-go"
2727
"github.com/bufbuild/connect-go"
28-
proj "github.com/compose-spec/compose-go/v2/types"
28+
composeTypes "github.com/compose-spec/compose-go/v2/types"
2929
"github.com/spf13/cobra"
3030
)
3131

32-
const DEFANG_PORTAL_HOST = "portal.defang.dev"
33-
const SERVICE_PORTAL_URL = "https://" + DEFANG_PORTAL_HOST + "/service"
34-
3532
const authNeeded = "auth-needed" // annotation to indicate that a command needs authorization
3633
var authNeededAnnotation = map[string]string{authNeeded: ""}
3734

@@ -614,7 +611,7 @@ var newCmd = &cobra.Command{
614611
RunE: generateCmd.RunE,
615612
}
616613

617-
func collectUnsetEnvVars(project *proj.Project) []string {
614+
func collectUnsetEnvVars(project *composeTypes.Project) []string {
618615
var envVars []string
619616
if project != nil {
620617
for _, service := range project.Services {

src/cmd/cli/command/compose.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,19 @@ import (
1919
"github.com/spf13/cobra"
2020
)
2121

22-
func isManagedService(service *defangv1.Service) bool {
23-
if service == nil {
22+
func isManagedService(service compose.ServiceConfig) bool {
23+
if service.Extensions == nil {
2424
return false
2525
}
2626

27-
return service.StaticFiles != nil || service.Redis != nil || service.Postgres != nil
27+
return service.Extensions["x-defang-static-files"] != nil || service.Extensions["x-defang-redis"] != nil || service.Extensions["x-defang-postgres"] != nil
2828
}
2929

30-
func GetUnreferencedManagedResources(serviceInfos []*defangv1.ServiceInfo) []string {
30+
func getUnreferencedManagedResources(serviceInfos compose.Services) []string {
3131
managedResources := make([]string, 0)
3232
for _, service := range serviceInfos {
33-
if isManagedService(service.Service) {
34-
managedResources = append(managedResources, service.Service.Name)
33+
if isManagedService(service) {
34+
managedResources = append(managedResources, service.Name)
3535
}
3636
}
3737

@@ -83,7 +83,7 @@ func makeComposeUpCmd() *cobra.Command {
8383

8484
printPlaygroundPortalServiceURLs(deploy.Services)
8585

86-
var managedResources = GetUnreferencedManagedResources(deploy.Services)
86+
var managedResources = getUnreferencedManagedResources(project.Services)
8787
if len(managedResources) > 0 {
8888
term.Warnf("Defang cannot monitor status of the following managed service(s): %v.\n To check if the managed service is up, check the status of the service which depends on it.", managedResources)
8989
}

src/cmd/cli/command/compose_test.go

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,75 +3,83 @@ package command
33
import (
44
"testing"
55

6-
defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1"
6+
"github.com/compose-spec/compose-go/v2/types"
77
)
88

99
func TestGetUnreferencedManagedResources(t *testing.T) {
1010

1111
t.Run("no services", func(t *testing.T) {
12-
project := []*defangv1.ServiceInfo{}
13-
managed := GetUnreferencedManagedResources(project)
12+
project := types.Services{}
13+
14+
managed := getUnreferencedManagedResources(project)
1415
if len(managed) != 0 {
1516
t.Errorf("Expected 0 managed resources, got %d (%v)", len(managed), managed)
1617
}
1718
})
1819

1920
t.Run("one service all managed", func(t *testing.T) {
20-
project := []*defangv1.ServiceInfo{}
21-
project = append(project, &defangv1.ServiceInfo{
22-
Service: &defangv1.Service{Name: "service1", Postgres: &defangv1.Postgres{}}})
21+
project := types.Services{
22+
"service1": types.ServiceConfig{
23+
Extensions: map[string]any{"x-defang-postgres": true},
24+
},
25+
}
2326

24-
managed := GetUnreferencedManagedResources(project)
27+
managed := getUnreferencedManagedResources(project)
2528
if len(managed) != 1 {
2629
t.Errorf("Expected 1 managed resource, got %d (%v)", len(managed), managed)
2730
}
2831
})
2932

3033
t.Run("one service unmanaged", func(t *testing.T) {
31-
project := []*defangv1.ServiceInfo{}
32-
project = append(project, &defangv1.ServiceInfo{
33-
Service: &defangv1.Service{Name: "service1"}})
34+
project := types.Services{
35+
"service1": types.ServiceConfig{},
36+
}
3437

35-
managed := GetUnreferencedManagedResources(project)
38+
managed := getUnreferencedManagedResources(project)
3639
if len(managed) != 0 {
3740
t.Errorf("Expected 0 managed resource, got %d (%v)", len(managed), managed)
3841
}
3942
})
4043

4144
t.Run("one service unmanaged, one service managed", func(t *testing.T) {
42-
project := []*defangv1.ServiceInfo{}
43-
project = append(project, &defangv1.ServiceInfo{
44-
Service: &defangv1.Service{Name: "service1"}})
45-
project = append(project, &defangv1.ServiceInfo{
46-
Service: &defangv1.Service{Name: "service2", Postgres: &defangv1.Postgres{}}})
45+
project := types.Services{
46+
"service1": types.ServiceConfig{},
47+
"service2": types.ServiceConfig{
48+
Extensions: map[string]any{"x-defang-postgres": true},
49+
},
50+
}
4751

48-
managed := GetUnreferencedManagedResources(project)
52+
managed := getUnreferencedManagedResources(project)
4953
if len(managed) != 1 {
5054
t.Errorf("Expected 1 managed resource, got %d (%v)", len(managed), managed)
5155
}
5256
})
5357

5458
t.Run("two service two unmanaged", func(t *testing.T) {
55-
project := []*defangv1.ServiceInfo{}
56-
project = append(project, &defangv1.ServiceInfo{
57-
Service: &defangv1.Service{Name: "service1"}})
58-
project = append(project, &defangv1.ServiceInfo{
59-
Service: &defangv1.Service{Name: "service2"}})
59+
project := types.Services{
60+
"service1": types.ServiceConfig{},
61+
"service2": types.ServiceConfig{},
62+
}
6063

61-
managed := GetUnreferencedManagedResources(project)
64+
managed := getUnreferencedManagedResources(project)
6265
if len(managed) != 0 {
6366
t.Errorf("Expected 0 managed resource, got %d (%v)", len(managed), managed)
6467
}
6568
})
6669

6770
t.Run("one service two managed", func(t *testing.T) {
68-
project := []*defangv1.ServiceInfo{}
69-
project = append(project, &defangv1.ServiceInfo{
70-
Service: &defangv1.Service{Name: "service1", Postgres: &defangv1.Postgres{}, Redis: &defangv1.Redis{}}})
71+
project := types.Services{
72+
"service1": types.ServiceConfig{
73+
Extensions: map[string]any{"x-defang-postgres": true},
74+
},
75+
"service2": types.ServiceConfig{
76+
Extensions: map[string]any{"x-defang-redis": true},
77+
},
78+
}
7179

72-
managed := GetUnreferencedManagedResources(project)
73-
if len(managed) != 1 {
74-
t.Errorf("Expected 1 managed resource, got %d (%s)", len(managed), managed)
80+
managed := getUnreferencedManagedResources(project)
81+
if len(managed) != 2 {
82+
t.Errorf("Expected 2 managed resource, got %d (%s)", len(managed), managed)
7583
}
7684
})
7785
}

src/cmd/cli/command/deploymentinfo.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
package command
22

33
import (
4-
"fmt"
5-
64
"github.com/DefangLabs/defang/src/pkg/cli"
75
cliClient "github.com/DefangLabs/defang/src/pkg/cli/client"
86
"github.com/DefangLabs/defang/src/pkg/term"
97
defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1"
108
)
119

10+
const DEFANG_PORTAL_HOST = "portal.defang.dev"
11+
const SERVICE_PORTAL_URL = "https://" + DEFANG_PORTAL_HOST + "/service"
12+
1213
func printPlaygroundPortalServiceURLs(serviceInfos []*defangv1.ServiceInfo) {
1314
// We can only show services deployed to the prod1 defang SaaS environment.
1415
if provider == cliClient.ProviderDefang && cluster == cli.DefaultCluster {
1516
term.Info("Monitor your services' status in the defang portal")
1617
for _, serviceInfo := range serviceInfos {
17-
fmt.Println(" -", SERVICE_PORTAL_URL+"/"+serviceInfo.Service.Name)
18+
term.Println(" -", SERVICE_PORTAL_URL+"/"+serviceInfo.Service.Name)
1819
}
1920
}
2021
}
@@ -36,13 +37,13 @@ func printEndpoints(serviceInfos []*defangv1.ServiceInfo) {
3637
if serviceInfo.Service.Ports[i].Mode == defangv1.Mode_INGRESS {
3738
endpoint = "https://" + endpoint
3839
}
39-
fmt.Println(" -", endpoint)
40+
term.Println(" -", endpoint)
4041
}
41-
if serviceInfo.Service.Domainname != "" {
42+
if serviceInfo.Domainname != "" {
4243
if serviceInfo.ZoneId != "" {
43-
fmt.Println(" -", "https://"+serviceInfo.Service.Domainname)
44+
term.Println(" -", "https://"+serviceInfo.Domainname)
4445
} else {
45-
fmt.Println(" -", "https://"+serviceInfo.Service.Domainname+" (after `defang cert generate` to get a TLS certificate)")
46+
term.Println(" -", "https://"+serviceInfo.Domainname+" (after `defang cert generate` to get a TLS certificate)")
4647
}
4748
}
4849
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package command
2+
3+
import (
4+
"bytes"
5+
"testing"
6+
7+
"github.com/DefangLabs/defang/src/pkg/cli"
8+
cliClient "github.com/DefangLabs/defang/src/pkg/cli/client"
9+
"github.com/DefangLabs/defang/src/pkg/term"
10+
defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1"
11+
)
12+
13+
func TestPrintPlaygroundPortalServiceURLs(t *testing.T) {
14+
defaultTerm := term.DefaultTerm
15+
t.Cleanup(func() {
16+
term.DefaultTerm = defaultTerm
17+
})
18+
19+
var stdout, stderr bytes.Buffer
20+
term.DefaultTerm = term.NewTerm(&stdout, &stderr)
21+
22+
provider = cliClient.ProviderDefang
23+
cluster = cli.DefaultCluster
24+
printPlaygroundPortalServiceURLs([]*defangv1.ServiceInfo{
25+
{
26+
Service: &defangv1.Service{Name: "service1"},
27+
}})
28+
const want = ` * Monitor your services' status in the defang portal
29+
- https://portal.defang.dev/service/service1
30+
`
31+
if got := stdout.String(); got != want {
32+
t.Errorf("got %q, want %q", got, want)
33+
}
34+
}
35+
36+
func TestPrintEndpoints(t *testing.T) {
37+
defaultTerm := term.DefaultTerm
38+
t.Cleanup(func() {
39+
term.DefaultTerm = defaultTerm
40+
})
41+
42+
var stdout, stderr bytes.Buffer
43+
term.DefaultTerm = term.NewTerm(&stdout, &stderr)
44+
45+
printEndpoints([]*defangv1.ServiceInfo{
46+
{
47+
Service: &defangv1.Service{
48+
Name: "service1",
49+
Ports: []*defangv1.Port{
50+
{Mode: defangv1.Mode_INGRESS},
51+
{Mode: defangv1.Mode_HOST},
52+
},
53+
},
54+
Status: "UNKNOWN",
55+
Endpoints: []string{
56+
"example.com",
57+
"service1.internal",
58+
},
59+
}})
60+
const want = ` * Service service1 has status UNKNOWN and will be available at:
61+
- https://example.com
62+
- service1.internal
63+
`
64+
if got := stdout.String(); got != want {
65+
t.Errorf("got %q, want %q", got, want)
66+
}
67+
}

src/pkg/cli/cert.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/DefangLabs/defang/src/pkg"
1515
"github.com/DefangLabs/defang/src/pkg/cert"
1616
cliClient "github.com/DefangLabs/defang/src/pkg/cli/client"
17+
"github.com/DefangLabs/defang/src/pkg/cli/compose"
1718
"github.com/DefangLabs/defang/src/pkg/dns"
1819
"github.com/DefangLabs/defang/src/pkg/spinner"
1920
"github.com/DefangLabs/defang/src/pkg/term"
@@ -76,29 +77,29 @@ var (
7677
)
7778

7879
func GenerateLetsEncryptCert(ctx context.Context, client cliClient.Client) error {
79-
projectName, err := client.LoadProjectName(ctx)
80+
project, err := client.LoadProject(ctx)
8081
if err != nil {
8182
return err
8283
}
83-
term.Debugf("Generating TLS cert for project %q", projectName)
84+
term.Debugf("Generating TLS cert for project %q", project.Name)
8485

8586
services, err := client.GetServices(ctx)
8687
if err != nil {
8788
return err
8889
}
8990

9091
cnt := 0
91-
for _, service := range services.Services {
92-
if service.Service != nil && service.Service.Domainname != "" && service.ZoneId == "" {
92+
for _, serviceInfo := range services.Services {
93+
if service, ok := project.Services[serviceInfo.Service.Name]; ok && service.DomainName != "" && serviceInfo.ZoneId == "" {
9394
cnt++
94-
targets := []string{service.PublicFqdn}
95-
for i, endpoint := range service.Endpoints {
96-
if service.Service.Ports[i].Mode == defangv1.Mode_INGRESS {
95+
targets := []string{serviceInfo.PublicFqdn}
96+
for i, endpoint := range serviceInfo.Endpoints {
97+
if service.Ports[i].Mode == compose.Mode_INGRESS {
9798
targets = append(targets, endpoint)
9899
}
99100
}
100-
term.Debugf("Found service %v with domain %v and targets %v", service.Service.Name, service.Service.Domainname, targets)
101-
generateCert(ctx, service.Service.Domainname, targets, client)
101+
term.Debugf("Found service %v with domain %v and targets %v", service.Name, service.DomainName, targets)
102+
generateCert(ctx, service.DomainName, targets, client)
102103
}
103104
}
104105
if cnt == 0 {

src/pkg/cli/cert_test.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,6 @@ import (
1414
"time"
1515
)
1616

17-
type dnsRequest struct {
18-
Type string
19-
Domain string
20-
}
2117
type tryResult struct {
2218
result *http.Response
2319
err error

0 commit comments

Comments
 (0)