Skip to content
Draft
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
30 changes: 14 additions & 16 deletions src/pkg/cli/client/byoc/gcp/byoc.go
Original file line number Diff line number Diff line change
Expand Up @@ -558,8 +558,8 @@ func (b *ByocGcp) Subscribe(ctx context.Context, req *defangv1.SubscribeRequest)
}

// TODO: update stack (1st param) to b.PulumiStack
subscribeStream.AddJobStatusUpdate("", req.Project, req.Etag, req.Services)
subscribeStream.AddServiceStatusUpdate("", req.Project, req.Etag, req.Services)
subscribeStream.AddJobStatusUpdate(b.PulumiStack, req.Project, req.Etag, req.Services)
subscribeStream.AddServiceStatusUpdate(b.PulumiStack, req.Project, req.Etag, req.Services)
subscribeStream.StartFollow(time.Now())
return subscribeStream, nil
}
Expand Down Expand Up @@ -598,14 +598,12 @@ func (b *ByocGcp) getLogStream(ctx context.Context, gcpLogsClient GcpLogsClient,
if execName == "." {
execName = ""
}
logStream.AddJobExecutionLog(execName) // CD log when there is an execution name
// TODO: update stack (1st param) to b.PulumiStack
logStream.AddJobLog("", req.Project, etag, req.Services) // Kaniko or CD logs when there is no execution name
logStream.AddCloudBuildLog("", req.Project, etag, req.Services) // CloudBuild logs
logStream.AddJobExecutionLog(execName) // CD log when there is an execution name
logStream.AddJobLog(b.PulumiStack, req.Project, etag, req.Services) // Kaniko or CD logs when there is no execution name
logStream.AddCloudBuildLog(b.PulumiStack, req.Project, etag, req.Services) // CloudBuild logs
}
if logs.LogType(req.LogType).Has(logs.LogTypeRun) {
// TODO: update stack (1st param) to b.PulumiStack
logStream.AddServiceLog("", req.Project, etag, req.Services) // Service logs
logStream.AddServiceLog(b.PulumiStack, req.Project, etag, req.Services) // Service logs
}
logStream.AddFilter(req.Pattern)
if req.Follow {
Expand Down Expand Up @@ -704,7 +702,7 @@ func (e ConflictDelegateDomainError) Error() string {

func (b *ByocGcp) PrepareDomainDelegation(ctx context.Context, req client.PrepareDomainDelegationRequest) (*client.PrepareDomainDelegationResponse, error) {
term.Debugf("Preparing domain delegation for %s", req.DelegateDomain)
name := "defang-" + dns.SafeLabel(req.DelegateDomain)
name := "defang-" + gcp.SafeZoneName(req.DelegateDomain)
if zone, err := b.driver.EnsureDNSZoneExists(ctx, name, req.DelegateDomain, "defang delegate domain"); err != nil {
if apiErr := new(googleapi.Error); errors.As(err, &apiErr) {
if strings.Contains(apiErr.Message, "Please verify ownership of") ||
Expand Down Expand Up @@ -806,17 +804,17 @@ func (b *ByocGcp) createDeploymentLogQuery(req *defangv1.DebugRequest) string {
}

// Logs TODO: update stack (1st param) to b.PulumiStack
query.AddJobLogQuery("", req.Project, req.Etag, req.Services) // Kaniko OR CD logs
query.AddServiceLogQuery("", req.Project, req.Etag, req.Services) // Cloudrun service logs
query.AddCloudBuildLogQuery("", req.Project, req.Etag, req.Services) // CloudBuild logs
query.AddJobLogQuery(b.PulumiStack, req.Project, req.Etag, req.Services) // Kaniko OR CD logs
query.AddServiceLogQuery(b.PulumiStack, req.Project, req.Etag, req.Services) // Cloudrun service logs
query.AddCloudBuildLogQuery(b.PulumiStack, req.Project, req.Etag, req.Services) // CloudBuild logs
query.AddSince(since)
query.AddUntil(until)

// Service status updates TODO: update stack (1st param) to b.PulumiStack
query.AddJobStatusUpdateRequestQuery("", req.Project, req.Etag, req.Services)
query.AddJobStatusUpdateResponseQuery("", req.Project, req.Etag, req.Services)
query.AddServiceStatusRequestUpdate("", req.Project, req.Etag, req.Services)
query.AddServiceStatusReponseUpdate("", req.Project, req.Etag, req.Services)
query.AddJobStatusUpdateRequestQuery(b.PulumiStack, req.Project, req.Etag, req.Services)
query.AddJobStatusUpdateResponseQuery(b.PulumiStack, req.Project, req.Etag, req.Services)
query.AddServiceStatusRequestUpdate(b.PulumiStack, req.Project, req.Etag, req.Services)
query.AddServiceStatusReponseUpdate(b.PulumiStack, req.Project, req.Etag, req.Services)

return query.GetQuery()
}
Expand Down
2 changes: 1 addition & 1 deletion src/pkg/cli/client/byoc/gcp/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ func (q *Query) AddCloudBuildLogQuery(stack, project, etag string, services []st
query := `resource.type="build"`

// FIXME: Support stack
servicesRegex := `[a-zA-Z0-9-]{1,63}`
servicesRegex := `[a-zA-Z0-9-_]{1,63}`
if len(services) > 0 {
servicesRegex = fmt.Sprintf("(%v)", strings.Join(services, "|")) // Cloud build labels allows upper case letters
}
Expand Down
5 changes: 4 additions & 1 deletion src/pkg/cli/client/byoc/gcp/testdata/with_cd_exec.query
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,15 @@ logName="projects/test-project/logs/docker-logs"
labels."run.googleapis.com/execution_name" = "test-execution-id"
) OR (
resource.type = "cloud_run_job"
labels."defang-stack" = "beta"
) OR (
resource.type="build"
labels.build_tags =~ "__[a-zA-Z0-9-]{1,63}_"
labels.build_tags =~ "beta__[a-zA-Z0-9-_]{1,63}_"
) OR (
resource.type="cloud_run_revision"
labels."defang-stack" = "beta"
) OR (
resource.type="gce_instance"
labels."defang-stack" = "beta"
)
)
5 changes: 4 additions & 1 deletion src/pkg/cli/client/byoc/gcp/testdata/with_etag.query
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,18 @@ logName="projects/test-project/logs/docker-logs"
) AND (
(
resource.type = "cloud_run_job"
labels."defang-stack" = "beta"
labels."defang-etag" = "test-etag"
) OR (
resource.type="build"
labels.build_tags =~ "__[a-zA-Z0-9-]{1,63}_test-etag"
labels.build_tags =~ "beta__[a-zA-Z0-9-_]{1,63}_test-etag"
) OR (
resource.type="cloud_run_revision"
labels."defang-stack" = "beta"
labels."defang-etag" = "test-etag"
) OR (
resource.type="gce_instance"
labels."defang-stack" = "beta"
labels."defang-etag" = "test-etag"
)
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,18 @@ logName="projects/test-project/logs/docker-logs"
) AND (timestamp >= "2024-01-01T00:00:00Z") AND (
(
resource.type = "cloud_run_job"
labels."defang-stack" = "beta"
labels."defang-etag" = "test-etag"
) OR (
resource.type="build"
labels.build_tags =~ "__[a-zA-Z0-9-]{1,63}_test-etag"
labels.build_tags =~ "beta__[a-zA-Z0-9-_]{1,63}_test-etag"
) OR (
resource.type="cloud_run_revision"
labels."defang-stack" = "beta"
labels."defang-etag" = "test-etag"
) OR (
resource.type="gce_instance"
labels."defang-stack" = "beta"
labels."defang-etag" = "test-etag"
)
)
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,15 @@ logName="projects/test-project/logs/docker-logs"
labels."run.googleapis.com/execution_name" = "test-execution-id"
) OR (
resource.type = "cloud_run_job"
labels."defang-stack" = "beta"
) OR (
resource.type="build"
labels.build_tags =~ "__[a-zA-Z0-9-]{1,63}_"
labels.build_tags =~ "beta__[a-zA-Z0-9-_]{1,63}_"
) OR (
resource.type="cloud_run_revision"
labels."defang-stack" = "beta"
) OR (
resource.type="gce_instance"
labels."defang-stack" = "beta"
)
)
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,20 @@ logName="projects/test-project/logs/docker-logs"
labels."run.googleapis.com/execution_name" = "test-execution-id"
) OR (
resource.type = "cloud_run_job"
labels."defang-stack" = "beta"
labels."defang-project" = "test-project"
labels."defang-etag" = "test-etag"
) OR (
resource.type="build"
labels.build_tags =~ "_test-project_[a-zA-Z0-9-]{1,63}_test-etag"
labels.build_tags =~ "beta_test-project_[a-zA-Z0-9-_]{1,63}_test-etag"
) OR (
resource.type="cloud_run_revision"
labels."defang-stack" = "beta"
labels."defang-project" = "test-project"
labels."defang-etag" = "test-etag"
) OR (
resource.type="gce_instance"
labels."defang-stack" = "beta"
labels."defang-project" = "test-project"
labels."defang-etag" = "test-etag"
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,15 @@ logName="projects/test-project/logs/docker-logs"
) AND ("error") AND (
(
resource.type = "cloud_run_job"
labels."defang-stack" = "beta"
) OR (
resource.type="build"
labels.build_tags =~ "__[a-zA-Z0-9-]{1,63}_"
labels.build_tags =~ "beta__[a-zA-Z0-9-_]{1,63}_"
) OR (
resource.type="cloud_run_revision"
labels."defang-stack" = "beta"
) OR (
resource.type="gce_instance"
labels."defang-stack" = "beta"
)
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ logName="projects/test-project/logs/docker-logs"
) AND (
(
resource.type = "cloud_run_job"
labels."defang-stack" = "beta"
) OR (
resource.type="build"
labels.build_tags =~ "__[a-zA-Z0-9-]{1,63}_"
labels.build_tags =~ "beta__[a-zA-Z0-9-_]{1,63}_"
)
)
2 changes: 2 additions & 0 deletions src/pkg/cli/client/byoc/gcp/testdata/with_logtype_run.query
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ logName="projects/test-project/logs/docker-logs"
) AND (
(
resource.type="cloud_run_revision"
labels."defang-stack" = "beta"
) OR (
resource.type="gce_instance"
labels."defang-stack" = "beta"
)
)
5 changes: 4 additions & 1 deletion src/pkg/cli/client/byoc/gcp/testdata/with_project.query
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,18 @@ logName="projects/test-project/logs/docker-logs"
) AND (
(
resource.type = "cloud_run_job"
labels."defang-stack" = "beta"
labels."defang-project" = "test-project"
) OR (
resource.type="build"
labels.build_tags =~ "_test-project_[a-zA-Z0-9-]{1,63}_"
labels.build_tags =~ "beta_test-project_[a-zA-Z0-9-_]{1,63}_"
) OR (
resource.type="cloud_run_revision"
labels."defang-stack" = "beta"
labels."defang-project" = "test-project"
) OR (
resource.type="gce_instance"
labels."defang-stack" = "beta"
labels."defang-project" = "test-project"
)
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,18 @@ logName="projects/test-project/logs/docker-logs"
) AND (timestamp >= "2024-01-01T00:00:00Z") AND (timestamp <= "2024-01-02T00:00:00Z") AND (
(
resource.type = "cloud_run_job"
labels."defang-stack" = "beta"
labels."defang-project" = "test-project"
) OR (
resource.type="build"
labels.build_tags =~ "_test-project_[a-zA-Z0-9-]{1,63}_"
labels.build_tags =~ "beta_test-project_[a-zA-Z0-9-_]{1,63}_"
) OR (
resource.type="cloud_run_revision"
labels."defang-stack" = "beta"
labels."defang-project" = "test-project"
) OR (
resource.type="gce_instance"
labels."defang-stack" = "beta"
labels."defang-project" = "test-project"
)
)
13 changes: 13 additions & 0 deletions src/pkg/cli/compose/fixup.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"fmt"
"os"
"path/filepath"
"regexp"
"slices"
"strconv"
"strings"
Expand All @@ -29,6 +30,12 @@ func FixupServices(ctx context.Context, provider client.Provider, project *compo
}
}

