3 * Copyright 2016 RIFT.IO Inc
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 // DescriptorModelMeta API (NSD + VNFD)
22 var rp
= require('request-promise');
23 var Promise
= require('promise');
24 var constants
= require('../../api_utils/constants');
25 var utils
= require('../../api_utils/utils');
26 var _
= require('lodash');
27 var cors
= require('cors');
28 var bodyParser
= require('body-parser');
29 var utils
= require('../../api_utils/utils');
30 var configuration
= require('./configuration');
32 var router
= require('express').Router();
35 router
.use(bodyParser
.json());
37 router
.use(bodyParser
.urlencoded({
41 router
.get('/model', cors(), function (req
, res
) {
42 get(req
).then(function (response
) {
43 utils
.sendSuccessResponse(response
, res
);
45 utils
.sendErrorResponse(error
, res
);
49 router
.patch('/model', cors(), function (req
, res
) {
50 update(req
).then(function (response
) {
51 utils
.sendSuccessResponse(response
, res
);
53 utils
.sendErrorResponse(error
, res
);
57 router
.put('/model', cors(), function (req
, res
) {
58 add(req
).then(function (response
) {
59 utils
.sendSuccessResponse(response
, res
);
61 utils
.sendErrorResponse(error
, res
);
65 router
.delete('/model', cors(), function (req
, res
) {
66 remove(req
).then(function (response
) {
67 utils
.sendSuccessResponse(response
, res
);
69 utils
.sendErrorResponse(error
, res
);
74 getRouter: function () {
80 get = function (req
) {
81 var backend
= configuration
.getBackendAPI();
82 var modelPath
= req
.query
['path'];
83 var requestHeaders
= _
.extend({}, constants
.HTTP_HEADERS
.accept
.collection
, {
84 'Authorization': req
.session
&& req
.session
.authorization
86 return new Promise(function (resolve
, reject
) {
89 uri
: backend
+ '/config' + modelPath
,
91 headers
: requestHeaders
,
92 forever
: constants
.FOREVER_ON
,
93 rejectUnauthorized
: false,
94 resolveWithFullResponse
: true
97 // uri: utils.projectContextUrl(req, backend + '/api/operational' + modelPath),
99 // headers: requestHeaders,
100 // forever: constants.FOREVER_ON,
101 // rejectUnauthorized: false,
102 // resolveWithFullResponse: true
104 ]).then(function (results
) {
106 statusCode
: results
[0].statusCode
|| 200,
109 if (results
[0].body
&& !results
[0].error
) {
110 var result
= JSON
.parse(results
[0].body
);
111 if (result
.collection
) {
112 result
= result
.collection
[Object
.keys(result
.collection
)[0]];
113 if (!result
.length
) {
115 } else if (result
.length
=== 1) {
119 response
.data
= result
;
123 }).catch(function (error
) {
125 console
.log('Problem with model get', error
);
126 res
.statusCode
= error
.statusCode
|| 500;
128 error
: 'Failed to get model: ' + error
135 add = function (req
) {
136 var backend
= configuration
.getBackendAPI();
137 var modelPath
= req
.query
['path'];
138 var targetProperty
= modelPath
.split('/').pop();
141 console
.log(req
.body
);
142 _
.forIn(req
.body
, function (value
, key
) {
143 if (_
.isObject(value
)) {
144 if (value
.type
=== 'leaf_empty') {
148 } else if (value
.type
=== 'leaf_list') {
149 data
[key
] = value
.data
.add
;
155 newElement
[targetProperty
] = [data
];
156 console
.log(newElement
);
157 var target
= backend
+ '/config' + modelPath
;
159 var requestHeaders
= _
.extend({},
160 constants
.HTTP_HEADERS
.accept
.data
, {
161 'Authorization': req
.session
&& req
.session
.authorization
163 return new Promise(function (resolve
, reject
) {
167 headers
: requestHeaders
,
168 forever
: constants
.FOREVER_ON
,
170 rejectUnauthorized
: false,
171 resolveWithFullResponse
: true
172 }).then(function (results
) {
178 response
.statusCode
= constants
.HTTP_RESPONSE_CODES
.SUCCESS
.OK
;
179 console
.log(response
);
181 }).catch(function (result
) {
184 if (result
.error
['rpc-reply']) {
185 error
.type
= result
.error
['rpc-reply']['rpc-error']['error-tag'];
186 error
.message
= result
.error
['rpc-reply']['rpc-error']['error-message'];
187 error
.rpcError
= result
.error
['rpc-reply']['rpc-error']
189 error
.type
= 'api-error';
190 error
.message
= 'invalid api call';
192 console
.log('Problem with model update', error
);
193 response
.statusCode
= error
.statusCode
|| 500;
194 response
.error
= error
;
200 update = function (req
) {
201 var backend
= configuration
.getBackendAPI();
202 var modelPath
= req
.query
['path'];
203 var requestHeaders
= _
.extend({},
204 constants
.HTTP_HEADERS
.accept
.data
, {
205 'Authorization': req
.session
&& req
.session
.authorization
207 var base
= backend
+ '/config' + modelPath
+ '/';
209 function getUpdatePromise(name
, value
) {
212 return new Promise(function (resolve
, reject
) {
215 method
: value
? 'PATCH' : 'DELETE',
216 headers
: requestHeaders
,
217 forever
: constants
.FOREVER_ON
,
219 rejectUnauthorized
: false,
220 resolveWithFullResponse
: true
221 }).then(function (result
) {
227 }).catch(function (result
) {
229 if (result
.error
['rpc-reply']) {
230 error
.type
= result
.error
['rpc-reply']['rpc-error']['error-tag'];
231 error
.message
= result
.error
['rpc-reply']['rpc-error']['error-message'];
232 error
.rpcError
= result
.error
['rpc-reply']['rpc-error']
234 error
.type
= 'api-error';
235 error
.message
= 'invalid api call';
247 function getDeletePromise(targetProp
, item
) {
249 targetProp
= targetProp
+ '/' + item
;
251 return getUpdatePromise(targetProp
, '');
255 _
.forIn(req
.body
, function (value
, key
) {
257 if (_
.isObject(value
)) {
258 if (value
.type
=== 'leaf_list') {
259 _
.forEach(value
.data
.remove
, function (v
) {
260 updates
.push(getDeletePromise(key
))
262 _
.forEach(value
.data
.add
, function (v
) {
263 updates
.push(getUpdatePromise(key
, v
))
265 } else if (value
.type
=== 'leaf_empty') {
267 updates
.push(getUpdatePromise(key
, ' '))
269 updates
.push(getDeletePromise(key
))
273 updates
.push(getUpdatePromise(key
, value
))
277 return new Promise(function (resolve
, reject
) {
278 Promise
.all(updates
).then(function (results
) {
281 var hasError
= false;
282 _
.forEach(results
, function (result
) {
284 if (output
[result
.element
]) {
285 if (_
.isArray(output
[result
.element
].value
)) {
286 output
[result
.element
].value
.push(result
.value
);
288 output
[result
.element
].value
= [output
[result
.element
].value
, result
.value
];
291 output
[result
.element
] = result
;
293 hasError
= hasError
|| !result
.success
299 response
.statusCode
= constants
.HTTP_RESPONSE_CODES
.SUCCESS
.OK
;
300 console
.log(response
);
302 }).catch(function (result
) {
305 if (result
.error
['rpc-reply']) {
306 error
.type
= result
.error
['rpc-reply']['rpc-error']['error-tag'];
307 error
.message
= result
.error
['rpc-reply']['rpc-error']['error-message'];
308 error
.rpcError
= result
.error
['rpc-reply']['rpc-error']
310 error
.type
= 'api-error';
311 error
.message
= 'invalid api call';
313 console
.log('Problem with model update', error
);
314 response
.statusCode
= error
.statusCode
|| 500;
315 response
.error
= error
;
321 remove = function (req
) {
322 var backend
= configuration
.getBackendAPI();
323 var modelPath
= req
.query
['path'];
324 var target
= backend
+ '/config' + modelPath
;
325 var requestHeaders
= _
.extend({},
326 constants
.HTTP_HEADERS
.accept
.data
,
327 constants
.HTTP_HEADERS
.content_type
.data
, {
328 'Authorization': req
.session
&& req
.session
.authorization
330 return new Promise(function (resolve
, reject
) {
334 headers
: requestHeaders
,
335 forever
: constants
.FOREVER_ON
,
336 rejectUnauthorized
: false,
337 }).then(function (response
) {
339 statusCode
: constants
.HTTP_RESPONSE_CODES
.SUCCESS
.OK
,
342 }).catch(function (result
) {
345 if (result
.error
['rpc-reply']) {
346 error
.type
= result
.error
['rpc-reply']['rpc-error']['error-tag'];
347 error
.message
= result
.error
['rpc-reply']['rpc-error']['error-message'];
348 error
.rpcError
= result
.error
['rpc-reply']['rpc-error']
350 error
.type
= 'api-error';
351 error
.message
= 'invalid api call';
353 console
.log('Problem with model update', error
);
354 response
.statusCode
= error
.statusCode
|| 500;
355 response
.error
= error
;