@rocketsoftware/eureka-js-client
Version:
A JavaScript implementation the Netflix OSS service registry, Eureka.
233 lines (186 loc) • 8.03 kB
JavaScript
import sinon from 'sinon';
import chai, { expect } from 'chai';
import sinonChai from 'sinon-chai';
import request from 'request';
import AwsMetadata from '../src/AwsMetadata';
chai.use(sinonChai);
describe('AWS Metadata client', () => {
describe('fetchMetadata()', () => {
let client;
beforeEach(() => {
client = new AwsMetadata({ host: '127.0.0.1:8888' });
});
afterEach(() => {
request.get.restore();
});
it('should call metadata URIs', () => {
const requestStub = sinon.stub(request, 'get');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/ami-id',
}).yields(null, { statusCode: 200 }, 'ami-123');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/instance-id',
}).yields(null, { statusCode: 200 }, 'i123');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/instance-type',
}).yields(null, { statusCode: 200 }, 'medium');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/local-ipv4',
}).yields(null, { statusCode: 200 }, '1.1.1.1');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/local-hostname',
}).yields(null, { statusCode: 200 }, 'ip-127-0-0-1');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/placement/availability-zone',
}).yields(null, { statusCode: 200 }, 'fake-1');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/public-hostname',
}).yields(null, { statusCode: 200 }, 'ec2-127-0-0-1');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/public-ipv4',
}).yields(null, { statusCode: 200 }, '2.2.2.2');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/mac',
}).yields(null, { statusCode: 200 }, 'AB:CD:EF:GH:IJ');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/dynamic/instance-identity/document',
}).yields(null, { statusCode: 200 }, '{"accountId":"123456"}');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/network/interfaces/macs/AB:CD:EF:GH:IJ/vpc-id',
}).yields(null, { statusCode: 200 }, 'vpc123');
const fetchCb = sinon.spy();
client.fetchMetadata(fetchCb);
expect(request.get).to.have.been.callCount(11);
expect(fetchCb).to.have.been.calledWithMatch({
accountId: '123456',
'ami-id': 'ami-123',
'availability-zone': 'fake-1',
'instance-id': 'i123',
'instance-type': 'medium',
'local-hostname': 'ip-127-0-0-1',
'local-ipv4': '1.1.1.1',
mac: 'AB:CD:EF:GH:IJ',
'public-hostname': 'ec2-127-0-0-1',
'public-ipv4': '2.2.2.2',
'vpc-id': 'vpc123',
});
});
it('should call metadata URIs and filter out null and undefined values', () => {
const requestStub = sinon.stub(request, 'get');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/ami-id',
}).yields(null, { statusCode: 200 }, 'ami-123');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/instance-id',
}).yields(null, { statusCode: 200 }, 'i123');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/instance-type',
}).yields(null, { statusCode: 200 }, 'medium');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/local-ipv4',
}).yields(null, { statusCode: 200 }, '1.1.1.1');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/local-hostname',
}).yields(null, { statusCode: 200 }, 'ip-127-0-0-1');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/placement/availability-zone',
}).yields(null, { statusCode: 200 }, 'fake-1');
let undef;
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/public-hostname',
}).yields(null, { statusCode: 200 }, undef);
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/public-ipv4',
}).yields(null, { statusCode: 200 }, null);
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/mac',
}).yields(null, { statusCode: 200 }, 'AB:CD:EF:GH:IJ');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/dynamic/instance-identity/document',
}).yields(null, { statusCode: 200 }, '{"accountId":"123456"}');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/network/interfaces/macs/AB:CD:EF:GH:IJ/vpc-id',
}).yields(null, { statusCode: 200 }, 'vpc123');
const fetchCb = sinon.spy();
client.fetchMetadata(fetchCb);
expect(request.get).to.have.been.callCount(11);
expect(fetchCb).to.have.been.calledWithMatch({
accountId: '123456',
'ami-id': 'ami-123',
'availability-zone': 'fake-1',
'instance-id': 'i123',
'instance-type': 'medium',
'local-hostname': 'ip-127-0-0-1',
'local-ipv4': '1.1.1.1',
mac: 'AB:CD:EF:GH:IJ',
'vpc-id': 'vpc123',
});
expect(fetchCb.firstCall.args[0]).to.have.all.keys(['ami-id',
'instance-id',
'instance-type',
'local-ipv4',
'local-hostname',
'availability-zone',
'mac',
'accountId',
'vpc-id']);
});
it('should call metadata URIs and filter out errored values', () => {
const requestStub = sinon.stub(request, 'get');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/ami-id',
}).yields(null, { statusCode: 200 }, 'ami-123');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/instance-id',
}).yields(null, { statusCode: 200 }, 'i123');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/instance-type',
}).yields(null, { statusCode: 200 }, 'medium');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/local-ipv4',
}).yields(null, { statusCode: 200 }, '1.1.1.1');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/local-hostname',
}).yields(null, { statusCode: 200 }, 'ip-127-0-0-1');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/placement/availability-zone',
}).yields(null, { statusCode: 200 }, 'fake-1');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/public-hostname',
}).yields(new Error('fail'));
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/public-ipv4',
}).yields(new Error('fail'));
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/mac',
}).yields(null, { statusCode: 200 }, 'AB:CD:EF:GH:IJ');
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/dynamic/instance-identity/document',
}).yields(new Error('fail'));
requestStub.withArgs({
url: 'http://127.0.0.1:8888/latest/meta-data/network/interfaces/macs/AB:CD:EF:GH:IJ/vpc-id',
}).yields(null, { statusCode: 200 }, 'vpc123');
const fetchCb = sinon.spy();
client.fetchMetadata(fetchCb);
expect(request.get).to.have.been.callCount(11);
expect(fetchCb).to.have.been.calledWithMatch({
'ami-id': 'ami-123',
'availability-zone': 'fake-1',
'instance-id': 'i123',
'instance-type': 'medium',
'local-hostname': 'ip-127-0-0-1',
'local-ipv4': '1.1.1.1',
mac: 'AB:CD:EF:GH:IJ',
'vpc-id': 'vpc123',
});
expect(fetchCb.firstCall.args[0]).to.have.all.keys(['ami-id',
'instance-id',
'instance-type',
'local-ipv4',
'local-hostname',
'availability-zone',
'mac',
'vpc-id']);
});
});
});