update from RIFT as of 696b75d2fe9fb046261b08c616f1bcf6c0b54a9b third try
[osm/UI.git] / skyquake / framework / core / modules / api / modelAPI.js
diff --git a/skyquake/framework/core/modules/api/modelAPI.js b/skyquake/framework/core/modules/api/modelAPI.js
new file mode 100644 (file)
index 0000000..1f14cb7
--- /dev/null
@@ -0,0 +1,359 @@
+/*
+ * 
+ *   Copyright 2016 RIFT.IO Inc
+ *
+ *   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.
+ *
+ */
+// DescriptorModelMeta API (NSD + VNFD)
+
+
+var Schema = {};
+var rp = require('request-promise');
+var Promise = require('promise');
+var constants = require('../../api_utils/constants');
+var utils = require('../../api_utils/utils');
+var _ = require('lodash');
+var cors = require('cors');
+var bodyParser = require('body-parser');
+var utils = require('../../api_utils/utils');
+var configuration = require('./configuration');
+
+var router = require('express').Router();
+
+
+router.use(bodyParser.json());
+router.use(cors());
+router.use(bodyParser.urlencoded({
+    extended: true
+}));
+
+router.get('/model', cors(), function (req, res) {
+    get(req).then(function (response) {
+        utils.sendSuccessResponse(response, res);
+    }, function (error) {
+        utils.sendErrorResponse(error, res);
+    });
+});
+
+router.patch('/model', cors(), function (req, res) {
+    update(req).then(function (response) {
+        utils.sendSuccessResponse(response, res);
+    }, function (error) {
+        utils.sendErrorResponse(error, res);
+    });
+});
+
+router.put('/model', cors(), function (req, res) {
+    add(req).then(function (response) {
+        utils.sendSuccessResponse(response, res);
+    }, function (error) {
+        utils.sendErrorResponse(error, res);
+    });
+});
+
+router.delete('/model', cors(), function (req, res) {
+    remove(req).then(function (response) {
+        utils.sendSuccessResponse(response, res);
+    }, function (error) {
+        utils.sendErrorResponse(error, res);
+    });
+});
+
+module.exports = {
+    getRouter: function () {
+        return router;
+    },
+    init: function () {}
+};
+
+get = function (req) {
+    var backend = configuration.getBackendAPI();
+    var modelPath = req.query['path'];
+    var requestHeaders = _.extend({}, constants.HTTP_HEADERS.accept.collection, {
+        'Authorization': req.session && req.session.authorization
+    })
+    return new Promise(function (resolve, reject) {
+        Promise.all([
+            rp({
+                uri: backend + '/config' + modelPath,
+                method: 'GET',
+                headers: requestHeaders,
+                forever: constants.FOREVER_ON,
+                rejectUnauthorized: false,
+                resolveWithFullResponse: true
+                // }),
+                // rp({
+                //     uri: utils.projectContextUrl(req, backend + '/api/operational' + modelPath),
+                //     method: 'GET',
+                //     headers: requestHeaders,
+                //     forever: constants.FOREVER_ON,
+                //     rejectUnauthorized: false,
+                //     resolveWithFullResponse: true
+            })
+        ]).then(function (results) {
+            var response = {
+                statusCode: results[0].statusCode || 200,
+                data: [null]
+            }
+            if (results[0].body && !results[0].error) {
+                var result = JSON.parse(results[0].body);
+                if (result.collection) {
+                    result = result.collection[Object.keys(result.collection)[0]];
+                    if (!result.length) {
+                        result = null;
+                    } else if (result.length === 1) {
+                        result = result[0];
+                    }
+                }
+                response.data = result;
+            }
+            resolve(response);
+
+        }).catch(function (error) {
+            var res = {};
+            console.log('Problem with model get', error);
+            res.statusCode = error.statusCode || 500;
+            res.errorMessage = {
+                error: 'Failed to get model: ' + error
+            };
+            reject(res);
+        });
+    });
+};
+
+add = function (req) {
+    var backend = configuration.getBackendAPI();
+    var modelPath = req.query['path'];
+    var targetProperty = modelPath.split('/').pop();
+    var newElement = {};
+    var data = {};
+    console.log(req.body);
+    _.forIn(req.body, function (value, key) {
+        if (_.isObject(value)) {
+            if (value.type === 'leaf_empty') {
+                if (value.data) {
+                    data[key] = ' ';
+                }
+            } else if (value.type === 'leaf_list') {
+                data[key] = value.data.add;
+            }
+        } else {
+            data[key] = value;
+        }
+    });
+    newElement[targetProperty] = [data];
+    console.log(newElement);
+    var target = backend + '/config' + modelPath;
+    var method = 'POST'
+    var requestHeaders = _.extend({},
+        constants.HTTP_HEADERS.accept.data, {
+            'Authorization': req.session && req.session.authorization
+        });
+    return new Promise(function (resolve, reject) {
+        rp({
+            uri: target,
+            method: method,
+            headers: requestHeaders,
+            forever: constants.FOREVER_ON,
+            json: newElement,
+            rejectUnauthorized: false,
+            resolveWithFullResponse: true
+        }).then(function (results) {
+            var response = {};
+            response.data = {
+                path: modelPath,
+                data: data
+            };
+            response.statusCode = constants.HTTP_RESPONSE_CODES.SUCCESS.OK;
+            console.log(response);
+            resolve(response);
+        }).catch(function (result) {
+            var response = {};
+            var error = {};
+            if (result.error['rpc-reply']) {
+                error.type = result.error['rpc-reply']['rpc-error']['error-tag'];
+                error.message = result.error['rpc-reply']['rpc-error']['error-message'];
+                error.rpcError = result.error['rpc-reply']['rpc-error']
+            } else {
+                error.type = 'api-error';
+                error.message = 'invalid api call';
+            }
+            console.log('Problem with model update', error);
+            response.statusCode = error.statusCode || 500;
+            response.error = error;
+            reject(response);
+        });
+    });
+};
+
+update = function (req) {
+    var backend = configuration.getBackendAPI();
+    var modelPath = req.query['path'];
+    var requestHeaders = _.extend({},
+        constants.HTTP_HEADERS.accept.data, {
+            'Authorization': req.session && req.session.authorization
+        });
+    var base = backend + '/config' + modelPath + '/';
+
+    function getUpdatePromise(name, value) {
+        var data = {};
+        data[name] = value;
+        return new Promise(function (resolve, reject) {
+            rp({
+                uri: base + name,
+                method: value ? 'PATCH' : 'DELETE',
+                headers: requestHeaders,
+                forever: constants.FOREVER_ON,
+                json: data,
+                rejectUnauthorized: false,
+                resolveWithFullResponse: true
+            }).then(function (result) {
+                resolve({
+                    element: name,
+                    success: true,
+                    value: value
+                });
+            }).catch(function (result) {
+                var error = {};
+                if (result.error['rpc-reply']) {
+                    error.type = result.error['rpc-reply']['rpc-error']['error-tag'];
+                    error.message = result.error['rpc-reply']['rpc-error']['error-message'];
+                    error.rpcError = result.error['rpc-reply']['rpc-error']
+                } else {
+                    error.type = 'api-error';
+                    error.message = 'invalid api call';
+                }
+                resolve({
+                    element: name,
+                    success: false,
+                    error: error,
+                    value: value
+                });
+            })
+        })
+    }
+
+    function getDeletePromise(targetProp, item) {
+        if (item) {
+            targetProp = targetProp + '/' + item;
+        }
+        return getUpdatePromise(targetProp, '');
+    }
+
+    var updates = [];
+    _.forIn(req.body, function (value, key) {
+        var data = {};
+        if (_.isObject(value)) {
+            if (value.type === 'leaf_list') {
+                _.forEach(value.data.remove, function (v) {
+                    updates.push(getDeletePromise(key))
+                })
+                _.forEach(value.data.add, function (v) {
+                    updates.push(getUpdatePromise(key, v))
+                })
+            } else if (value.type === 'leaf_empty') {
+                if (value.data) {
+                    updates.push(getUpdatePromise(key, ' '))
+                } else {
+                    updates.push(getDeletePromise(key))
+                }
+            }
+        } else {
+            updates.push(getUpdatePromise(key, value))
+        }
+    })
+
+    return new Promise(function (resolve, reject) {
+        Promise.all(updates).then(function (results) {
+            var response = {};
+            var output = {};
+            var hasError = false;
+            _.forEach(results, function (result) {
+                var record = {};
+                if (output[result.element]) {
+                    if (_.isArray(output[result.element].value)) {
+                        output[result.element].value.push(result.value);
+                    } else {
+                        output[result.element].value = [output[result.element].value, result.value];
+                    }
+                } else {
+                    output[result.element] = result;
+                }
+                hasError = hasError || !result.success
+            })
+            response.data = {
+                result: output,
+                hasError: hasError
+            };
+            response.statusCode = constants.HTTP_RESPONSE_CODES.SUCCESS.OK;
+            console.log(response);
+            resolve(response);
+        }).catch(function (result) {
+            var response = {};
+            var error = {};
+            if (result.error['rpc-reply']) {
+                error.type = result.error['rpc-reply']['rpc-error']['error-tag'];
+                error.message = result.error['rpc-reply']['rpc-error']['error-message'];
+                error.rpcError = result.error['rpc-reply']['rpc-error']
+            } else {
+                error.type = 'api-error';
+                error.message = 'invalid api call';
+            }
+            console.log('Problem with model update', error);
+            response.statusCode = error.statusCode || 500;
+            response.error = error;
+            reject(response);
+        });
+    });
+};
+
+remove = function (req) {
+    var backend = configuration.getBackendAPI();
+    var modelPath = req.query['path'];
+    var target = backend + '/config' + modelPath;
+    var requestHeaders = _.extend({},
+        constants.HTTP_HEADERS.accept.data,
+        constants.HTTP_HEADERS.content_type.data, {
+            'Authorization': req.session && req.session.authorization
+        })
+    return new Promise(function (resolve, reject) {
+        rp({
+            url: target,
+            method: 'DELETE',
+            headers: requestHeaders,
+            forever: constants.FOREVER_ON,
+            rejectUnauthorized: false,
+        }).then(function (response) {
+            return resolve({
+                statusCode: constants.HTTP_RESPONSE_CODES.SUCCESS.OK,
+                data: modelPath
+            });
+        }).catch(function (result) {
+            var response = {};
+            var error = {};
+            if (result.error['rpc-reply']) {
+                error.type = result.error['rpc-reply']['rpc-error']['error-tag'];
+                error.message = result.error['rpc-reply']['rpc-error']['error-message'];
+                error.rpcError = result.error['rpc-reply']['rpc-error']
+            } else {
+                error.type = 'api-error';
+                error.message = 'invalid api call';
+            }
+            console.log('Problem with model update', error);
+            response.statusCode = error.statusCode || 500;
+            response.error = error;
+            reject(response);
+        });
+    })
+}
\ No newline at end of file