blob: ec74f51e75cd4b135a8259e84d3883eef9a7f200 [file] [log] [blame]
/*
*
* 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.
*
*/
var request = require('request');
var Promise = require('bluebird');
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 Cloud = require('./cloud_account/cloudAccount')
var Sdn = require('./sdn_account/sdnAccount')
var ConfigAgent = require('./config_agent/configAgent')
var Accounts = {};
var nameSpace = {
cloud: 'cloud',
sdn: 'sdn',
'config-agent': 'config-agent'
};
Accounts.get = function(req) {
return new Promise(function(resolve, reject) {
if (req.params.type || req.params.name) {
getAccount(req)
.then(function(data) {
resolve({
statusCode: 200,
data: Object.assign(data, {
type: req.params.type
})
});
}, function(reason) {
reject(reason);
})
} else {
getAll(req, resolve, reject);
}
});
function getAll(req, resolve, reject) {
Promise.all([
Cloud.get(req),
Sdn.get(req),
ConfigAgent.get(req)
]).then(function(result) {
var ReturnData = {
cloud: result[0],
sdn: result[1],
'config-agent': result[2]
};
ReturnData.cloud.type = 'cloud';
ReturnData.sdn.type = 'sdn';
ReturnData['config-agent'].type = 'config';
resolve({
statusCode: 200,
data: ReturnData
});
}, function(reason) {
reject(reason);
})
}
}
Accounts.update = updateAccount;
Accounts.create = updateAccount;
Accounts.delete = deleteAccount;
Accounts.refreshAccountConnectionStatus = refreshAccountConnectionStatus
function getAccount(req) {
return new Promise(function(resolve, reject) {
var self = this;
var api_server = req.query["api_server"];
var id = req.params.id || req.params.name;
var requestHeaders = {};
var type = nameSpace[req.params.type];
var url = utils.confdPort(api_server) + '/api/operational/' + type + '/account';
if (id) {
url += '/' + id;
}
_.extend(
requestHeaders,
id ? constants.HTTP_HEADERS.accept.data : constants.HTTP_HEADERS.accept.collection, {
'Authorization': req.get('Authorization')
}
);
request({
url: url + '?deep',
type: 'GET',
headers: requestHeaders,
forever: constants.FOREVER_ON,
rejectUnauthorized: false
},
function(error, response, body) {
var data;
var objKey = 'rw-' + type + ':account';
//SDN model doesn't follow convention
if (utils.validateResponse(type.toUpperCase() + '.get', error, response, body, resolve, reject)) {
try {
data = JSON.parse(response.body);
if (!id) {
data = data.collection;
}
data = data[objKey]
} catch (e) {
console.log('Problem with "' + type.toUpperCase() + '.get"', e);
var err = {};
err.statusCode = 500;
err.errorMessage = {
error: 'Problem with "' + type.toUpperCase() + '.get": ' + e
}
return reject(err);
}
return resolve({
statusCode: response.statusCode,
data: data
});
};
});
});
}
function updateAccount(req) {
var self = this;
var id = req.params.id || req.params.name;
var api_server = req.query["api_server"];
var type = nameSpace[req.params.type];
var data = req.body;
var requestHeaders = {};
var createData = {};
var url = utils.confdPort(api_server) + '/api/config/' + type;
var method = 'POST'
if (!id) {
createData = {
'account': Array.isArray(data) ? data : [data]
}
console.log('Creating ' + type + ' account: ', createData);
} else {
method = 'PUT';
url += '/account/' + id;
createData['rw-' + type + ':account'] = Array.isArray(data) ? data : [data];
}
return new Promise(function(resolve, reject) {
_.extend(requestHeaders,
constants.HTTP_HEADERS.accept.data,
constants.HTTP_HEADERS.content_type.data, {
'Authorization': req.get('Authorization')
});
request({
url: url,
method: method,
headers: requestHeaders,
forever: constants.FOREVER_ON,
rejectUnauthorized: false,
json: createData,
}, function(error, response, body) {
if (utils.validateResponse(type.toUpperCase() + '.' + method, error, response, body, resolve, reject)) {
return resolve({
statusCode: response.statusCode,
data: JSON.stringify(response.body)
});
};
});
})
}
function deleteAccount(req) {
var self = this;
var id = req.params.id || req.params.name;
var api_server = req.query["api_server"];
var type = nameSpace[req.params.type];
var data = req.body;
var requestHeaders = {};
var createData = {};
var url = utils.confdPort(api_server) + '/api/config/' + type;
url += '/account/' + id;
return new Promise(function(resolve, reject) {
_.extend(requestHeaders,
constants.HTTP_HEADERS.accept.data,
constants.HTTP_HEADERS.content_type.data, {
'Authorization': req.get('Authorization')
});
request({
url: url,
method: 'DELETE',
headers: requestHeaders,
forever: constants.FOREVER_ON,
rejectUnauthorized: false,
}, function(error, response, body) {
if (utils.validateResponse(type.toUpperCase() + '.DELETE', error, response, body, resolve, reject)) {
return resolve({
statusCode: response.statusCode,
data: JSON.stringify(response.body)
});
};
});
})
}
function refreshAccountConnectionStatus (req) {
var api_server = req.query['api_server'];
var Name = req.params.name;
var Type = req.params.type;
var jsonData = {
input: {}
};
var rpcInfo = {
sdn: {
label: 'sdn-account',
rpc: 'update-sdn-status'
},
'config': {
label: 'cfg-agent-account',
rpc: 'update-cfg-agent-status'
},
cloud: {
label: 'cloud-account',
rpc: 'update-cloud-status'
}
}
jsonData.input[rpcInfo[Type].label] = Name;
var headers = _.extend({},
constants.HTTP_HEADERS.accept.data,
constants.HTTP_HEADERS.content_type.data, {
'Authorization': req.get('Authorization')
}
);
return new Promise(function(resolve, reject) {
request({
uri: utils.confdPort(api_server) + '/api/operations/' + rpcInfo[Type].rpc,
method: 'POST',
headers: headers,
forever: constants.FOREVER_ON,
rejectUnauthorized: false,
json: jsonData
}, function(error, response, body) {
if (utils.validateResponse('RPC.refreshAccountConnectionStatus', error, response, body, resolve, reject)) {
resolve({
statusCode: response.statusCode,
data: body
});
}
});
}).catch(function(error) {
console.log('Error refreshing account info');
});
};
module.exports = Accounts;