Alerting: Rename expression elements of Rules APIs (#110914)

This renames `data` to `expressions` for clarity in the rules apis.

Also makes certain fields that are redundant optional in the case of pure expressions, so that users don't have to specify them when they are not needed (e.g. not datasource queries).
This commit is contained in:
Moustafa Baiou
2025-09-12 22:15:55 +00:00
committed by GitHub
parent 3e0f57a407
commit cb7abbaa0f
19 changed files with 610 additions and 517 deletions
@@ -54,10 +54,10 @@ func TestIntegrationResourceIdentifier(t *testing.T) {
},
Spec: v0alpha1.AlertRuleSpec{
Title: rule.Title,
Data: map[string]v0alpha1.AlertRuleQuery{
Expressions: v0alpha1.AlertRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer("query"),
DatasourceUID: util.Pointer(v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
Source: util.Pointer(true),
RelativeTimeRange: &v0alpha1.AlertRuleRelativeTimeRange{
@@ -154,10 +154,10 @@ func TestIntegrationAccessControl(t *testing.T) {
},
Spec: v0alpha1.AlertRuleSpec{
Title: rule.Title,
Data: map[string]v0alpha1.AlertRuleQuery{
Expressions: v0alpha1.AlertRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
Source: util.Pointer(true),
RelativeTimeRange: &v0alpha1.AlertRuleRelativeTimeRange{
@@ -241,10 +241,10 @@ func TestIntegrationCRUD(t *testing.T) {
},
Spec: v0alpha1.AlertRuleSpec{
Title: rule.Title,
Data: map[string]v0alpha1.AlertRuleQuery{
Expressions: v0alpha1.AlertRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
Source: util.Pointer(true),
RelativeTimeRange: &v0alpha1.AlertRuleRelativeTimeRange{
@@ -295,10 +295,10 @@ func TestIntegrationCRUD(t *testing.T) {
},
Spec: v0alpha1.AlertRuleSpec{
Title: rule.Title,
Data: map[string]v0alpha1.AlertRuleQuery{
Expressions: v0alpha1.AlertRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
Source: util.Pointer(true),
RelativeTimeRange: &v0alpha1.AlertRuleRelativeTimeRange{
@@ -328,8 +328,8 @@ func TestIntegrationCRUD(t *testing.T) {
},
},
Spec: v0alpha1.AlertRuleSpec{
Title: "invalid-rule",
Data: map[string]v0alpha1.AlertRuleQuery{}, // Empty data should fail
Title: "invalid-rule",
Expressions: v0alpha1.AlertRuleExpressionMap{}, // Empty data should fail
Trigger: v0alpha1.AlertRuleIntervalTrigger{
Interval: "30",
},
@@ -356,10 +356,10 @@ func TestIntegrationCRUD(t *testing.T) {
},
Spec: v0alpha1.AlertRuleSpec{
Title: rule.Title,
Data: map[string]v0alpha1.AlertRuleQuery{
Expressions: v0alpha1.AlertRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
Source: util.Pointer(true),
RelativeTimeRange: &v0alpha1.AlertRuleRelativeTimeRange{
@@ -408,10 +408,10 @@ func TestIntegrationCRUD(t *testing.T) {
},
Spec: v0alpha1.AlertRuleSpec{
Title: rule.Title,
Data: map[string]v0alpha1.AlertRuleQuery{
Expressions: v0alpha1.AlertRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
RelativeTimeRange: &v0alpha1.AlertRuleRelativeTimeRange{
From: v0alpha1.AlertRulePromDurationWMillis("5m"),
@@ -445,10 +445,10 @@ func TestIntegrationCRUD(t *testing.T) {
},
Spec: v0alpha1.AlertRuleSpec{
Title: rule.Title,
Data: map[string]v0alpha1.AlertRuleQuery{
Expressions: v0alpha1.AlertRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
Source: util.Pointer(true),
RelativeTimeRange: &v0alpha1.AlertRuleRelativeTimeRange{
@@ -501,10 +501,10 @@ func TestIntegrationPatch(t *testing.T) {
},
Spec: v0alpha1.AlertRuleSpec{
Title: rule.Title,
Data: map[string]v0alpha1.AlertRuleQuery{
Expressions: v0alpha1.AlertRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
Source: util.Pointer(true),
RelativeTimeRange: &v0alpha1.AlertRuleRelativeTimeRange{
@@ -57,10 +57,10 @@ func TestIntegrationAlertRuleCompatCreateViaK8s(t *testing.T) {
},
Spec: v0alpha1.AlertRuleSpec{
Title: rule.Title,
Data: map[string]v0alpha1.AlertRuleQuery{
Expressions: v0alpha1.AlertRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.AlertRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
Source: util.Pointer(true),
RelativeTimeRange: &v0alpha1.AlertRuleRelativeTimeRange{
@@ -91,9 +91,9 @@ func TestIntegrationAlertRuleCompatCreateViaK8s(t *testing.T) {
err := json.Unmarshal(retrievedRule.Data[0].Model, &model)
require.NoError(t, err)
require.NotNil(t, model)
expectedModel, ok := created.Spec.Data["A"].Model.(map[string]interface{})
expectedModel, ok := created.Spec.Expressions["A"].Model.(map[string]interface{})
if !ok {
t.Fatalf("Expected model to be a map[string]interface{}, got %T", created.Spec.Data["A"].Model)
t.Fatalf("Expected model to be a map[string]interface{}, got %T", created.Spec.Expressions["A"].Model)
}
for k, v := range expectedModel {
require.EqualValues(t, v, model[k], "Model field %s should match", k)
@@ -230,13 +230,13 @@ func TestIntegrationAlertRuleCompatCreateViaProvisioning(t *testing.T) {
require.NoError(t, err)
require.NotNil(t, retrievedRule)
require.Equal(t, r.Title, retrievedRule.Spec.Title)
require.NotNil(t, retrievedRule.Spec.Data[r.Data[0].RefID].Source)
require.True(t, *retrievedRule.Spec.Data[r.Data[0].RefID].Source)
require.NotNil(t, retrievedRule.Spec.Expressions[r.Data[0].RefID].Source)
require.True(t, *retrievedRule.Spec.Expressions[r.Data[0].RefID].Source)
require.Equal(t, r.FolderUID, retrievedRule.Annotations["grafana.app/folder"])
require.Equal(t, created.Title, retrievedRule.Labels[v0alpha1.GroupLabelKey])
require.Equal(t, fmt.Sprintf("%d", i), retrievedRule.Labels[v0alpha1.GroupIndexLabelKey])
require.Equal(t, ngmodels.ProvenanceAPI, ngmodels.Provenance(retrievedRule.GetProvenanceStatus()))
require.EqualValues(t, r.Data[0].DatasourceUID, retrievedRule.Spec.Data["A"].DatasourceUID)
require.EqualValues(t, r.Data[0].DatasourceUID, *retrievedRule.Spec.Expressions["A"].DatasourceUID)
expectedDuration, err := prom_model.ParseDuration(fmt.Sprintf("%ds", created.Interval))
require.NoError(t, err)
require.Equal(t, expectedDuration.String(), string(retrievedRule.Spec.Trigger.Interval))
@@ -244,9 +244,9 @@ func TestIntegrationAlertRuleCompatCreateViaProvisioning(t *testing.T) {
err = json.Unmarshal(r.Data[0].Model, &expectedModel)
require.NoError(t, err)
require.NotNil(t, expectedModel)
retrievedModel, ok := retrievedRule.Spec.Data["A"].Model.(map[string]interface{})
retrievedModel, ok := retrievedRule.Spec.Expressions["A"].Model.(map[string]interface{})
if !ok {
t.Fatalf("Expected model to be a map[string]interface{}, got %T", retrievedRule.Spec.Data["A"].Model)
t.Fatalf("Expected model to be a map[string]interface{}, got %T", retrievedRule.Spec.Expressions["A"].Model)
}
for k, v := range expectedModel {
require.EqualValues(t, v, retrievedModel[k], "Model field %s should match", k)
@@ -372,13 +372,13 @@ func TestIntegrationAlertRuleCompatCreateViaProvisioningChangeGroupInK8s(t *test
require.NoError(t, err)
require.NotNil(t, retrievedRule)
require.Equal(t, r.Title, retrievedRule.Spec.Title)
require.NotNil(t, retrievedRule.Spec.Data[r.Data[0].RefID].Source)
require.True(t, *retrievedRule.Spec.Data[r.Data[0].RefID].Source)
require.NotNil(t, retrievedRule.Spec.Expressions[r.Data[0].RefID].Source)
require.True(t, *retrievedRule.Spec.Expressions[r.Data[0].RefID].Source)
require.Equal(t, r.FolderUID, retrievedRule.Annotations["grafana.app/folder"])
require.Equal(t, created.Title, retrievedRule.Labels[v0alpha1.GroupLabelKey])
require.Equal(t, fmt.Sprintf("%d", i), retrievedRule.Labels[v0alpha1.GroupIndexLabelKey])
require.Equal(t, ngmodels.ProvenanceAPI, ngmodels.Provenance(retrievedRule.GetProvenanceStatus()))
require.EqualValues(t, r.Data[0].DatasourceUID, retrievedRule.Spec.Data["X"].DatasourceUID)
require.EqualValues(t, r.Data[0].DatasourceUID, *retrievedRule.Spec.Expressions["X"].DatasourceUID)
expectedDuration, err := prom_model.ParseDuration(fmt.Sprintf("%ds", created.Interval))
require.NoError(t, err)
require.Equal(t, expectedDuration.String(), string(retrievedRule.Spec.Trigger.Interval))
@@ -386,9 +386,9 @@ func TestIntegrationAlertRuleCompatCreateViaProvisioningChangeGroupInK8s(t *test
err = json.Unmarshal(r.Data[0].Model, &expectedModel)
require.NoError(t, err)
require.NotNil(t, expectedModel)
retrievedModel, ok := retrievedRule.Spec.Data["X"].Model.(map[string]interface{})
retrievedModel, ok := retrievedRule.Spec.Expressions["X"].Model.(map[string]interface{})
if !ok {
t.Fatalf("Expected model to be a map[string]interface{}, got %T", retrievedRule.Spec.Data["X"].Model)
t.Fatalf("Expected model to be a map[string]interface{}, got %T", retrievedRule.Spec.Expressions["X"].Model)
}
for k, v := range expectedModel {
require.EqualValues(t, v, retrievedModel[k], "Model field %s should match", k)
@@ -64,10 +64,10 @@ func TestIntegrationRecordingRuleCompatCreateViaK8s(t *testing.T) {
Spec: v0alpha1.RecordingRuleSpec{
Title: rule.Title,
Metric: rule.Record.Metric,
Data: map[string]v0alpha1.RecordingRuleQuery{
Expressions: v0alpha1.RecordingRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
Source: util.Pointer(true),
RelativeTimeRange: &v0alpha1.RecordingRuleRelativeTimeRange{
@@ -98,9 +98,9 @@ func TestIntegrationRecordingRuleCompatCreateViaK8s(t *testing.T) {
err := json.Unmarshal(retrievedRule.Data[0].Model, &model)
require.NoError(t, err)
require.NotNil(t, model)
expectedModel, ok := created.Spec.Data["A"].Model.(map[string]interface{})
expectedModel, ok := created.Spec.Expressions["A"].Model.(map[string]interface{})
if !ok {
t.Fatalf("Expected model to be a map[string]interface{}, got %T", created.Spec.Data["A"].Model)
t.Fatalf("Expected model to be a map[string]interface{}, got %T", created.Spec.Expressions["A"].Model)
}
for k, v := range expectedModel {
require.EqualValues(t, v, model[k], "Model field %s should match", k)
@@ -247,7 +247,7 @@ func TestIntegrationRecordingRuleCompatCreateViaProvisioning(t *testing.T) {
require.Equal(t, created.Title, retrievedRule.Labels[v0alpha1.GroupLabelKey])
require.Equal(t, fmt.Sprintf("%d", i), retrievedRule.Labels[v0alpha1.GroupIndexLabelKey])
require.Equal(t, ngmodels.ProvenanceAPI, ngmodels.Provenance(retrievedRule.GetProvenanceStatus()))
require.EqualValues(t, r.Data[0].DatasourceUID, retrievedRule.Spec.Data["A"].DatasourceUID)
require.EqualValues(t, r.Data[0].DatasourceUID, *retrievedRule.Spec.Expressions["A"].DatasourceUID)
expectedDuration, err := prom_model.ParseDuration(fmt.Sprintf("%ds", created.Interval))
require.NoError(t, err)
require.Equal(t, expectedDuration.String(), string(retrievedRule.Spec.Trigger.Interval))
@@ -255,9 +255,9 @@ func TestIntegrationRecordingRuleCompatCreateViaProvisioning(t *testing.T) {
err = json.Unmarshal(r.Data[0].Model, &expectedModel)
require.NoError(t, err)
require.NotNil(t, expectedModel)
retrievedModel, ok := retrievedRule.Spec.Data["A"].Model.(map[string]interface{})
retrievedModel, ok := retrievedRule.Spec.Expressions["A"].Model.(map[string]interface{})
if !ok {
t.Fatalf("Expected model to be a map[string]interface{}, got %T", retrievedRule.Spec.Data["A"].Model)
t.Fatalf("Expected model to be a map[string]interface{}, got %T", retrievedRule.Spec.Expressions["A"].Model)
}
for k, v := range expectedModel {
require.EqualValues(t, v, retrievedModel[k], "Model field %s should match", k)
@@ -391,7 +391,7 @@ func TestIntegrationRecordingRuleCompatCreateViaProvisioningChangeGroupInK8s(t *
require.Equal(t, created.Title, retrievedRule.Labels[v0alpha1.GroupLabelKey])
require.Equal(t, fmt.Sprintf("%d", i), retrievedRule.Labels[v0alpha1.GroupIndexLabelKey])
require.Equal(t, ngmodels.ProvenanceAPI, ngmodels.Provenance(retrievedRule.GetProvenanceStatus()))
require.EqualValues(t, r.Data[0].DatasourceUID, retrievedRule.Spec.Data["X"].DatasourceUID)
require.EqualValues(t, r.Data[0].DatasourceUID, *retrievedRule.Spec.Expressions["X"].DatasourceUID)
expectedDuration, err := prom_model.ParseDuration(fmt.Sprintf("%ds", created.Interval))
require.NoError(t, err)
require.Equal(t, expectedDuration.String(), string(retrievedRule.Spec.Trigger.Interval))
@@ -399,9 +399,9 @@ func TestIntegrationRecordingRuleCompatCreateViaProvisioningChangeGroupInK8s(t *
err = json.Unmarshal(r.Data[0].Model, &expectedModel)
require.NoError(t, err)
require.NotNil(t, expectedModel)
retrievedModel, ok := retrievedRule.Spec.Data["X"].Model.(map[string]interface{})
retrievedModel, ok := retrievedRule.Spec.Expressions["X"].Model.(map[string]interface{})
if !ok {
t.Fatalf("Expected model to be a map[string]interface{}, got %T", retrievedRule.Spec.Data["X"].Model)
t.Fatalf("Expected model to be a map[string]interface{}, got %T", retrievedRule.Spec.Expressions["X"].Model)
}
for k, v := range expectedModel {
require.EqualValues(t, v, retrievedModel[k], "Model field %s should match", k)
@@ -55,10 +55,10 @@ func TestIntegrationResourceIdentifier(t *testing.T) {
Spec: v0alpha1.RecordingRuleSpec{
Title: rule.Title,
Metric: rule.Record.Metric,
Data: map[string]v0alpha1.RecordingRuleQuery{
Expressions: v0alpha1.RecordingRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
Source: util.Pointer(true),
RelativeTimeRange: &v0alpha1.RecordingRuleRelativeTimeRange{
@@ -155,10 +155,10 @@ func TestIntegrationAccessControl(t *testing.T) {
Spec: v0alpha1.RecordingRuleSpec{
Title: rule.Title,
Metric: rule.Record.Metric,
Data: map[string]v0alpha1.RecordingRuleQuery{
Expressions: v0alpha1.RecordingRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
Source: util.Pointer(true),
RelativeTimeRange: &v0alpha1.RecordingRuleRelativeTimeRange{
@@ -242,10 +242,10 @@ func TestIntegrationCRUD(t *testing.T) {
Spec: v0alpha1.RecordingRuleSpec{
Title: rule.Title,
Metric: rule.Record.Metric,
Data: map[string]v0alpha1.RecordingRuleQuery{
Expressions: v0alpha1.RecordingRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
Source: util.Pointer(true),
RelativeTimeRange: &v0alpha1.RecordingRuleRelativeTimeRange{
@@ -294,10 +294,10 @@ func TestIntegrationCRUD(t *testing.T) {
Spec: v0alpha1.RecordingRuleSpec{
Title: rule.Title,
Metric: rule.Record.Metric,
Data: map[string]v0alpha1.RecordingRuleQuery{
Expressions: v0alpha1.RecordingRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
Source: util.Pointer(true),
RelativeTimeRange: &v0alpha1.RecordingRuleRelativeTimeRange{
@@ -325,8 +325,8 @@ func TestIntegrationCRUD(t *testing.T) {
},
},
Spec: v0alpha1.RecordingRuleSpec{
Title: "invalid-recording-rule",
Data: map[string]v0alpha1.RecordingRuleQuery{}, // Empty data should fail
Title: "invalid-recording-rule",
Expressions: v0alpha1.RecordingRuleExpressionMap{}, // Empty data should fail
Trigger: v0alpha1.RecordingRuleIntervalTrigger{
Interval: "30s",
},
@@ -352,10 +352,10 @@ func TestIntegrationCRUD(t *testing.T) {
Spec: v0alpha1.RecordingRuleSpec{
Title: rule.Title,
Metric: rule.Record.Metric,
Data: map[string]v0alpha1.RecordingRuleQuery{
Expressions: v0alpha1.RecordingRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
Source: util.Pointer(true),
RelativeTimeRange: &v0alpha1.RecordingRuleRelativeTimeRange{
@@ -404,10 +404,10 @@ func TestIntegrationCRUD(t *testing.T) {
Spec: v0alpha1.RecordingRuleSpec{
Title: rule.Title,
Metric: rule.Record.Metric,
Data: map[string]v0alpha1.RecordingRuleQuery{
Expressions: v0alpha1.RecordingRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
RelativeTimeRange: &v0alpha1.RecordingRuleRelativeTimeRange{
From: v0alpha1.RecordingRulePromDurationWMillis("5m"),
@@ -440,10 +440,10 @@ func TestIntegrationCRUD(t *testing.T) {
Spec: v0alpha1.RecordingRuleSpec{
Title: rule.Title,
Metric: rule.Record.Metric,
Data: map[string]v0alpha1.RecordingRuleQuery{
Expressions: v0alpha1.RecordingRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
Source: util.Pointer(true),
RelativeTimeRange: &v0alpha1.RecordingRuleRelativeTimeRange{
@@ -496,10 +496,10 @@ func TestIntegrationPatch(t *testing.T) {
Spec: v0alpha1.RecordingRuleSpec{
Title: rule.Title,
Metric: rule.Record.Metric,
Data: map[string]v0alpha1.RecordingRuleQuery{
Expressions: v0alpha1.RecordingRuleExpressionMap{
"A": {
QueryType: "query",
DatasourceUID: v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID),
QueryType: util.Pointer(rule.Data[0].QueryType),
DatasourceUID: util.Pointer(v0alpha1.RecordingRuleDatasourceUID(rule.Data[0].DatasourceUID)),
Model: rule.Data[0].Model,
Source: util.Pointer(true),
RelativeTimeRange: &v0alpha1.RecordingRuleRelativeTimeRange{