splunk-sdk
Version:
SDK for usage with the Splunk REST API
282 lines (264 loc) • 14.7 kB
JavaScript
var assert = require('chai').assert;
var splunkjs = require('../../index');
var utils = splunkjs.Utils;
var idCounter = 0;
var getNextId = function () {
return "id" + (idCounter++) + "_" + ((new Date()).valueOf());
};
exports.setup = function (svc, loggedOutSvc) {
return (
describe("Fired alerts tests", () => {
beforeEach(function () {
this.service = svc;
this.loggedOutService = loggedOutSvc;
});
it("create, verify emptiness and delete new alert group", async function () {
let searches = this.service.savedSearches({ owner: this.service.username });
let name = "jssdk_savedsearch_alert_" + getNextId();
let searchConfig = {
"name": name,
"search": "index=_internal | head 1",
"alert_type": "always",
"alert.severity": "2",
"alert.suppress": "0",
"alert.track": "1",
"dispatch.earliest_time": "-1h",
"dispatch.latest_time": "now",
"is_scheduled": "1",
"cron_schedule": "* * * * *"
};
let search = await searches.create(searchConfig);
assert.ok(search);
assert.strictEqual(search.alertCount(), 0);
[jobs, search] = await search.history();
assert.strictEqual(jobs.length, 0);
assert.strictEqual(search.firedAlertGroup().count(), 0);
let firedAlertGroups = await searches.service.firedAlertGroups().fetch();
let originalSearch = search;
assert.strictEqual(firedAlertGroups.list().indexOf(originalSearch.name), -1);
await originalSearch.remove();
});
// This test is not stable, commenting it out until we figure it out
// it("Callback#alert is triggered + test firedAlert entity -- FAILS INTERMITTENTLY", function(done) {
// var searches = this.service.savedSearches({owner: this.service.username});
// var indexName = "sdk-tests-alerts";
// var name = "jssdk_savedsearch_alert_" + getNextId();
// // Real-time search config
// var searchConfig = {
// "name": name,
// "search": "index="+indexName+" sourcetype=sdk-tests-alerts | head 1",
// "alert_type": "always",
// "alert.severity": "2",
// "alert.suppress": "0",
// "alert.track": "1",
// "dispatch.earliest_time": "rt-1s",
// "dispatch.latest_time": "rt",
// "is_scheduled": "1",
// "cron_schedule": "* * * * *"
// };
// Async.chain([
// function(done) {
// searches.create(searchConfig, done);
// },
// function(search, done) {
// assert.ok(search);
// assert.strictEqual(search.alertCount(), 0);
// assert.strictEqual(search.firedAlertGroup().count(), 0);
// var indexes = search.service.indexes();
// indexes.create(indexName, {}, function(err, index) {
// if (err && err.status !== 409) {
// done(new Error("Index creation failed for an unknown reason"));
// }
// done(null, search);
// });
// },
// function(originalSearch, done) {
// var indexes = originalSearch.service.indexes();
// indexes.fetch(function(err, indexes) {
// if (err) {
// done(err);
// }
// else {
// var index = indexes.item(indexName);
// assert.ok(index);
// index.enable(Async.augment(done, originalSearch));
// }
// });
// },
// function(index, originalSearch, done) {
// //Is the index enabled?
// assert.ok(!index.properties().disabled);
// //refresh the index
// index.fetch(Async.augment(done, originalSearch));
// },
// function(index, originalSearch, done) {
// //Store the current event count for a later comparison
// var eventCount = index.properties().totalEventCount;
// assert.strictEqual(index.properties().sync, 0);
// assert.ok(!index.properties().disabled);
// index.fetch(Async.augment(done, originalSearch, eventCount));
// },
// function(index, originalSearch, eventCount, done) {
// // submit an event
// index.submitEvent(
// "JS SDK: testing alerts",
// {
// sourcetype: "sdk-tests-alerts"
// },
// Async.augment(done, originalSearch, eventCount)
// );
// },
// function(result, index, originalSearch, eventCount, done) {
// Async.sleep(1000, function(){
// //refresh the search
// index.fetch(Async.augment(done, originalSearch, eventCount));
// });
// },
// function(index, originalSearch, eventCount, done) {
// // Did the event get submitted
// assert.strictEqual(index.properties().totalEventCount, eventCount+1);
// // Refresh the search
// originalSearch.fetch(Async.augment(done, index));
// },
// function(originalSearch, index, done) {
// splunkjs.Logger.log("\tAlert count pre-fetch", originalSearch.alertCount());
// var attemptNum = 1;
// var maxAttempts = 20;
// Async.whilst(
// function() {
// // When this returns false, it hits the final function in the chain
// splunkjs.Logger.log("\tFetch attempt", attemptNum, "of", maxAttempts, "alertCount", originalSearch.alertCount());
// if (originalSearch.alertCount() !== 0) {
// return false;
// }
// else {
// attemptNum++;
// return attemptNum < maxAttempts;
// }
// },
// function(callback) {
// Async.sleep(500, function() {
// originalSearch.fetch(callback);
// });
// },
// function(err) {
// splunkjs.Logger.log("Attempted fetching", attemptNum, "of", maxAttempts, "result is", originalSearch.alertCount() !== 0);
// originalSearch.fetch(Async.augment(done, index));
// }
// );
// },
// function(originalSearch, index, done) {
// splunkjs.Logger.log("about to fetch");
// splunkjs.Logger.log("SavedSearch name was: " + originalSearch.name);
// svc.firedAlertGroups({username: svc.username}).fetch(Async.augment(done, index, originalSearch));
// },
// function(firedAlertGroups, index, originalSearch, done) {
// Async.seriesEach(
// firedAlertGroups.list(),
// function(firedAlertGroup, innerIndex, seriescallback) {
// Async.chain([
// function(insideChainCallback) {
// firedAlertGroup.list(insideChainCallback);
// },
// function(firedAlerts, firedAlertGroup, insideChainCallback) {
// for(var i = 0; i < firedAlerts.length; i++) {
// var firedAlert = firedAlerts[i];
// firedAlert.actions();
// firedAlert.alertType();
// firedAlert.isDigestMode();
// firedAlert.expirationTime();
// firedAlert.savedSearchName();
// firedAlert.severity();
// firedAlert.sid();
// firedAlert.triggerTime();
// firedAlert.triggerTimeRendered();
// firedAlert.triggeredAlertCount();
// }
// insideChainCallback(null);
// }
// ],
// function(err) {
// if (err) {
// seriescallback(err);
// }
// seriescallback(null);
// }
// );
// },
// function(err) {
// if (err) {
// done(err, originalSearch, index);
// }
// done(null, originalSearch, index);
// }
// );
// },
// function(originalSearch, index, done) {
// // Make sure the event count has incremented, as expected
// assert.strictEqual(originalSearch.alertCount(), 1);
// // Remove the search, especially because it's a real-time search
// originalSearch.remove(Async.augment(done, index));
// },
// function(index, done) {
// Async.sleep(500, function() {
// index.remove(done);
// });
// }
// ],
// function(err) {
// assert.ok(!err);
// done();
// }
// );
// });
it("Delete all alerts", async function () {
let namePrefix = "jssdk_savedsearch_alert_";
let alertList = this.service.savedSearches().list();
let err = await utils.parallelEach(
alertList,
async function (alert, idx) {
if (utils.startsWith(alert.name, namePrefix)) {
splunkjs.Logger.log("ALERT ---", alert.name);
await alert.remove();
}
}
);
assert.ok(!err);
})
})
)
};
if (module.id === __filename && module.parent.id.includes('mocha')) {
var splunkjs = require('../../index');
var options = require('../cmdline');
let cmdline = options.create().parse(process.argv);
// If there is no command line, we should return
if (!cmdline) {
throw new Error("Error in parsing command line parameters");
}
let svc = new splunkjs.Service({
scheme: cmdline.opts.scheme,
host: cmdline.opts.host,
port: cmdline.opts.port,
username: cmdline.opts.username,
password: cmdline.opts.password,
version: cmdline.opts.version
});
let loggedOutSvc = new splunkjs.Service({
scheme: cmdline.opts.scheme,
host: cmdline.opts.host,
port: cmdline.opts.port,
username: cmdline.opts.username,
password: cmdline.opts.password + 'wrong',
version: cmdline.opts.version
});
// Exports tests on a successful login
module.exports = new Promise(async (resolve, reject) => {
try {
await svc.login();
return resolve(exports.setup(svc, loggedOutSvc))
} catch (error) {
throw new Error("Login failed - not running tests", error || "");
}
});
}