oldName := project.Name
project.Name = NormalizeProjectName(project.Name)
if project.Name != oldName {
term.Debugf("normalized project name %q -> %q", oldName, project.Name)
}

// Preload the current config so we can detect which environment variables should be passed as "secrets"
config, err := provider.ListConfig(ctx, &defangv1.ListConfigsRequest{Project: project.Name})
if err != nil {
Expand Down Expand Up @@ -471,3 +478,9 @@ func IsRedisRepo(repo string) bool {
func IsMongoRepo(repo string) bool {
return strings.HasSuffix(repo, "mongo")
}

var safeProjectNameRE = regexp.MustCompile(`[^A-Za-z0-9-]+`)

func NormalizeProjectName(name string) string {
return safeProjectNameRE.ReplaceAllString(name, "-")
}
8 changes: 4 additions & 4 deletions src/pkg/cli/composeUp.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ func ComposeUp(ctx context.Context, fabric client.FabricClient, provider cliClie
}

req := &defangv1.GetDelegateSubdomainZoneRequest{
Project: project.Name,
Project: fixedProject.Name,
Stack: params.Stack,
}
delegateDomain, err := fabric.GetDelegateSubdomainZone(ctx, req)
Expand All @@ -100,15 +100,15 @@ func ComposeUp(ctx context.Context, fabric client.FabricClient, provider cliClie

deployRequest := &defangv1.DeployRequest{
Mode: mode.Value(),
Project: project.Name,
Project: fixedProject.Name,
Compose: bytes,
DelegateDomain: delegateDomain.Zone,
}

delegation, err := provider.PrepareDomainDelegation(ctx, client.PrepareDomainDelegationRequest{
DelegateDomain: delegateDomain.Zone,
Preview: upload == compose.UploadModePreview || upload == compose.UploadModeEstimate,
Project: project.Name,
Project: fixedProject.Name,
})
if err != nil {
return nil, project, err
Expand All @@ -133,7 +133,7 @@ func ComposeUp(ctx context.Context, fabric client.FabricClient, provider cliClie
if delegation != nil && len(delegation.NameServers) > 0 {
req := &defangv1.DelegateSubdomainZoneRequest{
NameServerRecords: delegation.NameServers,
Project: project.Name,
Project: fixedProject.Name,
Stack: params.Stack,
}
_, err = fabric.DelegateSubdomainZone(ctx, req)
Expand Down
3 changes: 2 additions & 1 deletion src/pkg/cli/subscribe.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"errors"

"github.com/DefangLabs/defang/src/pkg/cli/client"
"github.com/DefangLabs/defang/src/pkg/cli/compose"
"github.com/DefangLabs/defang/src/pkg/term"
"github.com/DefangLabs/defang/src/pkg/types"
defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1"
Expand All @@ -29,7 +30,7 @@ func WaitServiceState(
}

// Assume "services" are normalized service names
subscribeRequest := defangv1.SubscribeRequest{Project: projectName, Etag: etag, Services: services}
subscribeRequest := defangv1.SubscribeRequest{Project: compose.NormalizeProjectName(projectName), Etag: etag, Services: services}
serverStream, err := provider.Subscribe(ctx, &subscribeRequest)
if err != nil {
return nil, err
Expand Down
3 changes: 2 additions & 1 deletion src/pkg/cli/tail.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (

"github.com/DefangLabs/defang/src/pkg"
"github.com/DefangLabs/defang/src/pkg/cli/client"
"github.com/DefangLabs/defang/src/pkg/cli/compose"
"github.com/DefangLabs/defang/src/pkg/dryrun"
"github.com/DefangLabs/defang/src/pkg/logs"
"github.com/DefangLabs/defang/src/pkg/spinner"
Expand Down Expand Up @@ -207,7 +208,7 @@ func streamLogs(ctx context.Context, provider client.Provider, projectName strin
Etag: options.Deployment,
LogType: uint32(options.LogType),
Pattern: options.Filter,
Project: projectName,
Project: compose.NormalizeProjectName(projectName), // Matching the FixupServices behavior
Services: options.Services,
Since: sinceTs, // this is also used to continue from the last timestamp
Until: untilTs,
Expand Down
12 changes: 6 additions & 6 deletions src/pkg/clouds/gcp/cloudbuild.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,28 +19,28 @@ type BuildTag struct {

func (bt BuildTag) String() string {
if bt.Stack == "" {
return fmt.Sprintf("%s_%s_%s", bt.Project, bt.Service, bt.Etag)
return fmt.Sprintf("%s_%s_%s", bt.Project, bt.Service, bt.Etag) // Backward compatibility
} else {
return fmt.Sprintf("%s_%s_%s_%s", bt.Stack, bt.Project, bt.Service, bt.Etag)
}
}

func (bt *BuildTag) Parse(tag string) error {
parts := strings.Split(tag, "_")
if len(parts) < 3 || len(parts) > 4 {
if len(parts) < 3 {
return fmt.Errorf("invalid cloudbuild build tags value: %q", tag)
}

if len(parts) == 3 { // Backward compatibility
if n := len(parts); n == 3 { // Backward compatibility
bt.Stack = ""
bt.Project = parts[0]
bt.Service = parts[1]
bt.Etag = parts[2]
} else {
bt.Stack = parts[0]
bt.Project = parts[1]
bt.Service = parts[2]
bt.Etag = parts[3]
bt.Project = parts[1] // Project names has been normalized to not contain underscores
bt.Service = strings.Join(parts[2:n-1], "_") // Service names may contain underscores, so join all parts except last which is the etag
bt.Etag = parts[n-1]
}
return nil
}
Expand Down
Loading
Loading