Various updates.
This commit is contained in:
parent
426dbf4fff
commit
10edf58bf9
|
@ -20,7 +20,7 @@
|
||||||
"q": ">=0.9.6",
|
"q": ">=0.9.6",
|
||||||
"sync": ">=0.2.2",
|
"sync": ">=0.2.2",
|
||||||
"then-redis": ">=0.3.8",
|
"then-redis": ">=0.3.8",
|
||||||
"underscore": ">=1.4.4",
|
"underscore": ">=1.5.2",
|
||||||
"validator": ">=1.2.1",
|
"validator": ">=1.2.1",
|
||||||
"ws": ">=0.4.27",
|
"ws": ">=0.4.27",
|
||||||
"xmlrpc": ">=1.1.0"
|
"xmlrpc": ">=1.1.0"
|
||||||
|
|
35
src/api.js
35
src/api.js
|
@ -535,14 +535,21 @@ Api.fn.xo = {
|
||||||
// (and possibly heavy) computing.
|
// (and possibly heavy) computing.
|
||||||
|
|
||||||
var xo = this.xo;
|
var xo = this.xo;
|
||||||
|
var xobjs = xo.xobjs;
|
||||||
return Q.all([
|
return Q.all([
|
||||||
xo.hosts.get(),
|
xobjs.host.get(),
|
||||||
xo.vms.get({
|
xobjs.host_metrics.get().then(function (metrics) {
|
||||||
|
return _.indexBy(metrics, 'id');
|
||||||
|
}),
|
||||||
|
xobjs.VM.get({
|
||||||
'is_a_template': false,
|
'is_a_template': false,
|
||||||
'is_control_domain': false,
|
'is_control_domain': false,
|
||||||
}),
|
}),
|
||||||
xo.srs.count(),
|
xobjs.VM_metrics.get().then(function (metrics) {
|
||||||
]).spread(function (hosts, vms, n_srs) {
|
return _.indexBy(metrics, 'id');
|
||||||
|
}),
|
||||||
|
xobjs.SR.count(),
|
||||||
|
]).spread(function (hosts, host_metrics, vms, vms_metrics, n_srs) {
|
||||||
var running_vms = _.where(vms, {
|
var running_vms = _.where(vms, {
|
||||||
'power_state': 'Running',
|
'power_state': 'Running',
|
||||||
});
|
});
|
||||||
|
@ -551,16 +558,18 @@ Api.fn.xo = {
|
||||||
var total_memory = 0;
|
var total_memory = 0;
|
||||||
_.each(hosts, function (host) {
|
_.each(hosts, function (host) {
|
||||||
n_cpus += host.host_CPUs.length;
|
n_cpus += host.host_CPUs.length;
|
||||||
total_memory += +host.metrics.memory_total;
|
total_memory += +host_metrics[host.metrics].memory_total;
|
||||||
});
|
});
|
||||||
|
|
||||||
var n_vifs = 0;
|
var n_vifs = 0;
|
||||||
var n_vcpus = 0;
|
var n_vcpus = 0;
|
||||||
var used_memory = 0;
|
var used_memory = 0;
|
||||||
_.each(vms, function (vm) {
|
_.each(vms, function (vm) {
|
||||||
|
var metrics = vms_metrics[vm.metrics];
|
||||||
|
|
||||||
n_vifs += vm.VIFs.length;
|
n_vifs += vm.VIFs.length;
|
||||||
n_vcpus += +vm.metrics.VCPUs_number;
|
n_vcpus += +metrics.VCPUs_number;
|
||||||
used_memory += +vm.metrics.memory_actual;
|
used_memory += +metrics.memory_actual;
|
||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
@ -584,7 +593,7 @@ Api.fn.xo = {
|
||||||
throw Api.err.INVALID_PARAMS;
|
throw Api.err.INVALID_PARAMS;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.xo.pools.first(p_pool_id).then(function (pool) {
|
return this.xobjs.pool.first(p_pool_id).then(function (pool) {
|
||||||
return pool.get('sessionId');
|
return pool.get('sessionId');
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -599,7 +608,10 @@ Api.fn.xapi = {
|
||||||
throw Api.err.INVALID_METHOD;
|
throw Api.err.INVALID_METHOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.xo[match[1] +'s'].get();
|
var xobjs = this.xo.xobjs;
|
||||||
|
var collection = xobjs[match[1]] || xobjs[match[1].toUpperCase()];
|
||||||
|
|
||||||
|
return collection.get();
|
||||||
},
|
},
|
||||||
|
|
||||||
'vm': {
|
'vm': {
|
||||||
|
@ -611,9 +623,10 @@ Api.fn.xapi = {
|
||||||
}
|
}
|
||||||
|
|
||||||
var xo = this.xo;
|
var xo = this.xo;
|
||||||
|
var xobjs = xo.xobjs;
|
||||||
var vm;
|
var vm;
|
||||||
return this.checkPermission(session, 'write').then(function () {
|
return this.checkPermission(session, 'write').then(function () {
|
||||||
return xo.vms.first(p_id);
|
return xobjs.VM.first(p_id);
|
||||||
}).then(function (tmp) {
|
}).then(function (tmp) {
|
||||||
vm = tmp;
|
vm = tmp;
|
||||||
|
|
||||||
|
@ -622,7 +635,7 @@ Api.fn.xapi = {
|
||||||
throw Api.err.NO_SUCH_OBJECT;
|
throw Api.err.NO_SUCH_OBJECT;
|
||||||
}
|
}
|
||||||
|
|
||||||
return xo.pools.first(vm.get('pool_uuid'));
|
return xobjs.pool.first(vm.get('pool_uuid'));
|
||||||
}).then(function (pool) {
|
}).then(function (pool) {
|
||||||
var xapi = xo.connections[pool.get('uuid')];
|
var xapi = xo.connections[pool.get('uuid')];
|
||||||
|
|
||||||
|
|
94
src/xapi.js
94
src/xapi.js
|
@ -5,51 +5,79 @@ Q.longStackSupport = true;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
function Xapi(host)
|
function Xapi(host, username, password)
|
||||||
{
|
{
|
||||||
// Parent constructor.
|
// Parent constructor.
|
||||||
Xapi.super_.call(this);
|
Xapi.super_.call(this);
|
||||||
|
|
||||||
|
this.username = username;
|
||||||
|
this.password = password;
|
||||||
|
|
||||||
|
this.changeHost(host);
|
||||||
|
}
|
||||||
|
require('util').inherits(Xapi, require('events').EventEmitter);
|
||||||
|
|
||||||
|
Xapi.prototype.call = function (method) {
|
||||||
|
var args = arguments;
|
||||||
|
var params = Array.prototype.slice.call(arguments, 1);
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
return Q(self.sessionId).then(function (session_id) {
|
||||||
|
if (session_id)
|
||||||
|
{
|
||||||
|
params.unshift(session_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Q.ninvoke(self.xmlrpc, 'methodCall', method, params);
|
||||||
|
}).then(function (value) {
|
||||||
|
if ('Success' !== value.Status)
|
||||||
|
{
|
||||||
|
if ('Failure' === value.Status)
|
||||||
|
{
|
||||||
|
throw value.ErrorDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return value.Value;
|
||||||
|
}).fail(function (error) {
|
||||||
|
if ('HOST_IS_SLAVE' !== error[0])
|
||||||
|
{
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.changeHost(error[1]);
|
||||||
|
return self.call.apply(self, args);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
Xapi.prototype.changeHost = function (host) {
|
||||||
|
if (this.host === host)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.host = host;
|
||||||
this.xmlrpc = xmlrpc.createSecureClient({
|
this.xmlrpc = xmlrpc.createSecureClient({
|
||||||
hostname: host,
|
hostname: host,
|
||||||
port: '443',
|
port: '443',
|
||||||
rejectUnauthorized: false,
|
rejectUnauthorized: false,
|
||||||
}); // @todo Handle connection success/error.
|
}); // @todo Handle connection success/error.
|
||||||
}
|
|
||||||
require('util').inherits(Xapi, require('events').EventEmitter);
|
|
||||||
|
|
||||||
Xapi.prototype.call = function (method) {
|
|
||||||
var params = Array.prototype.slice.call(arguments, 1);
|
|
||||||
|
|
||||||
if (this.sessionId)
|
|
||||||
{
|
|
||||||
params.unshift(this.sessionId);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Q.ninvoke(this.xmlrpc, 'methodCall', method, params)
|
|
||||||
.then(function (value) {
|
|
||||||
if ('Success' !== value.Status)
|
|
||||||
{
|
|
||||||
if ('Failure' === value.Status)
|
|
||||||
{
|
|
||||||
throw value.ErrorDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw value;
|
|
||||||
}
|
|
||||||
|
|
||||||
return value.Value;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
Xapi.prototype.connect = function (username, password) {
|
|
||||||
var self = this;
|
var self = this;
|
||||||
|
self.sessionId = undefined;
|
||||||
|
self.sessionId = self.call(
|
||||||
|
'session.login_with_password',
|
||||||
|
self.username,
|
||||||
|
self.password
|
||||||
|
).then(function (session_id) {
|
||||||
|
self.sessionId = session_id;
|
||||||
|
|
||||||
return this.call('session.login_with_password', username, password)
|
return session_id;
|
||||||
.then(function (session_id) {
|
});
|
||||||
console.log(self.xmlrpc.options, session_id);
|
|
||||||
self.sessionId = session_id;
|
return self.sessionId;
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
40
src/xo.js
40
src/xo.js
|
@ -230,35 +230,27 @@ Xo.prototype.start = function (cfg) {
|
||||||
// When a server is added we should connect to it and fetch data.
|
// When a server is added we should connect to it and fetch data.
|
||||||
var connect = function (server) {
|
var connect = function (server) {
|
||||||
var pool_id = server.id;
|
var pool_id = server.id;
|
||||||
var xapi = new Xapi(server.host);
|
var xapi = new Xapi(server.host, server.username, server.password);
|
||||||
|
|
||||||
xapi.connect(server.username, server.password).then(function () {
|
var xclasses = xo.xclasses;
|
||||||
var xclasses = xo.xclasses;
|
var xobjs = xo.xobjs;
|
||||||
var xobjs = xo.xobjs;
|
|
||||||
|
|
||||||
return _.map(xclasses, function (xclass) {
|
return Q.all(_.map(xclasses, function (xclass) {
|
||||||
var collection = xo.xobjs[xclass];
|
var collection = xobjs[xclass];
|
||||||
var helper = function () {
|
|
||||||
return xapi.call(xclass +'.get_all_records').then(function (records) {
|
|
||||||
_.each(records, function (record) {
|
|
||||||
record.pool = pool_id;
|
|
||||||
});
|
|
||||||
|
|
||||||
return collection.add(records, {
|
return xapi.call(xclass +'.get_all_records').then(function (records) {
|
||||||
'update': true,
|
records = _.map(records, function (record, ref) {
|
||||||
});
|
record.id = ref;
|
||||||
}).fail(function (error) {
|
record.pool = pool_id;
|
||||||
if ('HOST_IS_SLAVE' === error[0])
|
return record;
|
||||||
{
|
});
|
||||||
server.host = error[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
throw error;
|
return collection.add(records, {
|
||||||
});
|
'replace': true,
|
||||||
}
|
});
|
||||||
});
|
});
|
||||||
}).fail(function (error) {
|
})).fail(function (error) {
|
||||||
console.log(error);
|
console.error(error);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
// Connect existing servers.
|
// Connect existing servers.
|
||||||
|
|
Loading…
Reference in New Issue