fix(ui): use CORS credential settings from each alertmanager configuration

Fixes #1432
This commit is contained in:
Łukasz Mierzwa
2020-02-19 12:10:42 +00:00
parent af8d1637a3
commit 1f22a11e14
18 changed files with 74 additions and 11 deletions
+1
View File
@@ -146,6 +146,7 @@ const AlertAck = observer(
body: JSON.stringify(
this.submitState.silencesByCluster[cluster].payload
),
credentials: am.corsCredentials,
headers: {
"Content-Type": "application/json",
...am.headers
+4
View File
@@ -37,6 +37,7 @@ beforeEach(() => {
publicURI: "http://example.com",
readonly: false,
headers: { foo: "bar" },
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "default",
@@ -265,6 +266,7 @@ describe("<AlertAck />", () => {
publicURI: "http://am1.example.com",
readonly: false,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "default",
@@ -276,6 +278,7 @@ describe("<AlertAck />", () => {
publicURI: "http://am2.example.com",
readonly: false,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "default",
@@ -314,6 +317,7 @@ describe("<AlertAck />", () => {
publicURI: "http://am1.example.com",
readonly: false,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "default",
@@ -27,6 +27,7 @@ beforeEach(() => {
publicURI: "http://example.com",
readonly: false,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "default",
@@ -25,6 +25,7 @@ beforeEach(() => {
publicURI: "http://example.com",
readonly: false,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "default",
@@ -150,7 +150,8 @@ const DeleteSilenceModalContent = observer(
this.deleteState.fetch = FetchDelete(
`${alertmanager.uri}/api/v2/silence/${silence.id}`,
{
headers: alertmanager.headers
headers: alertmanager.headers,
credentials: alertmanager.corsCredentials
}
)
.then(result => {
@@ -207,6 +207,18 @@ describe("<DeleteSilenceModalContent />", () => {
});
});
it("uses CORS credentials from alertmanager config", async () => {
alertStore.data.upstreams.instances[0].corsCredentials = "omit";
await VerifyResponse({ status: "success" });
expect(fetch.mock.calls[1][0]).toBe(
"http://localhost:9093/api/v2/silence/04d37636-2350-4878-b382-e0b50353230f"
);
expect(fetch.mock.calls[1][1]).toMatchObject({
credentials: "omit",
method: "DELETE"
});
});
it("'Confirm' button is no-op after successful DELETE", async () => {
const tree = await VerifyResponse({ status: "success" });
expect(fetch.mock.calls[1][0]).toBe(
@@ -46,6 +46,7 @@ const MockMultipleClusters = () => {
publicURI: "http://am1.example.com",
readonly: false,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "default",
@@ -57,6 +58,7 @@ const MockMultipleClusters = () => {
publicURI: "http://am2.example.com",
readonly: false,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "default",
@@ -68,6 +70,7 @@ const MockMultipleClusters = () => {
publicURI: "http://am3.example.com",
readonly: false,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "second",
@@ -37,7 +37,8 @@ beforeEach(() => {
readonly: false,
error: "",
version: "0.17.0",
headers: {}
headers: {},
corsCredentials: "include"
}
],
clusters: { am: ["am1"] }
@@ -33,7 +33,8 @@ storiesOf("ManagedSilence", module)
readonly: false,
error: "",
version: "0.17.0",
headers: {}
headers: {},
corsCredentials: "include"
}
],
clusters: { am: ["am1"] }
@@ -49,6 +50,7 @@ storiesOf("ManagedSilence", module)
publicURI: "http://example.com",
readonly: true,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "ro",
+10 -5
View File
@@ -36,7 +36,8 @@ beforeEach(() => {
readonly: false,
error: "",
version: "0.17.0",
headers: {}
headers: {},
corsCredentials: "include"
}
],
clusters: { am: ["am1"] }
@@ -99,7 +100,8 @@ describe("<ManagedSilence />", () => {
readonly: false,
error: "",
version: "0.17.0",
headers: {}
headers: {},
corsCredentials: "include"
});
});
@@ -115,7 +117,8 @@ describe("<ManagedSilence />", () => {
readonly: false,
error: "",
version: "0.17.0",
headers: {}
headers: {},
corsCredentials: "include"
},
{
name: "am2",
@@ -126,7 +129,8 @@ describe("<ManagedSilence />", () => {
readonly: true,
error: "",
version: "0.17.0",
headers: {}
headers: {},
corsCredentials: "include"
}
],
clusters: { am: ["am1", "am2"] }
@@ -144,7 +148,8 @@ describe("<ManagedSilence />", () => {
readonly: false,
error: "",
version: "0.17.0",
headers: {}
headers: {},
corsCredentials: "include"
});
});
@@ -29,6 +29,7 @@ beforeEach(() => {
publicURI: "http://am1.example.com",
readonly: false,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "ha",
@@ -40,6 +41,7 @@ beforeEach(() => {
publicURI: "http://am2.example.com",
readonly: false,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "ha",
@@ -51,6 +53,7 @@ beforeEach(() => {
publicURI: "http://am3.example.com",
readonly: false,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "am3",
@@ -39,7 +39,8 @@ beforeEach(() => {
readonly: false,
error: "",
version: "0.17.0",
headers: {}
headers: {},
corsCredentials: "include"
}
],
clusters: { am: ["am1"] }
@@ -109,6 +109,7 @@ const SilenceSubmitProgress = observer(
this.submitState.fetch = FetchPost(`${am.uri}/api/v2/silences`, {
body: JSON.stringify(payload),
credentials: am.corsCredentials,
headers: {
"Content-Type": "application/json",
...am.headers
@@ -17,6 +17,7 @@ beforeEach(() => {
publicURI: "http://example.com",
readonly: false,
headers: { foo: "bar" },
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "mockAlertmanager",
@@ -80,6 +81,16 @@ describe("<SilenceSubmitProgress />", () => {
});
});
it("uses CORS credentials from alertmanager config", async () => {
alertStore.data.upstreams.instances[0].corsCredentials = "same-site";
MountedSilenceSubmitProgress();
expect(fetch.mock.calls[0][0]).toBe("http://localhost/api/v2/silences");
expect(fetch.mock.calls[0][1]).toMatchObject({
credentials: "same-site",
method: "POST"
});
});
it("will retry on another cluster member after fetch failure", async () => {
fetch
.mockRejectOnce(new Error("mock error message"))
@@ -93,6 +104,7 @@ describe("<SilenceSubmitProgress />", () => {
publicURI: "http://am1.example.com",
readonly: false,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "ha",
@@ -104,6 +116,7 @@ describe("<SilenceSubmitProgress />", () => {
publicURI: "http://am2.example.com",
readonly: false,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "ha",
@@ -151,6 +164,7 @@ describe("<SilenceSubmitProgress />", () => {
publicURI: "http://am1.example.com",
readonly: false,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "ha",
@@ -198,6 +212,7 @@ describe("<SilenceSubmitProgress />", () => {
publicURI: "http://am1.example.com",
readonly: false,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "ha",
@@ -209,6 +224,7 @@ describe("<SilenceSubmitProgress />", () => {
publicURI: "http://am2.example.com",
readonly: true,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "ha",
@@ -49,6 +49,7 @@ storiesOf("SilenceModal", module)
publicURI: "http://example.com",
readonly: false,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "default",
@@ -123,6 +124,7 @@ storiesOf("SilenceModal", module)
publicURI: "http://example.com",
readonly: true,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "default",
@@ -190,7 +192,8 @@ storiesOf("SilenceModal", module)
readonly: false,
error: "",
version: "0.17.0",
headers: {}
headers: {},
corsCredentials: "include"
}
],
clusters: { am: ["am1"] }
@@ -253,7 +256,8 @@ storiesOf("SilenceModal", module)
readonly: false,
error: "",
version: "0.17.0",
headers: {}
headers: {},
corsCredentials: "include"
}
],
clusters: { am: ["am1"] }
+2
View File
@@ -71,6 +71,8 @@ const APIAlertmanagerUpstream = PropTypes.exact({
publicURI: PropTypes.string.isRequired,
readonly: PropTypes.bool.isRequired,
headers: PropTypes.object.isRequired,
corsCredentials: PropTypes.oneOf(["omit", "same-origin", "include"])
.isRequired,
error: PropTypes.string.isRequired,
version: PropTypes.string.isRequired,
clusterMembers: PropTypes.arrayOf(PropTypes.string).isRequired
+4
View File
@@ -32,6 +32,7 @@ describe("AlertStore.data", () => {
publicURI: "http://example.com:8080",
readonly: false,
headers: { foo: "bar" },
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "default",
@@ -43,6 +44,7 @@ describe("AlertStore.data", () => {
publicURI: "http://example.com",
readonly: true,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "default",
@@ -68,6 +70,7 @@ describe("AlertStore.data", () => {
publicURI: "http://example.com:8080",
readonly: true,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "default",
@@ -79,6 +82,7 @@ describe("AlertStore.data", () => {
publicURI: "http://example.com",
readonly: true,
headers: {},
corsCredentials: "include",
error: "",
version: "0.17.0",
cluster: "default",
+1
View File
@@ -74,6 +74,7 @@ const MockAlertmanager = () => ({
headers: {
Authorization: "Basic foo bar"
},
corsCredentials: "include",
error: "",
version: "0.17.0",
clusterMembers: ["default"]