From 20e675a080cd2c530eeb213e0ccb99688cb8bdeb Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Tue, 30 Jul 2013 13:25:51 +0200 Subject: [PATCH] Various updates. --- src/api.js | 2 +- src/xo.js | 149 ++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 109 insertions(+), 42 deletions(-) diff --git a/src/api.js b/src/api.js index 84ebc8b..2fac2ea 100644 --- a/src/api.js +++ b/src/api.js @@ -558,7 +558,7 @@ Api.fn.xo = { Api.fn.xapi = { '__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; if (!(match = req.method.match(RE))) { diff --git a/src/xo.js b/src/xo.js index 0e34a39..ab1a036 100644 --- a/src/xo.js +++ b/src/xo.js @@ -31,14 +31,21 @@ var check = function () { }(); ////////////////////////////////////////////////////////////////////// -// Models +// Models & Collections. ////////////////////////////////////////////////////////////////////// var Server = Model.extend({ 'validate': function () { + // @todo }, }); +var Servers = Collection.extend({ + 'model': Server, +}); + +//-------------------------------------------------------------------- + // @todo We could also give a permission level to tokens (<= // user.permission). 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({ 'default': { '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. var Users = Collection.extend({ 'model': User, @@ -165,26 +154,74 @@ var Users = Collection.extend({ } }); +//-------------------------------------------------------------------- + +var Pool = Model.extend({}); + var Pools = Collection.extend({ 'model': Pool, }); +//-------------------------------------------------------------------- + +var Host = Model.extend({}); + var Hosts = Collection.extend({ 'model': Host, }); +//-------------------------------------------------------------------- + +var VM = Model.extend({}); + var VMs = Collection.extend({ 'model': VM, }); +//-------------------------------------------------------------------- + +var Network = Model.extend({}); + var Networks = Collection.extend({ 'model': Network, }); +//-------------------------------------------------------------------- + +var SR = Model.extend({}); + var SRs = Collection.extend({ '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({ 'model': VDI, }); @@ -233,7 +270,9 @@ function Xo() this.srs = new SRs(); 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. @@ -297,6 +336,9 @@ Xo.prototype.start = function () { 'SR', 'VDI', + 'PIF', + 'VIF', + // Associated classes (e.g. metrics). 'console', 'crashdump', @@ -309,10 +351,10 @@ Xo.prototype.start = function () { 'PBD', 'PCI', 'PGPU', - 'PIF', + 'PIF_metrics', 'VBD', 'VGPU', - 'VIF', + 'VIF_metrics', 'VM_appliance', 'VM_metrics', 'VM_guest_metrics', @@ -328,6 +370,9 @@ Xo.prototype.start = function () { srs, vdis, + pifs, + vifs, + consoles, crashdumps, dr_tasks, @@ -339,10 +384,10 @@ Xo.prototype.start = function () { pbds, pcis, pgpus, - pifs, + pif_metrics, vbds, vgpus, - vifs, + vif_metrics, vm_appliances, vm_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) { var prop = props[i]; var ref = model[prop]; model[prop] = _.isArray(ref) - ? _.map(ref, helper) // @todo Correctly handle objects. + ? map(ref, helper) : helper(ref); } }; @@ -393,6 +446,8 @@ Xo.prototype.start = function () { // @todo Messages are linked differently. messages = _.groupBy(messages, 'obj_uuid'); + // @todo Cast numerical/boolean properties to correct types. + // Resolves dependencies. // // 1. Associated objects are included. @@ -427,7 +482,7 @@ Xo.prototype.start = function () { resolve(host, pbds, 'PBDs', true); resolve(host, pcis, 'PCIs', true); resolve(host, pgpus, 'PGPUs', true); - resolve(host, pifs, 'PIFs', true); + resolve(host, pifs, 'PIFs'); resolve(host, vms, 'resident_VMs'); }); _.each(vms, function (vm) { @@ -447,7 +502,7 @@ Xo.prototype.start = function () { resolve(vm, consoles, 'consoles', true); resolve(vm, crashdumps, 'crash_dumps', 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, vmpps, 'protection_policy', true); resolve(vm, srs, 'suspend_SR'); @@ -466,7 +521,7 @@ Xo.prototype.start = function () { _.each(srs, function (sr) { // @todo Blobs? - resolve(sr, dr_tasks, 'introduced_by'); + resolve(sr, dr_tasks, 'introduced_by'); // @todo. resolve(sr, pbds, 'PBDs'); resolve(sr, vdis, 'VDIs'); }); @@ -481,6 +536,18 @@ Xo.prototype.start = function () { resolve(vdi, srs, 'SR'); 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. //