@@ -429,9 +429,10 @@ func getGridLayoutSchema() map[string]*schema.Schema {
429429
430430func 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+
12021511func 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
12411551func resourceSumologicDashboardDelete (d * schema.ResourceData , meta interface {}) error {
@@ -1245,9 +1555,9 @@ func resourceSumologicDashboardDelete(d *schema.ResourceData, meta interface{})
12451555
12461556func 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