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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
## X.Y.Z (Unreleased)
* Add new change notes here
* Add `filter_variable_source_definition` support for dashboard variables (scope-based variables)

## 3.2.0 (November 21, 2025)
* Add support for Zurich region
Expand Down
43 changes: 43 additions & 0 deletions sumologic/resource_sumologic_dashboard.go
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,33 @@ func getSourceDefinitionSchema() map[string]*schema.Schema {
},
},
},
"filter_variable_source_definition": {
Type: schema.TypeList,
MaxItems: 1,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"key": {
Type: schema.TypeString,
Required: true,
},
"filter": {
Type: schema.TypeString,
Optional: true,
Default: "",
},
"values": {
Type: schema.TypeString,
Optional: true,
},
"panel_ids": {
Type: schema.TypeString,
Optional: true,
Default: "\"allpanels\"",
},
},
},
},
}
}

Expand Down Expand Up @@ -1033,6 +1060,15 @@ func getSourceDefinition(tfSourceDef map[string]interface{}) interface{} {
VariableSourceType: "CsvVariableSourceDefinition",
Values: csvSourceDef["values"].(string),
}
} else if val := tfSourceDef["filter_variable_source_definition"].([]interface{}); len(val) == 1 {
filterSourceDef := val[0].(map[string]interface{})
return FilterVariableSourceDefinition{
VariableSourceType: "FilterSourceDefinition",
Filter: filterSourceDef["filter"].(string),
Key: filterSourceDef["key"].(string),
Values: filterSourceDef["values"].(string),
PanelIds: filterSourceDef["panel_ids"].(string),
}
}
return nil
}
Expand Down Expand Up @@ -1445,6 +1481,13 @@ func getTerraformVariableSourceDefinition(sourceDefinition map[string]interface{
logQueryDefinition[0]["query"] = sourceDefinition["query"]
logQueryDefinition[0]["field"] = sourceDefinition["field"]
tfSourceDefinition[0]["log_query_variable_source_definition"] = logQueryDefinition
} else if sourceDefinition["variableSourceType"] == "FilterSourceDefinition" {
filterDefinition := MakeTerraformObject()
filterDefinition[0]["key"] = sourceDefinition["key"]
filterDefinition[0]["filter"] = sourceDefinition["filter"]
filterDefinition[0]["values"] = sourceDefinition["values"]
filterDefinition[0]["panel_ids"] = sourceDefinition["panelIds"]
tfSourceDefinition[0]["filter_variable_source_definition"] = filterDefinition
}

return tfSourceDefinition
Expand Down
89 changes: 89 additions & 0 deletions sumologic/resource_sumologic_dashboard_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -652,3 +652,92 @@ func dashboardUpdateConfig(title string, description string, theme string, refre
variables[1].Name, variables[1].DisplayName, loqQuerySourceDef.Query, loqQuerySourceDef.Field,
)
}

func TestAccSumologicDashboard_filterSourceDefinition(t *testing.T) {
testNameSuffix := acctest.RandString(16)

title := "terraform_test_dashboard_filter_" + testNameSuffix
variableName := "_sourcecategory"
variableDisplayName := "Source Category"
filterKey := "_sourcecategory"
filterValues := "aws/prod,aws/dev"
filterPanelIds := "\"allpanels\""

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckDashboardDestroy(),
Steps: []resource.TestStep{
{
Config: dashboardFilterSourceDefinitionConfig(title, variableName, variableDisplayName, filterKey, filterValues, filterPanelIds),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("sumologic_dashboard.tf_filter_test",
"title", title),
resource.TestCheckResourceAttr("sumologic_dashboard.tf_filter_test",
"variable.0.name", variableName),
resource.TestCheckResourceAttr("sumologic_dashboard.tf_filter_test",
"variable.0.display_name", variableDisplayName),
resource.TestCheckResourceAttr("sumologic_dashboard.tf_filter_test",
"variable.0.source_definition.0.filter_variable_source_definition.0.key", filterKey),
resource.TestCheckResourceAttr("sumologic_dashboard.tf_filter_test",
"variable.0.source_definition.0.filter_variable_source_definition.0.values", filterValues),
resource.TestCheckResourceAttr("sumologic_dashboard.tf_filter_test",
"variable.0.source_definition.0.filter_variable_source_definition.0.panel_ids", filterPanelIds),
),
},
},
})
}

func dashboardFilterSourceDefinitionConfig(title, variableName, variableDisplayName, filterKey, filterValues, filterPanelIds string) string {
return fmt.Sprintf(`
data "sumologic_personal_folder" "personalFolder" {}
resource "sumologic_dashboard" "tf_filter_test" {
title = "%s"
folder_id = data.sumologic_personal_folder.personalFolder.id

time_range {
begin_bounded_time_range {
from {
literal_time_range {
range_name = "today"
}
}
}
}

panel {
text_panel {
key = "text-panel-01"
title = "Test Panel"
text = "Test text"
}
}

layout {
grid {
layout_structure {
key = "text-panel-01"
structure = "{\"height\":10,\"width\":24,\"x\":0,\"y\":0}"
}
}
}

variable {
name = "%s"
display_name = "%s"
source_definition {
filter_variable_source_definition {
key = "%s"
values = "%s"
panel_ids = "%s"
}
}
allow_multi_select = true
include_all_option = true
hide_from_ui = false
}
}`,
title, variableName, variableDisplayName, filterKey, filterValues, filterPanelIds,
)
}
9 changes: 9 additions & 0 deletions sumologic/sumologic_dashboard.go
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ type Variable struct {
AllowMultiSelect bool `json:"allowMultiSelect,omitempty"`
IncludeAllOption bool `json:"includeAllOption"`
HideFromUI bool `json:"hideFromUI,omitempty"`
ValueType string `json:"valueType,omitempty"`
}

type MetadataVariableSourceDefinition struct {
Expand All @@ -201,6 +202,14 @@ type LogQueryVariableSourceDefinition struct {
Field string `json:"field"`
}

type FilterVariableSourceDefinition struct {
VariableSourceType string `json:"variableSourceType"`
Filter string `json:"filter"`
Key string `json:"key"`
Values string `json:"values"`
PanelIds string `json:"panelIds"`
}

// Coloring Rule related structs
type ColoringRule struct {
Scope string `json:"scope"`
Expand Down
5 changes: 5 additions & 0 deletions website/docs/r/dashboard.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,11 @@ One of `Basic` or `Advanced`.
- `key` - (Required) Return the values for this given key.
- `csv_variable_source_definition` - (Optional) Variable values in csv format.
- `values` - (Required) A comma separated values for the variable.
- `filter_variable_source_definition` - (Optional) Variable values from a filter (scope-based variable).
- `key` - (Required) The metadata key to filter on (e.g., `_sourcecategory`).
- `filter` - (Optional) Additional filter expression. Defaults to empty string.
- `values` - (Optional) Comma-separated list of values for the filter.
- `panel_ids` - (Optional) Panel IDs to apply the filter to. Defaults to `"allpanels"`.


## Import
Expand Down