Skip to content

Commit 478d4b7

Browse files
fixup! WOOP-1151: Add workload_custom_metrics_data_source TF resource
1 parent e611060 commit 478d4b7

File tree

3 files changed

+72
-43
lines changed

3 files changed

+72
-43
lines changed

castai/resource_workload_custom_metrics_data_source.go

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ import (
1515
"github.com/castai/terraform-provider-castai/castai/sdk"
1616
)
1717

18-
// TODO: manually listing metrics doesn't work! `resolved_metrics` is not accepted? It sounds weird anyway
19-
2018
func resourceWorkloadCustomMetricsDataSource() *schema.Resource {
2119
return &schema.Resource{
2220
CreateContext: resourceWorkloadCustomMetricsDataSourceCreate,
@@ -286,39 +284,39 @@ func workloadCustomMetricsDataSourceImporter(ctx context.Context, d *schema.Reso
286284

287285
func expandWorkloadCustomMetricsDataSourceCreate(d *schema.ResourceData) (sdk.WorkloadOptimizationAPICreateCustomMetricsDataSourceJSONRequestBody, error) {
288286
name := d.Get("name").(string)
289-
prometheusData, err := expandPrometheusConfig(d)
287+
prometheusInput, err := expandPrometheusInputConfig(d)
290288
if err != nil {
291289
return sdk.WorkloadOptimizationAPICreateCustomMetricsDataSourceJSONRequestBody{}, err
292290
}
293291

294292
return sdk.WorkloadOptimizationAPICreateCustomMetricsDataSourceJSONRequestBody{
295293
Name: name,
296294
Type: sdk.PROMETHEUS,
297-
Data: sdk.WorkloadoptimizationV1CustomMetricsDataSourceData{
298-
Prometheus: prometheusData,
295+
Data: sdk.WorkloadoptimizationV1CustomMetricsDataSourceInput{
296+
Prometheus: prometheusInput,
299297
},
300298
}, nil
301299
}
302300

303301
func expandWorkloadCustomMetricsDataSourceUpdate(d *schema.ResourceData) (sdk.WorkloadOptimizationAPIUpdateCustomMetricsDataSourceJSONRequestBody, error) {
304302
name := d.Get("name").(string)
305-
prometheusData, err := expandPrometheusConfig(d)
303+
prometheusInput, err := expandPrometheusInputConfig(d)
306304
if err != nil {
307305
return sdk.WorkloadOptimizationAPIUpdateCustomMetricsDataSourceJSONRequestBody{}, err
308306
}
309307

310308
return sdk.WorkloadOptimizationAPIUpdateCustomMetricsDataSourceJSONRequestBody{
311309
DataSource: &sdk.WorkloadoptimizationV1UpdateCustomMetricsDataSource{
312310
Name: &name,
313-
Data: &sdk.WorkloadoptimizationV1CustomMetricsDataSourceData{
314-
Prometheus: prometheusData,
311+
Data: &sdk.WorkloadoptimizationV1CustomMetricsDataSourceInput{
312+
Prometheus: prometheusInput,
315313
},
316314
},
317315
UpdateMask: "name,data",
318316
}, nil
319317
}
320318

321-
func expandPrometheusConfig(d *schema.ResourceData) (*sdk.WorkloadoptimizationV1CustomMetricsDataSourceDataPrometheus, error) {
319+
func expandPrometheusInputConfig(d *schema.ResourceData) (*sdk.WorkloadoptimizationV1CustomMetricsDataSourceInputPrometheus, error) {
322320
promList := d.Get("prometheus").([]interface{})
323321
if len(promList) == 0 {
324322
return nil, fmt.Errorf("prometheus configuration is required")
@@ -327,19 +325,19 @@ func expandPrometheusConfig(d *schema.ResourceData) (*sdk.WorkloadoptimizationV1
327325
promMap := promList[0].(map[string]interface{})
328326
url := promMap["url"].(string)
329327

330-
dataSource := sdk.WorkloadoptimizationV1CustomMetricsDataSourceDataPrometheusDataSource{
328+
dataSource := sdk.WorkloadoptimizationV1CustomMetricsDataSourceInputPrometheusDataSource{
331329
Url: url,
332330
}
333331

334332
if v, ok := promMap["timeout"].(string); ok && v != "" {
335333
dataSource.Timeout = &v
336334
}
337335

338-
result := &sdk.WorkloadoptimizationV1CustomMetricsDataSourceDataPrometheus{
336+
result := &sdk.WorkloadoptimizationV1CustomMetricsDataSourceInputPrometheus{
339337
DataSource: dataSource,
340338
}
341339

342-
var metrics *sdk.WorkloadoptimizationV1CustomMetricsDataSourceDataPrometheusMetrics
340+
var metrics *sdk.WorkloadoptimizationV1CustomMetricsDataSourceInputPrometheusMetrics
343341

344342
// Expand presets.
345343
if v, ok := promMap["presets"].([]interface{}); ok && len(v) > 0 {
@@ -348,31 +346,30 @@ func expandPrometheusConfig(d *schema.ResourceData) (*sdk.WorkloadoptimizationV1
348346
presets[i] = p.(string)
349347
}
350348
if metrics == nil {
351-
metrics = &sdk.WorkloadoptimizationV1CustomMetricsDataSourceDataPrometheusMetrics{}
349+
metrics = &sdk.WorkloadoptimizationV1CustomMetricsDataSourceInputPrometheusMetrics{}
352350
}
353351
metrics.Presets = &presets
354352
}
355353

356-
// Expand manual metrics.
354+
// Expand manual metrics. Each TF metric block with multiple queries is fanned out
355+
// into separate custom metric entries (the API expects one query per entry).
357356
if v, ok := promMap["metric"].([]interface{}); ok && len(v) > 0 {
358-
resolvedMetrics := make([]sdk.WorkloadoptimizationV1CustomMetricsDataSourceDataPrometheusMetricsMetric, len(v))
359-
for i, m := range v {
357+
var customMetrics []sdk.WorkloadoptimizationV1CustomMetricsDataSourceInputPrometheusMetric
358+
for _, m := range v {
360359
metricMap := m.(map[string]interface{})
361360
name := metricMap["name"].(string)
362361
queriesRaw := metricMap["queries"].([]interface{})
363-
queries := make([]string, len(queriesRaw))
364-
for j, q := range queriesRaw {
365-
queries[j] = q.(string)
366-
}
367-
resolvedMetrics[i] = sdk.WorkloadoptimizationV1CustomMetricsDataSourceDataPrometheusMetricsMetric{
368-
Name: name,
369-
Queries: queries,
362+
for _, q := range queriesRaw {
363+
customMetrics = append(customMetrics, sdk.WorkloadoptimizationV1CustomMetricsDataSourceInputPrometheusMetric{
364+
Name: name,
365+
Query: q.(string),
366+
})
370367
}
371368
}
372369
if metrics == nil {
373-
metrics = &sdk.WorkloadoptimizationV1CustomMetricsDataSourceDataPrometheusMetrics{}
370+
metrics = &sdk.WorkloadoptimizationV1CustomMetricsDataSourceInputPrometheusMetrics{}
374371
}
375-
metrics.ResolvedMetrics = &resolvedMetrics
372+
metrics.Custom = &customMetrics
376373
}
377374

378375
result.Metrics = metrics

castai/resource_workload_scaling_policy_test.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -987,7 +987,7 @@ func Test_toWorkloadScalingPoliciesMap(t *testing.T) {
987987
"should map limit strategy with only_if_original_exist true": {
988988
previousCfg: map[string]any{},
989989
policies: sdk.WorkloadoptimizationV1ResourcePolicies{
990-
Function: sdk.QUANTILE,
990+
Function: sdk.WorkloadoptimizationV1ResourcePoliciesFunctionQUANTILE,
991991
Args: []string{"0.9"},
992992
Overhead: 0.1,
993993
Limit: &sdk.WorkloadoptimizationV1ResourceLimitStrategy{
@@ -998,7 +998,7 @@ func Test_toWorkloadScalingPoliciesMap(t *testing.T) {
998998
},
999999
expected: []map[string]any{
10001000
{
1001-
"function": sdk.QUANTILE,
1001+
"function": sdk.WorkloadoptimizationV1ResourcePoliciesFunctionQUANTILE,
10021002
"args": []string{"0.9"},
10031003
"overhead": 0.1,
10041004
"min": (*float64)(nil),
@@ -1016,7 +1016,7 @@ func Test_toWorkloadScalingPoliciesMap(t *testing.T) {
10161016
"should map limit strategy with only_if_original_exist false": {
10171017
previousCfg: map[string]any{},
10181018
policies: sdk.WorkloadoptimizationV1ResourcePolicies{
1019-
Function: sdk.MAX,
1019+
Function: sdk.WorkloadoptimizationV1ResourcePoliciesFunctionMAX,
10201020
Overhead: 0.15,
10211021
Limit: &sdk.WorkloadoptimizationV1ResourceLimitStrategy{
10221022
Type: sdk.WorkloadoptimizationV1ResourceLimitStrategyTypeNOLIMIT,
@@ -1025,7 +1025,7 @@ func Test_toWorkloadScalingPoliciesMap(t *testing.T) {
10251025
},
10261026
expected: []map[string]any{
10271027
{
1028-
"function": sdk.MAX,
1028+
"function": sdk.WorkloadoptimizationV1ResourcePoliciesFunctionMAX,
10291029
"args": []string(nil),
10301030
"overhead": 0.15,
10311031
"min": (*float64)(nil),
@@ -1042,7 +1042,7 @@ func Test_toWorkloadScalingPoliciesMap(t *testing.T) {
10421042
"should map limit strategy with only_if_original_lower true": {
10431043
previousCfg: map[string]any{},
10441044
policies: sdk.WorkloadoptimizationV1ResourcePolicies{
1045-
Function: sdk.QUANTILE,
1045+
Function: sdk.WorkloadoptimizationV1ResourcePoliciesFunctionQUANTILE,
10461046
Args: []string{"0.95"},
10471047
Overhead: 0.2,
10481048
Limit: &sdk.WorkloadoptimizationV1ResourceLimitStrategy{
@@ -1052,7 +1052,7 @@ func Test_toWorkloadScalingPoliciesMap(t *testing.T) {
10521052
},
10531053
expected: []map[string]any{
10541054
{
1055-
"function": sdk.QUANTILE,
1055+
"function": sdk.WorkloadoptimizationV1ResourcePoliciesFunctionQUANTILE,
10561056
"args": []string{"0.95"},
10571057
"overhead": 0.2,
10581058
"min": (*float64)(nil),
@@ -1069,7 +1069,7 @@ func Test_toWorkloadScalingPoliciesMap(t *testing.T) {
10691069
"should map limit strategy with only_if_original_lower false": {
10701070
previousCfg: map[string]any{},
10711071
policies: sdk.WorkloadoptimizationV1ResourcePolicies{
1072-
Function: sdk.QUANTILE,
1072+
Function: sdk.WorkloadoptimizationV1ResourcePoliciesFunctionQUANTILE,
10731073
Args: []string{"0.5"},
10741074
Overhead: 0.05,
10751075
Limit: &sdk.WorkloadoptimizationV1ResourceLimitStrategy{
@@ -1080,7 +1080,7 @@ func Test_toWorkloadScalingPoliciesMap(t *testing.T) {
10801080
},
10811081
expected: []map[string]any{
10821082
{
1083-
"function": sdk.QUANTILE,
1083+
"function": sdk.WorkloadoptimizationV1ResourcePoliciesFunctionQUANTILE,
10841084
"args": []string{"0.5"},
10851085
"overhead": 0.05,
10861086
"min": (*float64)(nil),
@@ -1098,7 +1098,7 @@ func Test_toWorkloadScalingPoliciesMap(t *testing.T) {
10981098
"should map limit strategy with both only_if_original_exist and only_if_original_lower": {
10991099
previousCfg: map[string]any{},
11001100
policies: sdk.WorkloadoptimizationV1ResourcePolicies{
1101-
Function: sdk.MAX,
1101+
Function: sdk.WorkloadoptimizationV1ResourcePoliciesFunctionMAX,
11021102
Overhead: 0.3,
11031103
Limit: &sdk.WorkloadoptimizationV1ResourceLimitStrategy{
11041104
Type: sdk.WorkloadoptimizationV1ResourceLimitStrategyTypeMULTIPLIER,
@@ -1109,7 +1109,7 @@ func Test_toWorkloadScalingPoliciesMap(t *testing.T) {
11091109
},
11101110
expected: []map[string]any{
11111111
{
1112-
"function": sdk.MAX,
1112+
"function": sdk.WorkloadoptimizationV1ResourcePoliciesFunctionMAX,
11131113
"args": []string(nil),
11141114
"overhead": 0.3,
11151115
"min": (*float64)(nil),
@@ -1128,7 +1128,7 @@ func Test_toWorkloadScalingPoliciesMap(t *testing.T) {
11281128
"should map limit strategy without only_if flags": {
11291129
previousCfg: map[string]any{},
11301130
policies: sdk.WorkloadoptimizationV1ResourcePolicies{
1131-
Function: sdk.QUANTILE,
1131+
Function: sdk.WorkloadoptimizationV1ResourcePoliciesFunctionQUANTILE,
11321132
Args: []string{"0.8"},
11331133
Overhead: 0.12,
11341134
Limit: &sdk.WorkloadoptimizationV1ResourceLimitStrategy{
@@ -1138,7 +1138,7 @@ func Test_toWorkloadScalingPoliciesMap(t *testing.T) {
11381138
},
11391139
expected: []map[string]any{
11401140
{
1141-
"function": sdk.QUANTILE,
1141+
"function": sdk.WorkloadoptimizationV1ResourcePoliciesFunctionQUANTILE,
11421142
"args": []string{"0.8"},
11431143
"overhead": 0.12,
11441144
"min": (*float64)(nil),
@@ -1155,13 +1155,13 @@ func Test_toWorkloadScalingPoliciesMap(t *testing.T) {
11551155
"should not include limit when nil": {
11561156
previousCfg: map[string]any{},
11571157
policies: sdk.WorkloadoptimizationV1ResourcePolicies{
1158-
Function: sdk.MAX,
1158+
Function: sdk.WorkloadoptimizationV1ResourcePoliciesFunctionMAX,
11591159
Overhead: 0.1,
11601160
Limit: nil,
11611161
},
11621162
expected: []map[string]any{
11631163
{
1164-
"function": sdk.MAX,
1164+
"function": sdk.WorkloadoptimizationV1ResourcePoliciesFunctionMAX,
11651165
"args": []string(nil),
11661166
"overhead": 0.1,
11671167
"min": (*float64)(nil),

castai/sdk/api.gen.go

Lines changed: 36 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)