diff --git a/ui/src/Components/ManagedSilence/DeleteSilence.js b/ui/src/Components/ManagedSilence/DeleteSilence.js index aeed69c02..21317e000 100644 --- a/ui/src/Components/ManagedSilence/DeleteSilence.js +++ b/ui/src/Components/ManagedSilence/DeleteSilence.js @@ -111,9 +111,8 @@ const DeleteSilenceModalContent = observer( ); getAlertmanager = () => - this.props.alertStore.data.upstreams.instances + this.props.alertStore.data.readWriteAlertmanagers .filter(u => u.cluster === this.props.cluster) - .filter(u => u.readonly === false) .slice(0, 1)[0]; parseAlertmanagerResponse = response => { diff --git a/ui/src/Components/ManagedSilence/DeleteSilence.test.js b/ui/src/Components/ManagedSilence/DeleteSilence.test.js index edec8da27..0d1583d42 100644 --- a/ui/src/Components/ManagedSilence/DeleteSilence.test.js +++ b/ui/src/Components/ManagedSilence/DeleteSilence.test.js @@ -29,7 +29,8 @@ beforeEach(() => { readonly: false, error: "", version: "0.15.3", - headers: {} + headers: {}, + clusterMembers: ["am1"] } ], clusters: { am: ["am1"] } diff --git a/ui/src/Components/ManagedSilence/index.js b/ui/src/Components/ManagedSilence/index.js index 43bce27cf..0ec1e1b0f 100644 --- a/ui/src/Components/ManagedSilence/index.js +++ b/ui/src/Components/ManagedSilence/index.js @@ -45,9 +45,8 @@ const ManagedSilence = observer( } getAlertmanager = () => - this.props.alertStore.data.upstreams.instances + this.props.alertStore.data.readWriteAlertmanagers .filter(u => u.cluster === this.props.cluster) - .filter(u => u.readonly === false) .slice(0, 1)[0]; onEditSilence = () => { diff --git a/ui/src/Components/ManagedSilence/index.test.js b/ui/src/Components/ManagedSilence/index.test.js index 790f0f29e..4ffdc9ad5 100644 --- a/ui/src/Components/ManagedSilence/index.test.js +++ b/ui/src/Components/ManagedSilence/index.test.js @@ -103,6 +103,51 @@ describe("", () => { }); }); + it("getAlertmanager() returns only writable instances", () => { + alertStore.data.upstreams = { + instances: [ + { + name: "am1", + cluster: "am", + clusterMembers: ["am1", "am2"], + uri: "http://localhost:9093", + publicURI: "http://example.com", + readonly: false, + error: "", + version: "0.15.3", + headers: {} + }, + { + name: "am2", + cluster: "am", + clusterMembers: ["am1", "am2"], + uri: "http://localhost:9094", + publicURI: "http://example.com", + readonly: true, + error: "", + version: "0.15.3", + headers: {} + } + ], + clusters: { am: ["am1", "am2"] } + }; + + const tree = MountedManagedSilence(); + const instance = tree.instance(); + const am = instance.getAlertmanager(); + expect(am).toEqual({ + name: "am1", + cluster: "am", + clusterMembers: ["am1"], + uri: "http://localhost:9093", + publicURI: "http://example.com", + readonly: false, + error: "", + version: "0.15.3", + headers: {} + }); + }); + it("shows Edit button on unexpired silence", () => { const tree = MountedManagedSilence(); tree.instance().collapse.toggle(); diff --git a/ui/src/Stores/AlertStore.js b/ui/src/Stores/AlertStore.js index c31870e58..610b6e141 100644 --- a/ui/src/Stores/AlertStore.js +++ b/ui/src/Stores/AlertStore.js @@ -176,6 +176,17 @@ class AlertStore { get readOnlyAlertmanagers() { return this.upstreams.instances.filter(am => am.readonly === true); }, + get readWriteAlertmanagers() { + return this.upstreams.instances + .filter(am => am.readonly === false) + .map(am => + Object.assign({}, am, { + clusterMembers: am.clusterMembers.filter( + m => this.isReadOnlyAlertmanager(m) === false + ) + }) + ); + }, get clustersWithoutReadOnly() { const clusters = {}; for (const clusterID of Object.keys(this.upstreams.clusters)) { @@ -196,6 +207,7 @@ class AlertStore { }, { readOnlyAlertmanagers: computed, + readWriteAlertmanagers: computed, clustersWithoutReadOnly: computed }, { name: "API Response data" }