Skip to content

Commit 0a751f9

Browse files
toppercodesampagent
andcommitted
dataset: resolve edge deployment from org default
Amp-Thread-ID: https://ampcode.com/threads/T-019d0c27-9d81-71e1-9db5-23c7af7a04a8 Co-authored-by: Amp <amp@ampcode.com>
1 parent 131747a commit 0a751f9

3 files changed

Lines changed: 136 additions & 9 deletions

File tree

axiom/data_source_dataset.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,5 +71,11 @@ func (d *DatasetDataSource) Read(ctx context.Context, req datasource.ReadRequest
7171
return
7272
}
7373

74-
resp.Diagnostics.Append(resp.State.Set(ctx, flattenDataset(ds))...)
74+
state, err := flattenDatasetWithOrgDefault(ctx, d.client, ds)
75+
if err != nil {
76+
resp.Diagnostics.AddWarning("Unable to resolve default edge deployment", err.Error())
77+
state = flattenDataset(ds, "")
78+
}
79+
80+
resp.Diagnostics.Append(resp.State.Set(ctx, state)...)
7581
}

axiom/resource_dataset.go

Lines changed: 78 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,14 @@ func (r *DatasetResource) Create(ctx context.Context, req resource.CreateRequest
185185
return
186186
}
187187

188+
state, err := flattenDatasetWithOrgDefault(ctx, r.client, ds)
189+
if err != nil {
190+
resp.Diagnostics.AddWarning("Unable to resolve default edge deployment", err.Error())
191+
state = flattenDataset(ds, "")
192+
}
193+
188194
// Set state immediately after creation to avoid orphaned resources
189-
resp.Diagnostics.Append(resp.State.Set(ctx, flattenDataset(ds))...)
195+
resp.Diagnostics.Append(resp.State.Set(ctx, state)...)
190196
if resp.Diagnostics.HasError() {
191197
return
192198
}
@@ -206,7 +212,14 @@ func (r *DatasetResource) Create(ctx context.Context, req resource.CreateRequest
206212
}
207213

208214
ds.MapFields = resMapFields
209-
resp.Diagnostics.Append(resp.State.Set(ctx, flattenDataset(ds))...)
215+
216+
state, err := flattenDatasetWithOrgDefault(ctx, r.client, ds)
217+
if err != nil {
218+
resp.Diagnostics.AddWarning("Unable to resolve default edge deployment", err.Error())
219+
state = flattenDataset(ds, "")
220+
}
221+
222+
resp.Diagnostics.Append(resp.State.Set(ctx, state)...)
210223
}
211224
}
212225

@@ -232,7 +245,13 @@ func (r *DatasetResource) Read(ctx context.Context, req resource.ReadRequest, re
232245
return
233246
}
234247

235-
resp.Diagnostics.Append(resp.State.Set(ctx, flattenDataset(ds))...)
248+
state, err := flattenDatasetWithOrgDefault(ctx, r.client, ds)
249+
if err != nil {
250+
resp.Diagnostics.AddWarning("Unable to resolve default edge deployment", err.Error())
251+
state = flattenDataset(ds, "")
252+
}
253+
254+
resp.Diagnostics.Append(resp.State.Set(ctx, state)...)
236255
}
237256

238257
func (r *DatasetResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) {
@@ -263,8 +282,14 @@ func (r *DatasetResource) Update(ctx context.Context, req resource.UpdateRequest
263282
return
264283
}
265284

285+
state, err := flattenDatasetWithOrgDefault(ctx, r.client, ds)
286+
if err != nil {
287+
resp.Diagnostics.AddWarning("Unable to resolve default edge deployment", err.Error())
288+
state = flattenDataset(ds, "")
289+
}
290+
266291
// Set state immediately after update to preserve changes
267-
resp.Diagnostics.Append(resp.State.Set(ctx, flattenDataset(ds))...)
292+
resp.Diagnostics.Append(resp.State.Set(ctx, state)...)
268293
if resp.Diagnostics.HasError() {
269294
return
270295
}
@@ -284,7 +309,14 @@ func (r *DatasetResource) Update(ctx context.Context, req resource.UpdateRequest
284309
}
285310

286311
ds.MapFields = resMapFields
287-
resp.Diagnostics.Append(resp.State.Set(ctx, flattenDataset(ds))...)
312+
313+
state, err := flattenDatasetWithOrgDefault(ctx, r.client, ds)
314+
if err != nil {
315+
resp.Diagnostics.AddWarning("Unable to resolve default edge deployment", err.Error())
316+
state = flattenDataset(ds, "")
317+
}
318+
319+
resp.Diagnostics.Append(resp.State.Set(ctx, state)...)
288320
}
289321
}
290322

@@ -306,7 +338,7 @@ func (r *DatasetResource) ImportState(ctx context.Context, req resource.ImportSt
306338
resource.ImportStatePassthroughID(ctx, path.Root("id"), req, resp)
307339
}
308340

