cloud-red
Version:
Harnessing Serverless for your cloud integration needs
296 lines (285 loc) • 9.36 kB
JavaScript
/**
* Copyright 2014 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
var AWS = require('aws-sdk');
var when = require('when');
var util = require('util');
var fs = require('fs');
var settings;
var appname;
var s3 = null;
var s3BucketName = null;
var s3FlowName = null;
var currentFlowRev = {};
var currentSettingsRev = null;
var currentCredRev = null;
var libraryCache = {};
var s3storage = {
init: function(_settings) {
settings = _settings;
s3BucketName = settings.awsS3Bucket;
s3FlowName = settings.awsS3FlowName;
//appname = settings.awsS3Appname || require('os').hostname();
AWS.config.region = settings.awsRegion || 'eu-west-1';
return when.promise(function(resolve, reject) {
s3 = new AWS.S3();
if (!s3BucketName) {
reject('[storage-s3] awsS3Bucket property not found in the settings.');
}
console.log(
`[storage-s3] Saving flow: ${s3FlowName} from bucket: \"${s3BucketName}\" ...`
);
var params = {};
params.Key = s3FlowName;
params.Bucket = s3BucketName;
var promises = [];
s3.getObject(params, function(err, flow) {
if (err) {
reject(err);
} else {
//var _flow = JSON.parse(flow);
//promises.push(s3storage.saveFlows(_flow));
resolve();
}
});
});
},
getFlows: function() {
console.log('[storage-s3] getFlows invoked');
return this.getArrayData(s3FlowName);
},
saveFlows: function(flow) {
console.log(`[storage-s3] saveFlows invoked with param: \"${flow}\".`);
return this.saveData(s3FlowName, flows);
},
getCredentials: function() {
return when.promise(function(resolve, reject) {
console.log(
'[storage-s3] Get Credentials! - WARNING!! - Not implemented yet'
);
resolve({});
});
},
saveCredentials: function(creds) {
return when.promise(function(resolve, reject) {
console.log(
'[storage-s3] Save Credentials! - WARNING!! - Not implemented yet'
);
resolve({});
});
},
getSettings: function() {
return when.promise(function(resolve, reject) {
console.log(
'[storage-s3] Get Settings! - WARNING!! - Hardcoded settings, not reading from s3 bucket'
);
resolve({
disableEditor: true,
httpAdminRoot: true,
httpNodeRoot: '/',
httpAdminRoot: '/admin',
awsRegion: 'ap-southeast-2',
awsS3Bucket: 'cloud-red-flows',
awsS3FlowName: 'awshandler-flow.json',
storageModule: require('./index.js'),
functionGlobalContext: {},
credentialSecret: process.env.NODE_RED_SECRET || 'a-secret-key',
logging: {
console: {
level: 'debug',
// Whether or not to include metric events in the log output
metrics: false,
// Whether or not to include audit events in the log output
audit: false
}
}
});
});
},
saveSettings: function(creds) {
// return this.saveData('settings', creds);
return when.promise(function(resolve, reject) {
console.log(
'[storage-s3] Save Settings! - WARNING!! - Not implemented yet'
);
resolve({});
});
},
getData: function(entryType) {
console.log(
`[storage-s3] getData! - WARNING!! - Lookup not expected with param: ${entryType}`
);
return when.promise(function(resolve, reject) {
var params = {};
params.Bucket = s3BucketName;
params.Key = appname + '/' + entryType + '.json';
s3.getObject(params, function(err, doc) {
if (err) {
if (err.code == 'NoSuchKey') {
console.warn('[storage-s3] No entry found for key ' + params.Key);
resolve({});
} else {
console.error(err);
reject(err.toString());
}
} else {
var strObj = doc.Body.toString();
var dataEntry = JSON.parse(strObj);
resolve(dataEntry);
}
});
});
},
getArrayData: function(flowName) {
return when.promise(function(resolve, reject) {
var params = {};
params.Bucket = s3BucketName;
params.Key = flowName;
s3.getObject(params, function(err, doc) {
if (err) {
if (err.code == 'NoSuchKey') {
console.warn('[storage-s3] No entry found for key ' + params.Key);
resolve([]);
} else {
console.error(err);
reject(err.toString());
}
} else {
var strObj = doc.Body.toString();
console.log(`*********** Flow received ***********`);
console.log(strObj);
console.log('*************************************');
var dataEntry = JSON.parse(strObj);
resolve(dataEntry);
}
});
});
},
saveData: function(entryType, dataEntry) {
console.log('save ' + entryType);
return when.promise(function(resolve, reject) {
var params = {};
params.Bucket = s3BucketName;
// params.Key = appname + '/' + entryType + '.json';
params.Key = entryType;
params.Body = JSON.stringify(dataEntry);
s3.upload(params, function(err, doc) {
if (err) {
reject(err.toString());
} else {
resolve();
}
});
});
},
saveLibraryEntry: function(type, path, meta, body) {
console.log('[storage-s3] Save library entry: ' + type + ':' + path);
if (path.substr(0) != '/') {
path = '/' + path;
}
var key = appname + '/lib/' + type + path;
return when.promise(function(resolve, reject) {
var params = {};
params.Bucket = s3BucketName;
params.Key = appname + '/lib/' + type + path;
params.Body = JSON.stringify(body);
if (meta) {
var metaStr = JSON.stringify(meta);
params.Metadata = { nrmeta: metaStr };
}
s3.putObject(params, function(err, data) {
if (err) {
reject(err.toString());
} else {
resolve();
}
});
});
},
getLibraryEntry: function(type, path) {
console.log('[storage-s3] Get library entry: ' + type + ':' + path);
return when.promise(function(resolve, reject) {
var params = {};
params.Bucket = s3BucketName;
params.Prefix =
appname + '/lib/' + type + (path.substr(0) != '/' ? '/' : '') + path;
params.Delimiter = '/';
s3.listObjects(params, function(err, data) {
if (err) {
if (err.code == 'NoSuchKey') {
console.warn('[storage-s3] No entry found for key ' + params.Key);
reject(err.toString());
} else {
console.error(err);
reject(err.toString());
}
} else {
if (
data.Contents.length == 1 &&
data.Contents[0].Key == data.Prefix
) {
var getParams = { Bucket: s3BucketName, Key: data.Prefix };
s3.getObject(getParams, function(err, doc) {
if (err) {
reject(err.toString());
} else {
var strObj = doc.Body.toString();
var dataEntry = JSON.parse(strObj);
resolve(dataEntry);
}
});
} else {
var resultData = [];
for (var i = 0; i < data.CommonPrefixes.length; i++) {
var li = data.CommonPrefixes[i];
resultData.push(
li['Prefix'].substr(
data.Prefix.length,
li['Prefix'].length - (data.Prefix.length + 1)
)
);
}
var prefixes = {};
for (var i = 0; i < data.Contents.length; i++) {
var li = data.Contents[i];
var getParams = { Bucket: s3BucketName, Key: li.Key };
s3.headObject(getParams, function(err, objData) {
console.log(this.request.httpRequest.path);
var entryName = this.request.httpRequest.path.toString();
entryName = entryName.substr(
data.Prefix.length + 1,
entryName.length - (data.Prefix.length + 1)
);
var entryData = {};
if (objData.Metadata['nrmeta']) {
entryData = JSON.parse(objData.Metadata.nrmeta);
}
entryData.fn = entryName;
resultData.push(entryData);
if (
resultData.length ==
data.CommonPrefixes.length + data.Contents.length
) {
resolve(resultData);
}
});
}
}
}
});
});
}
};
module.exports = s3storage;