diff --git a/ui/src/Components/AlertAck/index.js b/ui/src/Components/AlertAck/index.js index 657682e6b..63bc222e3 100644 --- a/ui/src/Components/AlertAck/index.js +++ b/ui/src/Components/AlertAck/index.js @@ -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 diff --git a/ui/src/Components/AlertAck/index.test.js b/ui/src/Components/AlertAck/index.test.js index 03e20c8b0..58155561f 100644 --- a/ui/src/Components/AlertAck/index.test.js +++ b/ui/src/Components/AlertAck/index.test.js @@ -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("", () => { publicURI: "http://am1.example.com", readonly: false, headers: {}, + corsCredentials: "include", error: "", version: "0.17.0", cluster: "default", @@ -276,6 +278,7 @@ describe("", () => { publicURI: "http://am2.example.com", readonly: false, headers: {}, + corsCredentials: "include", error: "", version: "0.17.0", cluster: "default", @@ -314,6 +317,7 @@ describe("", () => { publicURI: "http://am1.example.com", readonly: false, headers: {}, + corsCredentials: "include", error: "", version: "0.17.0", cluster: "default", diff --git a/ui/src/Components/Grid/AlertGrid/AlertGroup/Alert/AlertMenu.test.js b/ui/src/Components/Grid/AlertGrid/AlertGroup/Alert/AlertMenu.test.js index 1c8a122ef..3b633f702 100644 --- a/ui/src/Components/Grid/AlertGrid/AlertGroup/Alert/AlertMenu.test.js +++ b/ui/src/Components/Grid/AlertGrid/AlertGroup/Alert/AlertMenu.test.js @@ -27,6 +27,7 @@ beforeEach(() => { publicURI: "http://example.com", readonly: false, headers: {}, + corsCredentials: "include", error: "", version: "0.17.0", cluster: "default", diff --git a/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupHeader/GroupMenu.test.js b/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupHeader/GroupMenu.test.js index a1c6df152..221a159b6 100644 --- a/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupHeader/GroupMenu.test.js +++ b/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupHeader/GroupMenu.test.js @@ -25,6 +25,7 @@ beforeEach(() => { publicURI: "http://example.com", readonly: false, headers: {}, + corsCredentials: "include", error: "", version: "0.17.0", cluster: "default", diff --git a/ui/src/Components/ManagedSilence/DeleteSilence.js b/ui/src/Components/ManagedSilence/DeleteSilence.js index c9caee3f2..60c352965 100644 --- a/ui/src/Components/ManagedSilence/DeleteSilence.js +++ b/ui/src/Components/ManagedSilence/DeleteSilence.js @@ -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 => { diff --git a/ui/src/Components/ManagedSilence/DeleteSilence.test.js b/ui/src/Components/ManagedSilence/DeleteSilence.test.js index c30e6000e..b5f47ea77 100644 --- a/ui/src/Components/ManagedSilence/DeleteSilence.test.js +++ b/ui/src/Components/ManagedSilence/DeleteSilence.test.js @@ -207,6 +207,18 @@ describe("", () => { }); }); + 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( diff --git a/ui/src/Components/ManagedSilence/SilenceComment.test.js b/ui/src/Components/ManagedSilence/SilenceComment.test.js index c9aa463f2..b2de351fa 100644 --- a/ui/src/Components/ManagedSilence/SilenceComment.test.js +++ b/ui/src/Components/ManagedSilence/SilenceComment.test.js @@ -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", diff --git a/ui/src/Components/ManagedSilence/SilenceDetails.test.js b/ui/src/Components/ManagedSilence/SilenceDetails.test.js index c711568ed..731581a16 100644 --- a/ui/src/Components/ManagedSilence/SilenceDetails.test.js +++ b/ui/src/Components/ManagedSilence/SilenceDetails.test.js @@ -37,7 +37,8 @@ beforeEach(() => { readonly: false, error: "", version: "0.17.0", - headers: {} + headers: {}, + corsCredentials: "include" } ], clusters: { am: ["am1"] } diff --git a/ui/src/Components/ManagedSilence/index.stories.js b/ui/src/Components/ManagedSilence/index.stories.js index e950a95e0..9733bc73f 100644 --- a/ui/src/Components/ManagedSilence/index.stories.js +++ b/ui/src/Components/ManagedSilence/index.stories.js @@ -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", diff --git a/ui/src/Components/ManagedSilence/index.test.js b/ui/src/Components/ManagedSilence/index.test.js index ab299a74e..47b63fee9 100644 --- a/ui/src/Components/ManagedSilence/index.test.js +++ b/ui/src/Components/ManagedSilence/index.test.js @@ -36,7 +36,8 @@ beforeEach(() => { readonly: false, error: "", version: "0.17.0", - headers: {} + headers: {}, + corsCredentials: "include" } ], clusters: { am: ["am1"] } @@ -99,7 +100,8 @@ describe("", () => { readonly: false, error: "", version: "0.17.0", - headers: {} + headers: {}, + corsCredentials: "include" }); }); @@ -115,7 +117,8 @@ describe("", () => { readonly: false, error: "", version: "0.17.0", - headers: {} + headers: {}, + corsCredentials: "include" }, { name: "am2", @@ -126,7 +129,8 @@ describe("", () => { readonly: true, error: "", version: "0.17.0", - headers: {} + headers: {}, + corsCredentials: "include" } ], clusters: { am: ["am1", "am2"] } @@ -144,7 +148,8 @@ describe("", () => { readonly: false, error: "", version: "0.17.0", - headers: {} + headers: {}, + corsCredentials: "include" }); }); diff --git a/ui/src/Components/SilenceModal/AlertManagerInput/index.test.js b/ui/src/Components/SilenceModal/AlertManagerInput/index.test.js index 71cf47468..e785859e0 100644 --- a/ui/src/Components/SilenceModal/AlertManagerInput/index.test.js +++ b/ui/src/Components/SilenceModal/AlertManagerInput/index.test.js @@ -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", diff --git a/ui/src/Components/SilenceModal/Browser/index.test.js b/ui/src/Components/SilenceModal/Browser/index.test.js index 25ce5a651..b730efe59 100644 --- a/ui/src/Components/SilenceModal/Browser/index.test.js +++ b/ui/src/Components/SilenceModal/Browser/index.test.js @@ -39,7 +39,8 @@ beforeEach(() => { readonly: false, error: "", version: "0.17.0", - headers: {} + headers: {}, + corsCredentials: "include" } ], clusters: { am: ["am1"] } diff --git a/ui/src/Components/SilenceModal/SilenceSubmit/SilenceSubmitProgress.js b/ui/src/Components/SilenceModal/SilenceSubmit/SilenceSubmitProgress.js index 8a805db15..fe33d6beb 100644 --- a/ui/src/Components/SilenceModal/SilenceSubmit/SilenceSubmitProgress.js +++ b/ui/src/Components/SilenceModal/SilenceSubmit/SilenceSubmitProgress.js @@ -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 diff --git a/ui/src/Components/SilenceModal/SilenceSubmit/SilenceSubmitProgress.test.js b/ui/src/Components/SilenceModal/SilenceSubmit/SilenceSubmitProgress.test.js index baf40f331..795020463 100644 --- a/ui/src/Components/SilenceModal/SilenceSubmit/SilenceSubmitProgress.test.js +++ b/ui/src/Components/SilenceModal/SilenceSubmit/SilenceSubmitProgress.test.js @@ -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("", () => { }); }); + 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("", () => { publicURI: "http://am1.example.com", readonly: false, headers: {}, + corsCredentials: "include", error: "", version: "0.17.0", cluster: "ha", @@ -104,6 +116,7 @@ describe("", () => { publicURI: "http://am2.example.com", readonly: false, headers: {}, + corsCredentials: "include", error: "", version: "0.17.0", cluster: "ha", @@ -151,6 +164,7 @@ describe("", () => { publicURI: "http://am1.example.com", readonly: false, headers: {}, + corsCredentials: "include", error: "", version: "0.17.0", cluster: "ha", @@ -198,6 +212,7 @@ describe("", () => { publicURI: "http://am1.example.com", readonly: false, headers: {}, + corsCredentials: "include", error: "", version: "0.17.0", cluster: "ha", @@ -209,6 +224,7 @@ describe("", () => { publicURI: "http://am2.example.com", readonly: true, headers: {}, + corsCredentials: "include", error: "", version: "0.17.0", cluster: "ha", diff --git a/ui/src/Components/SilenceModal/index.stories.js b/ui/src/Components/SilenceModal/index.stories.js index abc9a6b21..ffe501cbf 100644 --- a/ui/src/Components/SilenceModal/index.stories.js +++ b/ui/src/Components/SilenceModal/index.stories.js @@ -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"] } diff --git a/ui/src/Models/API.js b/ui/src/Models/API.js index 7f4d5af63..5d7ff6dfd 100644 --- a/ui/src/Models/API.js +++ b/ui/src/Models/API.js @@ -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 diff --git a/ui/src/Stores/AlertStore.test.js b/ui/src/Stores/AlertStore.test.js index f02cd8f62..2d3200567 100644 --- a/ui/src/Stores/AlertStore.test.js +++ b/ui/src/Stores/AlertStore.test.js @@ -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", diff --git a/ui/src/__mocks__/Alerts.js b/ui/src/__mocks__/Alerts.js index 1244a7d4f..3937effda 100644 --- a/ui/src/__mocks__/Alerts.js +++ b/ui/src/__mocks__/Alerts.js @@ -74,6 +74,7 @@ const MockAlertmanager = () => ({ headers: { Authorization: "Basic foo bar" }, + corsCredentials: "include", error: "", version: "0.17.0", clusterMembers: ["default"]