+ relatedCollections: {"slivers": "slice", "slicePrivileges": "slice", "networks": "owner"},
+ foreignCollections: ["services", "sites"],
+ foreignFields: {"service": "services", "site": "sites"},
+ listFields: ["backend_status", "id", "name", "enabled", "description", "slice_url", "site", "max_slivers", "service"],
+ detailFields: ["backend_status", "name", "site", "enabled", "description", "slice_url", "max_slivers"],
+ inputType: {"enabled": "checkbox"},
+ modelName: "slicePlus",
+ collectionName: "slicesPlus",
+ defaults: extend_defaults("slice", {"network_ports": "", "site_allocation": []}),
+ validators: {"network_ports": ["portspec"]},
+ xosValidate: function(attrs, options) {
+ errors = XOSModel.prototype.xosValidate.call(this, attrs, options);
+ // validate that slice.name starts with site.login_base
+ site = attrs.site || this.site;
+ if ((site!=undefined) && (attrs.name!=undefined)) {
+ site = xos.sites.get(site);
+ if (attrs.name.indexOf(site.attributes.login_base+"_") != 0) {
+ errors = errors || {};
+ errors["name"] = "must start with " + site.attributes.login_base + "_";
+ }
+ }
+ return errors;
+ },
+ });
+
+ define_model(this, {urlRoot: TENANTVIEW_API,
+ modelName: "tenantview",
+ collectionName: "tenantview",
+ listFields: [],
+ detailFields: [],
+ });
+
+ /* by default, have slicePlus only fetch the slices the user can see */
+ this.slicesPlus.currentUserCanSee = true;
+
+ this.tenant = function() { return this.tenantview.models[0].attributes; };