Skip to content

Commit 6f4c52a

Browse files
committed
Add dashboard read method
1 parent c779661 commit 6f4c52a

File tree

2 files changed

+330
-20
lines changed

2 files changed

+330
-20
lines changed

sumologic/resource_sumologic_dashboard.go

Lines changed: 321 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -429,9 +429,10 @@ func getGridLayoutSchema() map[string]*schema.Schema {
429429

430430
func getVariablesSchema() map[string]*schema.Schema {
431431
return map[string]*schema.Schema{
432+
// TODO should we remove this field?
432433
"id": {
433434
Type: schema.TypeString,
434-
Optional: true,
435+
Computed: true,
435436
},
436437
"name": {
437438
Type: schema.TypeString,
@@ -640,7 +641,7 @@ func getTimeRangeBoundarySchema() map[string]*schema.Schema {
640641
"iso8601_time": {
641642
Type: schema.TypeString,
642643
Required: true,
643-
ValidateFunc: validation.ValidateRFC3339TimeString,
644+
ValidateFunc: validation.IsRFC3339Time,
644645
},
645646
},
646647
},
@@ -1190,22 +1191,330 @@ func setDashboard(d *schema.ResourceData, dashboard *Dashboard) error {
11901191
return err
11911192
}
11921193

1194+
timeRange := getTerraformTimeRange(dashboard.TimeRange.(map[string]interface{}))
1195+
if err := d.Set("time_range", timeRange); err != nil {
1196+
return err
1197+
}
1198+
1199+
panels := getTerraformPanels(dashboard.Panels)
1200+
if err := d.Set("panel", panels); err != nil {
1201+
return err
1202+
}
1203+
1204+
layout := getTerraformLayout(dashboard.Layout.(map[string]interface{}))
1205+
if err := d.Set("layout", layout); err != nil {
1206+
return err
1207+
}
1208+
1209+
variables := getTerraformVariables(dashboard.Variables)
1210+
if err := d.Set("variable", variables); err != nil {
1211+
return err
1212+
}
1213+
1214+
coloringRules := getTerraformColoringRules(dashboard.ColoringRules)
1215+
if err := d.Set("coloring_rule", coloringRules); err != nil {
1216+
return err
1217+
}
1218+
11931219
// TODO: Set rest of the fields
1194-
log.Printf("=====================================================================n")
1220+
log.Println("=====================================================================")
11951221
log.Printf("title: %+v\n", d.Get("title"))
11961222
log.Printf("description: %+v\n", d.Get("description"))
11971223
log.Printf("folder_id: %+v\n", d.Get("folder_id"))
1198-
log.Printf("=====================================================================n")
1224+
log.Printf("time_range: %+v\n", d.Get("time_range"))
1225+
log.Printf("panel: %+v\n", d.Get("panel"))
1226+
log.Printf("layout: %+v\n", d.Get("layout"))
1227+
log.Printf("variable: %+v\n", d.Get("variable"))
1228+
log.Printf("coloring_rule: %+v\n", d.Get("coloring_rule"))
1229+
log.Println("=====================================================================")
11991230
return nil
12001231
}
12011232

1233+
type TerraformObject [1]map[string]interface{}
1234+
1235+
func makeTerraformObject() TerraformObject {
1236+
terraformObject := [1]map[string]interface{}{}
1237+
terraformObject[0] = make(map[string]interface{})
1238+
return terraformObject
1239+
}
1240+
1241+
func getTerraformTimeRange(timeRange map[string]interface{}) TerraformObject {
1242+
tfTimeRange := makeTerraformObject()
1243+
1244+
if timeRange["type"] == "BeginBoundedTimeRange" {
1245+
boundedTimeRange := makeTerraformObject()
1246+
1247+
from := timeRange["from"].(map[string]interface{})
1248+
rangeBoundary := getTerraformTimeRangeBoundary(from)
1249+
boundedTimeRange[0]["from"] = rangeBoundary
1250+
1251+
if to := timeRange["to"]; to != nil {
1252+
rangeBoundary := getTerraformTimeRangeBoundary(to.(map[string]interface{}))
1253+
boundedTimeRange[0]["to"] = rangeBoundary
1254+
}
1255+
1256+
tfTimeRange[0]["begin_bounded_time_range"] = boundedTimeRange
1257+
} else if timeRange["type"] == "CompleteLiteralTimeRange" {
1258+
rangeName := timeRange["rangeName"]
1259+
1260+
completeLiteralTimeRange := makeTerraformObject()
1261+
completeLiteralTimeRange[0]["range_name"] = rangeName
1262+
tfTimeRange[0]["complete_literal_time_range"] = completeLiteralTimeRange
1263+
}
1264+
1265+
return tfTimeRange
1266+
}
1267+
1268+
func getTerraformTimeRangeBoundary(
1269+
timeRangeBoundary map[string]interface{}) TerraformObject {
1270+
tfTimeRangeBoundary := makeTerraformObject()
1271+
1272+
if timeRangeBoundary["type"] == "RelativeTimeRangeBoundary" {
1273+
relativeRange := makeTerraformObject()
1274+
relativeRange[0]["relative_time"] = timeRangeBoundary["relativeTime"]
1275+
tfTimeRangeBoundary[0]["relative_time_range"] = relativeRange
1276+
} else if timeRangeBoundary["type"] == "EpochTimeRangeBoundary" {
1277+
epochRange := makeTerraformObject()
1278+
epochRange[0]["epoch_millis"] = timeRangeBoundary["epochMillis"]
1279+
tfTimeRangeBoundary[0]["epoch_time_range"] = epochRange
1280+
} else if timeRangeBoundary["type"] == "Iso8601TimeRangeBoundary" {
1281+
iso8601Range := makeTerraformObject()
1282+
iso8601Range[0]["iso8601_time"] = timeRangeBoundary["iso8601Time"]
1283+
tfTimeRangeBoundary[0]["iso8601_time_range"] = iso8601Range
1284+
} else if timeRangeBoundary["type"] == "LiteralTimeRangeBoundary" {
1285+
literalRange := makeTerraformObject()
1286+
literalRange[0]["range_name"] = timeRangeBoundary["rangeName"]
1287+
tfTimeRangeBoundary[0]["literal_time_range"] = literalRange
1288+
}
1289+
1290+
return tfTimeRangeBoundary
1291+
}
1292+
1293+
func getTerraformPanels(panels []interface{}) []map[string]interface{} {
1294+
tfPanels := make([]map[string]interface{}, len(panels))
1295+
1296+
for i, val := range panels {
1297+
panel := val.(map[string]interface{})
1298+
1299+
tfPanel := map[string]interface{}{}
1300+
tfPanel["key"] = panel["key"]
1301+
if title, ok := panel["title"]; ok {
1302+
tfPanel["title"] = title
1303+
}
1304+
if visualSettings, ok := panel["visualSettings"]; ok {
1305+
tfPanel["visual_settings"] = visualSettings
1306+
}
1307+
if keepVisualSettingsConsistentWithParent, ok := panel["keepVisualSettingsConsistentWithParent"]; ok {
1308+
tfPanel["keep_visual_settings_consistent_with_parent"] = keepVisualSettingsConsistentWithParent
1309+
}
1310+
1311+
if panel["panelType"] == "TextPanel" {
1312+
textPanel := makeTerraformObject()
1313+
textPanel[0]["text"] = panel["text"]
1314+
tfPanel["text_panel"] = textPanel
1315+
} else if panel["panelType"] == "SumoSearchPanel" {
1316+
tfPanel["sumo_search_panel"] = getTerraformSearchPanel(panel)
1317+
}
1318+
1319+
tfPanels[i] = tfPanel
1320+
}
1321+
return tfPanels
1322+
}
1323+
1324+
func getTerraformSearchPanel(searchPanel map[string]interface{}) TerraformObject {
1325+
tfSearchPanel := makeTerraformObject()
1326+
1327+
tfSearchPanel[0]["query"] = getTerraformSearchPanelQuery(searchPanel["queries"].([]interface{}))
1328+
if description, ok := searchPanel["description"]; ok {
1329+
tfSearchPanel[0]["description"] = description
1330+
}
1331+
if timeRange := searchPanel["timeRange"]; timeRange != nil {
1332+
tfSearchPanel[0]["time_range"] = getTerraformTimeRange(timeRange.(map[string]interface{}))
1333+
}
1334+
if coloringRules := searchPanel["coloringRules"]; coloringRules != nil {
1335+
tfSearchPanel[0]["coloring_rule"] = getTerraformTimeRange(coloringRules.(map[string]interface{}))
1336+
}
1337+
if linkedDashboards := searchPanel["linkedDashboards"]; linkedDashboards != nil {
1338+
tfSearchPanel[0]["linked_dashboard"] = getTerraformLinkedDashboards(linkedDashboards.([]interface{}))
1339+
}
1340+
1341+
return tfSearchPanel
1342+
}
1343+
1344+
func getTerraformSearchPanelQuery(queries []interface{}) []map[string]interface{} {
1345+
tfPanelQueries := make([]map[string]interface{}, len(queries))
1346+
1347+
for i, val := range queries {
1348+
query := val.(map[string]interface{})
1349+
tfPanelQueries[i] = make(map[string]interface{})
1350+
tfPanelQueries[i]["query_string"] = query["queryString"]
1351+
tfPanelQueries[i]["query_type"] = query["queryType"]
1352+
tfPanelQueries[i]["query_key"] = query["queryKey"]
1353+
if metricsQueryMode, ok := query["metricsQueryMode"]; ok {
1354+
tfPanelQueries[i]["metrics_query_mode"] = metricsQueryMode
1355+
}
1356+
if metricsQueryData, ok := query["metricsQueryData"]; ok && metricsQueryData != nil {
1357+
tfPanelQueries[i]["metrics_query_data"] =
1358+
getTerraformMetricsQueryDataScheme(metricsQueryData.(map[string]interface{}))
1359+
}
1360+
}
1361+
return tfPanelQueries
1362+
}
1363+
1364+
func getTerraformMetricsQueryDataScheme(queryData map[string]interface{}) TerraformObject {
1365+
tfMetricsQueryData := makeTerraformObject()
1366+
1367+
tfMetricsQueryData[0]["metric"] = queryData["metric"]
1368+
if aggregationType, ok := queryData["aggregationType"]; ok {
1369+
tfMetricsQueryData[0]["aggregation_type"] = aggregationType
1370+
}
1371+
if groupBy, ok := queryData["groupBy"]; ok {
1372+
tfMetricsQueryData[0]["group_by"] = groupBy
1373+
}
1374+
1375+
filters := queryData["filters"].([]interface{})
1376+
tfFilters := make([]map[string]interface{}, len(filters))
1377+
for i, val := range filters {
1378+
filter := val.(map[string]interface{})
1379+
tfFilters[i] = make(map[string]interface{})
1380+
tfFilters[i]["key"] = filter["key"]
1381+
tfFilters[i]["value"] = filter["value"]
1382+
tfFilters[i]["negation"] = filter["negation"]
1383+
}
1384+
tfMetricsQueryData[0]["filter"] = tfFilters
1385+
1386+
if val, ok := queryData["operators"]; ok && val != nil {
1387+
operators := val.([]interface{})
1388+
tfOperators := make([]map[string]interface{}, len(operators))
1389+
for i, val := range operators {
1390+
operator := val.(map[string]interface{})
1391+
tfOperators[i] = getTerraformMetricsQueryOperator(operator)
1392+
}
1393+
tfMetricsQueryData[0]["operator"] = tfOperators
1394+
}
1395+
1396+
return tfMetricsQueryData
1397+
}
1398+
1399+
func getTerraformMetricsQueryOperator(operator map[string]interface{}) map[string]interface{} {
1400+
tfOperator := make(map[string]interface{})
1401+
tfOperator["operator_name"] = operator["operatorName"]
1402+
1403+
parameters := operator["parameters"].([]interface{})
1404+
tfParameters := make([]map[string]interface{}, len(parameters))
1405+
for i, val := range parameters {
1406+
parameter := val.(map[string]interface{})
1407+
tfParameters[i] = make(map[string]interface{})
1408+
tfParameters[i]["key"] = parameter["key"]
1409+
tfParameters[i]["value"] = parameter["value"]
1410+
}
1411+
tfOperator["parameter"] = tfParameters
1412+
1413+
return tfOperator
1414+
}
1415+
1416+
func getTerraformLinkedDashboards(dashboards []interface{}) []map[string]interface{} {
1417+
tfLinkedDashboards := make([]map[string]interface{}, len(dashboards))
1418+
1419+
for i, val := range dashboards {
1420+
dashboard := val.(map[string]interface{})
1421+
tfLinkedDashboards[i] = make(map[string]interface{})
1422+
tfLinkedDashboards[i]["id"] = dashboard["id"]
1423+
tfLinkedDashboards[i]["relative_path"] = dashboard["relativePath"]
1424+
tfLinkedDashboards[i]["include_time_range"] = dashboard["includeTimeRange"]
1425+
tfLinkedDashboards[i]["include_variables"] = dashboard["includeVariables"]
1426+
}
1427+
1428+
return tfLinkedDashboards
1429+
}
1430+
1431+
func getTerraformLayout(layout map[string]interface{}) TerraformObject {
1432+
tfLayout := makeTerraformObject()
1433+
1434+
if layout["layoutType"] == "Grid" {
1435+
gridLayout := makeTerraformObject()
1436+
1437+
layoutStructures := layout["layoutStructures"].([]interface{})
1438+
tfLayoutStructures := make([]map[string]interface{}, len(layoutStructures))
1439+
for i, structure := range layoutStructures {
1440+
tfLayoutStructures[i] = structure.(map[string]interface{})
1441+
}
1442+
gridLayout[0]["layout_structures"] = tfLayoutStructures
1443+
tfLayout[0]["grid"] = gridLayout
1444+
}
1445+
1446+
return tfLayout
1447+
}
1448+
1449+
func getTerraformVariables(variables []Variable) []map[string]interface{} {
1450+
tfVariables := make([]map[string]interface{}, len(variables))
1451+
1452+
for i, variable := range variables {
1453+
tfVariables[i] = make(map[string]interface{})
1454+
tfVariables[i]["name"] = variable.Name
1455+
tfVariables[i]["display_name"] = variable.DisplayName
1456+
tfVariables[i]["default_value"] = variable.DefaultValue
1457+
tfVariables[i]["allow_multi_select"] = variable.AllowMultiSelect
1458+
tfVariables[i]["include_all_option"] = variable.IncludeAllOption
1459+
tfVariables[i]["hide_from_ui"] = variable.HideFromUI
1460+
tfVariables[i]["source_definition"] =
1461+
getTerraformVariableSourceDefinition(variable.SourceDefinition.(map[string]interface{}))
1462+
}
1463+
1464+
return tfVariables
1465+
}
1466+
1467+
func getTerraformVariableSourceDefinition(sourceDefinition map[string]interface{}) TerraformObject {
1468+
tfSourceDefinition := makeTerraformObject()
1469+
1470+
if sourceDefinition["variableSourceType"] == "MetadataVariableSourceDefinition" {
1471+
metadataDefinition := makeTerraformObject()
1472+
metadataDefinition[0]["filter"] = sourceDefinition["filter"]
1473+
metadataDefinition[0]["key"] = sourceDefinition["key"]
1474+
tfSourceDefinition[0]["metadata_variable_source_definition"] = metadataDefinition
1475+
} else if sourceDefinition["variableSourceType"] == "CsvVariableSourceDefinition" {
1476+
csvDefinition := makeTerraformObject()
1477+
csvDefinition[0]["values"] = sourceDefinition["values"]
1478+
tfSourceDefinition[0]["csv_variable_source_definition"] = csvDefinition
1479+
} else if sourceDefinition["variableSourceType"] == "LogQueryVariableSourceDefinition" {
1480+
logQueryDefinition := makeTerraformObject()
1481+
logQueryDefinition[0]["query"] = sourceDefinition["query"]
1482+
logQueryDefinition[0]["field"] = sourceDefinition["field"]
1483+
tfSourceDefinition[0]["log_query_variable_source_definition"] = logQueryDefinition
1484+
}
1485+
1486+
return tfSourceDefinition
1487+
}
1488+
1489+
func getTerraformColoringRules(coloringRules []ColoringRule) []map[string]interface{} {
1490+
tfColoringRules := make([]map[string]interface{}, len(coloringRules))
1491+
1492+
for i, rule := range coloringRules {
1493+
tfColoringRules[i] = make(map[string]interface{})
1494+
tfColoringRules[i]["scope"] = rule.Scope
1495+
tfColoringRules[i]["single_series_aggregate_function"] = rule.SingleSeriesAggregateFunction
1496+
tfColoringRules[i]["multiple_series_aggregate_function"] = rule.MultipleSeriesAggregateFunction
1497+
1498+
tfColorThresholds := make([]map[string]interface{}, len(rule.ColorThresholds))
1499+
for j, threshold := range rule.ColorThresholds {
1500+
tfColorThresholds[j] = make(map[string]interface{})
1501+
tfColorThresholds[j]["color"] = threshold.Color
1502+
tfColorThresholds[j]["min"] = threshold.Max
1503+
tfColorThresholds[j]["max"] = threshold.Min
1504+
}
1505+
tfColoringRules[i]["color_thresholds"] = tfColorThresholds
1506+
}
1507+
1508+
return tfColoringRules
1509+
}
1510+
12021511
func resourceSumologicDashboardCreate(d *schema.ResourceData, meta interface{}) error {
12031512
c := meta.(*Client)
12041513
if d.Id() == "" {
12051514
dashboard := resourceToDashboard(d)
1206-
log.Printf("=====================================================================n")
1515+
log.Println("=====================================================================")
12071516
log.Printf("Creating dashboard: %+v\n", dashboard)
1208-
log.Printf("=====================================================================n")
1517+
log.Println("=====================================================================")
12091518

12101519
createdDashboard, err := c.CreateDashboard(dashboard)
12111520
if err != nil {
@@ -1222,9 +1531,9 @@ func resourceSumologicDashboardRead(d *schema.ResourceData, meta interface{}) er
12221531

12231532
id := d.Id()
12241533
dashboard, err := c.GetDashboard(id)
1225-
log.Printf("=====================================================================n")
1534+
log.Println("=====================================================================")
12261535
log.Printf("Read dashboard: %+v\n", dashboard)
1227-
log.Printf("=====================================================================n")
1536+
log.Println("=====================================================================")
12281537
if err != nil {
12291538
return err
12301539
}
@@ -1235,7 +1544,8 @@ func resourceSumologicDashboardRead(d *schema.ResourceData, meta interface{}) er
12351544
return nil
12361545
}
12371546

1238-
return setDashboard(d, dashboard)
1547+
err = setDashboard(d, dashboard)
1548+
return err
12391549
}
12401550

12411551
func resourceSumologicDashboardDelete(d *schema.ResourceData, meta interface{}) error {
@@ -1245,9 +1555,9 @@ func resourceSumologicDashboardDelete(d *schema.ResourceData, meta interface{})
12451555

12461556
func resourceSumologicDashboardUpdate(d *schema.ResourceData, meta interface{}) error {
12471557
dashboard := resourceToDashboard(d)
1248-
log.Printf("=====================================================================n")
1558+
log.Println("=====================================================================")
12491559
log.Printf("Updating dashboard: %+v\n", dashboard)
1250-
log.Printf("=====================================================================n")
1560+
log.Println("=====================================================================")
12511561

12521562
c := meta.(*Client)
12531563
err := c.UpdateDashboard(dashboard)

0 commit comments

Comments
 (0)