mirror of
https://github.com/prymitive/karma
synced 2026-08-23 11:56:20 +00:00
fix(ui): use CORS credential settings from each alertmanager configuration
Fixes #1432
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"] }
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -74,6 +74,7 @@ const MockAlertmanager = () => ({
|
||||
headers: {
|
||||
Authorization: "Basic foo bar"
|
||||
},
|
||||
corsCredentials: "include",
|
||||
error: "",
|
||||
version: "0.17.0",
|
||||
clusterMembers: ["default"]
|
||||
|
||||
Reference in New Issue
Block a user