Folder creation for onboarded packages
[osm/UI.git] / skyquake / plugins / composer / api / composer.js
index d9dc5e2..d83311f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * 
+ *
  *   Copyright 2016 RIFT.IO Inc
  *
  *   Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,9 +22,13 @@ var rp = require('request-promise');
 var utils = require('../../../framework/core/api_utils/utils.js');
 var constants = require('../../../framework/core/api_utils/constants.js');
 var _ = require('underscore');
+var URL = require('url');
+var uuid = require('uuid');
 var APIVersion = '/v1';
-var Composer = {};
+var PackageFileHandler = require('./packageFileHandler.js');
 
+var Composer = {};
+var FileManager = {};
 var DataCenters = {};
 // Catalog module methods
 Composer.get = function(req) {
@@ -268,7 +272,7 @@ Composer.create = function(req) {
         });
     });
 };
-Composer.update = function(req) {
+Composer.updateSave = function(req) {
     var api_server = req.query['api_server'];
     var catalogType = req.params.catalogType;
     var id = req.params.id;
@@ -297,5 +301,358 @@ Composer.update = function(req) {
             }
         });
     });
+}
+
+Composer.update = function(req) {
+    console.log(' Updating file', req.file.originalname, 'as', req.file.filename);
+    var api_server = req.query['api_server'];
+    // dev_download_server is for testing purposes.
+    // It is the direct IP address of the Node server where the
+    // package will be hosted.
+    var download_host = req.query['dev_download_server'];
+
+    if (!download_host) {
+        download_host = api_server + ':' + utils.getPortForProtocol(req.protocol);
+    }
+    var input = {
+        'external-url': download_host + '/composer/update/' + req.file.filename,
+        'package-type': 'VNFD',
+        'package-id': uuid()
+    }
+    return new Promise(function(resolve, reject) {
+        Promise.all([
+            rp({
+                uri: utils.confdPort(api_server) + '/api/operations/package-update',
+                method: 'POST',
+                headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, {
+                    'Authorization': req.get('Authorization')
+                }),
+                forever: constants.FOREVER_ON,
+                rejectUnauthorized: false,
+                resolveWithFullResponse: true,
+                json: true,
+                body: {
+                    input: input
+                }
+            })
+        ]).then(function(result) {
+            var data = {};
+            data['transaction_id'] = result[0].body['output']['transaction-id'];
+
+            // Add a status checker on the transaction and then to delete the file later
+            PackageFileHandler.checkCreatePackageStatusAndHandleFile(req, data['transaction_id'], true);
+
+            // Return status to composer UI to update the status.
+            resolve({
+                statusCode: constants.HTTP_RESPONSE_CODES.SUCCESS.OK,
+                data: data
+            });
+        }).catch(function(error) {
+            var res = {};
+            console.log('Problem with Composer.upload', error);
+            res.statusCode = error.statusCode || 500;
+            res.errorMessage = {
+                error: 'Failed to upload package ' + req.file.originalname + '. Error: ' + error
+            };
+            reject(res);
+        });
+    });
+};
+
+Composer.upload = function(req) {
+    console.log(' Uploading file', req.file.originalname, 'as', req.file.filename);
+    var api_server = req.query['api_server'];
+    // dev_download_server is for testing purposes.
+    // It is the direct IP address of the Node server where the
+    // package will be hosted.
+    var download_host = req.query['dev_download_server'];
+
+    if (!download_host) {
+        download_host = api_server + ':' + utils.getPortForProtocol(req.protocol);
+    }
+
+    return new Promise(function(resolve, reject) {
+        Promise.all([
+            rp({
+                uri: utils.confdPort(api_server) + '/api/operations/package-create',
+                method: 'POST',
+                headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, {
+                    'Authorization': req.get('Authorization')
+                }),
+                forever: constants.FOREVER_ON,
+                rejectUnauthorized: false,
+                resolveWithFullResponse: true,
+                json: true,
+                body: {
+                    input: {
+                        'external-url': download_host + '/composer/upload/' + req.file.filename,
+                        'package-type': 'VNFD',
+                        'package-id': uuid()
+                    }
+                }
+            })
+        ]).then(function(result) {
+            var data = {};
+            data['transaction_id'] = result[0].body['output']['transaction-id'];
+
+            // Add a status checker on the transaction and then to delete the file later
+            PackageFileHandler.checkCreatePackageStatusAndHandleFile(req, data['transaction_id']);
+
+            // Return status to composer UI to update the status.
+            resolve({
+                statusCode: constants.HTTP_RESPONSE_CODES.SUCCESS.OK,
+                data: data
+            });
+        }).catch(function(error) {
+            var res = {};
+            console.log('Problem with Composer.upload', error);
+            res.statusCode = error.statusCode || 500;
+            res.errorMessage = {
+                error: 'Failed to upload package ' + req.file.originalname + '. Error: ' + error
+            };
+            reject(res);
+        });
+    });
+};
+
+
+
+Composer.addFile = function(req) {
+    console.log(' Uploading file', req.file.originalname, 'as', req.file.filename);
+    var api_server = req.query['api_server'];
+    var download_host = req.query['dev_download_server'];
+    var package_id = req.query['package_id'];
+    var package_type = req.query['package_type'].toUpperCase();
+    var package_path = req.query['package_path'];
+    if (!download_host) {
+        download_host = api_server + ':' + utils.getPortForProtocol(req.protocol);
+    }
+    var input = {
+        'external-url': download_host + '/composer/upload/' + req.query['package_id'] + '/' + req.file.filename,
+        'package-type': package_type,
+        'package-id': package_id,
+        'package-path': package_path + '/' + req.file.filename
+    }
+    return new Promise(function(resolve, reject) {
+        Promise.all([
+            rp({
+                uri: utils.confdPort(api_server) + '/api/operations/package-file-add',
+                method: 'POST',
+                headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, {
+                    'Authorization': req.get('Authorization')
+                }),
+                forever: constants.FOREVER_ON,
+                rejectUnauthorized: false,
+                resolveWithFullResponse: true,
+                json: true,
+                body: {
+                    input: input
+                }
+            })
+        ]).then(function(result) {
+            var data = {};
+            data['transaction_id'] = result[0].body['output']['task-id'];
+            resolve({
+                statusCode: constants.HTTP_RESPONSE_CODES.SUCCESS.OK,
+                data: data
+            });
+        }).catch(function(error) {
+            var res = {};
+            console.log('Problem with Composer.upload', error);
+            res.statusCode = error.statusCode || 500;
+            res.errorMessage = {
+                error: 'Failed to upload package ' + req.file.originalname + '. Error: ' + error
+            };
+            reject(res);
+        });
+    });
+}
+
+Composer.exportPackage = function(req) {
+    // /api/operations/package-export
+    var api_server = req.query['api_server'];
+    return new Promise(function(resolve, reject) {
+        Promise.all([
+            rp({
+                uri: utils.confdPort(api_server) + '/api/operations/package-export',
+                method: 'POST',
+                headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, {
+                    'Authorization': req.get('Authorization')
+                }),
+                forever: constants.FOREVER_ON,
+                rejectUnauthorized: false,
+                resolveWithFullResponse: true,
+                json: true,
+                body: { "input": req.body}
+            })
+        ]).then(function(result) {
+            var data = {};
+            resolve({
+                statusCode: constants.HTTP_RESPONSE_CODES.SUCCESS.OK,
+                data: result[0].body
+            });
+        }).catch(function(error) {
+            var res = {};
+            console.log('Problem with Composer.exportPackage', error);
+            res.statusCode = error.statusCode || 500;
+            res.errorMessage = {
+                error: error
+            };
+            reject(res);
+        });
+    });
+}
+
+FileManager.get = function(req) {
+    var api_server = req.query['api_server'];
+    var type = req.query['package_type'] && req.query['package_type'].toUpperCase();
+    var id = req.query['package_id'];
+    var downloadUrl = req.query['url'];
+    var path = req.query['package_path'];
+    var payload = {
+        "input": {
+            "package-type": type,
+            "package-id": id
+        }
+    }
+    if(req.method == 'GET') {
+        if(downloadUrl && path) {
+            payload.input['external-url'] = downloadUrl;
+            payload.input['package-path'] = path;
+            return download(payload);
+        } else {
+            return list(payload);
+        }
+    }
+    if(req.method == 'DELETE') {
+        payload.input['package-path'] = path;
+        return deleteFile(payload)
+    }
+
+    function deleteFile(payload) {
+        return new Promise(function(resolve, reject) {
+            rp({
+                uri: utils.confdPort(api_server) + '/api/operations/rw-pkg-mgmt:package-file-delete',
+                method: 'POST',
+                headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, {
+                    'Authorization': req.get('Authorization')
+                }),
+                json: payload,
+                forever: constants.FOREVER_ON,
+                rejectUnauthorized: false,
+                resolveWithFullResponse: true
+            }).then(function(data) {
+                        if (utils.validateResponse('FileManager.delete', data.error, data, data.body, resolve, reject)) {
+                            resolve({
+                                statusCode: data.statusCode,
+                                data: data.body
+                            });
+                        }
+                    })
+        })
+    }
+    function download(payload) {
+        return new Promise(function(resolve, reject) {
+            rp({
+                uri: utils.confdPort(api_server) + '/api/operations/rw-pkg-mgmt:package-file-add',
+                method: 'POST',
+                headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, {
+                    'Authorization': req.get('Authorization')
+                }),
+                json: payload,
+                forever: constants.FOREVER_ON,
+                rejectUnauthorized: false,
+                resolveWithFullResponse: true
+            }).then(function(data) {
+                        if (utils.validateResponse('FileManager.get', data.error, data, data.body, resolve, reject)) {
+                            resolve({
+                                statusCode: data.statusCode,
+                                data: data.body
+                            });
+                        }
+                    })
+        })
+    }
+    function list(payload) {
+        return new Promise(function(resolve, reject) {
+            rp({
+                uri: utils.confdPort(api_server) + '/api/operations/get-package-endpoint',
+                method: 'POST',
+                headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, {
+                    'Authorization': req.get('Authorization')
+                }),
+                json: payload,
+                forever: constants.FOREVER_ON,
+                rejectUnauthorized: false,
+                resolveWithFullResponse: true
+            }).then(function(data) {
+                if (utils.validateResponse('FileManager.get', data.error, data, data.body, resolve, reject)) {
+                    var endpoint = null;
+                    var parsedEndpoint = null;
+                    try {
+                        endpoint = data.body.output.endpoint
+                    } catch(e) {
+                        console.log('Something went wrong with the FileManager.get data that was returned');
+                        reject({});
+                    }
+                    parsedEndpoint = URL.parse(endpoint);
+                    rp({
+                        uri: api_server + ':' + parsedEndpoint.port + parsedEndpoint.path,
+                        method: 'GET',
+                        headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, {
+                            'Authorization': req.get('Authorization')
+                        }),
+                        forever: constants.FOREVER_ON,
+                        rejectUnauthorized: false,
+                        resolveWithFullResponse: true
+                    }).then(function(data) {
+                        if (utils.validateResponse('FileManager.get', data.error, data, data.body, resolve, reject)) {
+                            resolve({
+                                statusCode: data.statusCode,
+                                data: data.body
+                            });
+                        }
+                    }).catch(function(err) {
+                        console.log('Failed to retrieve FileManager.list')
+                        resolve(err);
+                    })
+                }
+            })
+        })
+    }
+}
+FileManager.job = function(req) {
+    var api_server = req.query["api_server"];
+    var uri = utils.confdPort(api_server);
+    var url = '/api/operational/download-jobs';
+    var id = req.params['id'];
+    return new Promise(function(resolve, reject) {
+        request({
+            url: uri + url + '?deep',
+            method: 'GET',
+            headers: _.extend({}, constants.HTTP_HEADERS.accept.data, {
+                'Authorization': req.get('Authorization')
+            }),
+            forever: constants.FOREVER_ON,
+            rejectUnauthorized: false,
+        }, function(error, response, body) {
+            if (utils.validateResponse('restconfAPI.streams', error, response, body, resolve, reject)) {
+                var data = JSON.parse(response.body)['rw-pkg-mgmt:download-jobs'];
+                var returnData = [];
+                data && data.job.map(function(d) {
+                    if(d['package-id'] == id) {
+                        returnData.push(d)
+                    }
+                })
+                resolve({
+                    statusCode: response.statusCode,
+                    data: returnData
+                })
+            };
+        })
+    })
+}
+module.exports = {
+    Composer:Composer,
+    FileManager: FileManager
 };
-module.exports = Composer;