309-
func flattenDataset(dataset *axiom.Dataset) DatasetResourceModel {
341+
func flattenDataset(dataset *axiom.Dataset, defaultEdgeDeployment string) DatasetResourceModel {
310342
var description types.String
311343
var edgeDeployment types.String
312344

@@ -316,6 +348,8 @@ func flattenDataset(dataset *axiom.Dataset) DatasetResourceModel {
316348

317349
if dataset.EdgeDeployment != "" {
318350
edgeDeployment = types.StringValue(dataset.EdgeDeployment)
351+
} else if defaultEdgeDeployment != "" {
352+
edgeDeployment = types.StringValue(defaultEdgeDeployment)
319353
}
320354

321355
mapFields := make([]attr.Value, 0, len(dataset.MapFields))
@@ -353,3 +387,41 @@ func edgeDeploymentValue(edgeDeployment types.String) string {
353387

354388
return edgeDeployment.ValueString()
355389
}
390+
391+
func flattenDatasetWithOrgDefault(ctx context.Context, client *axiom.Client, dataset *axiom.Dataset) (DatasetResourceModel, error) {
392+
if dataset.EdgeDeployment != "" {
393+
return flattenDataset(dataset, ""), nil
394+
}
395+
396+
defaultEdgeDeployment, err := fetchDefaultEdgeDeployment(ctx, client)
397+
if err != nil {
398+
return DatasetResourceModel{}, err
399+
}
400+
401+
return flattenDataset(dataset, defaultEdgeDeployment), nil
402+
}
403+
404+
func fetchDefaultEdgeDeployment(ctx context.Context, client *axiom.Client) (string, error) {
405+
if client == nil {
406+
return "", fmt.Errorf("client is not set")
407+
}
408+
409+
organizations, err := client.Organizations.List(ctx)
410+
if err != nil {
411+
return "", fmt.Errorf("could not fetch organizations while resolving edge deployment: %w", err)
412+
}
413+
414+
return selectDefaultEdgeDeployment(organizations), nil
415+
}
416+
417+
func selectDefaultEdgeDeployment(organizations []*axiom.Organization) string {
418+
for _, organization := range organizations {
419+
if organization == nil || organization.DefaultEdgeDeployment == "" {
420+
continue
421+
}
422+
423+
return organization.DefaultEdgeDeployment
424+
}
425+
426+
return ""
427+
}

axiom/resource_dataset_unit_test.go

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,24 +54,73 @@ func TestFlattenDataset_EdgeDeployment(t *testing.T) {
5454
Name: "dataset-a",
5555
Kind: "axiom:events:v1",
5656
EdgeDeployment: "cloud.eu-central-1.aws",
57-
})
57+
}, "")
5858

5959
assert.Equal(t, "cloud.eu-central-1.aws", state.EdgeDeployment.ValueString())
6060
})
6161

62+
t.Run("uses org default edge deployment when dataset omits it", func(t *testing.T) {
63+
t.Parallel()
64+
65+
state := flattenDataset(&axiom.Dataset{
66+
ID: "dataset-a",
67+
Name: "dataset-a",
68+
Kind: "axiom:events:v1",
69+
}, "cloud.us-east-1.aws")
70+
71+
assert.Equal(t, "cloud.us-east-1.aws", state.EdgeDeployment.ValueString())
72+
})
73+
6274
t.Run("keeps edge deployment null when absent", func(t *testing.T) {
6375
t.Parallel()
6476

6577
state := flattenDataset(&axiom.Dataset{
6678
ID: "dataset-a",
6779
Name: "dataset-a",
6880
Kind: "axiom:events:v1",
69-
})
81+
}, "")
7082

7183
assert.True(t, state.EdgeDeployment.IsNull())
7284
})
7385
}
7486

87+
func TestSelectDefaultEdgeDeployment(t *testing.T) {
88+
t.Parallel()
89+
90+
t.Run("returns first default edge deployment", func(t *testing.T) {
91+
t.Parallel()
92+
93+
selected := selectDefaultEdgeDeployment([]*axiom.Organization{
94+
{DefaultEdgeDeployment: "cloud.eu-central-1.aws"},
95+
{DefaultEdgeDeployment: "cloud.us-east-1.aws"},
96+
})
97+
98+
assert.Equal(t, "cloud.eu-central-1.aws", selected)
99+
})
100+
101+
t.Run("skips nil and empty organizations", func(t *testing.T) {
102+
t.Parallel()
103+
104+
selected := selectDefaultEdgeDeployment([]*axiom.Organization{
105+
nil,
106+
{},
107+
{DefaultEdgeDeployment: "cloud.us-east-1.aws"},
108+
})
109+
110+
assert.Equal(t, "cloud.us-east-1.aws", selected)
111+
})
112+
113+
t.Run("returns empty when none configured", func(t *testing.T) {
114+
t.Parallel()
115+
116+
selected := selectDefaultEdgeDeployment([]*axiom.Organization{
117+
{},
118+
})
119+
120+
assert.Empty(t, selected)
121+
})
122+
}
123+
75124
func TestEdgeDeploymentValue(t *testing.T) {
76125
t.Parallel()
77126

0 commit comments

Comments
 (0)