UNPKG

cloud-red

Version:

Harnessing Serverless for your cloud integration needs

296 lines (285 loc) 9.36 kB
/** * 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;