소스 검색

It is now possible to save the results to an AWS S3 bucket

Gaël Métais 4 년 전
부모
커밋
9211074b32
3개의 변경된 파일123개의 추가작업 그리고 10개의 파일을 삭제
  1. 2 4
      lib/server/controllers/apiController.js
  2. 119 0
      lib/server/datastores/awsResultsDatastore.js
  3. 2 6
      lib/server/datastores/resultsDatastore.js

+ 2 - 4
lib/server/controllers/apiController.js

@@ -5,10 +5,11 @@ var ylt                 = require('../../index');
 var ScreenshotHandler   = require('../../screenshotHandler');
 var RunsQueue           = require('../datastores/runsQueue');
 var RunsDatastore       = require('../datastores/runsDatastore');
-var ResultsDatastore    = require('../datastores/resultsDatastore');
 
 var serverSettings      = (process.env.IS_TEST) ? require('../../../test/fixtures/settings.json') : require('../../../server_config/settings.json');
 
+var ResultsDatastore = (serverSettings.awsHosting) ? require('../datastores/awsResultsDatastore') : require('../datastores/resultsDatastore');
+
 var ApiController = function(app) {
     'use strict';
 
@@ -134,9 +135,6 @@ var ApiController = function(app) {
                 .then(function() {
                     // Remove uneeded temp screenshot path
                     delete data.params.options.screenshot;
-
-                    // Here we can remove tools results if not needed
-                    delete data.toolsResults.phantomas.offenders.requests;
                     
                     return resultsDatastore.saveResult(data);
                 })

+ 119 - 0
lib/server/datastores/awsResultsDatastore.js

@@ -0,0 +1,119 @@
+const Q           = require('q');
+const debug       = require('debug')('ylt:resultsDatastore');
+const path        = require('path');
+const AWS         = require('aws-sdk');
+
+
+function ResultsDatastore() {
+    'use strict';
+
+    const serverSettings = require('../../../server_config/settings.json');
+    
+    const s3 = new AWS.S3();
+
+    const resultFileName = 'results.json';
+    const resultScreenshotName = 'screenshot.jpg';
+    const resultsFolderName = 'results';
+
+
+    this.saveResult = function(testResults) {
+        const resultFilePath = path.join(resultsFolderName, testResults.runId, resultFileName);
+        const screenshotFilePath = path.join(resultsFolderName, testResults.runId, resultScreenshotName);
+
+        debug('Starting to save screenshot then results.json file on s3...');
+
+        return saveScreenshotIfExists(testResults, screenshotFilePath)
+
+        .then(function() {
+            debug('Saving results file to s3, destination is %s', resultFilePath);
+            return s3PutObject(resultFilePath, JSON.stringify(testResults, null, 2));
+        });
+    };
+
+
+    this.getResult = function(runId) {
+        const resultFilePath = path.join(resultsFolderName, runId, resultFileName);
+        debug('Reading results (runID = %s) from AWS s3...', runId);
+        return s3GetObject(resultFilePath).then(function(bodyBuffer) {
+            return JSON.parse(bodyBuffer.toString('utf-8'));
+        });
+    };
+
+
+    // If there is a screenshot, save it as screenshot.jpg in the same folder as the results
+    function saveScreenshotIfExists(testResults, imagePath) {
+        var deferred = Q.defer();
+
+        if (testResults.screenshotBuffer) {
+            s3PutObject(imagePath, testResults.screenshotBuffer)
+            
+            .fail(function() {
+                debug('Image %s could not be saved on s3. Ignoring.', imagePath);
+            })
+            
+            .finally(function() {
+                delete testResults.screenshotBuffer;
+                deferred.resolve();
+            });
+
+        } else {
+            debug('Screenshot not found');
+            deferred.resolve();
+        }
+
+        return deferred.promise;
+    }
+
+
+    this.getScreenshot = function(runId) {
+        const screenshotFilePath = path.join(resultsFolderName, runId, resultScreenshotName);
+        debug('Retrieving screenshot (runID = %s) from s3...', runId);
+        return s3GetObject(screenshotFilePath);
+    };
+
+
+    function s3PutObject(path, body, ignoreError) {
+        var deferred = Q.defer();
+
+        s3.putObject({
+            Bucket: serverSettings.awsHosting.s3.bucket,
+            Key: path,
+            Body: body
+        }, function(err, data) {
+            if (err) {
+                debug('Could not save file %s on s3', path);
+                debug(err);
+                deferred.reject('File saving failed on s3');
+            } else {
+                debug('File %s saved on s3', path);
+                deferred.resolve();
+            }
+        });
+
+        return deferred.promise;
+    }
+
+
+    function s3GetObject(path) {
+        var deferred = Q.defer();
+
+        s3.getObject({
+            Bucket: serverSettings.awsHosting.s3.bucket,
+            Key: path
+        }, function(err, data) {
+            if (err) {
+                debug('Failed retrieving object %s from s3', path);
+                debug(err);
+                deferred.reject(err);
+            } else {
+                debug('Response for %s received from s3...', path);
+                deferred.resolve(data.Body);
+            }
+        });
+
+        return deferred.promise;
+    }
+
+}
+
+module.exports = ResultsDatastore;

+ 2 - 6
lib/server/datastores/resultsDatastore.js

@@ -49,13 +49,13 @@ function ResultsDatastore() {
     };
 
 
-    this.deleteResult = function(runId) {
+    /*this.deleteResult = function(runId) {
         var folder = path.join(resultsDir, runId);
 
         debug('Deleting results (runID = %s) from disk...', runId);
 
         return Q.nfcall(rimraf, folder);
-    };
+    };*/
 
 
     // The folder /results/folderName/
@@ -92,10 +92,6 @@ function ResultsDatastore() {
         return deferred.promise;
     }
 
-    this.getResultFolder = function(runId) {
-        return path.join(resultsDir, runId);
-    };
-
     // If there is a screenshot, save it as screenshot.jpg in the same folder as the results
     function saveScreenshotIfExists(testResults, path) {
         var deferred = Q.defer();