From 4fef791c7cc90e4a93ca427952893a2371e6ab29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Philippe=20Qu=C3=A9m=C3=A9ner?= Date: Wed, 9 Feb 2022 10:26:06 +0100 Subject: [PATCH] Alerting: enable e2e tests to run in production mode (#45073) * Alerting: run e2e tests in production mode * adapt expected messages * switch expected and actual to have the right order --- .../alerting/api_admin_configuration_test.go | 15 +++--- .../api_alertmanager_configuration_test.go | 6 ++- .../api/alerting/api_alertmanager_test.go | 48 +++++++++++-------- .../alerting/api_available_channel_test.go | 1 + .../alerting/api_notification_channel_test.go | 11 ++++- pkg/tests/api/alerting/api_prometheus_test.go | 9 ++-- pkg/tests/api/alerting/api_ruler_test.go | 9 ++-- pkg/tests/testinfra/testinfra.go | 5 ++ 8 files changed, 68 insertions(+), 36 deletions(-) diff --git a/pkg/tests/api/alerting/api_admin_configuration_test.go b/pkg/tests/api/alerting/api_admin_configuration_test.go index 6fe04e6407e..7b707f8b30d 100644 --- a/pkg/tests/api/alerting/api_admin_configuration_test.go +++ b/pkg/tests/api/alerting/api_admin_configuration_test.go @@ -30,6 +30,7 @@ func TestAdminConfiguration_SendingToExternalAlertmanagers(t *testing.T) { DisableAnonymous: true, NGAlertAdminConfigPollInterval: 2 * time.Second, UnifiedAlertingDisabledOrgs: []int64{disableOrgID}, // disable unified alerting for organisation 3 + AppModeProduction: true, }) grafanaListedAddr, s := testinfra.StartGrafana(t, dir, path) @@ -67,7 +68,7 @@ func TestAdminConfiguration_SendingToExternalAlertmanagers(t *testing.T) { resp := getRequest(t, alertsURL, http.StatusNotFound) // nolint b, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) - require.JSONEq(t, string(b), "{\"message\": \"no admin configuration available\",\"error\": \"no admin configuration available\"}") + require.JSONEq(t, `{"message": "no admin configuration available"}`, string(b)) } // An invalid alertmanager choice should return an error. @@ -84,7 +85,7 @@ func TestAdminConfiguration_SendingToExternalAlertmanagers(t *testing.T) { resp := postRequest(t, alertsURL, buf.String(), http.StatusBadRequest) // nolint b, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) - require.JSONEq(t, string(b), "{\"message\": \"Invalid alertmanager choice specified\"}") + require.JSONEq(t, `{"message": "Invalid alertmanager choice specified"}`, string(b)) } // Let's try to send all the alerts to an external Alertmanager @@ -102,7 +103,7 @@ func TestAdminConfiguration_SendingToExternalAlertmanagers(t *testing.T) { resp := postRequest(t, alertsURL, buf.String(), http.StatusBadRequest) // nolint b, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) - require.JSONEq(t, string(b), "{\"message\": \"At least one Alertmanager must be provided to choose this option\"}") + require.JSONEq(t, `{"message": "At least one Alertmanager must be provided to choose this option"}`, string(b)) } // Now, lets re-set external Alertmanagers for main organisation @@ -121,7 +122,7 @@ func TestAdminConfiguration_SendingToExternalAlertmanagers(t *testing.T) { resp := postRequest(t, alertsURL, buf.String(), http.StatusCreated) // nolint b, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) - require.JSONEq(t, string(b), "{\"message\": \"admin configuration updated\"}") + require.JSONEq(t, `{"message": "admin configuration updated"}`, string(b)) } // If we get the configuration again, it shows us what we've set. @@ -130,7 +131,7 @@ func TestAdminConfiguration_SendingToExternalAlertmanagers(t *testing.T) { resp := getRequest(t, alertsURL, http.StatusOK) // nolint b, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) - require.JSONEq(t, string(b), fmt.Sprintf("{\"alertmanagers\":[\"%s\",\"%s\"], \"alertmanagersChoice\": %q}\n", fakeAM1.URL(), fakeAM2.URL(), ngmodels.ExternalAlertmanagers)) + require.JSONEq(t, fmt.Sprintf("{\"alertmanagers\":[\"%s\",\"%s\"], \"alertmanagersChoice\": %q}\n", fakeAM1.URL(), fakeAM2.URL(), ngmodels.ExternalAlertmanagers), string(b)) } // With the configuration set, we should eventually discover those Alertmanagers. @@ -221,7 +222,7 @@ func TestAdminConfiguration_SendingToExternalAlertmanagers(t *testing.T) { resp := postRequest(t, alertsURL, buf.String(), http.StatusCreated) // nolint b, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) - require.JSONEq(t, string(b), "{\"message\": \"admin configuration updated\"}") + require.JSONEq(t, "{\"message\": \"admin configuration updated\"}", string(b)) } // If we get the configuration again, it shows us what we've set. @@ -230,7 +231,7 @@ func TestAdminConfiguration_SendingToExternalAlertmanagers(t *testing.T) { resp := getRequest(t, alertsURL, http.StatusOK) // nolint b, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) - require.JSONEq(t, string(b), fmt.Sprintf("{\"alertmanagers\":[\"%s\"], \"alertmanagersChoice\": %q}\n", fakeAM3.URL(), ngmodels.AllAlertmanagers)) + require.JSONEq(t, fmt.Sprintf("{\"alertmanagers\":[\"%s\"], \"alertmanagersChoice\": %q}\n", fakeAM3.URL(), ngmodels.AllAlertmanagers), string(b)) } // With the configuration set, we should eventually not discover Alertmanagers. diff --git a/pkg/tests/api/alerting/api_alertmanager_configuration_test.go b/pkg/tests/api/alerting/api_alertmanager_configuration_test.go index 59e8e1c2895..d51d3752b60 100644 --- a/pkg/tests/api/alerting/api_alertmanager_configuration_test.go +++ b/pkg/tests/api/alerting/api_alertmanager_configuration_test.go @@ -26,6 +26,7 @@ func TestAlertmanagerConfigurationIsTransactional(t *testing.T) { EnableUnifiedAlerting: true, NGAlertAlertmanagerConfigPollInterval: 2 * time.Second, DisableAnonymous: true, + AppModeProduction: true, }) grafanaListedAddr, store := testinfra.StartGrafana(t, dir, path) @@ -92,7 +93,7 @@ func TestAlertmanagerConfigurationIsTransactional(t *testing.T) { } ` resp := postRequest(t, alertConfigURL, payload, http.StatusBadRequest) // nolint - require.JSONEq(t, `{"message": "failed to save and apply Alertmanager configuration: failed to build integration map: the receiver is invalid: failed to validate receiver \"slack.receiver\" of type \"slack\": token must be specified when using the Slack chat API","error":"failed to save and apply Alertmanager configuration: failed to build integration map: the receiver is invalid: failed to validate receiver \"slack.receiver\" of type \"slack\": token must be specified when using the Slack chat API"}`, getBody(t, resp.Body)) + require.JSONEq(t, `{"message": "failed to save and apply Alertmanager configuration: failed to build integration map: the receiver is invalid: failed to validate receiver \"slack.receiver\" of type \"slack\": token must be specified when using the Slack chat API"}`, getBody(t, resp.Body)) resp = getRequest(t, alertConfigURL, http.StatusOK) // nolint require.JSONEq(t, defaultAlertmanagerConfigJSON, getBody(t, resp.Body)) @@ -138,6 +139,7 @@ func TestAlertmanagerConfigurationPersistSecrets(t *testing.T) { DisableLegacyAlerting: true, EnableUnifiedAlerting: true, DisableAnonymous: true, + AppModeProduction: true, }) grafanaListedAddr, store := testinfra.StartGrafana(t, dir, path) @@ -215,7 +217,7 @@ func TestAlertmanagerConfigurationPersistSecrets(t *testing.T) { ` resp := postRequest(t, alertConfigURL, payload, http.StatusBadRequest) // nolint - require.JSONEq(t, `{"message": "unknown receiver: invalid","error": "unknown receiver: invalid"}`, getBody(t, resp.Body)) + require.JSONEq(t, `{"message": "unknown receiver: invalid"}`, getBody(t, resp.Body)) } // The secure settings must be present diff --git a/pkg/tests/api/alerting/api_alertmanager_test.go b/pkg/tests/api/alerting/api_alertmanager_test.go index 9a631b5539f..bd2fc42e7a0 100644 --- a/pkg/tests/api/alerting/api_alertmanager_test.go +++ b/pkg/tests/api/alerting/api_alertmanager_test.go @@ -36,6 +36,7 @@ func TestAMConfigAccess(t *testing.T) { DisableLegacyAlerting: true, EnableUnifiedAlerting: true, DisableAnonymous: true, + AppModeProduction: true, }) grafanaListedAddr, store := testinfra.StartGrafana(t, dir, path) @@ -100,7 +101,7 @@ func TestAMConfigAccess(t *testing.T) { desc: "viewer request should fail", url: "http://viewer:viewer@%s/api/alertmanager/grafana/config/api/v1/alerts", expStatus: http.StatusForbidden, - expBody: `{"message": "permission denied","error": "permission denied"}`, + expBody: `{"message": "permission denied"}`, }, { desc: "editor request should succeed", @@ -170,7 +171,7 @@ func TestAMConfigAccess(t *testing.T) { desc: "viewer request should fail", url: "http://viewer:viewer@%s/api/alertmanager/grafana/config/api/v1/alerts", expStatus: http.StatusForbidden, - expBody: `{"message": "permission denied","error": "permission denied"}`, + expBody: `{"message": "permission denied"}`, }, { desc: "editor request should succeed", @@ -233,7 +234,7 @@ func TestAMConfigAccess(t *testing.T) { desc: "viewer request should fail", url: "http://viewer:viewer@%s/api/alertmanager/grafana/api/v2/silences", expStatus: http.StatusForbidden, - expBody: `{"message": "permission denied","error": "permission denied"}`, + expBody: `{"message": "permission denied"}`, }, { desc: "editor request should succeed", @@ -339,7 +340,7 @@ func TestAMConfigAccess(t *testing.T) { desc: "viewer request should fail", url: "http://viewer:viewer@%s/api/alertmanager/grafana/api/v2/silence/%s", expStatus: http.StatusForbidden, - expBody: `{"message": "permission denied","error": "permission denied"}`, + expBody: `{"message": "permission denied"}`, }, { desc: "editor request should succeed", @@ -398,6 +399,7 @@ func TestAlertAndGroupsQuery(t *testing.T) { DisableLegacyAlerting: true, EnableUnifiedAlerting: true, DisableAnonymous: true, + AppModeProduction: true, }) grafanaListedAddr, store := testinfra.StartGrafana(t, dir, path) @@ -440,7 +442,7 @@ func TestAlertAndGroupsQuery(t *testing.T) { b, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) require.Equal(t, http.StatusUnauthorized, resp.StatusCode) - require.JSONEq(t, `{"error": "invalid username or password","message": "invalid username or password"}`, string(b)) + require.JSONEq(t, `{"message": "invalid username or password"}`, string(b)) } // When there are no alerts available, it returns an empty list. @@ -568,6 +570,7 @@ func TestRulerAccess(t *testing.T) { EnableQuota: true, DisableAnonymous: true, ViewersCanEdit: true, + AppModeProduction: true, }) grafanaListedAddr, store := testinfra.StartGrafana(t, dir, path) @@ -612,7 +615,7 @@ func TestRulerAccess(t *testing.T) { desc: "viewer request should fail", url: "http://viewer:viewer@%s/api/ruler/grafana/api/v1/rules/default", expStatus: http.StatusForbidden, - expectedResponse: `{"message": "user does not have permissions to edit the namespace: user does not have permissions to edit the namespace","error":"user does not have permissions to edit the namespace: user does not have permissions to edit the namespace"}`, + expectedResponse: `{"message": "user does not have permissions to edit the namespace: user does not have permissions to edit the namespace"}`, }, { desc: "editor request should succeed", @@ -697,6 +700,7 @@ func TestDeleteFolderWithRules(t *testing.T) { EnableQuota: true, DisableAnonymous: true, ViewersCanEdit: true, + AppModeProduction: true, }) grafanaListedAddr, store := testinfra.StartGrafana(t, dir, path) @@ -858,6 +862,7 @@ func TestAlertRuleCRUD(t *testing.T) { EnableUnifiedAlerting: true, EnableQuota: true, DisableAnonymous: true, + AppModeProduction: true, }) grafanaListedAddr, store := testinfra.StartGrafana(t, dir, path) @@ -903,7 +908,7 @@ func TestAlertRuleCRUD(t *testing.T) { Data: []ngmodels.AlertQuery{}, }, }, - expectedResponse: `{"message": "failed to update rule group: invalid alert rule: no queries or expressions are found","error":"failed to update rule group: invalid alert rule: no queries or expressions are found"}`, + expectedResponse: `{"message": "failed to update rule group: invalid alert rule: no queries or expressions are found"}`, }, { desc: "alert rule with empty title", @@ -933,7 +938,7 @@ func TestAlertRuleCRUD(t *testing.T) { }, }, }, - expectedResponse: `{"message": "failed to update rule group: invalid alert rule: title is empty","error":"failed to update rule group: invalid alert rule: title is empty"}`, + expectedResponse: `{"message": "failed to update rule group: invalid alert rule: title is empty"}`, }, { desc: "alert rule with too long name", @@ -963,7 +968,7 @@ func TestAlertRuleCRUD(t *testing.T) { }, }, }, - expectedResponse: `{"message": "failed to update rule group: invalid alert rule: name length should not be greater than 190","error":"failed to update rule group: invalid alert rule: name length should not be greater than 190"}`, + expectedResponse: `{"message": "failed to update rule group: invalid alert rule: name length should not be greater than 190"}`, }, { desc: "alert rule with too long rulegroup", @@ -993,7 +998,7 @@ func TestAlertRuleCRUD(t *testing.T) { }, }, }, - expectedResponse: `{"message": "failed to update rule group: invalid alert rule: rule group name length should not be greater than 190","error":"failed to update rule group: invalid alert rule: rule group name length should not be greater than 190"}`, + expectedResponse: `{"message": "failed to update rule group: invalid alert rule: rule group name length should not be greater than 190"}`, }, { desc: "alert rule with invalid interval", @@ -1024,7 +1029,7 @@ func TestAlertRuleCRUD(t *testing.T) { }, }, }, - expectedResponse: `{"message": "failed to update rule group: invalid alert rule: interval (1s) should be non-zero and divided exactly by scheduler interval: 10s","error":"failed to update rule group: invalid alert rule: interval (1s) should be non-zero and divided exactly by scheduler interval: 10s"}`, + expectedResponse: `{"message": "failed to update rule group: invalid alert rule: interval (1s) should be non-zero and divided exactly by scheduler interval: 10s"}`, }, { desc: "alert rule with unknown datasource", @@ -1054,7 +1059,7 @@ func TestAlertRuleCRUD(t *testing.T) { }, }, }, - expectedResponse: `{"message": "failed to validate alert rule \"AlwaysFiring\": invalid query A: data source not found: unknown","error":"failed to validate alert rule \"AlwaysFiring\": invalid query A: data source not found: unknown"}`, + expectedResponse: `{"message": "failed to validate alert rule \"AlwaysFiring\": invalid query A: data source not found: unknown"}`, }, { desc: "alert rule with invalid condition", @@ -1084,7 +1089,7 @@ func TestAlertRuleCRUD(t *testing.T) { }, }, }, - expectedResponse: `{"message": "failed to validate alert rule \"AlwaysFiring\": condition B not found in any query or expression: it should be one of: [A]","error":"failed to validate alert rule \"AlwaysFiring\": condition B not found in any query or expression: it should be one of: [A]"}`, + expectedResponse: `{"message": "failed to validate alert rule \"AlwaysFiring\": condition B not found in any query or expression: it should be one of: [A]"}`, }, } @@ -1374,7 +1379,7 @@ func TestAlertRuleCRUD(t *testing.T) { require.NoError(t, err) assert.Equal(t, http.StatusNotFound, resp.StatusCode) - require.JSONEq(t, `{"message": "failed to update rule group: failed to get alert rule unknown: could not find alert rule","error":"failed to update rule group: failed to get alert rule unknown: could not find alert rule"}`, string(b)) + require.JSONEq(t, `{"message": "failed to update rule group: failed to get alert rule unknown: could not find alert rule"}`, string(b)) // let's make sure that rule definitions are not affected by the failed POST request. u = fmt.Sprintf("http://grafana:password@%s/api/ruler/grafana/api/v1/rules/default", grafanaListedAddr) @@ -1493,7 +1498,7 @@ func TestAlertRuleCRUD(t *testing.T) { require.NoError(t, err) assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - require.JSONEq(t, fmt.Sprintf(`{"message": "failed to validate alert rule \"AlwaysAlerting\": conflicting UID \"%s\" found","error":"failed to validate alert rule \"AlwaysAlerting\": conflicting UID \"%s\" found"}`, ruleUID, ruleUID), string(b)) + require.JSONEq(t, fmt.Sprintf(`{"message": "failed to validate alert rule \"AlwaysAlerting\": conflicting UID \"%s\" found"}`, ruleUID), string(b)) // let's make sure that rule definitions are not affected by the failed POST request. u = fmt.Sprintf("http://grafana:password@%s/api/ruler/grafana/api/v1/rules/default", grafanaListedAddr) @@ -1898,7 +1903,7 @@ func TestAlertRuleCRUD(t *testing.T) { require.NoError(t, err) require.Equal(t, http.StatusNotFound, resp.StatusCode) - require.JSONEq(t, `{"message": "failed to delete rule group: rule group not found under this namespace","error":"failed to delete rule group: rule group not found under this namespace"}`, string(b)) + require.JSONEq(t, `{"message": "failed to delete rule group: rule group not found under this namespace"}`, string(b)) }) t.Run("succeed if the rule group name does exist", func(t *testing.T) { @@ -1925,6 +1930,7 @@ func TestAlertmanagerStatus(t *testing.T) { dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{ DisableLegacyAlerting: true, EnableUnifiedAlerting: true, + AppModeProduction: true, }) grafanaListedAddr, _ := testinfra.StartGrafana(t, dir, path) @@ -1990,6 +1996,7 @@ func TestQuota(t *testing.T) { EnableUnifiedAlerting: true, EnableQuota: true, DisableAnonymous: true, + AppModeProduction: true, }) grafanaListedAddr, store := testinfra.StartGrafana(t, dir, path) @@ -2108,7 +2115,7 @@ func TestQuota(t *testing.T) { b, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) assert.Equal(t, http.StatusForbidden, resp.StatusCode) - require.JSONEq(t, `{"message": "quota reached","error":"quota reached"}`, string(b)) + require.JSONEq(t, `{"message": "quota reached"}`, string(b)) }) t.Run("when quota limit exceed updating existing rule should succeed", func(t *testing.T) { @@ -2235,6 +2242,7 @@ func TestEval(t *testing.T) { EnableUnifiedAlerting: true, EnableQuota: true, DisableAnonymous: true, + AppModeProduction: true, }) grafanaListedAddr, store := testinfra.StartGrafana(t, dir, path) @@ -2405,7 +2413,7 @@ func TestEval(t *testing.T) { } `, expectedStatusCode: http.StatusBadRequest, - expectedResponse: `{"message": "invalid condition: condition B not found in any query or expression: it should be one of: [A]","error":"invalid condition: condition B not found in any query or expression: it should be one of: [A]"}`, + expectedResponse: `{"message": "invalid condition: condition B not found in any query or expression: it should be one of: [A]"}`, }, { desc: "unknown query datasource", @@ -2430,7 +2438,7 @@ func TestEval(t *testing.T) { } `, expectedStatusCode: http.StatusBadRequest, - expectedResponse: `{"message": "invalid condition: invalid query A: data source not found: unknown","error":"invalid condition: invalid query A: data source not found: unknown"}`, + expectedResponse: `{"message": "invalid condition: invalid query A: data source not found: unknown"}`, }, } @@ -2586,7 +2594,7 @@ func TestEval(t *testing.T) { } `, expectedStatusCode: http.StatusBadRequest, - expectedResponse: `{"message": "invalid queries or expressions: invalid query A: data source not found: unknown","error":"invalid queries or expressions: invalid query A: data source not found: unknown"}`, + expectedResponse: `{"message": "invalid queries or expressions: invalid query A: data source not found: unknown"}`, }, } diff --git a/pkg/tests/api/alerting/api_available_channel_test.go b/pkg/tests/api/alerting/api_available_channel_test.go index dbd01ad238b..03061c78008 100644 --- a/pkg/tests/api/alerting/api_available_channel_test.go +++ b/pkg/tests/api/alerting/api_available_channel_test.go @@ -22,6 +22,7 @@ func TestAvailableChannels(t *testing.T) { DisableLegacyAlerting: true, EnableUnifiedAlerting: true, DisableAnonymous: true, + AppModeProduction: true, }) grafanaListedAddr, store := testinfra.StartGrafana(t, dir, path) diff --git a/pkg/tests/api/alerting/api_notification_channel_test.go b/pkg/tests/api/alerting/api_notification_channel_test.go index e519221ca75..402add9ca2c 100644 --- a/pkg/tests/api/alerting/api_notification_channel_test.go +++ b/pkg/tests/api/alerting/api_notification_channel_test.go @@ -39,6 +39,7 @@ func TestTestReceivers(t *testing.T) { dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{ DisableLegacyAlerting: true, EnableUnifiedAlerting: true, + AppModeProduction: true, }) grafanaListedAddr, env := testinfra.StartGrafanaEnv(t, dir, path) @@ -62,7 +63,7 @@ func TestTestReceivers(t *testing.T) { b, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) - require.JSONEq(t, `{"error":"no receivers"}`, string(b)) + require.JSONEq(t, `{}`, string(b)) }) t.Run("assert working receiver returns OK", func(t *testing.T) { @@ -72,6 +73,7 @@ func TestTestReceivers(t *testing.T) { dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{ DisableLegacyAlerting: true, EnableUnifiedAlerting: true, + AppModeProduction: true, }) grafanaListedAddr, env := testinfra.StartGrafanaEnv(t, dir, path) @@ -156,6 +158,7 @@ func TestTestReceivers(t *testing.T) { dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{ DisableLegacyAlerting: true, EnableUnifiedAlerting: true, + AppModeProduction: true, }) grafanaListedAddr, env := testinfra.StartGrafanaEnv(t, dir, path) @@ -235,6 +238,7 @@ func TestTestReceivers(t *testing.T) { dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{ DisableLegacyAlerting: true, EnableUnifiedAlerting: true, + AppModeProduction: true, }) grafanaListedAddr, env := testinfra.StartGrafanaEnv(t, dir, path) @@ -324,6 +328,7 @@ func TestTestReceivers(t *testing.T) { dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{ DisableLegacyAlerting: true, EnableUnifiedAlerting: true, + AppModeProduction: true, }) grafanaListedAddr, env := testinfra.StartGrafanaEnv(t, dir, path) @@ -439,6 +444,7 @@ func TestTestReceiversAlertCustomization(t *testing.T) { dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{ DisableLegacyAlerting: true, EnableUnifiedAlerting: true, + AppModeProduction: true, }) grafanaListedAddr, env := testinfra.StartGrafanaEnv(t, dir, path) @@ -534,6 +540,7 @@ func TestTestReceiversAlertCustomization(t *testing.T) { dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{ DisableLegacyAlerting: true, EnableUnifiedAlerting: true, + AppModeProduction: true, }) grafanaListedAddr, env := testinfra.StartGrafanaEnv(t, dir, path) @@ -624,6 +631,7 @@ func TestTestReceiversAlertCustomization(t *testing.T) { dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{ DisableLegacyAlerting: true, EnableUnifiedAlerting: true, + AppModeProduction: true, }) grafanaListedAddr, env := testinfra.StartGrafanaEnv(t, dir, path) @@ -715,6 +723,7 @@ func TestNotificationChannels(t *testing.T) { DisableLegacyAlerting: true, EnableUnifiedAlerting: true, DisableAnonymous: true, + AppModeProduction: true, }) grafanaListedAddr, env := testinfra.StartGrafanaEnv(t, dir, path) diff --git a/pkg/tests/api/alerting/api_prometheus_test.go b/pkg/tests/api/alerting/api_prometheus_test.go index 29a29f0551a..ccaa162b0af 100644 --- a/pkg/tests/api/alerting/api_prometheus_test.go +++ b/pkg/tests/api/alerting/api_prometheus_test.go @@ -29,6 +29,7 @@ func TestPrometheusRules(t *testing.T) { DisableLegacyAlerting: true, EnableUnifiedAlerting: true, DisableAnonymous: true, + AppModeProduction: true, }) grafanaListedAddr, store := testinfra.StartGrafana(t, dir, path) @@ -206,7 +207,7 @@ func TestPrometheusRules(t *testing.T) { require.NoError(t, err) assert.Equal(t, 400, resp.StatusCode) - require.JSONEq(t, `{"message": "failed to update rule group: invalid alert rule: cannot have Panel ID without a Dashboard UID","error":"failed to update rule group: invalid alert rule: cannot have Panel ID without a Dashboard UID"}`, string(b)) + require.JSONEq(t, `{"message": "failed to update rule group: invalid alert rule: cannot have Panel ID without a Dashboard UID"}`, string(b)) } // Now, let's see how this looks like. @@ -329,6 +330,7 @@ func TestPrometheusRulesFilterByDashboard(t *testing.T) { dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{ EnableFeatureToggles: []string{"ngalert"}, DisableAnonymous: true, + AppModeProduction: true, }) grafanaListedAddr, store := testinfra.StartGrafana(t, dir, path) @@ -600,7 +602,7 @@ func TestPrometheusRulesFilterByDashboard(t *testing.T) { require.Equal(t, http.StatusBadRequest, resp.StatusCode) b, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) - require.JSONEq(t, `{"message": "invalid panel_id: strconv.ParseInt: parsing \"invalid\": invalid syntax","error":"invalid panel_id: strconv.ParseInt: parsing \"invalid\": invalid syntax"}`, string(b)) + require.JSONEq(t, `{"message": "invalid panel_id: strconv.ParseInt: parsing \"invalid\": invalid syntax"}`, string(b)) } // Now, let's check a panel_id without dashboard_uid returns a 400 Bad Request response @@ -616,7 +618,7 @@ func TestPrometheusRulesFilterByDashboard(t *testing.T) { require.Equal(t, http.StatusBadRequest, resp.StatusCode) b, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) - require.JSONEq(t, `{"message": "panel_id must be set with dashboard_uid","error":"panel_id must be set with dashboard_uid"}`, string(b)) + require.JSONEq(t, `{"message": "panel_id must be set with dashboard_uid"}`, string(b)) } } @@ -628,6 +630,7 @@ func TestPrometheusRulesPermissions(t *testing.T) { DisableLegacyAlerting: true, EnableUnifiedAlerting: true, DisableAnonymous: true, + AppModeProduction: true, }) grafanaListedAddr, store := testinfra.StartGrafana(t, dir, path) diff --git a/pkg/tests/api/alerting/api_ruler_test.go b/pkg/tests/api/alerting/api_ruler_test.go index d4710d8360e..a90dcdaabca 100644 --- a/pkg/tests/api/alerting/api_ruler_test.go +++ b/pkg/tests/api/alerting/api_ruler_test.go @@ -30,6 +30,7 @@ func TestAlertRulePermissions(t *testing.T) { DisableLegacyAlerting: true, EnableUnifiedAlerting: true, DisableAnonymous: true, + AppModeProduction: true, }) grafanaListedAddr, store := testinfra.StartGrafana(t, dir, path) @@ -337,6 +338,7 @@ func TestAlertRuleConflictingTitle(t *testing.T) { EnableQuota: true, DisableAnonymous: true, ViewersCanEdit: true, + AppModeProduction: true, }) grafanaListedAddr, store := testinfra.StartGrafana(t, dir, path) @@ -428,7 +430,7 @@ func TestAlertRuleConflictingTitle(t *testing.T) { require.NoError(t, err) assert.Equal(t, http.StatusInternalServerError, resp.StatusCode) - require.JSONEq(t, `{"message": "failed to update rule group: a conflicting alert rule is found: rule title under the same organisation and folder should be unique","error":"failed to update rule group: a conflicting alert rule is found: rule title under the same organisation and folder should be unique"}`, string(b)) + require.JSONEq(t, `{"message": "failed to update rule group: a conflicting alert rule is found: rule title under the same organisation and folder should be unique"}`, string(b)) }) t.Run("trying to create alert with same title under another folder should succeed", func(t *testing.T) { @@ -460,6 +462,7 @@ func TestRulerRulesFilterByDashboard(t *testing.T) { dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{ EnableFeatureToggles: []string{"ngalert"}, DisableAnonymous: true, + AppModeProduction: true, }) grafanaListedAddr, store := testinfra.StartGrafana(t, dir, path) @@ -782,7 +785,7 @@ func TestRulerRulesFilterByDashboard(t *testing.T) { require.Equal(t, http.StatusBadRequest, resp.StatusCode) b, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) - require.JSONEq(t, `{"message": "invalid panel_id: strconv.ParseInt: parsing \"invalid\": invalid syntax","error":"invalid panel_id: strconv.ParseInt: parsing \"invalid\": invalid syntax"}`, string(b)) + require.JSONEq(t, `{"message": "invalid panel_id: strconv.ParseInt: parsing \"invalid\": invalid syntax"}`, string(b)) } // Now, let's check a panel_id without dashboard_uid returns a 400 Bad Request response @@ -798,6 +801,6 @@ func TestRulerRulesFilterByDashboard(t *testing.T) { require.Equal(t, http.StatusBadRequest, resp.StatusCode) b, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) - require.JSONEq(t, `{"message": "panel_id must be set with dashboard_uid","error":"panel_id must be set with dashboard_uid"}`, string(b)) + require.JSONEq(t, `{"message": "panel_id must be set with dashboard_uid"}`, string(b)) } } diff --git a/pkg/tests/testinfra/testinfra.go b/pkg/tests/testinfra/testinfra.go index dec6141fecc..4aaefae51b9 100644 --- a/pkg/tests/testinfra/testinfra.go +++ b/pkg/tests/testinfra/testinfra.go @@ -236,6 +236,10 @@ func CreateGrafDir(t *testing.T, opts ...GrafanaOpts) (string, string) { _, err = ngalertingSection.NewKey("alertmanager_config_poll_interval", o.NGAlertAlertmanagerConfigPollInterval.String()) require.NoError(t, err) } + if o.AppModeProduction { + _, err = dfltSect.NewKey("app_mode", "production") + require.NoError(t, err) + } if o.AnonymousUserRole != "" { _, err = anonSect.NewKey("org_role", string(o.AnonymousUserRole)) require.NoError(t, err) @@ -313,6 +317,7 @@ type GrafanaOpts struct { CatalogAppEnabled bool ViewersCanEdit bool PluginAdminEnabled bool + AppModeProduction bool DisableLegacyAlerting bool EnableUnifiedAlerting bool UnifiedAlertingDisabledOrgs []int64