From 548e77246a2385674f78e29409f282999792290c Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 8 Apr 2019 10:07:59 +0200 Subject: [PATCH] Storage Gateway Stablished --- AzureBlobStorage.js | 389 ++++++++++++++++++++++++++++++++++++++++++ AzureStorage.js | 2 +- BlobStorage.js | 402 ++------------------------------------------ MinioBlobStorage.js | 389 ++++++++++++++++++++++++++++++++++++++++++ Project.njsproj | 6 + 5 files changed, 799 insertions(+), 389 deletions(-) create mode 100644 AzureBlobStorage.js create mode 100644 MinioBlobStorage.js diff --git a/AzureBlobStorage.js b/AzureBlobStorage.js new file mode 100644 index 000000000..c9ca99a8c --- /dev/null +++ b/AzureBlobStorage.js @@ -0,0 +1,389 @@ + +exports.newAzureBlobBlobStorage = function newAzureBlobBlobStorage(BOT, logger) { + + let FULL_LOG = false; + let ERROR_LOG = true; + let LOG_FILE_CONTENT = false; + + let bot = BOT; + const ROOT_DIR = './'; + + const MODULE_NAME = "Azure Blob Storage"; + const SECOND_TRY_WAIT_TIME = 10000; + + let AZURE_STORAGE = require('./AzureStorage') + let storage = AZURE_STORAGE.newAzureStorage(bot, logger); + + let thisObject = { + initialize: initialize, + createFolder: createFolder, + createTextFile: createTextFile, + getTextFile: getTextFile + }; + + let readOnlyBlobService; + let writeOnlyBlobService; + let containerName; + let environment = global.CURRENT_ENVIRONMENT; + + return thisObject; + + function initialize(pDataOwner, callBackFunction, disableLogging) { + + try { + + containerName = pDataOwner.toLowerCase(); + + if (pDataOwner.environment !== undefined) { // This is use for data migration from one environment to the other. + + environment = pDataOwner.environment; + + } + + if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] initialize -> Entering function."); } + if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] initialize -> environment = " + environment); } + if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] initialize -> containerName = " + containerName); } + + + + let readConnectionString = global.USER_PROFILE.storagePermissions.get(pDataOwner + "." + "READ"); + + if (readConnectionString !== undefined) { + readOnlyBlobService = storage.createBlobService(readConnectionString); + } + + let writeConnectionString = global.USER_PROFILE.storagePermissions.get(pDataOwner + "." + "WRITE"); + + if (writeConnectionString !== undefined) { + writeOnlyBlobService = storage.createBlobService(writeConnectionString); + } + + if (readOnlyBlobService !== undefined || writeOnlyBlobService !== undefined) { + + callBackFunction(global.DEFAULT_OK_RESPONSE); + return; + + } else { + + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] initialize -> No READ or WRITE permissions found."); } + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] initialize -> pDataOwner = " + pDataOwner); } + + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + return; + + } + } + catch (err) { + + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] initialize -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + + function createFolder(pFolderPath, callBackFunction) { + + if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] createFolder -> Entering function."); } + + try { + + /* Folders do not need to be created when using blobs. */ + + callBackFunction(global.DEFAULT_OK_RESPONSE); + return; + + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createFolder -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + + function createTextFile(pFolderPath, pFileName, pFileContent, callBackFunction) { + + if (writeOnlyBlobService === undefined) { + + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> initialize function not executed or failed. Can not process this request. Sorry."); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + return; + } + + try { + + if (FULL_LOG === true && logger !== undefined) { + logger.write(MODULE_NAME, "[INFO] createTextFile -> About to create a text file."); + logger.write(MODULE_NAME, "[INFO] createTextFile -> containerName = " + containerName); + logger.write(MODULE_NAME, "[INFO] createTextFile -> pFolderPath = " + pFolderPath); + logger.write(MODULE_NAME, "[INFO] createTextFile -> pFileName = " + pFileName); + } + + writeOnlyBlobService.createBlockBlobFromText(containerName, pFolderPath + "/" + pFileName, pFileContent, onFileCreated); + + function onFileCreated(err, result, response) { + + try { + + if (FULL_LOG === true && logger !== undefined) { + logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> Response from Azure received."); + logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> err = " + JSON.stringify(err)); + } + + if (LOG_FILE_CONTENT === true && logger !== undefined) { + logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> result = " + JSON.stringify(result)); + logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileReceived -> response = " + JSON.stringify(response)); + logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileReceived -> pFileContent = " + pFileContent); + } + + if (err) { + + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> err = " + JSON.stringify(err)); } + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> result = " + JSON.stringify(result)); } + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> response = " + JSON.stringify(response)); } + + if (ERROR_LOG === true && logger !== undefined) { + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileReceived -> Error trying to create this file."); + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileReceived -> containerName = " + containerName); + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileReceived -> pFolderPath = " + pFolderPath); + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileReceived -> pFileName = " + pFileName); + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileReceived -> err.code = " + err.code); + } + + if ( + err.code === 'ECONNRESET' || + err.code === 'ENOTFOUND' || + err.code === 'ESOCKETTIMEDOUT' || + err.code === 'ETIMEDOUT' || + err.code === 'ECONNREFUSED' || + err.code === 'EADDRINUSE' || + err.code === 'EAI_AGAIN' || + err.code === 'AuthenticationFailed' || + err.code === 'OperationTimedOut' || + err.code === 'ServerBusy' + ) { + + setTimeout(secondTry, SECOND_TRY_WAIT_TIME); + return; + + function secondTry() { + + try { + + logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> secondTry -> Retrying to create the file."); + + writeOnlyBlobService.createBlockBlobFromText(containerName, pFolderPath + "/" + pFileName, pFileContent, onSecondTry); + + function onSecondTry(err, result, response) { + + try { + + if (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> secondTry -> File not created. Giving Up."); } + + if (ERROR_LOG === true && logger !== undefined) { + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> secondTry -> containerName = " + containerName); + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> secondTry -> pFolderPath = " + pFolderPath); + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> secondTry -> pFileName = " + pFileName); + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> secondTry -> err.code = " + err.code); + } + + callBackFunction(global.DEFAULT_RETRY_RESPONSE); + } else { + logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> secondTry -> File succesfully created on second try."); + callBackFunction(global.DEFAULT_OK_RESPONSE); + } + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'createTextFile' -> onFileCreated -> secondTry -> onSecondTry -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'createTextFile' -> onFileCreated -> secondTry -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + } + + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> Dont know what to do here. Cancelling operation. "); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + + } else { + if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> File Created."); } + callBackFunction(global.DEFAULT_OK_RESPONSE); + } + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'createTextFile' -> onFileCreated -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'createTextFile' -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + + function getTextFile(pFolderPath, pFileName, callBackFunction) { + + if (readOnlyBlobService === undefined) { + + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] getTextFile -> initialize function not executed or failed. Can not process this request. Sorry."); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + return; + } + + try { + + if (FULL_LOG === true && logger !== undefined) { + logger.write(MODULE_NAME, "[INFO] getTextFile -> About to get a text file."); + logger.write(MODULE_NAME, "[INFO] getTextFile -> containerName = " + containerName); + logger.write(MODULE_NAME, "[INFO] getTextFile -> pFolderPath = " + pFolderPath); + logger.write(MODULE_NAME, "[INFO] getTextFile -> pFileName = " + pFileName); + } + + readOnlyBlobService.getBlobToText(containerName, pFolderPath + "/" + pFileName, onFileReceived); + + function onFileReceived(err, text, response) { + + try { + + if (FULL_LOG === true && logger !== undefined) { + logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> Response from Azure received."); + logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> err = " + JSON.stringify(err)); + } + + if (LOG_FILE_CONTENT === true && logger !== undefined) { + logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> response = " + JSON.stringify(response)); + logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> text = " + text); + } + + if (err) { + + if (ERROR_LOG === true && logger !== undefined && err.code !== 'BlobNotFound') { + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> Error trying to get this file."); + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> containerName = " + containerName); + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> pFolderPath = " + pFolderPath); + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> pFileName = " + pFileName); + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> err.code = " + err.code); + } + + if ( + err.code === 'ECONNRESET' || + err.code === 'ENOTFOUND' || + err.code === 'ESOCKETTIMEDOUT' || + err.code === 'ETIMEDOUT' || + err.code === 'ECONNREFUSED' || + err.code === 'EADDRINUSE' || + err.code === 'EAI_AGAIN' || + err.code === 'AuthenticationFailed' || + err.code === 'OperationTimedOut' || + err.code === 'ServerBusy' + ) { + + setTimeout(secondTry, SECOND_TRY_WAIT_TIME); + return; + + function secondTry() { + + try { + + logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> secondTry -> Retrying to get the file."); + + readOnlyBlobService.getBlobToText(containerName, pFolderPath + "/" + pFileName, onSecondTry); + + function onSecondTry(err, text, response) { + + try { + + if (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> secondTry -> File not retrieved. Giving Up."); } + + if (ERROR_LOG === true && logger !== undefined) { + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> secondTry -> containerName = " + containerName); + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> secondTry -> pFolderPath = " + pFolderPath); + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> secondTry -> pFileName = " + pFileName); + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> secondTry -> err.code = " + err.code); + } + + callBackFunction(global.DEFAULT_RETRY_RESPONSE); + } else { + logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> secondTry -> File succesfully retrieved on second try."); + callBackFunction(global.DEFAULT_OK_RESPONSE, text); + } + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'getTextFile' -> onFileReceived -> secondTry -> onSecondTry -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'getTextFile' -> onFileReceived -> secondTry -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + } + + if (err.code === "BlobNotFound") { + + /* This is how Azure tell us the file does not exist. */ + + let customErr = { + result: global.CUSTOM_FAIL_RESPONSE.result, + message: "File does not exist." + }; + + logger.write(MODULE_NAME, "[WARN] getTextFile -> onFileReceived -> Custom Response -> message = " + customErr.message); + logger.write(MODULE_NAME, "[WARN] getTextFile -> containerName = " + containerName); + logger.write(MODULE_NAME, "[WARN] getTextFile -> pFolderPath = " + pFolderPath); + logger.write(MODULE_NAME, "[WARN] getTextFile -> pFileName = " + pFileName); + + callBackFunction(customErr); + return; + + } + + if (err.code === "ParentNotFound") { + + /* This is how Azure tell us the folder where the file was supposed to be does not exist. We map this to our own response. */ + + let customErr = { + result: global.CUSTOM_FAIL_RESPONSE.result, + message: "Folder does not exist." + }; + + logger.write(MODULE_NAME, "[WARN] getTextFile -> onFileReceived -> Custom Response -> message = " + customErr.message); + logger.write(MODULE_NAME, "[WARN] getTextFile -> containerName = " + containerName); + logger.write(MODULE_NAME, "[WARN] getTextFile -> pFolderPath = " + pFolderPath); + logger.write(MODULE_NAME, "[WARN] getTextFile -> pFileName = " + pFileName); + + callBackFunction(customErr); + return; + + } + + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileCreated -> err = " + JSON.stringify(err)); } + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileCreated -> response = " + JSON.stringify(response)); } + + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> Dont know what to do here. Cancelling operation. "); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + + } else { + if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> File retrieved."); } + callBackFunction(global.DEFAULT_OK_RESPONSE, text); + } + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'getTextFile' -> onFileReceived -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'getTextFile' -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + +}; \ No newline at end of file diff --git a/AzureStorage.js b/AzureStorage.js index f6312abf4..8e35fce13 100644 --- a/AzureStorage.js +++ b/AzureStorage.js @@ -6,7 +6,7 @@ let bot = BOT; const ROOT_DIR = './'; - const MODULE_NAME = "Azure Storage"; + const MODULE_NAME = "Azure Blob Storage"; const REQUEST_TIMEOUT = 180; let thisObject = { diff --git a/BlobStorage.js b/BlobStorage.js index ef5f92a23..ca0018573 100644 --- a/BlobStorage.js +++ b/BlobStorage.js @@ -9,403 +9,29 @@ exports.newBlobStorage = function newBlobStorage(BOT, logger) { const ROOT_DIR = './'; const MODULE_NAME = "Blob Storage"; - const SECOND_TRY_WAIT_TIME = 10000; let storage; - let AZURE_STORAGE = require('./AzureStorage') - let MINIO_STORAGE = require('./MinioStorage') - - let thisObject = { - initialize: initialize, - createFolder: createFolder, - createTextFile: createTextFile, - getTextFile: getTextFile - }; + let AZURE_STORAGE = require('./AzureBlobStorage') + let MINIO_STORAGE = require('./MinioBlobStorage') - let readOnlyBlobService; - let writeOnlyBlobService; - let containerName; - let environment = global.CURRENT_ENVIRONMENT; - - return thisObject; - - function initialize(pDataOwner, callBackFunction, disableLogging) { - - try { - - switch (process.env.STORAGE_PROVIDER) { - case 'Azure': { - storage = AZURE_STORAGE.newAzureStorage(bot, logger); - break; - } - case 'Minio': { - storage = MINIO_STORAGE.newMinioStorage(bot, logger); - break; - } - default: { - if (ERROR_LOG === true && logger !== undefined) { - logger.write(MODULE_NAME, "[ERROR] initialize -> Storage Provider not supported -> process.env.STORAGE_PROVIDER = " + process.env.STORAGE_PROVIDER); } - callBackFunction(global.DEFAULT_FAIL_RESPONSE); - return; - } - } - - containerName = pDataOwner.toLowerCase(); - - if (pDataOwner.environment !== undefined) { // This is use for data migration from one environment to the other. - - environment = pDataOwner.environment; - - } - - if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] initialize -> Entering function."); } - if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] initialize -> environment = " + environment); } - if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] initialize -> containerName = " + containerName); } - - - - let readConnectionString = global.USER_PROFILE.storagePermissions.get(pDataOwner + "." + "READ"); - - if (readConnectionString !== undefined) { - readOnlyBlobService = storage.createBlobService(readConnectionString); - } - - let writeConnectionString = global.USER_PROFILE.storagePermissions.get(pDataOwner + "." + "WRITE"); - - if (writeConnectionString !== undefined) { - writeOnlyBlobService = storage.createBlobService(writeConnectionString); - } - - if (readOnlyBlobService !== undefined || writeOnlyBlobService !== undefined) { - - callBackFunction(global.DEFAULT_OK_RESPONSE); - return; - - } else { - - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] initialize -> No READ or WRITE permissions found."); } - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] initialize -> pDataOwner = " + pDataOwner); } - - callBackFunction(global.DEFAULT_FAIL_RESPONSE); - return; - - } + switch (process.env.STORAGE_PROVIDER) { + case 'Azure': { + storage = AZURE_STORAGE.newAzureBlobBlobStorage(bot, logger); + break; } - catch (err) { - - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] initialize -> err = " + err.message); } - callBackFunction(global.DEFAULT_FAIL_RESPONSE); + case 'Minio': { + storage = MINIO_STORAGE.newMinioBlobBlobStorage(bot, logger); + break; } - } - - function createFolder(pFolderPath, callBackFunction) { - - if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] createFolder -> Entering function."); } - - try { - - /* Folders do not need to be created when using blobs. */ - - callBackFunction(global.DEFAULT_OK_RESPONSE); - return; - - } - catch (err) { - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createFolder -> err = " + err.message); } - callBackFunction(global.DEFAULT_FAIL_RESPONSE); - } - } - - function createTextFile(pFolderPath, pFileName, pFileContent, callBackFunction) { - - if (writeOnlyBlobService === undefined) { - - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> initialize function not executed or failed. Can not process this request. Sorry."); } - callBackFunction(global.DEFAULT_FAIL_RESPONSE); + default: { + if (ERROR_LOG === true && logger !== undefined) { + logger.write(MODULE_NAME, "[ERROR] initialize -> Storage Provider not supported -> process.env.STORAGE_PROVIDER = " + process.env.STORAGE_PROVIDER); + } return; } - - try { - - if (FULL_LOG === true && logger !== undefined) { - logger.write(MODULE_NAME, "[INFO] createTextFile -> About to create a text file."); - logger.write(MODULE_NAME, "[INFO] createTextFile -> containerName = " + containerName); - logger.write(MODULE_NAME, "[INFO] createTextFile -> pFolderPath = " + pFolderPath); - logger.write(MODULE_NAME, "[INFO] createTextFile -> pFileName = " + pFileName); - } - - writeOnlyBlobService.createBlockBlobFromText(containerName, pFolderPath + "/" + pFileName, pFileContent, onFileCreated); - - function onFileCreated(err, result, response) { - - try { - - if (FULL_LOG === true && logger !== undefined) { - logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> Response from Azure received."); - logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> err = " + JSON.stringify(err)); - } - - if (LOG_FILE_CONTENT === true && logger !== undefined) { - logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> result = " + JSON.stringify(result)); - logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileReceived -> response = " + JSON.stringify(response)); - logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileReceived -> pFileContent = " + pFileContent); - } - - if (err) { - - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> err = " + JSON.stringify(err)); } - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> result = " + JSON.stringify(result)); } - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> response = " + JSON.stringify(response)); } - - if (ERROR_LOG === true && logger !== undefined) { - logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileReceived -> Error trying to create this file."); - logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileReceived -> containerName = " + containerName); - logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileReceived -> pFolderPath = " + pFolderPath); - logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileReceived -> pFileName = " + pFileName); - logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileReceived -> err.code = " + err.code); - } - - if ( - err.code === 'ECONNRESET' || - err.code === 'ENOTFOUND' || - err.code === 'ESOCKETTIMEDOUT' || - err.code === 'ETIMEDOUT' || - err.code === 'ECONNREFUSED' || - err.code === 'EADDRINUSE' || - err.code === 'EAI_AGAIN' || - err.code === 'AuthenticationFailed' || - err.code === 'OperationTimedOut' || - err.code === 'ServerBusy' - ) - { - - setTimeout(secondTry, SECOND_TRY_WAIT_TIME); - return; - - function secondTry() { - - try { - - logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> secondTry -> Retrying to create the file."); - - writeOnlyBlobService.createBlockBlobFromText(containerName, pFolderPath + "/" + pFileName, pFileContent, onSecondTry); - - function onSecondTry(err, result, response) { - - try { - - if (err) { - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> secondTry -> File not created. Giving Up."); } - - if (ERROR_LOG === true && logger !== undefined) { - logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> secondTry -> containerName = " + containerName); - logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> secondTry -> pFolderPath = " + pFolderPath); - logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> secondTry -> pFileName = " + pFileName); - logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> secondTry -> err.code = " + err.code); - } - - callBackFunction(global.DEFAULT_RETRY_RESPONSE); - } else { - logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> secondTry -> File succesfully created on second try."); - callBackFunction(global.DEFAULT_OK_RESPONSE); - } - } - catch (err) { - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'createTextFile' -> onFileCreated -> secondTry -> onSecondTry -> err = " + err.message); } - callBackFunction(global.DEFAULT_FAIL_RESPONSE); - } - } - } - catch (err) { - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'createTextFile' -> onFileCreated -> secondTry -> err = " + err.message); } - callBackFunction(global.DEFAULT_FAIL_RESPONSE); - } - } - } - - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> Dont know what to do here. Cancelling operation. "); } - callBackFunction(global.DEFAULT_FAIL_RESPONSE); - - } else { - if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> File Created."); } - callBackFunction(global.DEFAULT_OK_RESPONSE); - } - } - catch (err) { - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'createTextFile' -> onFileCreated -> err = " + err.message); } - callBackFunction(global.DEFAULT_FAIL_RESPONSE); - } - } - } - catch (err) { - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'createTextFile' -> err = " + err.message); } - callBackFunction(global.DEFAULT_FAIL_RESPONSE); - } } - function getTextFile(pFolderPath, pFileName, callBackFunction) { - - if (readOnlyBlobService === undefined) { - - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] getTextFile -> initialize function not executed or failed. Can not process this request. Sorry."); } - callBackFunction(global.DEFAULT_FAIL_RESPONSE); - return; - } - - try { - - if (FULL_LOG === true && logger !== undefined) { - logger.write(MODULE_NAME, "[INFO] getTextFile -> About to get a text file."); - logger.write(MODULE_NAME, "[INFO] getTextFile -> containerName = " + containerName); - logger.write(MODULE_NAME, "[INFO] getTextFile -> pFolderPath = " + pFolderPath); - logger.write(MODULE_NAME, "[INFO] getTextFile -> pFileName = " + pFileName); - } - - readOnlyBlobService.getBlobToText(containerName, pFolderPath + "/" + pFileName, onFileReceived); - - function onFileReceived(err, text, response) { - - try { - - if (FULL_LOG === true && logger !== undefined) { - logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> Response from Azure received."); - logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> err = " + JSON.stringify(err)); - } - - if (LOG_FILE_CONTENT === true && logger !== undefined) { - logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> response = " + JSON.stringify(response)); - logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> text = " + text); - } - - if (err) { - - if (ERROR_LOG === true && logger !== undefined && err.code !== 'BlobNotFound') { - logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> Error trying to get this file."); - logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> containerName = " + containerName); - logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> pFolderPath = " + pFolderPath); - logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> pFileName = " + pFileName); - logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> err.code = " + err.code); - } - - if ( - err.code === 'ECONNRESET' || - err.code === 'ENOTFOUND' || - err.code === 'ESOCKETTIMEDOUT' || - err.code === 'ETIMEDOUT' || - err.code === 'ECONNREFUSED' || - err.code === 'EADDRINUSE' || - err.code === 'EAI_AGAIN' || - err.code === 'AuthenticationFailed' || - err.code === 'OperationTimedOut' || - err.code === 'ServerBusy' - ) - - { - - setTimeout(secondTry, SECOND_TRY_WAIT_TIME); - return; - - function secondTry() { - - try { - - logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> secondTry -> Retrying to get the file."); - - readOnlyBlobService.getBlobToText(containerName, pFolderPath + "/" + pFileName, onSecondTry); - - function onSecondTry(err, text, response) { - - try { - - if (err) { - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> secondTry -> File not retrieved. Giving Up."); } - - if (ERROR_LOG === true && logger !== undefined) { - logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> secondTry -> containerName = " + containerName); - logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> secondTry -> pFolderPath = " + pFolderPath); - logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> secondTry -> pFileName = " + pFileName); - logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> secondTry -> err.code = " + err.code); - } - - callBackFunction(global.DEFAULT_RETRY_RESPONSE); - } else { - logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> secondTry -> File succesfully retrieved on second try."); - callBackFunction(global.DEFAULT_OK_RESPONSE, text); - } - } - catch (err) { - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'getTextFile' -> onFileReceived -> secondTry -> onSecondTry -> err = " + err.message); } - callBackFunction(global.DEFAULT_FAIL_RESPONSE); - } - } - } - catch (err) { - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'getTextFile' -> onFileReceived -> secondTry -> err = " + err.message); } - callBackFunction(global.DEFAULT_FAIL_RESPONSE); - } - } - } - - if (err.code === "BlobNotFound") { - - /* This is how Azure tell us the file does not exist. */ - - let customErr = { - result: global.CUSTOM_FAIL_RESPONSE.result, - message: "File does not exist." - }; - - logger.write(MODULE_NAME, "[WARN] getTextFile -> onFileReceived -> Custom Response -> message = " + customErr.message); - logger.write(MODULE_NAME, "[WARN] getTextFile -> containerName = " + containerName); - logger.write(MODULE_NAME, "[WARN] getTextFile -> pFolderPath = " + pFolderPath); - logger.write(MODULE_NAME, "[WARN] getTextFile -> pFileName = " + pFileName); - - callBackFunction(customErr); - return; - - } - - if (err.code === "ParentNotFound") { - - /* This is how Azure tell us the folder where the file was supposed to be does not exist. We map this to our own response. */ - - let customErr = { - result: global.CUSTOM_FAIL_RESPONSE.result, - message: "Folder does not exist." - }; - - logger.write(MODULE_NAME, "[WARN] getTextFile -> onFileReceived -> Custom Response -> message = " + customErr.message); - logger.write(MODULE_NAME, "[WARN] getTextFile -> containerName = " + containerName); - logger.write(MODULE_NAME, "[WARN] getTextFile -> pFolderPath = " + pFolderPath); - logger.write(MODULE_NAME, "[WARN] getTextFile -> pFileName = " + pFileName); - - callBackFunction(customErr); - return; - - } - - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileCreated -> err = " + JSON.stringify(err)); } - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileCreated -> response = " + JSON.stringify(response)); } - - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> Dont know what to do here. Cancelling operation. "); } - callBackFunction(global.DEFAULT_FAIL_RESPONSE); - - } else { - if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> File retrieved."); } - callBackFunction(global.DEFAULT_OK_RESPONSE, text); - } - } - catch (err) { - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'getTextFile' -> onFileReceived -> err = " + err.message); } - callBackFunction(global.DEFAULT_FAIL_RESPONSE); - } - } - } - catch (err) { - if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'getTextFile' -> err = " + err.message); } - callBackFunction(global.DEFAULT_FAIL_RESPONSE); - } - } + return storage; }; \ No newline at end of file diff --git a/MinioBlobStorage.js b/MinioBlobStorage.js new file mode 100644 index 000000000..8f2a2f245 --- /dev/null +++ b/MinioBlobStorage.js @@ -0,0 +1,389 @@ + +exports.newMinioBlobBlobStorage = function newMinioBlobBlobStorage(BOT, logger) { + + let FULL_LOG = false; + let ERROR_LOG = true; + let LOG_FILE_CONTENT = false; + + let bot = BOT; + const ROOT_DIR = './'; + + const MODULE_NAME = "Minio Blob Storage"; + const SECOND_TRY_WAIT_TIME = 10000; + + let MINIO_STORAGE = require('./MinioStorage') + let storage = MINIO_STORAGE.newMinioStorage(bot, logger); + + let thisObject = { + initialize: initialize, + createFolder: createFolder, + createTextFile: createTextFile, + getTextFile: getTextFile + }; + + let readOnlyBlobService; + let writeOnlyBlobService; + let containerName; + let environment = global.CURRENT_ENVIRONMENT; + + return thisObject; + + function initialize(pDataOwner, callBackFunction, disableLogging) { + + try { + + containerName = pDataOwner.toLowerCase(); + + if (pDataOwner.environment !== undefined) { // This is use for data migration from one environment to the other. + + environment = pDataOwner.environment; + + } + + if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] initialize -> Entering function."); } + if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] initialize -> environment = " + environment); } + if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] initialize -> containerName = " + containerName); } + + + + let readConnectionString = global.USER_PROFILE.storagePermissions.get(pDataOwner + "." + "READ"); + + if (readConnectionString !== undefined) { + readOnlyBlobService = storage.createBlobService(readConnectionString); + } + + let writeConnectionString = global.USER_PROFILE.storagePermissions.get(pDataOwner + "." + "WRITE"); + + if (writeConnectionString !== undefined) { + writeOnlyBlobService = storage.createBlobService(writeConnectionString); + } + + if (readOnlyBlobService !== undefined || writeOnlyBlobService !== undefined) { + + callBackFunction(global.DEFAULT_OK_RESPONSE); + return; + + } else { + + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] initialize -> No READ or WRITE permissions found."); } + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] initialize -> pDataOwner = " + pDataOwner); } + + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + return; + + } + } + catch (err) { + + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] initialize -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + + function createFolder(pFolderPath, callBackFunction) { + + if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] createFolder -> Entering function."); } + + try { + + /* Folders do not need to be created when using blobs. */ + + callBackFunction(global.DEFAULT_OK_RESPONSE); + return; + + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createFolder -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + + function createTextFile(pFolderPath, pFileName, pFileContent, callBackFunction) { + + if (writeOnlyBlobService === undefined) { + + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> initialize function not executed or failed. Can not process this request. Sorry."); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + return; + } + + try { + + if (FULL_LOG === true && logger !== undefined) { + logger.write(MODULE_NAME, "[INFO] createTextFile -> About to create a text file."); + logger.write(MODULE_NAME, "[INFO] createTextFile -> containerName = " + containerName); + logger.write(MODULE_NAME, "[INFO] createTextFile -> pFolderPath = " + pFolderPath); + logger.write(MODULE_NAME, "[INFO] createTextFile -> pFileName = " + pFileName); + } + + writeOnlyBlobService.createBlockBlobFromText(containerName, pFolderPath + "/" + pFileName, pFileContent, onFileCreated); + + function onFileCreated(err, result, response) { + + try { + + if (FULL_LOG === true && logger !== undefined) { + logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> Response from Minio received."); + logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> err = " + JSON.stringify(err)); + } + + if (LOG_FILE_CONTENT === true && logger !== undefined) { + logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> result = " + JSON.stringify(result)); + logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileReceived -> response = " + JSON.stringify(response)); + logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileReceived -> pFileContent = " + pFileContent); + } + + if (err) { + + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> err = " + JSON.stringify(err)); } + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> result = " + JSON.stringify(result)); } + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> response = " + JSON.stringify(response)); } + + if (ERROR_LOG === true && logger !== undefined) { + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileReceived -> Error trying to create this file."); + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileReceived -> containerName = " + containerName); + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileReceived -> pFolderPath = " + pFolderPath); + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileReceived -> pFileName = " + pFileName); + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileReceived -> err.code = " + err.code); + } + + if ( + err.code === 'ECONNRESET' || + err.code === 'ENOTFOUND' || + err.code === 'ESOCKETTIMEDOUT' || + err.code === 'ETIMEDOUT' || + err.code === 'ECONNREFUSED' || + err.code === 'EADDRINUSE' || + err.code === 'EAI_AGAIN' || + err.code === 'AuthenticationFailed' || + err.code === 'OperationTimedOut' || + err.code === 'ServerBusy' + ) { + + setTimeout(secondTry, SECOND_TRY_WAIT_TIME); + return; + + function secondTry() { + + try { + + logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> secondTry -> Retrying to create the file."); + + writeOnlyBlobService.createBlockBlobFromText(containerName, pFolderPath + "/" + pFileName, pFileContent, onSecondTry); + + function onSecondTry(err, result, response) { + + try { + + if (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> secondTry -> File not created. Giving Up."); } + + if (ERROR_LOG === true && logger !== undefined) { + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> secondTry -> containerName = " + containerName); + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> secondTry -> pFolderPath = " + pFolderPath); + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> secondTry -> pFileName = " + pFileName); + logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> secondTry -> err.code = " + err.code); + } + + callBackFunction(global.DEFAULT_RETRY_RESPONSE); + } else { + logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> secondTry -> File succesfully created on second try."); + callBackFunction(global.DEFAULT_OK_RESPONSE); + } + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'createTextFile' -> onFileCreated -> secondTry -> onSecondTry -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'createTextFile' -> onFileCreated -> secondTry -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + } + + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] createTextFile -> onFileCreated -> Dont know what to do here. Cancelling operation. "); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + + } else { + if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] createTextFile -> onFileCreated -> File Created."); } + callBackFunction(global.DEFAULT_OK_RESPONSE); + } + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'createTextFile' -> onFileCreated -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'createTextFile' -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + + function getTextFile(pFolderPath, pFileName, callBackFunction) { + + if (readOnlyBlobService === undefined) { + + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] getTextFile -> initialize function not executed or failed. Can not process this request. Sorry."); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + return; + } + + try { + + if (FULL_LOG === true && logger !== undefined) { + logger.write(MODULE_NAME, "[INFO] getTextFile -> About to get a text file."); + logger.write(MODULE_NAME, "[INFO] getTextFile -> containerName = " + containerName); + logger.write(MODULE_NAME, "[INFO] getTextFile -> pFolderPath = " + pFolderPath); + logger.write(MODULE_NAME, "[INFO] getTextFile -> pFileName = " + pFileName); + } + + readOnlyBlobService.getBlobToText(containerName, pFolderPath + "/" + pFileName, onFileReceived); + + function onFileReceived(err, text, response) { + + try { + + if (FULL_LOG === true && logger !== undefined) { + logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> Response from Minio received."); + logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> err = " + JSON.stringify(err)); + } + + if (LOG_FILE_CONTENT === true && logger !== undefined) { + logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> response = " + JSON.stringify(response)); + logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> text = " + text); + } + + if (err) { + + if (ERROR_LOG === true && logger !== undefined && err.code !== 'BlobNotFound') { + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> Error trying to get this file."); + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> containerName = " + containerName); + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> pFolderPath = " + pFolderPath); + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> pFileName = " + pFileName); + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> err.code = " + err.code); + } + + if ( + err.code === 'ECONNRESET' || + err.code === 'ENOTFOUND' || + err.code === 'ESOCKETTIMEDOUT' || + err.code === 'ETIMEDOUT' || + err.code === 'ECONNREFUSED' || + err.code === 'EADDRINUSE' || + err.code === 'EAI_AGAIN' || + err.code === 'AuthenticationFailed' || + err.code === 'OperationTimedOut' || + err.code === 'ServerBusy' + ) { + + setTimeout(secondTry, SECOND_TRY_WAIT_TIME); + return; + + function secondTry() { + + try { + + logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> secondTry -> Retrying to get the file."); + + readOnlyBlobService.getBlobToText(containerName, pFolderPath + "/" + pFileName, onSecondTry); + + function onSecondTry(err, text, response) { + + try { + + if (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> secondTry -> File not retrieved. Giving Up."); } + + if (ERROR_LOG === true && logger !== undefined) { + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> secondTry -> containerName = " + containerName); + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> secondTry -> pFolderPath = " + pFolderPath); + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> secondTry -> pFileName = " + pFileName); + logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> secondTry -> err.code = " + err.code); + } + + callBackFunction(global.DEFAULT_RETRY_RESPONSE); + } else { + logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> secondTry -> File succesfully retrieved on second try."); + callBackFunction(global.DEFAULT_OK_RESPONSE, text); + } + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'getTextFile' -> onFileReceived -> secondTry -> onSecondTry -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'getTextFile' -> onFileReceived -> secondTry -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + } + + if (err.code === "BlobNotFound") { + + /* This is how Minio tell us the file does not exist. */ + + let customErr = { + result: global.CUSTOM_FAIL_RESPONSE.result, + message: "File does not exist." + }; + + logger.write(MODULE_NAME, "[WARN] getTextFile -> onFileReceived -> Custom Response -> message = " + customErr.message); + logger.write(MODULE_NAME, "[WARN] getTextFile -> containerName = " + containerName); + logger.write(MODULE_NAME, "[WARN] getTextFile -> pFolderPath = " + pFolderPath); + logger.write(MODULE_NAME, "[WARN] getTextFile -> pFileName = " + pFileName); + + callBackFunction(customErr); + return; + + } + + if (err.code === "ParentNotFound") { + + /* This is how Minio tell us the folder where the file was supposed to be does not exist. We map this to our own response. */ + + let customErr = { + result: global.CUSTOM_FAIL_RESPONSE.result, + message: "Folder does not exist." + }; + + logger.write(MODULE_NAME, "[WARN] getTextFile -> onFileReceived -> Custom Response -> message = " + customErr.message); + logger.write(MODULE_NAME, "[WARN] getTextFile -> containerName = " + containerName); + logger.write(MODULE_NAME, "[WARN] getTextFile -> pFolderPath = " + pFolderPath); + logger.write(MODULE_NAME, "[WARN] getTextFile -> pFileName = " + pFileName); + + callBackFunction(customErr); + return; + + } + + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileCreated -> err = " + JSON.stringify(err)); } + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileCreated -> response = " + JSON.stringify(response)); } + + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] getTextFile -> onFileReceived -> Dont know what to do here. Cancelling operation. "); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + + } else { + if (FULL_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[INFO] getTextFile -> onFileReceived -> File retrieved."); } + callBackFunction(global.DEFAULT_OK_RESPONSE, text); + } + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'getTextFile' -> onFileReceived -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + } + catch (err) { + if (ERROR_LOG === true && logger !== undefined) { logger.write(MODULE_NAME, "[ERROR] 'getTextFile' -> err = " + err.message); } + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } + } + +}; \ No newline at end of file diff --git a/Project.njsproj b/Project.njsproj index 2fe8ff0cf..fe4c94830 100644 --- a/Project.njsproj +++ b/Project.njsproj @@ -33,12 +33,18 @@ Code + + Code + Code Code + + Code + Code