blob: 4ca3491d2a34a91486c9b6d40c7fe1232ccad245 [file] [log] [blame] [raw]
// Copyright (c) 2017, Matt Godbolt
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
const chai = require('chai'),
chaiAsPromised = require('chai-as-promised'),
aws = require('../lib/aws'),
AWS = require('aws-sdk-mock');
chai.use(chaiAsPromised);
chai.should();
const instanceA = {
State: {Name: 'running'},
Id: 'A',
Tags: [
{Key: 'Name', Value: 'Alice'},
{Key: 'Moose', Value: 'Bob'},
],
};
const instanceB = {
State: {Name: 'sleeping'},
Id: 'B',
Tags: [
{Key: 'Name', Value: 'Alice'},
{Key: 'Moose', Value: 'Bob'},
],
};
const instanceC = {
State: {Name: 'running'},
Id: 'C',
Tags: [
{Key: 'Name', Value: 'Bob'},
{Key: 'Moose', Value: 'Bob'},
],
};
const instanceD = {
State: {Name: 'running'},
Id: 'D',
Tags: [
{Key: 'Name', Value: 'Alice'},
{Key: 'Moose', Value: 'Bob'},
],
};
function setup() {
beforeEach(() => {
AWS.mock('EC2', 'describeInstances', {
Reservations: [
{
Instances: [
instanceA,
instanceB,
instanceC,
instanceD,
],
},
],
});
AWS.mock('SSM', 'getParametersByPath', {
Parameters: [
{
Name: '/compiler-explorer/configValue',
Value: 'fromAws',
},
{
Name: '/compiler-explorer/onlyOnAws',
Value: 'bibble',
},
],
});
});
afterEach(() => AWS.restore());
}
describe('AWS instance fetcher tests', () => {
setup();
it('Fetches Bob', () => {
const fakeProps = {
region: 'not-a-region',
tagKey: 'Name',
tagValue: 'Bob',
};
const fetcher = new aws.InstanceFetcher(prop => fakeProps[prop]);
return fetcher.getInstances().should.eventually.deep.equal([instanceC]);
});
it('Ignores sleeping nodes', () => {
const fakeProps = {
region: 'not-a-region',
tagKey: 'Name',
tagValue: 'Alice',
};
const fetcher = new aws.InstanceFetcher(prop => fakeProps[prop]);
return fetcher.getInstances().should.eventually.deep.equal([instanceA, instanceD]);
});
});
describe('AWS config tests', () => {
setup();
it('Doesn\'t fetch unless region is configured', () => {
const fakeProps = {
region: '',
configValue: 'fromConfigFile',
};
return aws.initConfig(prop => fakeProps[prop])
.then(() => {
aws.getConfig('configValue').should.equal('fromConfigFile');
});
});
it('Gets results from SSM, falling back to config if needed', () => {
const fakeProps = {
region: 'a non-empty region',
configValue: 'fromConfigFile',
notInAmazon: 'yay',
};
return aws.initConfig(prop => fakeProps[prop])
.then(() => {
aws.getConfig('configValue').should.equal('fromAws');
aws.getConfig('onlyOnAws').should.equal('bibble');
aws.getConfig('notInAmazon').should.equal('yay');
});
});
});