Skip to content

Commit f196ccb

Browse files
edwardrfedw-defanglionellogithub-actions[bot]
authored
Azure support (#2027)
* WIP: Merge lio's work * WIP able to start cd container * WIP start working on logging * WIP: Have aci logging, able to run cd * WIP: fix the cd permission * WIP: able to build * Implement config and down api * Update hash and go.mod * Update nix sha * Address PR comments * Switch to container apps to run cd, use key vault for config * Update nix sha * Add build log * Update nix sha * Streaming cd log * Add test coverage and fix linting * Azure BYOC: device-code login, drop App Configuration, separate blob containers - Add MSAL-based device-code auth in pkg/clouds/azure/login.go with token-cache persistence via defang's TokenStore; tries DefaultAzureCredential, then silent MSAL, then interactive. Wired up through ByocAzure.Authenticate then driver.Authenticate. - Drop the appcfg/ package and the dual-write path; config now lives only in Key Vault. PutConfig/ListConfig/DeleteConfig updated accordingly. - Implement GetService/GetServices by reading the project.pb blob (same pattern as AWS/GCP providers). - Split the CD storage account into three blob containers: `uploads` (payloads/tarballs), `pulumi` (Pulumi state backend), `projects` (project.pb audit blobs). GetProjectUpdate now reads from `projects`. - Add read-only discovery helpers (FindStorageAccount, KeyVault.Find, findForConfig) so GetProjectUpdate / ListConfig / DeleteConfig don't provision resources just to read or clean up. - Improve Key Vault UX: actionable error when the caller lacks Microsoft.Authorization/roleAssignments/write, plus retry on transient ForbiddenByRbac while RBAC propagates after SetUp. - KeyVault.New now takes the full Azure struct so the authenticated credential propagates instead of each call falling back to DefaultAzureCredential. * No need to pass the RG and keyvault as env var to cd * Update Nix vendorHash to sha256-RDLJgsMv0iRbIiNWENOoV4JDcgjzD+4Hbi0vJiUxTzU= * Apply suggestions from code review Co-authored-by: Lio李歐 <lionello@users.noreply.github.com> * Trim off pre-signed token from context url * Self assign keyvault permissions if missing * Remove location from the resource group * Rename config keyvault from kv- to defang-config- * fix: ensure proper closure of log channels by waiting for all goroutines to finish * fix: return raw error for transient failures in GetDeploymentStatus * fix: increase cliTimeout to 90 seconds for improved Azure CLI performance * fix: add DEFANG_PULUMI_DEBUG and DEFANG_PULUMI_DIFF environment variables for enhanced debugging * fix: increase CD container resources for improved Pulumi performance * fix: update PollUntilDone calls to use azure.PollOptions for consistency and improved polling behavior * fix(azure): cd ls command used wrong blob container * fix(azure): ensure container resources are explicitly set in job execution to avoid default fallback * fix(azure): update blob iteration and state file parsing to use specified container name --------- Co-authored-by: Edward J <edw@defang.io> Co-authored-by: Lio李歐 <lionello@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Lionello Lunesu <lio+git@lunesu.com>
1 parent c89b107 commit f196ccb

47 files changed

Lines changed: 6464 additions & 41 deletions

Some content is hidden

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

flake.nix

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,20 @@
1717
with pkgs;
1818
mkShell {
1919
buildInputs = [
20+
azure-cli
2021
actionlint
2122
bashInteractive # full bash with readline/completion so prompts render correctly
2223
crane
2324
gh
2425
git
2526
gnumake
26-
less
2727
gnused # force Linux `sed` everywhere
2828
go_1_24 # must match GO_VERSION in Dockerfile
29-
gopls
3029
golangci-lint
30+
google-cloud-sdk
31+
gopls
3132
goreleaser
33+
less
3234
nixfmt-rfc-style
3335
nodejs_24 # for Pulumi, must match values in package.json and npm-build/action.yml
3436
openssh
@@ -37,8 +39,8 @@
3739
protoc-gen-go
3840
protolint
3941
pulumi
42+
pulumiPackages.pulumi-go
4043
pulumiPackages.pulumi-nodejs
41-
google-cloud-sdk
4244
vim
4345
];
4446
shellHook = ''

pkgs/defang/cli.nix

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ buildGo124Module {
77
pname = "defang-cli";
88
version = "git";
99
src = lib.cleanSource ../../src;
10-
vendorHash = "sha256-kuJPVIvKcffccWk6aU7slKXgGzVJgdu/NMokiW5Lpc8=";
10+
vendorHash = "sha256-RDLJgsMv0iRbIiNWENOoV4JDcgjzD+4Hbi0vJiUxTzU=";
1111

1212
subPackages = [ "cmd/cli" ];
1313

src/cmd/cli/command/estimate.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,17 @@ func interactiveSelectProvider(providers []client.ProviderID) (client.ProviderID
8585
}
8686
// Default to the provider in the environment if available
8787
var defaultOption any // not string!
88-
if pkg.AwsInEnv() != "" {
88+
switch {
89+
case pkg.AwsInEnv() != "":
8990
defaultOption = client.ProviderAWS.String()
90-
} else if pkg.GcpInEnv() != "" {
91+
case pkg.AzureInEnv() != "":
92+
defaultOption = client.ProviderAzure.String()
93+
case pkg.DoInEnv() != "":
94+
defaultOption = client.ProviderDO.String()
95+
case pkg.GcpInEnv() != "":
9196
defaultOption = client.ProviderGCP.String()
9297
}
98+
9399
var optionValue string
94100
if err := survey.AskOne(&survey.Select{
95101
Default: defaultOption,

src/go.mod

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,20 @@ require (
2020
cloud.google.com/go/storage v1.50.0
2121
connectrpc.com/connect v1.19.1
2222
github.com/AlecAivazis/survey/v2 v2.3.7
23+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0
24+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1
25+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appcontainers/armappcontainers v1.1.0
26+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appcontainers/armappcontainers/v3 v3.1.0
27+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2 v2.2.0
28+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerregistry/armcontainerregistry v1.2.0
29+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/keyvault/armkeyvault v1.5.0
30+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/operationalinsights/armoperationalinsights v1.2.0
31+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources/v2 v2.1.0
32+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armsubscriptions v1.3.0
33+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage/v2 v2.0.0
34+
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.4.0
35+
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4
36+
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0
2337
github.com/DefangLabs/secret-detector v0.0.0-20250811234530-d4b4214cd679
2438
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883
2539
github.com/aws/aws-sdk-go-v2 v1.41.5
@@ -41,7 +55,7 @@ require (
4155
github.com/digitalocean/godo v1.131.1
4256
github.com/docker/cli v29.2.0+incompatible
4357
github.com/firebase/genkit/go v1.2.0
44-
github.com/golang-jwt/jwt/v5 v5.2.2
58+
github.com/golang-jwt/jwt/v5 v5.3.0
4559
github.com/google/uuid v1.6.0
4660
github.com/googleapis/gax-go/v2 v2.14.2
4761
github.com/gorilla/websocket v1.5.3
@@ -82,6 +96,8 @@ require (
8296
cloud.google.com/go/compute/metadata v0.9.0 // indirect
8397
cloud.google.com/go/longrunning v0.6.7 // indirect
8498
cloud.google.com/go/monitoring v1.24.2 // indirect
99+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect
100+
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0 // indirect
85101
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect
86102
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.52.0 // indirect
87103
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.52.0 // indirect
@@ -111,6 +127,7 @@ require (
111127
github.com/hashicorp/go-multierror v1.1.1 // indirect
112128
github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf // indirect
113129
github.com/invopop/jsonschema v0.13.0 // indirect
130+
github.com/kylelemons/godebug v1.1.0 // indirect
114131
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
115132
github.com/mailru/easyjson v0.9.0 // indirect
116133
github.com/mattn/go-runewidth v0.0.14 // indirect

src/go.sum

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,52 @@ connectrpc.com/connect v1.19.1 h1:R5M57z05+90EfEvCY1b7hBxDVOUl45PrtXtAV2fOC14=
3434
connectrpc.com/connect v1.19.1/go.mod h1:tN20fjdGlewnSFeZxLKb0xwIZ6ozc3OQs2hTXy4du9w=
3535
github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ=
3636
github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo=
37+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0 h1:JXg2dwJUmPB9JmtVmdEB16APJ7jurfbY5jnfXpJoRMc=
38+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0/go.mod h1:YD5h/ldMsG0XiIw7PdyNhLxaM317eFh5yNLccNfGdyw=
39+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4=
40+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0=
41+
github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY=
42+
github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8=
43+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA=
44+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI=
45+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appcontainers/armappcontainers v1.1.0 h1:fdAOz6TFldGDoEcRa975i5L5QvWU8ptut+SJAIfuWUY=
46+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appcontainers/armappcontainers v1.1.0/go.mod h1:qV+BWew22CAalRTwJEAHs+aSLP49k/csNlspqhMIDRU=
47+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appcontainers/armappcontainers/v3 v3.1.0 h1:ilMZ576u8sm975EqV+AKEtD4u9TLwqEo2XY9csPXBRo=
48+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appcontainers/armappcontainers/v3 v3.1.0/go.mod h1:LGhzy+pg9AKr1Z7ZRyTC1qr1xNyVqLsqydvLdY+2iQk=
49+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2 v2.2.0 h1:Hp+EScFOu9HeCbeW8WU2yQPJd4gGwhMgKxWe+G6jNzw=
50+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2 v2.2.0/go.mod h1:/pz8dyNQe+Ey3yBp/XuYz7oqX8YDNWVpPB0hH3XWfbc=
51+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerregistry/armcontainerregistry v1.2.0 h1:DWlwvVV5r/Wy1561nZ3wrpI1/vDIBRY/Wd1HWaRBZWA=
52+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerregistry/armcontainerregistry v1.2.0/go.mod h1:E7ltexgRDmeJ0fJWv0D/HLwY2xbDdN+uv+X2uZtOx3w=
53+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do=
54+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI=
55+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v3 v3.1.0 h1:2qsIIvxVT+uE6yrNldntJKlLRgxGbZ85kgtz5SNBhMw=
56+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v3 v3.1.0/go.mod h1:AW8VEadnhw9xox+VaVd9sP7NjzOAnaZBLRH6Tq3cJ38=
57+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/keyvault/armkeyvault v1.5.0 h1:nnQ9vXH039UrEFxi08pPuZBE7VfqSJt343uJLw0rhWI=
58+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/keyvault/armkeyvault v1.5.0/go.mod h1:4YIVtzMFVsPwBvitCDX7J9sqthSj43QD1sP6fYc1egc=
59+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.2.0 h1:akP6VpxJGgQRpDR1P462piz/8OhYLRCreDj48AyNabc=
60+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.2.0/go.mod h1:8wzvopPfyZYPaQUoKW87Zfdul7jmJMDfp/k7YY3oJyA=
61+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/operationalinsights/armoperationalinsights v1.2.0 h1:4FlNvfcPu7tTvOgOzXxIbZLvwvmZq1OdhQUdIa9g2N4=
62+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/operationalinsights/armoperationalinsights v1.2.0/go.mod h1:A4nzEXwVd5pAyneR6KOvUAo72svUc5rmCzRHhAbP6lA=
63+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM=
64+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE=
65+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources/v2 v2.1.0 h1:seyVIpxalxYmfjoo8MB4rRzWaobMG+KJ2+MAUrEvDGU=
66+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources/v2 v2.1.0/go.mod h1:M3QD7IyKZBaC4uAKjitTOSOXdcPC6JS1A9oOW3hYjbQ=
67+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armsubscriptions v1.3.0 h1:wxQx2Bt4xzPIKvW59WQf1tJNx/ZZKPfN+EhPX3Z6CYY=
68+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armsubscriptions v1.3.0/go.mod h1:TpiwjwnW/khS0LKs4vW5UmmT9OWcxaveS8U7+tlknzo=
69+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1 h1:/Zt+cDPnpC3OVDm/JKLOs7M2DKmLRIIp3XIx9pHHiig=
70+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1/go.mod h1:Ng3urmn6dYe8gnbCMoHHVl5APYz2txho3koEkV2o2HA=
71+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage/v2 v2.0.0 h1:+vh02EiRx2UmL9NDoA36U18Bgwl9luxs6ia0GAI9Rzg=
72+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage/v2 v2.0.0/go.mod h1:iKOtU3WyuNvNc4L1Z4IxHaoO0dGq5tg+uhLix/KRmzE=
73+
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.4.0 h1:/g8S6wk65vfC6m3FIxJ+i5QDyN9JWwXI8Hb0Img10hU=
74+
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.4.0/go.mod h1:gpl+q95AzZlKVI3xSoseF9QPrypk0hQqBiJYeB/cR/I=
75+
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0 h1:nCYfgcSyHZXJI8J0IWE5MsCGlb2xp9fJiXyxWgmOFg4=
76+
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0/go.mod h1:ucUjca2JtSZboY8IoUqyQyuuXvwbMBVwFOm0vdQPNhA=
77+
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4 h1:jWQK1GI+LeGGUKBADtcH2rRqPxYB1Ljwms5gFA2LqrM=
78+
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4/go.mod h1:8mwH4klAm9DUgR2EEHyEEAQlRDvLPyg5fQry3y+cDew=
79+
github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM=
80+
github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE=
81+
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs=
82+
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk=
3783
github.com/DefangLabs/cobra v1.8.0-defang h1:rTzAg1XbEk3yXUmQPumcwkLgi8iNCby5CjyG3sCwzKk=
3884
github.com/DefangLabs/cobra v1.8.0-defang/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
3985
github.com/DefangLabs/secret-detector v0.0.0-20250811234530-d4b4214cd679 h1:qNT7R4qrN+5u5ajSbqSW1opHP4LA8lzA+ASyw5MQZjs=
@@ -176,8 +222,8 @@ github.com/goccy/go-yaml v1.17.1 h1:LI34wktB2xEE3ONG/2Ar54+/HJVBriAGJ55PHls4YuY=
176222
github.com/goccy/go-yaml v1.17.1/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
177223
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
178224
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
179-
github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=
180-
github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
225+
github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
226+
github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
181227
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
182228
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
183229
github.com/google/dotprompt/go v0.0.0-20251014011017-8d056e027254 h1:okN800+zMJOGHLJCgry+OGzhhtH6YrjQh1rluHmOacE=
@@ -228,6 +274,8 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
228274
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
229275
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
230276
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
277+
github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU=
278+
github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k=
231279
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
232280
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
233281
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
@@ -237,6 +285,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
237285
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
238286
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
239287
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
288+
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
289+
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
240290
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
241291
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
242292
github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=

src/pkg/agent/tools/estimate_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ func TestHandleEstimateTool(t *testing.T) {
132132
setupMock: func(m *MockEstimateCLI) {
133133
m.Project = &compose.Project{Name: "test-project"}
134134
},
135-
expectedError: "invalid provider: \"invalid-provider\", not one of [auto defang aws digitalocean gcp]",
135+
expectedError: "invalid provider: \"invalid-provider\", not one of [auto defang aws digitalocean gcp azure]",
136136
},
137137
{
138138
name: "run_estimate_error",

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,8 @@ func (b *ByocAws) bucketName() string {
476476

477477
func (b *ByocAws) environment(projectName string) (map[string]string, error) {
478478
region := b.driver.Region // TODO: this should be the destination region, not the CD region; make customizable
479+
480+
// From https://www.pulumi.com/docs/iac/concepts/state-and-backends/#aws-s3
479481
defangStateUrl := fmt.Sprintf(`s3://%s?region=%s&awssdk=v2`, b.bucketName(), region)
480482
pulumiBackendKey, pulumiBackendValue, err := byoc.GetPulumiBackend(defangStateUrl)
481483
if err != nil {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ import (
77
"strings"
88
"testing"
99

10+
"connectrpc.com/connect"
1011
"github.com/DefangLabs/defang/src/pkg/cli/client"
1112
"github.com/DefangLabs/defang/src/pkg/cli/client/byoc"
1213
"github.com/DefangLabs/defang/src/pkg/cli/compose"
1314
"github.com/DefangLabs/defang/src/pkg/clouds/aws"
1415
"github.com/DefangLabs/defang/src/pkg/clouds/aws/codebuild/cfn"
1516
defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1"
16-
"connectrpc.com/connect"
1717
)
1818

1919
func TestDeploy(t *testing.T) {

0 commit comments

Comments
 (0)