Skip to content

Commit

Permalink
fix: error toast message while configuring trigger while creating a m…
Browse files Browse the repository at this point in the history
…onitor (#1178)

* fix: error toast message while configuring trigger while creating a monitor

Signed-off-by: vikhy-aws <[email protected]>

* fix: gracefully handle exceptions related to config index not created

Signed-off-by: vikhy-aws <[email protected]>

* fix: gracefully handle exceptions related to config index not created

Signed-off-by: vikhy-aws <[email protected]>

* fix: fix unit test to conform to code changes

Signed-off-by: vikhy-aws <[email protected]>

---------

Signed-off-by: vikhy-aws <[email protected]>
  • Loading branch information
vikhy-aws committed Jan 9, 2025
1 parent a562401 commit 1783b64
Show file tree
Hide file tree
Showing 4 changed files with 245 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -182,8 +182,9 @@ class ConfigureActions extends React.Component {
type: toChannelType(destination.type),
description: '',
}));
} else {
backendErrorNotification(notifications, 'load', 'destinations', response.err);
} else if (response.totalMonitors !== 0) {
// If the config index is not created, don't show the notification
backendErrorNotification(notifications, 'load', 'destinations', response.err);
}

let channels = await this.getChannels();
Expand Down
21 changes: 14 additions & 7 deletions server/services/DestinationsService.js
Original file line number Diff line number Diff line change
Expand Up @@ -175,17 +175,24 @@ export default class DestinationsService extends MDSEnabledClientService {
},
});
} catch (err) {
// Indices will be created when the monitor is created.
if (isIndexNotFoundError(err)) {
return res.ok({
body: { ok: false, resp: {} },
body: {
ok: false,
totalMonitors: 0,
monitors: [],
message: "Config index will be created automatically when the monitor is created"
},
});
} else {
return res.ok({
body: {
ok: false,
err: err.message,
},
});
}
return res.ok({
body: {
ok: false,
err: err.message,
},
});
}
};

Expand Down
188 changes: 188 additions & 0 deletions server/services/DestinationsService.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
import DestinationsService from "./DestinationsService";

describe("Test DestinationsService -- getDestinations", () => {
let destinationsService;
let mockContext;
let mockReq;
let mockRes;
let mockClient;

beforeEach(() => {
mockClient = jest.fn();

mockContext = {};

mockRes = {
ok: jest.fn().mockReturnValue({ body: {} }),
};

destinationsService = new DestinationsService();
destinationsService.getClientBasedOnDataSource = jest.fn().mockReturnValue(mockClient);

});

describe("Test getDestinations", () => {

test("should successfully get destinations list -- name as sort string", async () => {
const mockReq = {
query: {
from: 0,
size: 20,
search: "",
sortDirection: "desc",
sortField: "name",
type: "ALL",
},
};

const mockResponse = {
destinations: [{
id: "1",
name: "Sample Destination",
schema_version: 1,
seq_no: 1,
primary_term: 1,
}],
totalDestinations: 1,
};
mockClient.mockResolvedValueOnce(mockResponse);

await destinationsService.getDestinations(mockContext, mockReq, mockRes);

expect(mockClient).toHaveBeenCalledWith("alerting.searchDestinations", {
sortString: "destination.name.keyword",
sortOrder: "desc",
startIndex: 0,
size: 20,
searchString: "",
destinationType: "ALL",
});
expect(mockRes.ok).toHaveBeenCalledWith({
body: {
ok: true,
destinations: [{
id: "1",
name: "Sample Destination",
schema_version: 1,
seq_no: 1,
primary_term: 1,
version: 1,
ifSeqNo: 1,
ifPrimaryTerm: 1,
}],
totalDestinations: 1,
},
});
});

test("should successfully get destinations list -- type as sort string", async () => {
const mockReq = {
query: {
from: 0,
size: 20,
search: "",
sortDirection: "desc",
sortField: "type",
type: "ALL",
},
};

const mockResponse = {
destinations: [{
id: "1",
name: "Sample Destination",
schema_version: 1,
seq_no: 1,
primary_term: 1,
}],
totalDestinations: 1,
};
mockClient.mockResolvedValueOnce(mockResponse);

await destinationsService.getDestinations(mockContext, mockReq, mockRes);

expect(mockClient).toHaveBeenCalledWith("alerting.searchDestinations", {
sortString: "destination.type",
sortOrder: "desc",
startIndex: 0,
size: 20,
searchString: "",
destinationType: "ALL",
});
expect(mockRes.ok).toHaveBeenCalledWith({
body: {
ok: true,
destinations: [{
id: "1",
name: "Sample Destination",
schema_version: 1,
seq_no: 1,
primary_term: 1,
version: 1,
ifSeqNo: 1,
ifPrimaryTerm: 1,
}],
totalDestinations: 1,
},
});
});

test("should handle index not found error", async () => {
const mockReq = {
query: {
from: 0,
size: 20,
search: "",
sortDirection: "desc",
sortField: "name",
type: "ALL",
},
};
const error = new Error();
error.statusCode = 404;
error.body = {
error: {
reason: 'Configured indices are not found: [.opendistro-alerting-config]'
}
};
mockClient.mockRejectedValueOnce(error);

await destinationsService.getDestinations(mockContext, mockReq, mockRes);

expect(mockRes.ok).toHaveBeenCalledWith({
body: {
ok: false,
totalMonitors: 0,
monitors: [],
message: "Config index will be created automatically when the monitor is created"
},
});
});

test("should handle other errors", async () => {
const mockReq = {
query: {
from: 0,
size: 20,
search: "",
sortDirection: "desc",
sortField: "name",
type: "ALL",
},
};

const error = new Error("Some error");
mockClient.mockRejectedValueOnce(error);

await destinationsService.getDestinations(mockContext, mockReq, mockRes);

expect(mockRes.ok).toHaveBeenCalledWith({
body: {
ok: false,
err: "Some error"
},
});
});

});
});
55 changes: 40 additions & 15 deletions server/services/MonitorService.js
Original file line number Diff line number Diff line change
Expand Up @@ -480,18 +480,28 @@ export default class MonitorService extends MDSEnabledClientService {
},
});
} catch (err) {
console.error('Alerting - MonitorService - getMonitors', err);
if (isIndexNotFoundError(err)) {
// Config index is not created unitl a monitor is created.
return res.ok({
body: { ok: false, resp: { totalMonitors: 0, monitors: [] } },
body: {
ok: false,
resp: {
totalMonitors: 0,
monitors: [],
message: "No monitors created"
}
},
});
} else {
// If the index is created, some error in retrieving the monitors.
console.error('Alerting - MonitorService - getMonitors', err);
return res.ok({
body: {
ok: false,
resp: err.message,
},
});
}
return res.ok({
body: {
ok: false,
resp: err.message,
},
});
}
};

Expand Down Expand Up @@ -593,13 +603,28 @@ export default class MonitorService extends MDSEnabledClientService {
},
});
} catch (err) {
console.error('Alerting - MonitorService - searchMonitor:', err);
return res.ok({
body: {
ok: false,
resp: err.message,
},
});
if (isIndexNotFoundError(err)) {
// Config index is not created unitl a monitor is created.
return res.ok({
body: {
ok: false,
resp: {
totalMonitors: 0,
monitors: [],
message: "No monitors created"
}
},
});
} else {
// If the index is created, some error in retrieving the monitors.
console.error('Alerting - MonitorService - searchMonitor:', err);
return res.ok({
body: {
ok: false,
resp: err.message,
},
});
}
}
};
}

0 comments on commit 1783b64

Please sign in to comment.