Various updates.

This commit is contained in:
Julien Fontanet 2013-07-30 13:25:51 +02:00
parent 199d107914
commit 20e675a080
2 changed files with 109 additions and 42 deletions

View File

@ -558,7 +558,7 @@ Api.fn.xo = {
Api.fn.xapi = { Api.fn.xapi = {
'__catchAll': function (session, req) { '__catchAll': function (session, req) {
var RE = /^xapi\.(pool|host|vm|network|sr|vdi)\.getAll$/; var RE = /^xapi\.(pool|host|vm|network|sr|vdi|pif|vif)\.getAll$/;
var match; var match;
if (!(match = req.method.match(RE))) if (!(match = req.method.match(RE)))
{ {

149
src/xo.js
View File

@ -31,14 +31,21 @@ var check = function () {
}(); }();
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// Models // Models & Collections.
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
var Server = Model.extend({ var Server = Model.extend({
'validate': function () { 'validate': function () {
// @todo
}, },
}); });
var Servers = Collection.extend({
'model': Server,
});
//--------------------------------------------------------------------
// @todo We could also give a permission level to tokens (<= // @todo We could also give a permission level to tokens (<=
// user.permission). // user.permission).
var Token = Model.extend({ var Token = Model.extend({
@ -60,6 +67,19 @@ var Token = Model.extend({
}, },
}); });
var Tokens = Collection.extend({
'model': Token,
'generate': function (user_id) {
var self = this;
return Token.generate(user_id).then(function (token) {
return self.add(token);
});
}
});
//--------------------------------------------------------------------
var User = Model.extend({ var User = Model.extend({
'default': { 'default': {
'permission': 'none', 'permission': 'none',
@ -114,37 +134,6 @@ var User = Model.extend({
}, },
}); });
var Pool = Model.extend({});
var Host = Model.extend({});
var VM = Model.extend({});
var Network = Model.extend({});
var SR = Model.extend({});
var VDI = Model.extend({});
//////////////////////////////////////////////////////////////////////
// Collections
//////////////////////////////////////////////////////////////////////
var Servers = Collection.extend({
'model': Server,
});
var Tokens = Collection.extend({
'model': Token,
'generate': function (user_id) {
var self = this;
return Token.generate(user_id).then(function (token) {
return self.add(token);
});
}
});
// @todo handle email uniqueness. // @todo handle email uniqueness.
var Users = Collection.extend({ var Users = Collection.extend({
'model': User, 'model': User,
@ -165,26 +154,74 @@ var Users = Collection.extend({
} }
}); });
//--------------------------------------------------------------------
var Pool = Model.extend({});
var Pools = Collection.extend({ var Pools = Collection.extend({
'model': Pool, 'model': Pool,
}); });
//--------------------------------------------------------------------
var Host = Model.extend({});
var Hosts = Collection.extend({ var Hosts = Collection.extend({
'model': Host, 'model': Host,
}); });
//--------------------------------------------------------------------
var VM = Model.extend({});
var VMs = Collection.extend({ var VMs = Collection.extend({
'model': VM, 'model': VM,
}); });
//--------------------------------------------------------------------
var Network = Model.extend({});
var Networks = Collection.extend({ var Networks = Collection.extend({
'model': Network, 'model': Network,
}); });
//--------------------------------------------------------------------
var SR = Model.extend({});
var SRs = Collection.extend({ var SRs = Collection.extend({
'model': SR, 'model': SR,
}); });
//--------------------------------------------------------------------
var VDI = Model.extend({});
var VDIs = Collection.extend({
'model': VDI,
});
//--------------------------------------------------------------------
var PIF = Model.extend({});
var PIFs = Collection.extend({
'model': PIF,
});
//--------------------------------------------------------------------
var VIF = Model.extend({});
var VIFs = Collection.extend({
'model': VIF,
});
//////////////////////////////////////////////////////////////////////
// Collections
//////////////////////////////////////////////////////////////////////
var VDIs = Collection.extend({ var VDIs = Collection.extend({
'model': VDI, 'model': VDI,
}); });
@ -233,7 +270,9 @@ function Xo()
this.srs = new SRs(); this.srs = new SRs();
this.vdis = new VDIs(); this.vdis = new VDIs();
// Connecting classes: VIF & PIF, VBD & SR. // Connecting classes. (@todo VBD & SR).
this.vifs = new VIFs();
this.pifs = new PIFs();
// ------------------------------------- // -------------------------------------
// Temporary data for testing purposes. // Temporary data for testing purposes.
@ -297,6 +336,9 @@ Xo.prototype.start = function () {
'SR', 'SR',
'VDI', 'VDI',
'PIF',
'VIF',
// Associated classes (e.g. metrics). // Associated classes (e.g. metrics).
'console', 'console',
'crashdump', 'crashdump',
@ -309,10 +351,10 @@ Xo.prototype.start = function () {
'PBD', 'PBD',
'PCI', 'PCI',
'PGPU', 'PGPU',
'PIF', 'PIF_metrics',
'VBD', 'VBD',
'VGPU', 'VGPU',
'VIF', 'VIF_metrics',
'VM_appliance', 'VM_appliance',
'VM_metrics', 'VM_metrics',
'VM_guest_metrics', 'VM_guest_metrics',
@ -328,6 +370,9 @@ Xo.prototype.start = function () {
srs, srs,
vdis, vdis,
pifs,
vifs,
consoles, consoles,
crashdumps, crashdumps,
dr_tasks, dr_tasks,
@ -339,10 +384,10 @@ Xo.prototype.start = function () {
pbds, pbds,
pcis, pcis,
pgpus, pgpus,
pifs, pif_metrics,
vbds, vbds,
vgpus, vgpus,
vifs, vif_metrics,
vm_appliances, vm_appliances,
vm_metrics, vm_metrics,
vm_guest_metrics, vm_guest_metrics,
@ -379,13 +424,21 @@ Xo.prototype.start = function () {
}; };
} }
var map = function (list, iterator) {
var result = _.isArray(list) ? [] : {};
_.each(list, function (value, key) {
result[key] = iterator(value);
});
return result;
};
for (var i = 0, n = props.length; i < n; ++i) for (var i = 0, n = props.length; i < n; ++i)
{ {
var prop = props[i]; var prop = props[i];
var ref = model[prop]; var ref = model[prop];
model[prop] = _.isArray(ref) model[prop] = _.isArray(ref)
? _.map(ref, helper) // @todo Correctly handle objects. ? map(ref, helper)
: helper(ref); : helper(ref);
} }
}; };
@ -393,6 +446,8 @@ Xo.prototype.start = function () {
// @todo Messages are linked differently. // @todo Messages are linked differently.
messages = _.groupBy(messages, 'obj_uuid'); messages = _.groupBy(messages, 'obj_uuid');
// @todo Cast numerical/boolean properties to correct types.
// Resolves dependencies. // Resolves dependencies.
// //
// 1. Associated objects are included. // 1. Associated objects are included.
@ -427,7 +482,7 @@ Xo.prototype.start = function () {
resolve(host, pbds, 'PBDs', true); resolve(host, pbds, 'PBDs', true);
resolve(host, pcis, 'PCIs', true); resolve(host, pcis, 'PCIs', true);
resolve(host, pgpus, 'PGPUs', true); resolve(host, pgpus, 'PGPUs', true);
resolve(host, pifs, 'PIFs', true); resolve(host, pifs, 'PIFs');
resolve(host, vms, 'resident_VMs'); resolve(host, vms, 'resident_VMs');
}); });
_.each(vms, function (vm) { _.each(vms, function (vm) {
@ -447,7 +502,7 @@ Xo.prototype.start = function () {
resolve(vm, consoles, 'consoles', true); resolve(vm, consoles, 'consoles', true);
resolve(vm, crashdumps, 'crash_dumps', true); resolve(vm, crashdumps, 'crash_dumps', true);
resolve(vm, vm_guest_metrics, 'guest_metrics', true); resolve(vm, vm_guest_metrics, 'guest_metrics', true);
vm.messages = messages[vm.uuid] || null; // @todo vm.messages = messages[vm.uuid] || []; // @todo
resolve(vm, vm_metrics, 'metrics', true); resolve(vm, vm_metrics, 'metrics', true);
resolve(vm, vmpps, 'protection_policy', true); resolve(vm, vmpps, 'protection_policy', true);
resolve(vm, srs, 'suspend_SR'); resolve(vm, srs, 'suspend_SR');
@ -466,7 +521,7 @@ Xo.prototype.start = function () {
_.each(srs, function (sr) { _.each(srs, function (sr) {
// @todo Blobs? // @todo Blobs?
resolve(sr, dr_tasks, 'introduced_by'); resolve(sr, dr_tasks, 'introduced_by'); // @todo.
resolve(sr, pbds, 'PBDs'); resolve(sr, pbds, 'PBDs');
resolve(sr, vdis, 'VDIs'); resolve(sr, vdis, 'VDIs');
}); });
@ -481,6 +536,18 @@ Xo.prototype.start = function () {
resolve(vdi, srs, 'SR'); resolve(vdi, srs, 'SR');
resolve(vdi, vbds, 'VBDs'); resolve(vdi, vbds, 'VBDs');
}); });
_.each(pifs, function (pif) {
// @todo Bonds, tunnels & VLANs.
resolve(pif, hosts, 'host');
resolve(pif, pif_metrics, 'metrics');
resolve(pif, networks, 'network');
});
_.each(vifs, function (vif) {
resolve(vif, vif_metrics, 'metrics');
resolve(vif, networks, 'network');
resolve(vif, vms, 'VM');
});
// Normalizes the collections. // Normalizes the collections.
// //