Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 29 additions & 13 deletions stackit/internal/services/observability/instance/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -918,6 +918,13 @@ func (r *instanceResource) ModifyPlan(ctx context.Context, req resource.ModifyPl
return
}

if plan.GetGrafanaGlobalDashboards() == 0 {
// If grafana_admin_enabled was set, return an error to the user
if !(utils.IsUndefined(configModel.GrafanaAdminEnabled)) {
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))
}
}

// Plan does not support alert config
if plan.GetAlertMatchers() == 0 && plan.GetAlertReceivers() == 0 {
// If an alert config was set, return an error to the user
Expand Down Expand Up @@ -990,7 +997,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques
return
}
// Generate API request body from model
createPayload, err := toCreatePayload(&model)
createPayload, err := toCreatePayload(&model, plan.GetGrafanaGlobalDashboards() != 0)
if err != nil {
core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Creating API payload: %v", err))
return
Expand Down Expand Up @@ -1328,7 +1335,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques
}

// Generate API request body from model
payload, err := toUpdatePayload(&model)
payload, err := toUpdatePayload(&model, plan.GetGrafanaGlobalDashboards() != 0)
if err != nil {
core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Creating API payload: %v", err))
return
Expand All @@ -1339,7 +1346,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques
if resp.Diagnostics.HasError() {
return
}
previousStatePayload, err := toUpdatePayload(&previousState)
previousStatePayload, err := toUpdatePayload(&previousState, plan.GetGrafanaGlobalDashboards() != 0)
if err != nil {
core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Creating previous state payload: %v", err))
return
Expand Down Expand Up @@ -2141,7 +2148,7 @@ func mapChildRoutesToAttributes(ctx context.Context, routes *[]observability.Rou
return returnRoutesList, nil
}

func toCreatePayload(model *Model) (*observability.CreateInstancePayload, error) {
func toCreatePayload(model *Model, setGrafanaAdminEnabled bool) (*observability.CreateInstancePayload, error) {
if model == nil {
return nil, fmt.Errorf("nil model")
}
Expand All @@ -2150,12 +2157,16 @@ func toCreatePayload(model *Model) (*observability.CreateInstancePayload, error)
for k := range elements {
pa[k] = elements[k].String()
}
return &observability.CreateInstancePayload{
GrafanaAdminEnabled: conversion.BoolValueToPointer(model.GrafanaAdminEnabled),
Name: conversion.StringValueToPointer(model.Name),
PlanId: conversion.StringValueToPointer(model.PlanId),
Parameter: &pa,
}, nil
payload := &observability.CreateInstancePayload{
Name: conversion.StringValueToPointer(model.Name),
PlanId: conversion.StringValueToPointer(model.PlanId),
Parameter: &pa,
}
if setGrafanaAdminEnabled {
payload.GrafanaAdminEnabled = conversion.BoolValueToPointer(model.GrafanaAdminEnabled)
}

return payload, nil
}

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

func toUpdatePayload(model *Model) (*observability.UpdateInstancePayload, error) {
func toUpdatePayload(model *Model, setGrafanaAdminEnabled bool) (*observability.UpdateInstancePayload, error) {
if model == nil {
return nil, fmt.Errorf("nil model")
}
Expand All @@ -2214,11 +2225,16 @@ func toUpdatePayload(model *Model) (*observability.UpdateInstancePayload, error)
for k, v := range elements {
pa[k] = v.String()
}
return &observability.UpdateInstancePayload{
payload := &observability.UpdateInstancePayload{
Name: conversion.StringValueToPointer(model.Name),
PlanId: conversion.StringValueToPointer(model.PlanId),
Parameter: &pa,
}, nil
}
if setGrafanaAdminEnabled {
payload.GrafanaAdminEnabled = conversion.BoolValueToPointer(model.GrafanaAdminEnabled)
}

return payload, nil
}

func toUpdateAlertConfigPayload(ctx context.Context, model *alertConfigModel) (*observability.UpdateAlertConfigsPayload, error) {
Expand Down
84 changes: 65 additions & 19 deletions stackit/internal/services/observability/instance/resource_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1004,30 +1004,52 @@ func TestMapAlertConfigField(t *testing.T) {

func TestToCreatePayload(t *testing.T) {
tests := []struct {
description string
input *Model
expected *observability.CreateInstancePayload
isValid bool
description string
input *Model
grafanaAdminEnabled bool
expected *observability.CreateInstancePayload
isValid bool
}{
{
"basic_ok",
&Model{
PlanId: types.StringValue("planId"),
GrafanaAdminEnabled: types.BoolValue(true),
PlanId: types.StringValue("planId"),
},
true,
&observability.CreateInstancePayload{
Name: nil,
PlanId: utils.Ptr("planId"),
Parameter: &map[string]interface{}{},
GrafanaAdminEnabled: utils.Ptr(true),
Name: nil,
PlanId: utils.Ptr("planId"),
Parameter: &map[string]interface{}{},
},
true,
},
{
"ok",
&Model{
GrafanaAdminEnabled: types.BoolValue(false),
Name: types.StringValue("Name"),
PlanId: types.StringValue("planId"),
Parameters: makeTestMap(t),
},
true,
&observability.CreateInstancePayload{
GrafanaAdminEnabled: utils.Ptr(false),
Name: utils.Ptr("Name"),
PlanId: utils.Ptr("planId"),
Parameter: &map[string]interface{}{"key": `"value"`},
},
true,
},
{
"plan does not support grafana",
&Model{
Name: types.StringValue("Name"),
PlanId: types.StringValue("planId"),
Parameters: makeTestMap(t),
},
false,
&observability.CreateInstancePayload{
Name: utils.Ptr("Name"),
PlanId: utils.Ptr("planId"),
Expand All @@ -1038,13 +1060,14 @@ func TestToCreatePayload(t *testing.T) {
{
"nil_model",
nil,
true,
nil,
false,
},
}
for _, tt := range tests {
t.Run(tt.description, func(t *testing.T) {
output, err := toCreatePayload(tt.input)
output, err := toCreatePayload(tt.input, tt.grafanaAdminEnabled)
if !tt.isValid && err == nil {
t.Fatalf("Should have failed")
}
Expand All @@ -1063,47 +1086,70 @@ func TestToCreatePayload(t *testing.T) {

func TestToPayloadUpdate(t *testing.T) {
tests := []struct {
description string
input *Model
expected *observability.UpdateInstancePayload
isValid bool
description string
input *Model
grafanaAdminEnabled bool
expected *observability.UpdateInstancePayload
isValid bool
}{
{
"basic_ok",
&Model{
PlanId: types.StringValue("planId"),
GrafanaAdminEnabled: types.BoolValue(true),
PlanId: types.StringValue("planId"),
},
true,
&observability.UpdateInstancePayload{
Name: nil,
PlanId: utils.Ptr("planId"),
Parameter: &map[string]any{},
GrafanaAdminEnabled: utils.Ptr(true),
Name: nil,
PlanId: utils.Ptr("planId"),
Parameter: &map[string]any{},
},
true,
},
{
"ok",
&Model{
GrafanaAdminEnabled: types.BoolValue(false),
Name: types.StringValue("Name"),
PlanId: types.StringValue("planId"),
Parameters: makeTestMap(t),
},
true,
&observability.UpdateInstancePayload{
GrafanaAdminEnabled: utils.Ptr(false),
Name: utils.Ptr("Name"),
PlanId: utils.Ptr("planId"),
Parameter: &map[string]any{"key": `"value"`},
},
true,
},
{
"plan does not support grafana",
&Model{
Name: types.StringValue("Name"),
PlanId: types.StringValue("planId"),
Parameters: makeTestMap(t),
},
false,
&observability.UpdateInstancePayload{
Name: utils.Ptr("Name"),
PlanId: utils.Ptr("planId"),
Parameter: &map[string]any{"key": `"value"`},
Parameter: &map[string]interface{}{"key": `"value"`},
},
true,
},
{
"nil_model",
nil,
true,
nil,
false,
},
}
for _, tt := range tests {
t.Run(tt.description, func(t *testing.T) {
output, err := toUpdatePayload(tt.input)
output, err := toUpdatePayload(tt.input, tt.grafanaAdminEnabled)
if !tt.isValid && err == nil {
t.Fatalf("Should have failed")
}
Expand Down
Loading