Skip to content

Commit 83286ac

Browse files
make collector update endpoints on registration
1 parent 9289548 commit 83286ac

File tree

6 files changed

+123
-19
lines changed

6 files changed

+123
-19
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
sudo: false
22
language: node_js
33
node_js:
4-
- "6"
4+
- "8"
55
install:
66
- make deps
77
script:

al_aws.js

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,27 @@ var arnToAccId = function (arn) {
150150

151151
var setEnv = function(vars, callback) {
152152
const lambda = new AWS.Lambda();
153-
var params = {
154-
FunctionName : process.env.AWS_LAMBDA_FUNCTION_NAME,
155-
Environment : {
156-
Variables : vars
157-
}
153+
154+
const getConfigParams = {
155+
FunctionName: process.env.AWS_LAMBDA_FUNCTION_NAME
158156
};
159-
return lambda.updateFunctionConfiguration(params, callback);
157+
158+
lambda.getFunctionConfiguration(getConfigParams, (err, config) => {
159+
if(err){
160+
console.error('Error getting function config, environment variables were not updated', err);
161+
return callback(err);
162+
}
163+
var params = {
164+
FunctionName: process.env.AWS_LAMBDA_FUNCTION_NAME,
165+
Environment : {
166+
Variables : {
167+
...config.Environment.Variables,
168+
...vars
169+
}
170+
}
171+
};
172+
return lambda.updateFunctionConfiguration(params, callback);
173+
});
160174
};
161175

162176
module.exports = {

al_aws_collector.js

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,13 +145,55 @@ class AlAwsCollector {
145145
const context = this._invokeContext;
146146
const regValues = Object.assign(this._getAttrs(), custom);
147147

148-
this._azcollectc.register(regValues)
149-
.then(resp => {
148+
async.waterfall([
149+
(asyncCallback) => {
150+
const {
151+
azcollect_api,
152+
ingest_api
153+
} = process.env;
154+
155+
if(!azcollect_api || !ingest_api){
156+
// handling errors like this because the other unit tests seem to indicat that the collectorshould
157+
// register even if there is an error in getting the endpoints.
158+
this.updateEndpoints((err, newConfig) => {
159+
if(err){
160+
console.warn('Error updating endpoints', err);
161+
} else {
162+
// reassign env vars because the config change occurs in the same run in registration.
163+
const {
164+
Environment: {
165+
Variables
166+
}
167+
} = newConfig;
168+
169+
Object.assign(process.env, Variables);
170+
this._azcollectc = new m_alCollector.AzcollectC(process.env.azollect_api, this._aimsc, this._collectorType);
171+
this._ingestc = new m_alCollector.IngestC(process.env.ingest_api, this._aimsc, 'lambda_function');
172+
}
173+
174+
asyncCallback(null);
175+
});
176+
} else{
177+
asyncCallback(null);
178+
}
179+
},
180+
(asyncCallback) => {
181+
this._azcollectc.register(regValues)
182+
.then(resp => {
183+
asyncCallback(null);
184+
})
185+
.catch(exception => {
186+
asyncCallback("registration error: " + exception);
187+
});
188+
}
189+
],
190+
(err)=> {
191+
if(err){
192+
return response.send(event, context, response.FAILED, {Error: err});
193+
} else {
150194
return response.send(event, context, response.SUCCESS);
151-
})
152-
.catch(exception => {
153-
return response.send(event, context, response.FAILED, {Error: exception});
154-
});
195+
}
196+
});
155197
}
156198

157199
checkin(callback) {

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@alertlogic/al-aws-collector-js",
3-
"version": "1.1.3",
3+
"version": "1.2.0",
44
"license": "MIT",
55
"description": "Alert Logic AWS Collector Common Library",
66
"repository": {

test/al_aws_collector_test.js

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const m_response = require('cfn-response');
55
const deepEqual = require('deep-equal');
66

77
const AlAwsCollector = require('../al_aws_collector');
8+
const m_al_aws = require('../al_aws');
89
var m_alCollector = require('@alertlogic/al-collector-js');
910
const m_healthChecks = require('../health_checks');
1011
var AWS = require('aws-sdk-mock');
@@ -17,6 +18,7 @@ const context = {
1718

1819
var alserviceStub = {};
1920
var responseStub = {};
21+
var setEnvStub = {};
2022

2123
function setAlServiceStub() {
2224
alserviceStub.get = sinon.stub(m_alCollector.AlServiceC.prototype, 'get').callsFake(
@@ -116,6 +118,23 @@ function mockLambdaEndpointsUpdateConfiguration() {
116118
});
117119
}
118120

121+
function mockSetEnvStub() {
122+
setEnvStub = sinon.stub(m_al_aws, 'setEnv').callsFake((vars, callback)=>{
123+
const {
124+
ingest_api,
125+
azcollect_api
126+
} = vars;
127+
process.env.ingest_api = ingest_api ? ingest_api : process.env.ingest_api;
128+
process.env.azollect_api = azcollect_api ? azcollect_api : process.env.azollect_api;
129+
const returnBody = {
130+
Environment: {
131+
Varaibles: vars
132+
}
133+
};
134+
return callback(null, returnBody);
135+
});
136+
}
137+
119138
function mockLambdaMetricStatistics() {
120139
AWS.mock('CloudWatch', 'getMetricStatistics', function (params, callback) {
121140
var ret = colMock.CLOUDWATCH_GET_METRIC_STATS_OK;
@@ -144,18 +163,41 @@ describe('al_aws_collector tests', function() {
144163
});
145164

146165
setAlServiceStub();
166+
mockSetEnvStub();
147167
});
148168

149169
afterEach(function(){
150170
restoreAlServiceStub();
171+
setEnvStub.restore();
151172
responseStub.restore();
152173
});
153174

154-
it('register success', function(done) {
175+
it('register success with env vars set', function(done) {
176+
var mockContext = {
177+
invokedFunctionArn : colMock.FUNCTION_ARN,
178+
succeed : () => {
179+
sinon.assert.calledWith(alserviceStub.post, colMock.REG_URL, colMock.REG_AZCOLLECT_QUERY);
180+
sinon.assert.neverCalledWithMatch(alserviceStub.get, colMock.GET_INGEST_URL);
181+
sinon.assert.neverCalledWithMatch(alserviceStub.get, colMock.GET_AZCOLLECT_URL);
182+
done();
183+
}
184+
};
185+
AlAwsCollector.load().then(function(creds) {
186+
var collector = new AlAwsCollector(
187+
mockContext, 'cwe', AlAwsCollector.IngestTypes.SECMSGS, '1.0.0', creds, function() {});
188+
collector.register(colMock.REGISTRATION_TEST_EVENT, colMock.REG_PARAMS);
189+
});
190+
});
191+
192+
it('register success with env vars not set', function(done) {
193+
mockLambdaEndpointsUpdateConfiguration();
194+
delete process.env.ingest_api;
195+
delete process.env.azcollect_api;
155196
var mockContext = {
156197
invokedFunctionArn : colMock.FUNCTION_ARN,
157198
succeed : () => {
158199
sinon.assert.calledWith(alserviceStub.post, colMock.REG_URL, colMock.REG_AZCOLLECT_QUERY);
200+
sinon.assert.calledTwice(alserviceStub.get);
159201
done();
160202
}
161203
};
@@ -752,11 +794,13 @@ describe('al_aws_collector error tests', function() {
752794
return callback(null, colMock.CF_DESCRIBE_STACKS_RESPONSE);
753795
});
754796
mockLambdaMetricStatistics();
797+
mockSetEnvStub();
755798
});
756799

757800
afterEach(function(){
758801
restoreAlServiceStub();
759802
responseStub.restore();
803+
setEnvStub.restore();
760804
AWS.restore('CloudFormation', 'describeStacks');
761805
AWS.restore('CloudWatch', 'getMetricStatistics');
762806
});
@@ -766,7 +810,7 @@ describe('al_aws_collector error tests', function() {
766810
invokedFunctionArn : colMock.FUNCTION_ARN,
767811
done : () => {
768812
sinon.assert.calledWith(alserviceStub.post, colMock.REG_URL, colMock.REG_AZCOLLECT_QUERY);
769-
sinon.assert.calledWith(responseStub, sinon.match.any, sinon.match.any, m_response.FAILED, {Error: 'post error'});
813+
sinon.assert.calledWith(responseStub, sinon.match.any, sinon.match.any, m_response.FAILED, {Error: 'registration error: post error'});
770814
done();
771815
}
772816
};

test/collector_mock.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ process.env.AWS_REGION = 'us-east-1';
88
process.env.AWS_LAMBDA_FUNCTION_NAME = FUNCTION_NAME;
99
process.env.al_api = 'api.global-services.global.alertlogic.com';
1010
process.env.ingest_api = 'ingest.global-services.global.alertlogic.com';
11-
process.env.azollect_api = 'azcollect.global-services.global.alertlogic.com';
11+
process.env.azcollect_api = 'azcollect.global-services.global.alertlogic.com';
1212
process.env.aims_access_key_id = 'aims-key-id';
1313
process.env.aims_secret_key = 'aims-secret-key-encrypted';
1414
process.env.aws_lambda_s3_bucket = S3_BUCKET;
@@ -60,6 +60,8 @@ const DEREGISTRATION_TEST_EVENT = {
6060
};
6161

6262
const REG_URL = '/aws/cwe/123456789012/us-east-1/' + encodeURIComponent(FUNCTION_NAME);
63+
const GET_INGEST_URL = '/residency/default/serevices/ingest/endpoint';
64+
const GET_AZCOLLECT_URL = '/residency/default/services/azcollect/endpoint';
6365
const REG_PARAMS = {
6466
stackName : STACK_NAME,
6567
custom_fields: {
@@ -253,7 +255,7 @@ const LAMBDA_FUNCTION_CONFIGURATION = {
253255
al_api: process.env.al_api,
254256
aws_lambda_s3_bucket: S3_BUCKET,
255257
aws_lambda_zipfile_name: S3_ZIPFILE,
256-
azollect_api: process.env.azollect_api,
258+
azcollect_api: process.env.azcollect_api,
257259
ingest_api: process.env.ingest_api
258260
}
259261
},
@@ -282,7 +284,7 @@ const LAMBDA_FUNCTION_CONFIGURATION_CHANGED = {
282284
al_api: 'new al_api value',
283285
aws_lambda_s3_bucket: S3_BUCKET,
284286
aws_lambda_zipfile_name: S3_ZIPFILE,
285-
azollect_api: process.env.azollect_api,
287+
azcollect_api: process.env.azcollect_api,
286288
ingest_api: process.env.ingest_api,
287289
x: 'XXXX'
288290
}
@@ -303,6 +305,8 @@ module.exports = {
303305

304306
REGISTRATION_TEST_EVENT : REGISTRATION_TEST_EVENT,
305307
REG_URL : REG_URL,
308+
GET_AZCOLLECT_URL: GET_AZCOLLECT_URL,
309+
GET_INGEST_URL: GET_INGEST_URL,
306310
REG_PARAMS : REG_PARAMS,
307311
REG_AZCOLLECT_QUERY : REG_AZCOLLECT_QUERY,
308312

0 commit comments

Comments
 (0)