abacus-account-stub
Version:
Stub for an account management service.
196 lines (163 loc) • 22 kB
JavaScript
;
// Stub for an account management service.
var _ = require('underscore');
var request = require('abacus-request');
var batch = require('abacus-batch');
var cluster = require('abacus-cluster');
var oauth = require('abacus-cfoauth');
var schemas = require('abacus-usage-schemas');
var extend = _.extend;
var map = _.map;
var brequest = batch(request);
// Mock the cluster module
require.cache[require.resolve('abacus-cluster')].exports = extend(function (app) {
return app;
}, cluster);
// Mock the oauth module with a spy
var oauthspy = spy(function (req, res, next) {
return next();
});
var oauthmock = extend({}, oauth, {
validator: function validator() {
return oauthspy;
}
});
require.cache[require.resolve('abacus-cfoauth')].exports = oauthmock;
var accountManagement = require('..');
describe('abacus-account-stub', function () {
it('returns information about an account', function (done) {
process.env.SECURED = 'false';
oauthspy.reset();
// Create an account management stub application
var app = accountManagement();
// Listen on an ephemeral port
var server = app.listen(0);
// Get an account, expecting our stub test account
var account = {
account_id: '5678',
organizations: ['a3d7fe4d-3cb1-4cc3-a831-ffe98e20cf27', 'b3d7fe4d-3cb1-4cc3-a831-ffe98e20cf28', 'c3d7fe4d-3cb1-4cc3-a831-ffe98e20cf29'],
pricing_country: 'USA'
};
request.get('http://localhost::p/v1/accounts/:account_id', {
p: server.address().port,
account_id: '5678'
}, function (err, val) {
expect(err).to.equal(undefined);
expect(val.statusCode).to.equal(200);
expect(val.body).to.deep.equal(account);
// Check oauth validator spy
expect(oauthspy.callCount).to.equal(0);
done();
});
});
it('returns information about the account containing an org', function (done) {
process.env.SECURED = 'false';
oauthspy.reset();
// Create an account management stub application
var app = accountManagement();
// Listen on an ephemeral port
var server = app.listen(0);
// Get the account containing an org, expecting our stub test account
var account = {
account_id: '1234',
organizations: ['a3d7fe4d-3cb1-4cc3-a831-ffe98e20cf27'],
pricing_country: 'USA'
};
request.get('http://localhost::p/v1/orgs/:org_id/account', {
p: server.address().port,
org_id: 'a3d7fe4d-3cb1-4cc3-a831-ffe98e20cf27'
}, function (err, val) {
expect(err).to.equal(undefined);
expect(val.statusCode).to.equal(200);
expect(val.body).to.deep.equal(account);
// Check oauth validator spy
expect(oauthspy.callCount).to.equal(0);
done();
});
});
it('returns a resource price config', function (done) {
process.env.SECURED = 'false';
oauthspy.reset();
// Create a test account management stub app
var app = accountManagement();
// Listen on an ephemeral port
var server = app.listen(0);
request.get('http://localhost::p/v1/pricing/resources' + '/:resource_id/config/:time', {
p: server.address().port,
resource_id: 'object-storage',
time: 1420070400000
}, function (err, val) {
expect(err).to.equal(undefined);
expect(val.statusCode).to.equal(200);
expect(val.body).to.deep.equal(require('../resources/object-storage'));
// Check oauth validator spy
expect(oauthspy.callCount).to.equal(0);
done();
});
});
it('Run a secured account management stub', function (done) {
process.env.SECURED = 'true';
oauthspy.reset();
// Create an account management stub application
var app = accountManagement();
// Listen on an ephemeral port
var server = app.listen(0);
var cbs = 0;
var done1 = function done1() {
if (++cbs === 3) {
// Check oauth validator spy
expect(oauthspy.callCount).to.equal(4);
done();
}
};
// Get an account, expecting our stub test account
var account = {
account_id: '5678',
organizations: ['a3d7fe4d-3cb1-4cc3-a831-ffe98e20cf27', 'b3d7fe4d-3cb1-4cc3-a831-ffe98e20cf28', 'c3d7fe4d-3cb1-4cc3-a831-ffe98e20cf29'],
pricing_country: 'USA'
};
brequest.get('http://localhost::p/v1/accounts/:account_id', {
p: server.address().port,
account_id: '5678'
}, function (err, val) {
expect(err).to.equal(undefined);
expect(val.statusCode).to.equal(200);
expect(val.body).to.deep.equal(account);
done1();
});
// Get the account containing an org, expecting our stub test account
brequest.get('http://localhost::p/v1/orgs/:org_id/account', {
p: server.address().port,
org_id: 'a3d7fe4d-3cb1-4cc3-a831-ffe98e20cf27'
}, function (err, val) {
expect(err).to.equal(undefined);
expect(val.statusCode).to.equal(200);
expect(val.body).to.deep.equal({
account_id: '1234',
organizations: ['a3d7fe4d-3cb1-4cc3-a831-ffe98e20cf27'],
pricing_country: 'USA'
});
done1();
});
// Get Pricing config for a resource
brequest.get('http://localhost::p/v1/pricing/resources' + '/:resource_id/config/:time', {
p: server.address().port,
resource_id: 'object-storage',
time: 1420070400000
}, function (err, val) {
expect(err).to.equal(undefined);
expect(val.statusCode).to.equal(200);
expect(val.body).to.deep.equal(require('../resources/object-storage'));
done1();
});
});
it('validates sample price configurations', function () {
map(['object-storage', 'linux-container'], function (name) {
console.log(' validating', name, ' pricing');
var conf = require('../resources/' + name);
expect(schemas.priceConfig.validate(conf)).to.deep.equal(conf);
console.log(' validated', name, ' pricing');
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L3Rlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7O0FBSWIsSUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2hDLElBQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzFDLElBQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN0QyxJQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUMxQyxJQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUN4QyxJQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQzs7QUFFaEQsSUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUN4QixJQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDOztBQUVsQixJQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7OztBQUdoQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FDdEQsTUFBTSxDQUFDLFVBQUMsR0FBRztTQUFLLEdBQUc7Q0FBQSxFQUFFLE9BQU8sQ0FBQyxDQUFDOzs7QUFHaEMsSUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLFVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJO1NBQUssSUFBSSxFQUFFO0NBQUEsQ0FBQyxDQUFDO0FBQ2pELElBQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFO0FBQ2xDLFdBQVMsRUFBRTtXQUFNLFFBQVE7R0FBQTtDQUMxQixDQUFDLENBQUM7QUFDSCxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE9B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QUMsdUNBQXVDLEVBQUUsWUFBTTtBQUNoRCxPQUFHLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLFVBQUMsSUFBSSxFQUFLO0FBQ25ELGFBQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2hELFVBQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDN0MsWUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0QsYUFBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7S0FDcEQsQ0FBQyxDQUFDO0dBQ0osQ0FBQyxDQUFDO0NBQ0osQ0FBQyxDQUFDIiwiZmlsZSI6InRlc3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIFN0dWIgZm9yIGFuIGFjY291bnQgbWFuYWdlbWVudCBzZXJ2aWNlLlxuXG5jb25zdCBfID0gcmVxdWlyZSgndW5kZXJzY29yZScpO1xuY29uc3QgcmVxdWVzdCA9IHJlcXVpcmUoJ2FiYWN1cy1yZXF1ZXN0Jyk7XG5jb25zdCBiYXRjaCA9IHJlcXVpcmUoJ2FiYWN1cy1iYXRjaCcpO1xuY29uc3QgY2x1c3RlciA9IHJlcXVpcmUoJ2FiYWN1cy1jbHVzdGVyJyk7XG5jb25zdCBvYXV0aCA9IHJlcXVpcmUoJ2FiYWN1cy1jZm9hdXRoJyk7XG5jb25zdCBzY2hlbWFzID0gcmVxdWlyZSgnYWJhY3VzLXVzYWdlLXNjaGVtYXMnKTtcblxuY29uc3QgZXh0ZW5kID0gXy5leHRlbmQ7XG5jb25zdCBtYXAgPSBfLm1hcDtcblxuY29uc3QgYnJlcXVlc3QgPSBiYXRjaChyZXF1ZXN0KTtcblxuLy8gTW9jayB0aGUgY2x1c3RlciBtb2R1bGVcbnJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKCdhYmFjdXMtY2x1c3RlcicpXS5leHBvcnRzID1cbiAgZXh0ZW5kKChhcHApID0+IGFwcCwgY2x1c3Rlcik7XG5cbi8vIE1vY2sgdGhlIG9hdXRoIG1vZHVsZSB3aXRoIGEgc3B5XG5jb25zdCBvYXV0aHNweSA9IHNweSgocmVxLCByZXMsIG5leHQpID0+IG5leHQoKSk7XG5jb25zdCBvYXV0aG1vY2sgPSBleHRlbmQoe30sIG9hdXRoLCB7XG4gIHZhbGlkYXRvcjogKCkgPT4gb2F1dGhzcHlcbn0pO1xucmVxdWlyZS5jYWNoZVtyZXF1aXJlLnJlc29sdmUoJ2FiYWN1cy1jZm9hdXRoJyldLmV4cG9ydHMgPSBvYXV0aG1vY2s7XG5cbmNvbnN0IGFjY291bnRNYW5hZ2VtZW50ID0gcmVxdWlyZSgnLi4nKTtcblxuZGVzY3JpYmUoJ2FiYWN1cy1hY2NvdW50LXN0dWInLCAoKSA9PiB7XG4gIGl0KCdyZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnQnLCAoZG9uZSkgPT4ge1xuICAgIHByb2Nlc3MuZW52LlNFQ1VSRUQgPSAnZmFsc2UnO1xuICAgIG9hdXRoc3B5LnJlc2V0KCk7XG5cbiAgICAvLyBDcmVhdGUgYW4gYWNjb3VudCBtYW5hZ2VtZW50IHN0dWIgYXBwbGljYXRpb25cbiAgICBjb25zdCBhcHAgPSBhY2NvdW50TWFuYWdlbWVudCgpO1xuXG4gICAgLy8gTGlzdGVuIG9uIGFuIGVwaGVtZXJhbCBwb3J0XG4gICAgY29uc3Qgc2VydmVyID0gYXBwLmxpc3RlbigwKTtcblxuICAgIC8vIEdldCBhbiBhY2NvdW50LCBleHBlY3Rpbmcgb3VyIHN0dWIgdGVzdCBhY2NvdW50XG4gICAgY29uc3QgYWNjb3VudCA9IHtcbiAgICAgIGFjY291bnRfaWQ6ICc1Njc4JyxcbiAgICAgIG9yZ2FuaXphdGlvbnM6IFtcbiAgICAgICAgJ2EzZDdmZTRkLTNjYjEtNGNjMy1hODMxLWZmZTk4ZTIwY2YyNycsXG4gICAgICAgICdiM2Q3ZmU0ZC0zY2IxLTRjYzMtYTgzMS1mZmU5OGUyMGNmMjgnLFxuICAgICAgICAnYzNkN2ZlNGQtM2NiMS00Y2MzLWE4MzEtZmZlOThlMjBjZjI5J10sXG4gICAgICBwcmljaW5nX2NvdW50cnk6ICdVU0EnXG4gICAgfTtcbiAgICByZXF1ZXN0LmdldCgnaHR0cDovL2xvY2FsaG9zdDo6cC92MS9hY2NvdW50cy86YWNjb3VudF9pZCcsIHtcbiAgICAgIHA6IHNlcnZlci5hZGRyZXNzKCkucG9ydCxcbiAgICAgIGFjY291bnRfaWQ6ICc1Njc4J1xuICAgIH0sIChlcnIsIHZhbCkgPT4ge1xuICAgICAgZXhwZWN0KGVycikudG8uZXF1YWwodW5kZWZpbmVkKTtcbiAgICAgIGV4cGVjdCh2YWwuc3RhdHVzQ29kZSkudG8uZXF1YWwoMjAwKTtcbiAgICAgIGV4cGVjdCh2YWwuYm9keSkudG8uZGVlcC5lcXVhbChhY2NvdW50KTtcblxuICAgICAgLy8gQ2hlY2sgb2F1dGggdmFsaWRhdG9yIHNweVxuICAgICAgZXhwZWN0KG9hdXRoc3B5LmNhbGxDb3VudCkudG8uZXF1YWwoMCk7XG5cbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjY291bnQgY29udGFpbmluZyBhbiBvcmcnLCAoZG9uZSkgPT4ge1xuICAgIHByb2Nlc3MuZW52LlNFQ1VSRUQgPSAnZmFsc2UnO1xuICAgIG9hdXRoc3B5LnJlc2V0KCk7XG5cbiAgICAvLyBDcmVhdGUgYW4gYWNjb3VudCBtYW5hZ2VtZW50IHN0dWIgYXBwbGljYXRpb25cbiAgICBjb25zdCBhcHAgPSBhY2NvdW50TWFuYWdlbWVudCgpO1xuXG4gICAgLy8gTGlzdGVuIG9uIGFuIGVwaGVtZXJhbCBwb3J0XG4gICAgY29uc3Qgc2VydmVyID0gYXBwLmxpc3RlbigwKTtcblxuICAgIC8vIEdldCB0aGUgYWNjb3VudCBjb250YWluaW5nIGFuIG9yZywgZXhwZWN0aW5nIG91ciBzdHViIHRlc3QgYWNjb3VudFxuICAgIGNvbnN0IGFjY291bnQgPSB7XG4gICAgICBhY2NvdW50X2lkOiAnMTIzNCcsXG4gICAgICBvcmdhbml6YXRpb25zOiBbJ2EzZDdmZTRkLTNjYjEtNGNjMy1hODMxLWZmZTk4ZTIwY2YyNyddLFxuICAgICAgcHJpY2luZ19jb3VudHJ5OiAnVVNBJ1xuICAgIH07XG4gICAgcmVxdWVzdC5nZXQoJ2h0dHA6Ly9sb2NhbGhvc3Q6OnAvdjEvb3Jncy86b3JnX2lkL2FjY291bnQnLCB7XG4gICAgICBwOiBzZXJ2ZXIuYWRkcmVzcygpLnBvcnQsXG4gICAgICBvcmdfaWQ6ICdhM2Q3ZmU0ZC0zY2IxLTRjYzMtYTgzMS1mZmU5OGUyMGNmMjcnXG4gICAgfSwgKGVyciwgdmFsKSA9PiB7XG4gICAgICBleHBlY3QoZXJyKS50by5lcXVhbCh1bmRlZmluZWQpO1xuICAgICAgZXhwZWN0KHZhbC5zdGF0dXNDb2RlKS50by5lcXVhbCgyMDApO1xuICAgICAgZXhwZWN0KHZhbC5ib2R5KS50by5kZWVwLmVxdWFsKGFjY291bnQpO1xuXG4gICAgICAvLyBDaGVjayBvYXV0aCB2YWxpZGF0b3Igc3B5XG4gICAgICBleHBlY3Qob2F1dGhzcHkuY2FsbENvdW50KS50by5lcXVhbCgwKTtcblxuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgncmV0dXJucyBhIHJlc291cmNlIHByaWNlIGNvbmZpZycsIChkb25lKSA9PiB7XG4gICAgcHJvY2Vzcy5lbnYuU0VDVVJFRCA9ICdmYWxzZSc7XG4gICAgb2F1dGhzcHkucmVzZXQoKTtcblxuICAgIC8vIENyZWF0ZSBhIHRlc3QgYWNjb3VudCBtYW5hZ2VtZW50IHN0dWIgYXBwXG4gICAgY29uc3QgYXBwID0gYWNjb3VudE1hbmFnZW1lbnQoKTtcblxuICAgIC8vIExpc3RlbiBvbiBhbiBlcGhlbWVyYWwgcG9ydFxuICAgIGNvbnN0IHNlcnZlciA9IGFwcC5saXN0ZW4oMCk7XG5cbiAgICByZXF1ZXN0LmdldChcbiAgICAgICdodHRwOi8vbG9jYWxob3N0OjpwL3YxL3ByaWNpbmcvcmVzb3VyY2VzJyArXG4gICAgICAnLzpyZXNvdXJjZV9pZC9jb25maWcvOnRpbWUnLCB7XG4gICAgICAgIHA6IHNlcnZlci5hZGRyZXNzKCkucG9ydCxcbiAgICAgICAgcmVzb3VyY2VfaWQ6ICdvYmplY3Qtc3RvcmFnZScsXG4gICAgICAgIHRpbWU6IDE0MjAwNzA0MDAwMDBcbiAgICAgIH0sIChlcnIsIHZhbCkgPT4ge1xuICAgICAgICBleHBlY3QoZXJyKS50by5lcXVhbCh1bmRlZmluZWQpO1xuICAgICAgICBleHBlY3QodmFsLnN0YXR1c0NvZGUpLnRvLmVxdWFsKDIwMCk7XG4gICAgICAgIGV4cGVjdCh2YWwuYm9keSkudG8uZGVlcC5lcXVhbChcbiAgICAgICAgICByZXF1aXJlKCcuLi9yZXNvdXJjZXMvb2JqZWN0LXN0b3JhZ2UnKSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgb2F1dGggdmFsaWRhdG9yIHNweVxuICAgICAgICBleHBlY3Qob2F1dGhzcHkuY2FsbENvdW50KS50by5lcXVhbCgwKTtcblxuICAgICAgICBkb25lKCk7XG4gICAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ1J1biBhIHNlY3VyZWQgYWNjb3VudCBtYW5hZ2VtZW50IHN0dWInLCAoZG9uZSkgPT4ge1xuICAgIHByb2Nlc3MuZW52LlNFQ1VSRUQgPSAndHJ1ZSc7XG4gICAgb2F1dGhzcHkucmVzZXQoKTtcblxuICAgIC8vIENyZWF0ZSBhbiBhY2NvdW50IG1hbmFnZW1lbnQgc3R1YiBhcHBsaWNhdGlvblxuICAgIGNvbnN0IGFwcCA9IGFjY291bnRNYW5hZ2VtZW50KCk7XG5cbiAgICAvLyBMaXN0ZW4gb24gYW4gZXBoZW1lcmFsIHBvcnRcbiAgICBjb25zdCBzZXJ2ZXIgPSBhcHAubGlzdGVuKDApO1xuXG4gICAgbGV0IGNicyA9IDA7XG4gICAgY29uc3QgZG9uZTEgPSAoKSA9PiB7XG4gICAgICBpZigrK2NicyA9PT0gMykge1xuICAgICAgICAvLyBDaGVjayBvYXV0aCB2YWxpZGF0b3Igc3B5XG4gICAgICAgIGV4cGVjdChvYXV0aHNweS5jYWxsQ291bnQpLnRvLmVxdWFsKDQpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IGFuIGFjY291bnQsIGV4cGVjdGluZyBvdXIgc3R1YiB0ZXN0IGFjY291bnRcbiAgICBjb25zdCBhY2NvdW50ID0ge1xuICAgICAgYWNjb3VudF9pZDogJzU2NzgnLFxuICAgICAgb3JnYW5pemF0aW9uczogW1xuICAgICAgICAnYTNkN2ZlNGQtM2NiMS00Y2MzLWE4MzEtZmZlOThlMjBjZjI3JyxcbiAgICAgICAgJ2IzZDdmZTRkLTNjYjEtNGNjMy1hODMxLWZmZTk4ZTIwY2YyOCcsXG4gICAgICAgICdjM2Q3ZmU0ZC0zY2IxLTRjYzMtYTgzMS1mZmU5OGUyMGNmMjknXSxcbiAgICAgIHByaWNpbmdfY291bnRyeTogJ1VTQSdcbiAgICB9O1xuICAgIGJyZXF1ZXN0LmdldCgnaHR0cDovL2xvY2FsaG9zdDo6cC92MS9hY2NvdW50cy86YWNjb3VudF9pZCcsIHtcbiAgICAgIHA6IHNlcnZlci5hZGRyZXNzKCkucG9ydCxcbiAgICAgIGFjY291bnRfaWQ6ICc1Njc4J1xuICAgIH0sIChlcnIsIHZhbCkgPT4ge1xuICAgICAgZXhwZWN0KGVycikudG8uZXF1YWwodW5kZWZpbmVkKTtcbiAgICAgIGV4cGVjdCh2YWwuc3RhdHVzQ29kZSkudG8uZXF1YWwoMjAwKTtcbiAgICAgIGV4cGVjdCh2YWwuYm9keSkudG8uZGVlcC5lcXVhbChhY2NvdW50KTtcbiAgICAgIGRvbmUxKCk7XG4gICAgfSk7XG5cbiAgICAvLyBHZXQgdGhlIGFjY291bnQgY29udGFpbmluZyBhbiBvcmcsIGV4cGVjdGluZyBvdXIgc3R1YiB0ZXN0IGFjY291bnRcbiAgICBicmVxdWVzdC5nZXQoJ2h0dHA6Ly9sb2NhbGhvc3Q6OnAvdjEvb3Jncy86b3JnX2lkL2FjY291bnQnLCB7XG4gICAgICBwOiBzZXJ2ZXIuYWRkcmVzcygpLnBvcnQsXG4gICAgICBvcmdfaWQ6ICdhM2Q3ZmU0ZC0zY2IxLTRjYzMtYTgzMS1mZmU5OGUyMGNmMjcnXG4gICAgfSwgKGVyciwgdmFsKSA9PiB7XG4gICAgICBleHBlY3QoZXJyKS50by5lcXVhbCh1bmRlZmluZWQpO1xuICAgICAgZXhwZWN0KHZhbC5zdGF0dXNDb2RlKS50by5lcXVhbCgyMDApO1xuICAgICAgZXhwZWN0KHZhbC5ib2R5KS50by5kZWVwLmVxdWFsKHtcbiAgICAgICAgYWNjb3VudF9pZDogJzEyMzQnLFxuICAgICAgICBvcmdhbml6YXRpb25zOiBbJ2EzZDdmZTRkLTNjYjEtNGNjMy1hODMxLWZmZTk4ZTIwY2YyNyddLFxuICAgICAgICBwcmljaW5nX2NvdW50cnk6ICdVU0EnXG4gICAgICB9KTtcbiAgICAgIGRvbmUxKCk7XG4gICAgfSk7XG5cbiAgICAvLyBHZXQgUHJpY2luZyBjb25maWcgZm9yIGEgcmVzb3VyY2VcbiAgICBicmVxdWVzdC5nZXQoXG4gICAgICAnaHR0cDovL2xvY2FsaG9zdDo6cC92MS9wcmljaW5nL3Jlc291cmNlcycgK1xuICAgICAgJy86cmVzb3VyY2VfaWQvY29uZmlnLzp0aW1lJywge1xuICAgICAgICBwOiBzZXJ2ZXIuYWRkcmVzcygpLnBvcnQsXG4gICAgICAgIHJlc291cmNlX2lkOiAnb2JqZWN0LXN0b3JhZ2UnLFxuICAgICAgICB0aW1lOiAxNDIwMDcwNDAwMDAwXG4gICAgICB9LCAoZXJyLCB2YWwpID0+IHtcbiAgICAgICAgZXhwZWN0KGVycikudG8uZXF1YWwodW5kZWZpbmVkKTtcbiAgICAgICAgZXhwZWN0KHZhbC5zdGF0dXNDb2RlKS50by5lcXVhbCgyMDApO1xuICAgICAgICBleHBlY3QodmFsLmJvZHkpLnRvLmRlZXAuZXF1YWwoXG4gICAgICAgICAgcmVxdWlyZSgnLi4vcmVzb3VyY2VzL29iamVjdC1zdG9yYWdlJykpO1xuICAgICAgICBkb25lMSgpO1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIGl0KCd2YWxpZGF0ZXMgc2FtcGxlIHByaWNlIGNvbmZpZ3VyYXRpb25zJywgKCkgPT4ge1xuICAgIG1hcChbJ29iamVjdC1zdG9yYWdlJywgJ2xpbnV4LWNvbnRhaW5lciddLCAobmFtZSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJyAgICB2YWxpZGF0aW5nJywgbmFtZSwgJyBwcmljaW5nJyk7XG4gICAgICBjb25zdCBjb25mID0gcmVxdWlyZSgnLi4vcmVzb3VyY2VzLycgKyBuYW1lKTtcbiAgICAgIGV4cGVjdChzY2hlbWFzLnByaWNlQ29uZmlnLnZhbGlkYXRlKGNvbmYpKS50by5kZWVwLmVxdWFsKGNvbmYpO1xuICAgICAgY29uc29sZS5sb2coJyAgICAgICAgdmFsaWRhdGVkJywgbmFtZSwgJyBwcmljaW5nJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=