Skip to content

Commit 0eed91b

Browse files
committed
Fix yaml sync snapshot when bundle is deployed without any resources
1 parent 2065651 commit 0eed91b

5 files changed

Lines changed: 55 additions & 15 deletions

File tree

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
bundle:
2+
name: test-bundle-$UNIQUE_NAME
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
>>> [CLI] bundle deploy
3+
Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bundle-[UNIQUE_NAME]/default/files...
4+
Deploying resources...
5+
Deployment complete!
6+
7+
>>> [CLI] bundle destroy --auto-approve
8+
All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/test-bundle-[UNIQUE_NAME]/default
9+
10+
Deleting files...
11+
Destroy complete!
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/bin/bash
2+
3+
envsubst < databricks.yml.tmpl > databricks.yml
4+
5+
cleanup() {
6+
trace $CLI bundle destroy --auto-approve
7+
}
8+
trap cleanup EXIT
9+
10+
trace $CLI bundle deploy
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Cloud = true
2+
3+
RecordRequests = false
4+
Ignore = [".databricks", "databricks.yml"]
5+
6+
[Env]
7+
DATABRICKS_BUNDLE_ENABLE_EXPERIMENTAL_YAML_SYNC = "true"
8+
9+
[EnvMatrix]
10+
DATABRICKS_BUNDLE_ENGINE = ["terraform"]

bundle/statemgmt/upload_state_for_yaml_sync.go

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ func (m *uploadStateForYamlSync) Apply(ctx context.Context, b *bundle.Bundle) di
5454

5555
_, snapshotPath := b.StateFilenameConfigSnapshot(ctx)
5656

57-
diags := m.convertState(ctx, b, snapshotPath)
58-
if diags.HasError() {
57+
created, diags := m.convertState(ctx, b, snapshotPath)
58+
if diags.HasError() || !created {
5959
return diags
6060
}
6161

@@ -92,10 +92,22 @@ func uploadState(ctx context.Context, b *bundle.Bundle) error {
9292
return nil
9393
}
9494

95-
func (m *uploadStateForYamlSync) convertState(ctx context.Context, b *bundle.Bundle, snapshotPath string) (diags diag.Diagnostics) {
95+
func (m *uploadStateForYamlSync) convertState(ctx context.Context, b *bundle.Bundle, snapshotPath string) (bool, diag.Diagnostics) {
9696
terraformResources, err := terraform.ParseResourcesState(ctx, b)
9797
if err != nil {
98-
return diag.FromErr(err)
98+
return false, diag.FromErr(fmt.Errorf("failed to parse terraform state for config snapshot: %w", err))
99+
}
100+
101+
// ParseResourcesState returns nil when the terraform state file doesn't exist
102+
// (e.g. first deploy with no resources).
103+
if terraformResources == nil {
104+
return false, nil
105+
}
106+
107+
_, localTerraformPath := b.StateFilenameTerraform(ctx)
108+
data, err := os.ReadFile(localTerraformPath)
109+
if err != nil {
110+
return false, diag.FromErr(fmt.Errorf("failed to read terraform state for config snapshot: %w", err))
99111
}
100112

101113
state := make(map[string]dstate.ResourceEntry)
@@ -111,18 +123,12 @@ func (m *uploadStateForYamlSync) convertState(ctx context.Context, b *bundle.Bun
111123
}
112124
}
113125

114-
_, localTerraformPath := b.StateFilenameTerraform(ctx)
115-
data, err := os.ReadFile(localTerraformPath)
116-
if err != nil {
117-
return diag.FromErr(err)
118-
}
119-
120126
var tfState struct {
121127
Lineage string `json:"lineage"`
122128
Serial int `json:"serial"`
123129
}
124130
if err := json.Unmarshal(data, &tfState); err != nil {
125-
return diag.FromErr(err)
131+
return false, diag.FromErr(err)
126132
}
127133

128134
migratedDB := dstate.NewDatabase(tfState.Lineage, tfState.Serial+1)
@@ -141,26 +147,27 @@ func (m *uploadStateForYamlSync) convertState(ctx context.Context, b *bundle.Bun
141147
interpolatedRoot := b.Config.Value()
142148
uninterpolatedRoot, err := reverseInterpolate(interpolatedRoot)
143149
if err != nil {
144-
return diag.FromErr(fmt.Errorf("failed to reverse interpolation: %w", err))
150+
return false, diag.FromErr(fmt.Errorf("failed to reverse interpolation: %w", err))
145151
}
146152

147153
var uninterpolatedConfig config.Root
148154
err = uninterpolatedConfig.Mutate(func(_ dyn.Value) (dyn.Value, error) {
149155
return uninterpolatedRoot, nil
150156
})
151157
if err != nil {
152-
return diag.FromErr(fmt.Errorf("failed to create uninterpolated config: %w", err))
158+
return false, diag.FromErr(fmt.Errorf("failed to create uninterpolated config: %w", err))
153159
}
154160

155161
plan, err := deploymentBundle.CalculatePlan(ctx, b.WorkspaceClient(), &uninterpolatedConfig, snapshotPath)
156162
if err != nil {
157-
return diag.FromErr(err)
163+
return false, diag.FromErr(err)
158164
}
159165

160166
for _, entry := range plan.Plan {
161167
entry.Action = deployplan.Update
162168
}
163169

170+
var diags diag.Diagnostics
164171
for key := range plan.Plan {
165172
etag := etags[key]
166173
if etag == "" {
@@ -178,7 +185,7 @@ func (m *uploadStateForYamlSync) convertState(ctx context.Context, b *bundle.Bun
178185

179186
deploymentBundle.Apply(ctx, b.WorkspaceClient(), plan, direct.MigrateMode(true))
180187

181-
return diags
188+
return true, diags
182189
}
183190

184191
// reverseInterpolate reverses the terraform.Interpolate transformation.

0 commit comments

Comments
 (0)