Files
grafana/apps/dashboard/pkg/migration/conversion/v2alpha1_to_v2beta1.go
T
Marc M. be734e970e CustomVariable: support values with multiple properties (json values format) (#113844)
* update Scenes libraries

---------

Co-authored-by: idastambuk <ida.stambuk@grafana.com>
2026-01-07 11:01:03 +01:00

1024 lines
39 KiB
Go

package conversion
import (
"k8s.io/apimachinery/pkg/conversion"
dashv2alpha1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1"
dashv2beta1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2beta1"
)
// Schema Migration: v2alpha1 → v2beta1
//
// This file handles the conversion from Dashboard v2alpha1 to v2beta1 schema.
// The main changes between these versions are:
//
// 1. DataQueryKind Structure Changes:
// - v2alpha1: kind = datasource type (e.g., "prometheus", "elasticsearch")
// - v2beta1: kind = "DataQuery" (hardcoded), group = datasource type, version = "v0"
//
// 2. Datasource Reference Migration:
// - v2alpha1: Datasource references stored at spec level (PanelQuerySpec.datasource, AnnotationQuerySpec.datasource, etc.)
// - v2beta1: Datasource references moved inside DataQueryKind.datasource
// - v2alpha1: {type?: string, uid?: string} → v2beta1: {name?: string}
//
// 3. Query Requirements:
// - v2alpha1: AnnotationQuerySpec.query? is optional (can be nil)
// - v2beta1: AnnotationQuerySpec.query is required
// - Conversion creates default query structure when v2alpha1 query is nil
//
// 4. DataSourceRef Usage:
// - v2alpha1: Used widely across different specs
// - v2beta1: Kept only for backward compatibility in GroupBy and Adhoc variables
//
// 5. Datasource Mapping Strategy:
// - Type → Name (if type is available)
// - Uid → Name (if type is not available but uid is)
//
// The conversion preserves all dashboard functionality while restructuring
// the data model to consolidate datasource references into the DataQueryKind.
func ConvertDashboard_V2alpha1_to_V2beta1(in *dashv2alpha1.Dashboard, out *dashv2beta1.Dashboard, scope conversion.Scope) error {
out.ObjectMeta = in.ObjectMeta
out.APIVersion = dashv2beta1.APIVERSION
out.Kind = in.Kind
return convertDashboardSpec_V2alpha1_to_V2beta1(&in.Spec, &out.Spec, scope)
}
func convertDashboardSpec_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardSpec, out *dashv2beta1.DashboardSpec, scope conversion.Scope) error {
// Convert annotations
out.Annotations = make([]dashv2beta1.DashboardAnnotationQueryKind, len(in.Annotations))
for i, annotation := range in.Annotations {
if err := convertAnnotationQuery_V2alpha1_to_V2beta1(&annotation, &out.Annotations[i], scope); err != nil {
return err
}
}
// Copy simple fields
out.CursorSync = dashv2beta1.DashboardDashboardCursorSync(in.CursorSync)
out.Description = in.Description
out.Editable = in.Editable
out.LiveNow = in.LiveNow
out.Preload = in.Preload
out.Revision = in.Revision
out.Tags = in.Tags
out.Title = in.Title
// Convert elements
out.Elements = make(map[string]dashv2beta1.DashboardElement, len(in.Elements))
for key, element := range in.Elements {
var convertedElement dashv2beta1.DashboardElement
if err := convertElement_V2alpha1_to_V2beta1(&element, &convertedElement, scope); err != nil {
return err
}
out.Elements[key] = convertedElement
}
// Convert layout
if err := convertLayout_V2alpha1_to_V2beta1(&in.Layout, &out.Layout, scope); err != nil {
return err
}
// Convert links
out.Links = make([]dashv2beta1.DashboardDashboardLink, len(in.Links))
for i, link := range in.Links {
convertDashboardLink_V2alpha1_to_V2beta1(&link, &out.Links[i])
}
// Convert time settings
if err := convertTimeSettings_V2alpha1_to_V2beta1(&in.TimeSettings, &out.TimeSettings, scope); err != nil {
return err
}
// Convert variables
out.Variables = make([]dashv2beta1.DashboardVariableKind, len(in.Variables))
for i, variable := range in.Variables {
if err := convertVariable_V2alpha1_to_V2beta1(&variable, &out.Variables[i], scope); err != nil {
return err
}
}
return nil
}
func convertAnnotationQuery_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardAnnotationQueryKind, out *dashv2beta1.DashboardAnnotationQueryKind, scope conversion.Scope) error {
out.Kind = in.Kind
// Convert spec
out.Spec.Enable = in.Spec.Enable
out.Spec.Hide = in.Spec.Hide
out.Spec.IconColor = in.Spec.IconColor
out.Spec.Name = in.Spec.Name
out.Spec.BuiltIn = in.Spec.BuiltIn
out.Spec.Filter = (*dashv2beta1.DashboardAnnotationPanelFilter)(in.Spec.Filter)
out.Spec.LegacyOptions = in.Spec.LegacyOptions
// Convert mappings
if in.Spec.Mappings != nil {
out.Spec.Mappings = convertAnnotationMappings_V2alpha1_to_V2beta1(in.Spec.Mappings)
}
// Convert query - move datasource from annotation spec to query
if err := convertDataQuery_V2alpha1_to_V2beta1(in.Spec.Query, &out.Spec.Query, in.Spec.Datasource, scope); err != nil {
return err
}
return nil
}
func convertDataQuery_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardDataQueryKind, out *dashv2beta1.DashboardDataQueryKind, datasource *dashv2alpha1.DashboardDataSourceRef, scope conversion.Scope) error {
if in == nil {
// v2beta1 requires a query even if v2alpha1 had none, so create a default
out.Kind = "DataQuery"
out.Version = "v0"
out.Spec = make(map[string]interface{})
// Don't set group field for manual annotations (no datasource)
} else {
out.Kind = "DataQuery"
out.Version = "v0"
out.Spec = in.Spec
}
// Convert datasource reference and set group
// Priority: 1) datasource.Type, 2) in.Kind (if no datasource or datasource.Type is empty)
if datasource != nil {
out.Datasource = &dashv2beta1.DashboardV2beta1DataQueryKindDatasource{}
if datasource.Uid != nil {
out.Datasource.Name = datasource.Uid
}
// Set group to datasource type if available
if datasource.Type != nil && *datasource.Type != "" {
out.Group = *datasource.Type
}
}
// Fallback: if group is still empty and we have a query with a kind (datasource type), use the kind as group
// This preserves the datasource type information when datasource reference is missing
// Note: in.Kind is the datasource type (e.g., "prometheus", "elasticsearch"), not "DataQuery"
if out.Group == "" && in != nil && in.Kind != "" {
out.Group = in.Kind
}
return nil
}
func convertElement_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardElement, out *dashv2beta1.DashboardElement, scope conversion.Scope) error {
if in.PanelKind != nil {
out.PanelKind = &dashv2beta1.DashboardPanelKind{}
return convertPanelKind_V2alpha1_to_V2beta1(in.PanelKind, out.PanelKind, scope)
}
if in.LibraryPanelKind != nil {
out.LibraryPanelKind = &dashv2beta1.DashboardLibraryPanelKind{}
return convertLibraryPanelKind_V2alpha1_to_V2beta1(in.LibraryPanelKind, out.LibraryPanelKind, scope)
}
return nil
}
func convertPanelKind_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardPanelKind, out *dashv2beta1.DashboardPanelKind, scope conversion.Scope) error {
out.Kind = in.Kind
// Convert spec
out.Spec.Id = in.Spec.Id
out.Spec.Title = in.Spec.Title
out.Spec.Description = in.Spec.Description
out.Spec.Transparent = in.Spec.Transparent
// Convert links
out.Spec.Links = make([]dashv2beta1.DashboardDataLink, len(in.Spec.Links))
for i, link := range in.Spec.Links {
convertDataLink_V2alpha1_to_V2beta1(&link, &out.Spec.Links[i])
}
// Convert data (QueryGroup)
if err := convertQueryGroup_V2alpha1_to_V2beta1(&in.Spec.Data, &out.Spec.Data, scope); err != nil {
return err
}
// Convert vizConfig
if err := convertVizConfig_V2alpha1_to_V2beta1(&in.Spec.VizConfig, &out.Spec.VizConfig); err != nil {
return err
}
return nil
}
func convertLibraryPanelKind_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardLibraryPanelKind, out *dashv2beta1.DashboardLibraryPanelKind, scope conversion.Scope) error {
out.Kind = in.Kind
out.Spec.Id = in.Spec.Id
out.Spec.Title = in.Spec.Title
out.Spec.LibraryPanel = dashv2beta1.DashboardLibraryPanelRef{
Name: in.Spec.LibraryPanel.Name,
Uid: in.Spec.LibraryPanel.Uid,
}
return nil
}
func convertQueryGroup_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardQueryGroupKind, out *dashv2beta1.DashboardQueryGroupKind, scope conversion.Scope) error {
out.Kind = in.Kind
// Convert queries
out.Spec.Queries = make([]dashv2beta1.DashboardPanelQueryKind, len(in.Spec.Queries))
for i, query := range in.Spec.Queries {
if err := convertPanelQuery_V2alpha1_to_V2beta1(&query, &out.Spec.Queries[i], scope); err != nil {
return err
}
}
// Convert transformations
out.Spec.Transformations = make([]dashv2beta1.DashboardTransformationKind, len(in.Spec.Transformations))
for i, transformation := range in.Spec.Transformations {
convertTransformation_V2alpha1_to_V2beta1(&transformation, &out.Spec.Transformations[i])
}
// Convert query options
convertQueryOptions_V2alpha1_to_V2beta1(&in.Spec.QueryOptions, &out.Spec.QueryOptions)
return nil
}
func convertPanelQuery_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardPanelQueryKind, out *dashv2beta1.DashboardPanelQueryKind, scope conversion.Scope) error {
out.Kind = in.Kind // PanelQueryKind keeps "PanelQuery" as its kind
out.Spec.RefId = in.Spec.RefId
out.Spec.Hidden = in.Spec.Hidden
// Convert query - move datasource from panel query spec to query
if err := convertDataQuery_V2alpha1_to_V2beta1(&in.Spec.Query, &out.Spec.Query, in.Spec.Datasource, scope); err != nil {
return err
}
return nil
}
func convertTransformation_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardTransformationKind, out *dashv2beta1.DashboardTransformationKind) {
out.Kind = in.Kind
out.Spec.Id = in.Spec.Id
out.Spec.Disabled = in.Spec.Disabled
out.Spec.Filter = (*dashv2beta1.DashboardMatcherConfig)(in.Spec.Filter)
out.Spec.Topic = (*dashv2beta1.DashboardDataTopic)(in.Spec.Topic)
out.Spec.Options = in.Spec.Options
}
func convertQueryOptions_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardQueryOptionsSpec, out *dashv2beta1.DashboardQueryOptionsSpec) {
out.TimeFrom = in.TimeFrom
out.MaxDataPoints = in.MaxDataPoints
out.TimeShift = in.TimeShift
out.QueryCachingTTL = in.QueryCachingTTL
out.Interval = in.Interval
out.CacheTimeout = in.CacheTimeout
out.HideTimeOverride = in.HideTimeOverride
}
func convertVizConfig_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardVizConfigKind, out *dashv2beta1.DashboardVizConfigKind) error {
out.Kind = "VizConfig"
out.Group = in.Kind // in.Kind is the panel type (e.g., "timeseries", "graph")
out.Version = in.Spec.PluginVersion
out.Spec = dashv2beta1.DashboardVizConfigSpec{
Options: in.Spec.Options,
}
// Convert field config
convertFieldConfigSource_V2alpha1_to_V2beta1(&in.Spec.FieldConfig, &out.Spec.FieldConfig)
return nil
}
func convertFieldConfigSource_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardFieldConfigSource, out *dashv2beta1.DashboardFieldConfigSource) {
// Convert defaults
convertFieldConfig_V2alpha1_to_V2beta1(&in.Defaults, &out.Defaults)
// Convert overrides
out.Overrides = make([]dashv2beta1.DashboardV2beta1FieldConfigSourceOverrides, len(in.Overrides))
for i, override := range in.Overrides {
convertFieldConfigOverride_V2alpha1_to_V2beta1(&override, &out.Overrides[i])
}
}
func convertFieldConfig_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardFieldConfig, out *dashv2beta1.DashboardFieldConfig) {
*out = dashv2beta1.DashboardFieldConfig{
DisplayName: in.DisplayName,
DisplayNameFromDS: in.DisplayNameFromDS,
Description: in.Description,
Path: in.Path,
Writeable: in.Writeable,
Filterable: in.Filterable,
Unit: in.Unit,
Decimals: in.Decimals,
Min: in.Min,
Max: in.Max,
Links: in.Links,
NoValue: in.NoValue,
Custom: in.Custom,
}
// Convert thresholds
if in.Thresholds != nil {
out.Thresholds = &dashv2beta1.DashboardThresholdsConfig{
Mode: dashv2beta1.DashboardThresholdsMode(in.Thresholds.Mode),
Steps: make([]dashv2beta1.DashboardThreshold, len(in.Thresholds.Steps)),
}
for i, step := range in.Thresholds.Steps {
// Convert threshold values: preserve null values from v2alpha1
out.Thresholds.Steps[i] = dashv2beta1.DashboardThreshold{
Value: step.Value,
Color: step.Color,
}
}
}
// Convert color
if in.Color != nil {
out.Color = &dashv2beta1.DashboardFieldColor{
Mode: dashv2beta1.DashboardFieldColorModeId(in.Color.Mode),
FixedColor: in.Color.FixedColor,
SeriesBy: (*dashv2beta1.DashboardFieldColorSeriesByMode)(in.Color.SeriesBy),
}
}
// Convert mappings
if in.Mappings != nil {
out.Mappings = make([]dashv2beta1.DashboardValueMapping, len(in.Mappings))
for i, mapping := range in.Mappings {
convertValueMapping_V2alpha1_to_V2beta1(&mapping, &out.Mappings[i])
}
}
}
func convertFieldConfigOverride_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardV2alpha1FieldConfigSourceOverrides, out *dashv2beta1.DashboardV2beta1FieldConfigSourceOverrides) {
out.SystemRef = in.SystemRef
out.Matcher = dashv2beta1.DashboardMatcherConfig{
Id: in.Matcher.Id,
Options: in.Matcher.Options,
}
out.Properties = make([]dashv2beta1.DashboardDynamicConfigValue, len(in.Properties))
for i, prop := range in.Properties {
out.Properties[i] = dashv2beta1.DashboardDynamicConfigValue{
Id: prop.Id,
Value: prop.Value,
}
}
}
func convertValueMapping_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardValueMapping, out *dashv2beta1.DashboardValueMapping) {
if in.ValueMap != nil {
out.ValueMap = &dashv2beta1.DashboardValueMap{
Type: dashv2beta1.DashboardMappingType(in.ValueMap.Type),
Options: make(map[string]dashv2beta1.DashboardValueMappingResult, len(in.ValueMap.Options)),
}
for k, v := range in.ValueMap.Options {
out.ValueMap.Options[k] = dashv2beta1.DashboardValueMappingResult{
Text: v.Text,
Color: v.Color,
Icon: v.Icon,
Index: v.Index,
}
}
}
if in.RangeMap != nil {
out.RangeMap = &dashv2beta1.DashboardRangeMap{
Type: dashv2beta1.DashboardMappingType(in.RangeMap.Type),
Options: dashv2beta1.DashboardV2beta1RangeMapOptions{
From: in.RangeMap.Options.From,
To: in.RangeMap.Options.To,
Result: dashv2beta1.DashboardValueMappingResult{
Text: in.RangeMap.Options.Result.Text,
Color: in.RangeMap.Options.Result.Color,
Icon: in.RangeMap.Options.Result.Icon,
Index: in.RangeMap.Options.Result.Index,
},
},
}
}
if in.RegexMap != nil {
out.RegexMap = &dashv2beta1.DashboardRegexMap{
Type: dashv2beta1.DashboardMappingType(in.RegexMap.Type),
Options: dashv2beta1.DashboardV2beta1RegexMapOptions{
Pattern: in.RegexMap.Options.Pattern,
Result: dashv2beta1.DashboardValueMappingResult{
Text: in.RegexMap.Options.Result.Text,
Color: in.RegexMap.Options.Result.Color,
Icon: in.RegexMap.Options.Result.Icon,
Index: in.RegexMap.Options.Result.Index,
},
},
}
}
if in.SpecialValueMap != nil {
out.SpecialValueMap = &dashv2beta1.DashboardSpecialValueMap{
Type: dashv2beta1.DashboardMappingType(in.SpecialValueMap.Type),
Options: dashv2beta1.DashboardV2beta1SpecialValueMapOptions{
Match: dashv2beta1.DashboardSpecialValueMatch(in.SpecialValueMap.Options.Match),
Result: dashv2beta1.DashboardValueMappingResult{
Text: in.SpecialValueMap.Options.Result.Text,
Color: in.SpecialValueMap.Options.Result.Color,
Icon: in.SpecialValueMap.Options.Result.Icon,
Index: in.SpecialValueMap.Options.Result.Index,
},
},
}
}
}
func convertLayout_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrAutoGridLayoutKindOrTabsLayoutKind, out *dashv2beta1.DashboardGridLayoutKindOrRowsLayoutKindOrAutoGridLayoutKindOrTabsLayoutKind, scope conversion.Scope) error {
if in.GridLayoutKind != nil {
out.GridLayoutKind = &dashv2beta1.DashboardGridLayoutKind{
Kind: in.GridLayoutKind.Kind,
}
return convertGridLayoutSpec_V2alpha1_to_V2beta1(&in.GridLayoutKind.Spec, &out.GridLayoutKind.Spec, scope)
}
if in.RowsLayoutKind != nil {
out.RowsLayoutKind = &dashv2beta1.DashboardRowsLayoutKind{
Kind: in.RowsLayoutKind.Kind,
}
return convertRowsLayoutSpec_V2alpha1_to_V2beta1(&in.RowsLayoutKind.Spec, &out.RowsLayoutKind.Spec, scope)
}
if in.AutoGridLayoutKind != nil {
out.AutoGridLayoutKind = &dashv2beta1.DashboardAutoGridLayoutKind{
Kind: in.AutoGridLayoutKind.Kind,
}
return convertAutoGridLayoutSpec_V2alpha1_to_V2beta1(&in.AutoGridLayoutKind.Spec, &out.AutoGridLayoutKind.Spec, scope)
}
if in.TabsLayoutKind != nil {
out.TabsLayoutKind = &dashv2beta1.DashboardTabsLayoutKind{
Kind: in.TabsLayoutKind.Kind,
}
return convertTabsLayoutSpec_V2alpha1_to_V2beta1(&in.TabsLayoutKind.Spec, &out.TabsLayoutKind.Spec, scope)
}
return nil
}
func convertGridLayoutSpec_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardGridLayoutSpec, out *dashv2beta1.DashboardGridLayoutSpec, scope conversion.Scope) error {
out.Items = make([]dashv2beta1.DashboardGridLayoutItemKind, len(in.Items))
for i, item := range in.Items {
out.Items[i] = dashv2beta1.DashboardGridLayoutItemKind{
Kind: item.Kind,
Spec: dashv2beta1.DashboardGridLayoutItemSpec{
X: item.Spec.X,
Y: item.Spec.Y,
Width: item.Spec.Width,
Height: item.Spec.Height,
Element: dashv2beta1.DashboardElementReference{
Kind: item.Spec.Element.Kind,
Name: item.Spec.Element.Name,
},
Repeat: convertRepeatOptions_V2alpha1_to_V2beta1(item.Spec.Repeat),
},
}
}
return nil
}
func convertRowsLayoutSpec_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardRowsLayoutSpec, out *dashv2beta1.DashboardRowsLayoutSpec, scope conversion.Scope) error {
out.Rows = make([]dashv2beta1.DashboardRowsLayoutRowKind, len(in.Rows))
for i, row := range in.Rows {
out.Rows[i] = dashv2beta1.DashboardRowsLayoutRowKind{
Kind: row.Kind,
Spec: dashv2beta1.DashboardRowsLayoutRowSpec{
Title: row.Spec.Title,
Collapse: row.Spec.Collapse,
HideHeader: row.Spec.HideHeader,
FillScreen: row.Spec.FillScreen,
ConditionalRendering: convertConditionalRenderingGroupKind_V2alpha1_to_V2beta1(row.Spec.ConditionalRendering),
Repeat: convertRowRepeatOptions_V2alpha1_to_V2beta1(row.Spec.Repeat),
},
}
if err := convertRowLayout_V2alpha1_to_V2beta1(&row.Spec.Layout, &out.Rows[i].Spec.Layout, scope); err != nil {
return err
}
}
return nil
}
func convertAutoGridLayoutSpec_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardAutoGridLayoutSpec, out *dashv2beta1.DashboardAutoGridLayoutSpec, scope conversion.Scope) error {
out.MaxColumnCount = in.MaxColumnCount
out.ColumnWidthMode = dashv2beta1.DashboardAutoGridLayoutSpecColumnWidthMode(in.ColumnWidthMode)
out.ColumnWidth = in.ColumnWidth
out.RowHeightMode = dashv2beta1.DashboardAutoGridLayoutSpecRowHeightMode(in.RowHeightMode)
out.RowHeight = in.RowHeight
out.FillScreen = in.FillScreen
out.Items = make([]dashv2beta1.DashboardAutoGridLayoutItemKind, len(in.Items))
for i, item := range in.Items {
out.Items[i] = dashv2beta1.DashboardAutoGridLayoutItemKind{
Kind: item.Kind,
Spec: dashv2beta1.DashboardAutoGridLayoutItemSpec{
Element: dashv2beta1.DashboardElementReference{
Kind: item.Spec.Element.Kind,
Name: item.Spec.Element.Name,
},
Repeat: convertAutoGridRepeatOptions_V2alpha1_to_V2beta1(item.Spec.Repeat),
ConditionalRendering: convertConditionalRenderingGroupKind_V2alpha1_to_V2beta1(item.Spec.ConditionalRendering),
},
}
}
return nil
}
func convertTabsLayoutSpec_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardTabsLayoutSpec, out *dashv2beta1.DashboardTabsLayoutSpec, scope conversion.Scope) error {
out.Tabs = make([]dashv2beta1.DashboardTabsLayoutTabKind, len(in.Tabs))
for i, tab := range in.Tabs {
out.Tabs[i] = dashv2beta1.DashboardTabsLayoutTabKind{
Kind: tab.Kind,
Spec: dashv2beta1.DashboardTabsLayoutTabSpec{
Title: tab.Spec.Title,
ConditionalRendering: convertConditionalRenderingGroupKind_V2alpha1_to_V2beta1(tab.Spec.ConditionalRendering),
Repeat: convertTabRepeatOptions_V2alpha1_to_V2beta1(tab.Spec.Repeat),
},
}
if err := convertTabLayout_V2alpha1_to_V2beta1(&tab.Spec.Layout, &out.Tabs[i].Spec.Layout, scope); err != nil {
return err
}
}
return nil
}
func convertDashboardLink_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardDashboardLink, out *dashv2beta1.DashboardDashboardLink) {
out.Title = in.Title
out.Type = dashv2beta1.DashboardDashboardLinkType(in.Type)
out.Icon = in.Icon
out.Tooltip = in.Tooltip
out.Url = in.Url
out.Tags = in.Tags
out.AsDropdown = in.AsDropdown
out.TargetBlank = in.TargetBlank
out.IncludeVars = in.IncludeVars
out.KeepTime = in.KeepTime
out.Placement = in.Placement
}
func convertDataLink_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardDataLink, out *dashv2beta1.DashboardDataLink) {
out.Title = in.Title
out.Url = in.Url
out.TargetBlank = in.TargetBlank
}
func convertTimeSettings_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardTimeSettingsSpec, out *dashv2beta1.DashboardTimeSettingsSpec, scope conversion.Scope) error {
out.Timezone = in.Timezone
out.From = in.From
out.To = in.To
out.AutoRefresh = in.AutoRefresh
out.AutoRefreshIntervals = in.AutoRefreshIntervals
out.HideTimepicker = in.HideTimepicker
out.WeekStart = (*dashv2beta1.DashboardTimeSettingsSpecWeekStart)(in.WeekStart)
out.FiscalYearStartMonth = in.FiscalYearStartMonth
out.NowDelay = in.NowDelay
// Convert quick ranges
if in.QuickRanges != nil {
out.QuickRanges = make([]dashv2beta1.DashboardTimeRangeOption, len(in.QuickRanges))
for i, qr := range in.QuickRanges {
out.QuickRanges[i] = dashv2beta1.DashboardTimeRangeOption{
Display: qr.Display,
From: qr.From,
To: qr.To,
}
}
}
return nil
}
func convertVariable_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardVariableKind, out *dashv2beta1.DashboardVariableKind, scope conversion.Scope) error {
if in.QueryVariableKind != nil {
out.QueryVariableKind = &dashv2beta1.DashboardQueryVariableKind{
Kind: in.QueryVariableKind.Kind,
}
return convertQueryVariableSpec_V2alpha1_to_V2beta1(&in.QueryVariableKind.Spec, &out.QueryVariableKind.Spec, scope)
}
if in.TextVariableKind != nil {
out.TextVariableKind = &dashv2beta1.DashboardTextVariableKind{
Kind: in.TextVariableKind.Kind,
Spec: dashv2beta1.DashboardTextVariableSpec{
Name: in.TextVariableKind.Spec.Name,
Current: convertVariableOption_V2alpha1_to_V2beta1(in.TextVariableKind.Spec.Current),
Query: in.TextVariableKind.Spec.Query,
Label: in.TextVariableKind.Spec.Label,
Hide: dashv2beta1.DashboardVariableHide(in.TextVariableKind.Spec.Hide),
SkipUrlSync: in.TextVariableKind.Spec.SkipUrlSync,
Description: in.TextVariableKind.Spec.Description,
},
}
}
if in.ConstantVariableKind != nil {
out.ConstantVariableKind = &dashv2beta1.DashboardConstantVariableKind{
Kind: in.ConstantVariableKind.Kind,
Spec: dashv2beta1.DashboardConstantVariableSpec{
Name: in.ConstantVariableKind.Spec.Name,
Query: in.ConstantVariableKind.Spec.Query,
Current: convertVariableOption_V2alpha1_to_V2beta1(in.ConstantVariableKind.Spec.Current),
Label: in.ConstantVariableKind.Spec.Label,
Hide: dashv2beta1.DashboardVariableHide(in.ConstantVariableKind.Spec.Hide),
SkipUrlSync: in.ConstantVariableKind.Spec.SkipUrlSync,
Description: in.ConstantVariableKind.Spec.Description,
},
}
}
if in.DatasourceVariableKind != nil {
out.DatasourceVariableKind = &dashv2beta1.DashboardDatasourceVariableKind{
Kind: in.DatasourceVariableKind.Kind,
Spec: dashv2beta1.DashboardDatasourceVariableSpec{
Name: in.DatasourceVariableKind.Spec.Name,
PluginId: in.DatasourceVariableKind.Spec.PluginId,
Refresh: dashv2beta1.DashboardVariableRefresh(in.DatasourceVariableKind.Spec.Refresh),
Regex: in.DatasourceVariableKind.Spec.Regex,
Current: convertVariableOption_V2alpha1_to_V2beta1(in.DatasourceVariableKind.Spec.Current),
Options: convertVariableOptions_V2alpha1_to_V2beta1(in.DatasourceVariableKind.Spec.Options),
Multi: in.DatasourceVariableKind.Spec.Multi,
IncludeAll: in.DatasourceVariableKind.Spec.IncludeAll,
AllValue: in.DatasourceVariableKind.Spec.AllValue,
Label: in.DatasourceVariableKind.Spec.Label,
Hide: dashv2beta1.DashboardVariableHide(in.DatasourceVariableKind.Spec.Hide),
SkipUrlSync: in.DatasourceVariableKind.Spec.SkipUrlSync,
Description: in.DatasourceVariableKind.Spec.Description,
AllowCustomValue: in.DatasourceVariableKind.Spec.AllowCustomValue,
},
}
}
if in.IntervalVariableKind != nil {
defaultIntervalVariableSpec := dashv2beta1.NewDashboardIntervalVariableSpec()
out.IntervalVariableKind = &dashv2beta1.DashboardIntervalVariableKind{
Kind: in.IntervalVariableKind.Kind,
Spec: dashv2beta1.DashboardIntervalVariableSpec{
Name: in.IntervalVariableKind.Spec.Name,
Query: in.IntervalVariableKind.Spec.Query,
Current: convertVariableOption_V2alpha1_to_V2beta1(in.IntervalVariableKind.Spec.Current),
Options: convertVariableOptions_V2alpha1_to_V2beta1(in.IntervalVariableKind.Spec.Options),
Auto: in.IntervalVariableKind.Spec.Auto,
AutoMin: in.IntervalVariableKind.Spec.AutoMin,
AutoCount: in.IntervalVariableKind.Spec.AutoCount,
Refresh: defaultIntervalVariableSpec.Refresh,
Label: in.IntervalVariableKind.Spec.Label,
Hide: dashv2beta1.DashboardVariableHide(in.IntervalVariableKind.Spec.Hide),
SkipUrlSync: in.IntervalVariableKind.Spec.SkipUrlSync,
Description: in.IntervalVariableKind.Spec.Description,
},
}
}
if in.CustomVariableKind != nil {
out.CustomVariableKind = &dashv2beta1.DashboardCustomVariableKind{
Kind: in.CustomVariableKind.Kind,
Spec: dashv2beta1.DashboardCustomVariableSpec{
Name: in.CustomVariableKind.Spec.Name,
Query: in.CustomVariableKind.Spec.Query,
Current: convertVariableOption_V2alpha1_to_V2beta1(in.CustomVariableKind.Spec.Current),
Options: convertVariableOptions_V2alpha1_to_V2beta1(in.CustomVariableKind.Spec.Options),
Multi: in.CustomVariableKind.Spec.Multi,
IncludeAll: in.CustomVariableKind.Spec.IncludeAll,
AllValue: in.CustomVariableKind.Spec.AllValue,
Label: in.CustomVariableKind.Spec.Label,
Hide: dashv2beta1.DashboardVariableHide(in.CustomVariableKind.Spec.Hide),
SkipUrlSync: in.CustomVariableKind.Spec.SkipUrlSync,
Description: in.CustomVariableKind.Spec.Description,
AllowCustomValue: in.CustomVariableKind.Spec.AllowCustomValue,
ValuesFormat: convertCustomValuesFormat_V2alpha1_to_V2beta1(in.CustomVariableKind.Spec.ValuesFormat),
},
}
}
if in.GroupByVariableKind != nil {
out.GroupByVariableKind = &dashv2beta1.DashboardGroupByVariableKind{
Kind: in.GroupByVariableKind.Kind,
Group: *in.GroupByVariableKind.Spec.Datasource.Type,
Datasource: &dashv2beta1.DashboardV2beta1GroupByVariableKindDatasource{
Name: in.GroupByVariableKind.Spec.Datasource.Uid,
},
Spec: dashv2beta1.DashboardGroupByVariableSpec{
Name: in.GroupByVariableKind.Spec.Name,
DefaultValue: convertVariableOptionPtr_V2alpha1_to_V2beta1(in.GroupByVariableKind.Spec.DefaultValue),
Current: convertVariableOption_V2alpha1_to_V2beta1(in.GroupByVariableKind.Spec.Current),
Options: convertVariableOptions_V2alpha1_to_V2beta1(in.GroupByVariableKind.Spec.Options),
Multi: in.GroupByVariableKind.Spec.Multi,
Label: in.GroupByVariableKind.Spec.Label,
Hide: dashv2beta1.DashboardVariableHide(in.GroupByVariableKind.Spec.Hide),
SkipUrlSync: in.GroupByVariableKind.Spec.SkipUrlSync,
Description: in.GroupByVariableKind.Spec.Description,
},
}
}
if in.AdhocVariableKind != nil {
group := ""
var uid *string
if in.AdhocVariableKind.Spec.Datasource != nil {
if in.AdhocVariableKind.Spec.Datasource.Type != nil {
group = *in.AdhocVariableKind.Spec.Datasource.Type
}
uid = in.AdhocVariableKind.Spec.Datasource.Uid
}
out.AdhocVariableKind = &dashv2beta1.DashboardAdhocVariableKind{
Kind: in.AdhocVariableKind.Kind,
Group: group,
Datasource: &dashv2beta1.DashboardV2beta1AdhocVariableKindDatasource{
Name: uid,
},
Spec: dashv2beta1.DashboardAdhocVariableSpec{
Name: in.AdhocVariableKind.Spec.Name,
BaseFilters: convertAdHocFilters_V2alpha1_to_V2beta1(in.AdhocVariableKind.Spec.BaseFilters),
Filters: convertAdHocFilters_V2alpha1_to_V2beta1(in.AdhocVariableKind.Spec.Filters),
DefaultKeys: convertMetricFindValues_V2alpha1_to_V2beta1(in.AdhocVariableKind.Spec.DefaultKeys),
Label: in.AdhocVariableKind.Spec.Label,
Hide: dashv2beta1.DashboardVariableHide(in.AdhocVariableKind.Spec.Hide),
SkipUrlSync: in.AdhocVariableKind.Spec.SkipUrlSync,
Description: in.AdhocVariableKind.Spec.Description,
AllowCustomValue: in.AdhocVariableKind.Spec.AllowCustomValue,
},
}
}
if in.SwitchVariableKind != nil {
out.SwitchVariableKind = &dashv2beta1.DashboardSwitchVariableKind{
Kind: in.SwitchVariableKind.Kind,
Spec: dashv2beta1.DashboardSwitchVariableSpec{
Name: in.SwitchVariableKind.Spec.Name,
Current: in.SwitchVariableKind.Spec.Current,
EnabledValue: in.SwitchVariableKind.Spec.EnabledValue,
DisabledValue: in.SwitchVariableKind.Spec.DisabledValue,
Label: in.SwitchVariableKind.Spec.Label,
Hide: dashv2beta1.DashboardVariableHide(in.SwitchVariableKind.Spec.Hide),
SkipUrlSync: in.SwitchVariableKind.Spec.SkipUrlSync,
Description: in.SwitchVariableKind.Spec.Description,
},
}
}
return nil
}
func convertCustomValuesFormat_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardCustomVariableSpecValuesFormat) *dashv2beta1.DashboardCustomVariableSpecValuesFormat {
if in == nil {
return nil
}
switch *in {
case dashv2alpha1.DashboardCustomVariableSpecValuesFormatJson:
v := dashv2beta1.DashboardCustomVariableSpecValuesFormatJson
return &v
case dashv2alpha1.DashboardCustomVariableSpecValuesFormatCsv:
v := dashv2beta1.DashboardCustomVariableSpecValuesFormatCsv
return &v
default:
return nil
}
}
func convertQueryVariableSpec_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardQueryVariableSpec, out *dashv2beta1.DashboardQueryVariableSpec, scope conversion.Scope) error {
out.Name = in.Name
out.Current = convertVariableOption_V2alpha1_to_V2beta1(in.Current)
out.Label = in.Label
out.Hide = dashv2beta1.DashboardVariableHide(in.Hide)
out.Refresh = dashv2beta1.DashboardVariableRefresh(in.Refresh)
out.SkipUrlSync = in.SkipUrlSync
out.Description = in.Description
out.Regex = in.Regex
out.RegexApplyTo = (*dashv2beta1.DashboardVariableRegexApplyTo)(in.RegexApplyTo)
out.Sort = dashv2beta1.DashboardVariableSort(in.Sort)
out.Definition = in.Definition
out.Options = convertVariableOptions_V2alpha1_to_V2beta1(in.Options)
out.Multi = in.Multi
out.IncludeAll = in.IncludeAll
out.AllValue = in.AllValue
out.Placeholder = in.Placeholder
out.AllowCustomValue = in.AllowCustomValue
out.StaticOptions = convertVariableOptions_V2alpha1_to_V2beta1(in.StaticOptions)
out.StaticOptionsOrder = (*dashv2beta1.DashboardQueryVariableSpecStaticOptionsOrder)(in.StaticOptionsOrder)
// Convert query - move datasource from variable spec to query
if err := convertDataQuery_V2alpha1_to_V2beta1(&in.Query, &out.Query, in.Datasource, scope); err != nil {
return err
}
return nil
}
func convertVariableOption_V2alpha1_to_V2beta1(in dashv2alpha1.DashboardVariableOption) dashv2beta1.DashboardVariableOption {
return dashv2beta1.DashboardVariableOption{
Selected: in.Selected,
Text: convertStringOrArrayOfString_V2alpha1_to_V2beta1(in.Text),
Value: convertStringOrArrayOfString_V2alpha1_to_V2beta1(in.Value),
}
}
// convertStringOrArrayOfString_V2alpha1_to_V2beta1 preserves empty strings to match unmarshaler behavior
func convertStringOrArrayOfString_V2alpha1_to_V2beta1(in dashv2alpha1.DashboardStringOrArrayOfString) dashv2beta1.DashboardStringOrArrayOfString {
out := dashv2beta1.DashboardStringOrArrayOfString{
ArrayOfString: in.ArrayOfString,
}
out.String = in.String
return out
}
func convertVariableOptionPtr_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardVariableOption) *dashv2beta1.DashboardVariableOption {
if in == nil {
return nil
}
out := convertVariableOption_V2alpha1_to_V2beta1(*in)
return &out
}
func convertVariableOptions_V2alpha1_to_V2beta1(in []dashv2alpha1.DashboardVariableOption) []dashv2beta1.DashboardVariableOption {
if in == nil {
return nil
}
out := make([]dashv2beta1.DashboardVariableOption, len(in))
for i, option := range in {
out[i] = convertVariableOption_V2alpha1_to_V2beta1(option)
}
return out
}
func convertAdHocFilters_V2alpha1_to_V2beta1(in []dashv2alpha1.DashboardAdHocFilterWithLabels) []dashv2beta1.DashboardAdHocFilterWithLabels {
if in == nil {
return nil
}
out := make([]dashv2beta1.DashboardAdHocFilterWithLabels, len(in))
for i, filter := range in {
out[i] = dashv2beta1.DashboardAdHocFilterWithLabels{
Key: filter.Key,
Operator: filter.Operator,
Value: filter.Value,
Values: filter.Values,
KeyLabel: filter.KeyLabel,
ValueLabels: filter.ValueLabels,
ForceEdit: filter.ForceEdit,
Origin: filter.Origin,
Condition: filter.Condition,
}
}
return out
}
func convertMetricFindValues_V2alpha1_to_V2beta1(in []dashv2alpha1.DashboardMetricFindValue) []dashv2beta1.DashboardMetricFindValue {
if in == nil {
return nil
}
out := make([]dashv2beta1.DashboardMetricFindValue, len(in))
for i, value := range in {
out[i] = dashv2beta1.DashboardMetricFindValue{
Text: value.Text,
Value: (*dashv2beta1.DashboardStringOrFloat64)(value.Value),
Group: value.Group,
Expandable: value.Expandable,
}
}
return out
}
func convertRepeatOptions_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardRepeatOptions) *dashv2beta1.DashboardRepeatOptions {
if in == nil {
return nil
}
return &dashv2beta1.DashboardRepeatOptions{
Mode: in.Mode,
Value: in.Value,
Direction: (*dashv2beta1.DashboardRepeatOptionsDirection)(in.Direction),
MaxPerRow: in.MaxPerRow,
}
}
func convertRowRepeatOptions_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardRowRepeatOptions) *dashv2beta1.DashboardRowRepeatOptions {
if in == nil {
return nil
}
return &dashv2beta1.DashboardRowRepeatOptions{
Mode: in.Mode,
Value: in.Value,
}
}
func convertAutoGridRepeatOptions_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardAutoGridRepeatOptions) *dashv2beta1.DashboardAutoGridRepeatOptions {
if in == nil {
return nil
}
return &dashv2beta1.DashboardAutoGridRepeatOptions{
Mode: in.Mode,
Value: in.Value,
}
}
func convertTabRepeatOptions_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardTabRepeatOptions) *dashv2beta1.DashboardTabRepeatOptions {
if in == nil {
return nil
}
return &dashv2beta1.DashboardTabRepeatOptions{
Mode: in.Mode,
Value: in.Value,
}
}
func convertConditionalRenderingGroupKind_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardConditionalRenderingGroupKind) *dashv2beta1.DashboardConditionalRenderingGroupKind {
if in == nil {
return nil
}
out := &dashv2beta1.DashboardConditionalRenderingGroupKind{
Kind: in.Kind,
Spec: dashv2beta1.DashboardConditionalRenderingGroupSpec{
Visibility: dashv2beta1.DashboardConditionalRenderingGroupSpecVisibility(in.Spec.Visibility),
Condition: dashv2beta1.DashboardConditionalRenderingGroupSpecCondition(in.Spec.Condition),
Items: make([]dashv2beta1.DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeRangeSizeKind, len(in.Spec.Items)),
},
}
// Convert each item in the Items slice
for i, item := range in.Spec.Items {
out.Spec.Items[i] = dashv2beta1.DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeRangeSizeKind{}
if item.ConditionalRenderingVariableKind != nil {
out.Spec.Items[i].ConditionalRenderingVariableKind = &dashv2beta1.DashboardConditionalRenderingVariableKind{
Kind: item.ConditionalRenderingVariableKind.Kind,
Spec: dashv2beta1.DashboardConditionalRenderingVariableSpec{
Variable: item.ConditionalRenderingVariableKind.Spec.Variable,
Operator: dashv2beta1.DashboardConditionalRenderingVariableSpecOperator(item.ConditionalRenderingVariableKind.Spec.Operator),
Value: item.ConditionalRenderingVariableKind.Spec.Value,
},
}
}
if item.ConditionalRenderingDataKind != nil {
out.Spec.Items[i].ConditionalRenderingDataKind = &dashv2beta1.DashboardConditionalRenderingDataKind{
Kind: item.ConditionalRenderingDataKind.Kind,
Spec: dashv2beta1.DashboardConditionalRenderingDataSpec{
Value: item.ConditionalRenderingDataKind.Spec.Value,
},
}
}
if item.ConditionalRenderingTimeRangeSizeKind != nil {
out.Spec.Items[i].ConditionalRenderingTimeRangeSizeKind = &dashv2beta1.DashboardConditionalRenderingTimeRangeSizeKind{
Kind: item.ConditionalRenderingTimeRangeSizeKind.Kind,
Spec: dashv2beta1.DashboardConditionalRenderingTimeRangeSizeSpec{
Value: item.ConditionalRenderingTimeRangeSizeKind.Spec.Value,
},
}
}
}
return out
}
func convertRowLayout_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardGridLayoutKindOrAutoGridLayoutKindOrTabsLayoutKindOrRowsLayoutKind, out *dashv2beta1.DashboardGridLayoutKindOrAutoGridLayoutKindOrTabsLayoutKindOrRowsLayoutKind, scope conversion.Scope) error {
if in.GridLayoutKind != nil {
out.GridLayoutKind = &dashv2beta1.DashboardGridLayoutKind{
Kind: in.GridLayoutKind.Kind,
}
return convertGridLayoutSpec_V2alpha1_to_V2beta1(&in.GridLayoutKind.Spec, &out.GridLayoutKind.Spec, scope)
}
if in.AutoGridLayoutKind != nil {
out.AutoGridLayoutKind = &dashv2beta1.DashboardAutoGridLayoutKind{
Kind: in.AutoGridLayoutKind.Kind,
}
return convertAutoGridLayoutSpec_V2alpha1_to_V2beta1(&in.AutoGridLayoutKind.Spec, &out.AutoGridLayoutKind.Spec, scope)
}
if in.TabsLayoutKind != nil {
out.TabsLayoutKind = &dashv2beta1.DashboardTabsLayoutKind{
Kind: in.TabsLayoutKind.Kind,
}
return convertTabsLayoutSpec_V2alpha1_to_V2beta1(&in.TabsLayoutKind.Spec, &out.TabsLayoutKind.Spec, scope)
}
if in.RowsLayoutKind != nil {
out.RowsLayoutKind = &dashv2beta1.DashboardRowsLayoutKind{
Kind: in.RowsLayoutKind.Kind,
}
return convertRowsLayoutSpec_V2alpha1_to_V2beta1(&in.RowsLayoutKind.Spec, &out.RowsLayoutKind.Spec, scope)
}
return nil
}
func convertTabLayout_V2alpha1_to_V2beta1(in *dashv2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrAutoGridLayoutKindOrTabsLayoutKind, out *dashv2beta1.DashboardGridLayoutKindOrRowsLayoutKindOrAutoGridLayoutKindOrTabsLayoutKind, scope conversion.Scope) error {
return convertLayout_V2alpha1_to_V2beta1(in, out, scope)
}
func convertAnnotationMappings_V2alpha1_to_V2beta1(in map[string]dashv2alpha1.DashboardAnnotationEventFieldMapping) map[string]dashv2beta1.DashboardAnnotationEventFieldMapping {
if in == nil {
return nil
}
out := make(map[string]dashv2beta1.DashboardAnnotationEventFieldMapping, len(in))
for key, mapping := range in {
out[key] = dashv2beta1.DashboardAnnotationEventFieldMapping{
Source: mapping.Source,
Value: mapping.Value,
Regex: mapping.Regex,
}
}
return out
}