Skip to content

Commit 517aa36

Browse files
committed
Use base36 to get denser hash string for project domain
1 parent 286a222 commit 517aa36

File tree

3 files changed

+24
-17
lines changed

3 files changed

+24
-17
lines changed

src/pkg/cli/client/byoc/aws/byoc.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"context"
66
"crypto/sha256"
77
"encoding/base64"
8+
"encoding/binary"
89
"encoding/json"
910
"errors"
1011
"fmt"
@@ -653,8 +654,9 @@ func (b *ByocAws) getProjectDomain(account, zone string) string {
653654
return "" // no project name => no custom domain
654655
}
655656
h := sha256.New()
656-
fmt.Fprintf(h, "%s.%s.%s.%s", account, b.ProjectName, b.TenantID, zone)
657-
return fmt.Sprintf("%x", h.Sum(nil)[:8]) + "." + byoc.DnsSafe(zone)
657+
fmt.Fprintf(h, "%s.%s.%s.%s.%s", account, b.ProjectName, b.PulumiStack, b.TenantID, zone)
658+
659+
return pkg.Base36ID(binary.LittleEndian.Uint64(h.Sum(nil)[:8])) + "." + byoc.DnsSafe(zone)
658660
}
659661

660662
func (b *ByocAws) TearDown(ctx context.Context) error {

src/pkg/cli/client/byoc/aws/byoc_test.go

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package aws
22

33
import (
44
"context"
5+
"regexp"
56
"testing"
67

78
"github.com/DefangLabs/defang/src/pkg/cli/client"
@@ -23,17 +24,17 @@ func TestDomainMultipleProjectSupport(t *testing.T) {
2324
PublicFqdn string
2425
PrivateFqdn string
2526
}{
26-
{"tenant1", "tenant1", "web", port80, "web--80.1fa1857b71717f6b.example.com", "web.1fa1857b71717f6b.example.com", "web.tenant1.internal"},
27-
{"tenant1", "tenant1", "web", hostModePort, "web.tenant1.internal:80", "web.1fa1857b71717f6b.example.com", "web.tenant1.internal"},
28-
{"project1", "tenant1", "web", port80, "web--80.1ac7562668796635.example.com", "web.1ac7562668796635.example.com", "web.project1.internal"},
29-
{"Project1", "tenant1", "web", port80, "web--80.40b35d8b26ff71ae.example.com", "web.40b35d8b26ff71ae.example.com", "web.project1.internal"},
30-
{"project1", "tenant1", "web", hostModePort, "web.project1.internal:80", "web.1ac7562668796635.example.com", "web.project1.internal"},
31-
{"project1", "tenant1", "api", port8080, "api--8080.1ac7562668796635.example.com", "api.1ac7562668796635.example.com", "api.project1.internal"},
32-
{"tenant1", "tenant1", "web", port80, "web--80.1fa1857b71717f6b.example.com", "web.1fa1857b71717f6b.example.com", "web.tenant1.internal"},
33-
{"tenant1", "tenant1", "web", hostModePort, "web.tenant1.internal:80", "web.1fa1857b71717f6b.example.com", "web.tenant1.internal"},
34-
{"Project1", "tenant1", "web", port80, "web--80.40b35d8b26ff71ae.example.com", "web.40b35d8b26ff71ae.example.com", "web.project1.internal"},
35-
{"Tenant2", "tenant1", "web", port80, "web--80.f5600a0d61784e9d.example.com", "web.f5600a0d61784e9d.example.com", "web.tenant2.internal"},
36-
{"tenant1", "tenAnt1", "web", port80, "web--80.7360f2237c979f46.example.com", "web.7360f2237c979f46.example.com", "web.tenant1.internal"},
27+
{"tenant1", "tenant1", "web", port80, `web--80\.[0-9a-z]{12}\.example\.com`, `web\.[0-9a-z]{12}\.example\.com`, "web.tenant1.internal"},
28+
{"tenant1", "tenant1", "web", hostModePort, `web\.tenant1.internal:80`, `web.[0-9a-z]{12}.example\.com`, "web.tenant1.internal"},
29+
{"project1", "tenant1", "web", port80, `web--80\.[0-9a-z]{12}\.example\.com`, `web\.[0-9a-z]{12}\.example\.com`, "web.project1.internal"},
30+
{"Project1", "tenant1", "web", port80, `web--80\.[0-9a-z]{12}\.example\.com`, `web\.[0-9a-z]{12}\.example\.com`, "web.project1.internal"},
31+
{"project1", "tenant1", "web", hostModePort, `web\.project1\.internal:80`, `web\.[0-9a-z]{12}\.example\.com`, "web.project1.internal"},
32+
{"project1", "tenant1", "api", port8080, `api--8080\.[0-9a-z]{12}\.example\.com`, `api\.[0-9a-z]{12}\.example\.com`, "api.project1.internal"},
33+
{"tenant1", "tenant1", "web", port80, `web--80\.[0-9a-z]{12}\.example\.com`, `web\.[0-9a-z]{12}\.example\.com`, "web.tenant1.internal"},
34+
{"tenant1", "tenant1", "web", hostModePort, `web\.tenant1\.internal:80`, `web\.[0-9a-z]{12}\.example\.com`, "web.tenant1.internal"},
35+
{"Project1", "tenant1", "web", port80, `web--80\.[0-9a-z]{12}\.example\.com`, `web\.[0-9a-z]{12}\.example\.com`, "web.project1.internal"},
36+
{"Tenant2", "tenant1", "web", port80, `web--80\.[0-9a-z]{12}\.example\.com`, `web\.[0-9a-z]{12}\.example\.com`, "web.tenant2.internal"},
37+
{"tenant1", "tenAnt1", "web", port80, `web--80\.[0-9a-z]{12}\.example\.com`, `web\.[0-9a-z]{12}\.example\.com`, "web.tenant1.internal"},
3738
}
3839

3940
for _, tt := range tests {
@@ -46,12 +47,12 @@ func TestDomainMultipleProjectSupport(t *testing.T) {
4647
b.ProjectDomain = b.getProjectDomain("123456789012", "example.com")
4748

4849
endpoint := b.getEndpoint(tt.Fqn, tt.Port)
49-
if endpoint != tt.EndPoint {
50+
if !regexp.MustCompile(tt.EndPoint).MatchString(endpoint) {
5051
t.Errorf("expected endpoint %q, got %q", tt.EndPoint, endpoint)
5152
}
5253

5354
publicFqdn := b.getPublicFqdn(tt.Fqn)
54-
if publicFqdn != tt.PublicFqdn {
55+
if !regexp.MustCompile(tt.PublicFqdn).MatchString(publicFqdn) {
5556
t.Errorf("expected public fqdn %q, got %q", tt.PublicFqdn, publicFqdn)
5657
}
5758

src/pkg/utils.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,19 @@ func (l *OneOrList) UnmarshalJSON(data []byte) error {
6666
}
6767

6868
func RandomID() string {
69-
const uint64msb = 1 << 63 // always set the MSB to ensure we get ≥12 digits
70-
return strconv.FormatUint(rand.Uint64()|uint64msb, 36)[1:]
69+
return Base36ID(rand.Uint64())
7170
}
7271

7372
func IsValidRandomID(s string) bool {
7473
_, err := strconv.ParseUint(s, 36, 64)
7574
return len(s) == 12 && err == nil
7675
}
7776

77+
func Base36ID(i uint64) string {
78+
const uint64msb = 1 << 63 // always set the MSB to ensure we get ≥12 digits
79+
return strconv.FormatUint(i|uint64msb, 36)[1:]
80+
}
81+
7882
func Min(a, b int) int {
7983
if a < b {
8084
return a

0 commit comments

Comments
 (0)