Skip to content

Commit 279cecb

Browse files
authored
fix(observability): Don't add grafanaAdminEnabled to payload for plans which don't support grafana (#1219)
Signed-off-by: Alexander Dahmen <alexander.dahmen@inovex.de>
1 parent c0edcad commit 279cecb

File tree

2 files changed

+94
-32
lines changed

2 files changed

+94
-32
lines changed

stackit/internal/services/observability/instance/resource.go

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -918,6 +918,13 @@ func (r *instanceResource) ModifyPlan(ctx context.Context, req resource.ModifyPl
918918
return
919919
}
920920

921+
if plan.GetGrafanaGlobalDashboards() == 0 {
922+
// If grafana_admin_enabled was set, return an error to the user
923+
if !(utils.IsUndefined(configModel.GrafanaAdminEnabled)) {
924+
core.LogAndAddError(ctx, &resp.Diagnostics, "Error validating plan", fmt.Sprintf("Plan (%s) has no Grafana included. Remove `grafana_admin_enabled` from your config or use a different plan.", *plan.Name))
925+
}
926+
}
927+
921928
// Plan does not support alert config
922929
if plan.GetAlertMatchers() == 0 && plan.GetAlertReceivers() == 0 {
923930
// If an alert config was set, return an error to the user
@@ -990,7 +997,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques
990997
return
991998
}
992999
// Generate API request body from model
993-
createPayload, err := toCreatePayload(&model)
1000+
createPayload, err := toCreatePayload(&model, plan.GetGrafanaGlobalDashboards() != 0)
9941001
if err != nil {
9951002
core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Creating API payload: %v", err))
9961003
return
@@ -1328,7 +1335,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques
13281335
}
13291336

13301337
// Generate API request body from model
1331-
payload, err := toUpdatePayload(&model)
1338+
payload, err := toUpdatePayload(&model, plan.GetGrafanaGlobalDashboards() != 0)
13321339
if err != nil {
13331340
core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Creating API payload: %v", err))
13341341
return
@@ -1339,7 +1346,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques
13391346
if resp.Diagnostics.HasError() {
13401347
return
13411348
}
1342-
previousStatePayload, err := toUpdatePayload(&previousState)
1349+
previousStatePayload, err := toUpdatePayload(&previousState, plan.GetGrafanaGlobalDashboards() != 0)
13431350
if err != nil {
13441351
core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Creating previous state payload: %v", err))
13451352
return
@@ -2141,7 +2148,7 @@ func mapChildRoutesToAttributes(ctx context.Context, routes *[]observability.Rou
21412148
return returnRoutesList, nil
21422149
}
21432150

2144-
func toCreatePayload(model *Model) (*observability.CreateInstancePayload, error) {
2151+
func toCreatePayload(model *Model, setGrafanaAdminEnabled bool) (*observability.CreateInstancePayload, error) {
21452152
if model == nil {
21462153
return nil, fmt.Errorf("nil model")
21472154
}
@@ -2150,12 +2157,16 @@ func toCreatePayload(model *Model) (*observability.CreateInstancePayload, error)
21502157
for k := range elements {
21512158
pa[k] = elements[k].String()
21522159
}
2153-
return &observability.CreateInstancePayload{
2154-
GrafanaAdminEnabled: conversion.BoolValueToPointer(model.GrafanaAdminEnabled),
2155-
Name: conversion.StringValueToPointer(model.Name),
2156-
PlanId: conversion.StringValueToPointer(model.PlanId),
2157-
Parameter: &pa,
2158-
}, nil
2160+
payload := &observability.CreateInstancePayload{
2161+
Name: conversion.StringValueToPointer(model.Name),
2162+
PlanId: conversion.StringValueToPointer(model.PlanId),
2163+
Parameter: &pa,
2164+
}
2165+
if setGrafanaAdminEnabled {
2166+
payload.GrafanaAdminEnabled = conversion.BoolValueToPointer(model.GrafanaAdminEnabled)
2167+
}
2168+
2169+
return payload, nil
21592170
}
21602171

21612172
func toUpdateMetricsStorageRetentionPayload(retentionDaysRaw, retentionDays5m, retentionDays1h *int64, resp *observability.GetMetricsStorageRetentionResponse) (*observability.UpdateMetricsStorageRetentionPayload, error) {
@@ -2205,7 +2216,7 @@ func updateACL(ctx context.Context, projectId, instanceId string, acl []string,
22052216
return nil
22062217
}
22072218

2208-
func toUpdatePayload(model *Model) (*observability.UpdateInstancePayload, error) {
2219+
func toUpdatePayload(model *Model, setGrafanaAdminEnabled bool) (*observability.UpdateInstancePayload, error) {
22092220
if model == nil {
22102221
return nil, fmt.Errorf("nil model")
22112222
}
@@ -2214,11 +2225,16 @@ func toUpdatePayload(model *Model) (*observability.UpdateInstancePayload, error)
22142225
for k, v := range elements {
22152226
pa[k] = v.String()
22162227
}
2217-
return &observability.UpdateInstancePayload{
2228+
payload := &observability.UpdateInstancePayload{
22182229
Name: conversion.StringValueToPointer(model.Name),
22192230
PlanId: conversion.StringValueToPointer(model.PlanId),
22202231
Parameter: &pa,
2221-
}, nil
2232+
}
2233+
if setGrafanaAdminEnabled {
2234+
payload.GrafanaAdminEnabled = conversion.BoolValueToPointer(model.GrafanaAdminEnabled)
2235+
}
2236+
2237+
return payload, nil
22222238
}
22232239

22242240
func toUpdateAlertConfigPayload(ctx context.Context, model *alertConfigModel) (*observability.UpdateAlertConfigsPayload, error) {

stackit/internal/services/observability/instance/resource_test.go

Lines changed: 65 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,30 +1004,52 @@ func TestMapAlertConfigField(t *testing.T) {
10041004

10051005
func TestToCreatePayload(t *testing.T) {
10061006
tests := []struct {
1007-
description string
1008-
input *Model
1009-
expected *observability.CreateInstancePayload
1010-
isValid bool
1007+
description string
1008+
input *Model
1009+
grafanaAdminEnabled bool
1010+
expected *observability.CreateInstancePayload
1011+
isValid bool
10111012
}{
10121013
{
10131014
"basic_ok",
10141015
&Model{
1015-
PlanId: types.StringValue("planId"),
1016+
GrafanaAdminEnabled: types.BoolValue(true),
1017+
PlanId: types.StringValue("planId"),
10161018
},
1019+
true,
10171020
&observability.CreateInstancePayload{
1018-
Name: nil,
1019-
PlanId: utils.Ptr("planId"),
1020-
Parameter: &map[string]interface{}{},
1021+
GrafanaAdminEnabled: utils.Ptr(true),
1022+
Name: nil,
1023+
PlanId: utils.Ptr("planId"),
1024+
Parameter: &map[string]interface{}{},
10211025
},
10221026
true,
10231027
},
10241028
{
10251029
"ok",
1030+
&Model{
1031+
GrafanaAdminEnabled: types.BoolValue(false),
1032+
Name: types.StringValue("Name"),
1033+
PlanId: types.StringValue("planId"),
1034+
Parameters: makeTestMap(t),
1035+
},
1036+
true,
1037+
&observability.CreateInstancePayload{
1038+
GrafanaAdminEnabled: utils.Ptr(false),
1039+
Name: utils.Ptr("Name"),
1040+
PlanId: utils.Ptr("planId"),
1041+
Parameter: &map[string]interface{}{"key": `"value"`},
1042+
},
1043+
true,
1044+
},
1045+
{
1046+
"plan does not support grafana",
10261047
&Model{
10271048
Name: types.StringValue("Name"),
10281049
PlanId: types.StringValue("planId"),
10291050
Parameters: makeTestMap(t),
10301051
},
1052+
false,
10311053
&observability.CreateInstancePayload{
10321054
Name: utils.Ptr("Name"),
10331055
PlanId: utils.Ptr("planId"),
@@ -1038,13 +1060,14 @@ func TestToCreatePayload(t *testing.T) {
10381060
{
10391061
"nil_model",
10401062
nil,
1063+
true,
10411064
nil,
10421065
false,
10431066
},
10441067
}
10451068
for _, tt := range tests {
10461069
t.Run(tt.description, func(t *testing.T) {
1047-
output, err := toCreatePayload(tt.input)
1070+
output, err := toCreatePayload(tt.input, tt.grafanaAdminEnabled)
10481071
if !tt.isValid && err == nil {
10491072
t.Fatalf("Should have failed")
10501073
}
@@ -1063,47 +1086,70 @@ func TestToCreatePayload(t *testing.T) {
10631086

10641087
func TestToPayloadUpdate(t *testing.T) {
10651088
tests := []struct {
1066-
description string
1067-
input *Model
1068-
expected *observability.UpdateInstancePayload
1069-
isValid bool
1089+
description string
1090+
input *Model
1091+
grafanaAdminEnabled bool
1092+
expected *observability.UpdateInstancePayload
1093+
isValid bool
10701094
}{
10711095
{
10721096
"basic_ok",
10731097
&Model{
1074-
PlanId: types.StringValue("planId"),
1098+
GrafanaAdminEnabled: types.BoolValue(true),
1099+
PlanId: types.StringValue("planId"),
10751100
},
1101+
true,
10761102
&observability.UpdateInstancePayload{
1077-
Name: nil,
1078-
PlanId: utils.Ptr("planId"),
1079-
Parameter: &map[string]any{},
1103+
GrafanaAdminEnabled: utils.Ptr(true),
1104+
Name: nil,
1105+
PlanId: utils.Ptr("planId"),
1106+
Parameter: &map[string]any{},
10801107
},
10811108
true,
10821109
},
10831110
{
10841111
"ok",
1112+
&Model{
1113+
GrafanaAdminEnabled: types.BoolValue(false),
1114+
Name: types.StringValue("Name"),
1115+
PlanId: types.StringValue("planId"),
1116+
Parameters: makeTestMap(t),
1117+
},
1118+
true,
1119+
&observability.UpdateInstancePayload{
1120+
GrafanaAdminEnabled: utils.Ptr(false),
1121+
Name: utils.Ptr("Name"),
1122+
PlanId: utils.Ptr("planId"),
1123+
Parameter: &map[string]any{"key": `"value"`},
1124+
},
1125+
true,
1126+
},
1127+
{
1128+
"plan does not support grafana",
10851129
&Model{
10861130
Name: types.StringValue("Name"),
10871131
PlanId: types.StringValue("planId"),
10881132
Parameters: makeTestMap(t),
10891133
},
1134+
false,
10901135
&observability.UpdateInstancePayload{
10911136
Name: utils.Ptr("Name"),
10921137
PlanId: utils.Ptr("planId"),
1093-
Parameter: &map[string]any{"key": `"value"`},
1138+
Parameter: &map[string]interface{}{"key": `"value"`},
10941139
},
10951140
true,
10961141
},
10971142
{
10981143
"nil_model",
10991144
nil,
1145+
true,
11001146
nil,
11011147
false,
11021148
},
11031149
}
11041150
for _, tt := range tests {
11051151
t.Run(tt.description, func(t *testing.T) {
1106-
output, err := toUpdatePayload(tt.input)
1152+
output, err := toUpdatePayload(tt.input, tt.grafanaAdminEnabled)
11071153
if !tt.isValid && err == nil {
11081154
t.Fatalf("Should have failed")
11091155
}

0 commit comments

Comments
 (0)