+ this.allCollectionNames = [];
+ this.allCollections = [];
+
+ /* Give an id, the name of a collection, and the name of a field for models
+ within that collection, lookup the id and return the value of the field.
+ */
+
+ this.idToName = function(id, collectionName, fieldName) {
+ linkedObject = xos[collectionName].get(id);
+ if (linkedObject == undefined) {
+ return "#" + id;
+ } else {
+ return linkedObject.attributes[fieldName];
+ }
+ };
+
+ /* defining the models
+
+ modelName - name of the model.
+
+ relatedCollections - collections which should be drawn as an inline
+ list when the detail view is displayed.
+ Format: <collection>:<collectionFieldName> where
+ <collectionFieldName> is the name of the field
+ in the collection that points back to the
+ collection in the detail view.
+
+ foreignCollections - collections which are used in idToName() calls
+ when presenting the data to the user. Used to
+ create a listento event. Somewhat
+ redundant with foreignFields.
+
+ foreignFields - <localFieldName>:<collection>. Used to
+ automatically map ids into humanReadableNames
+ when presenting data to the user.
+
+ m2mfields - <localFieldName>:<colleciton>. Used to
+ populate choices in picker lists. Simalar to
+ foreignFields.
+
+ listFields - fields to display in lists
+
+ detailFields - fields to display in detail views
+
+ addFields - fields to display in popup add windows
+
+ inputType - by default, "detailFields" will be displayed
+ as text input controls. This will let you display
+ a checkbox or a picker instead.
+ */
+
+ define_model(this, {urlRoot: SLIVER_API,
+ relatedCollections: {"networkSlivers": "sliver"},
+ foreignCollections: ["slices", "deployments", "images", "nodes", "users", "flavors"],
+ foreignFields: {"creator": "users", "image": "images", "node": "nodes", "deploymentNetwork": "deployments", "slice": "slices", "flavor": "flavors"},
+ modelName: "sliver",
+ listFields: ["backend_status", "id", "name", "instance_id", "instance_name", "slice", "deploymentNetwork", "image", "node", "flavor"],
+ addFields: ["slice", "deploymentNetwork", "flavor", "image", "node"],
+ detailFields: ["backend_status", "name", "instance_id", "instance_name", "slice", "deploymentNetwork", "flavor", "image", "node", "creator"],
+ preSave: function() { if (!this.attributes.name && this.attributes.slice) { this.attributes.name = xos.idToName(this.attributes.slice, "slices", "name"); } },
+ });
+
+ define_model(this, {urlRoot: SLICE_API,
+ 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: "slice",
+ xosValidate: function(attrs, options) {
+ errors = XOSModel.prototype.xosValidate(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: SLICEPRIVILEGE_API,
+ foreignCollections: ["slices", "users", "sliceRoles"],
+ modelName: "slicePrivilege",
+ foreignFields: {"user": "users", "slice": "slices", "role": "sliceRoles"},
+ listFields: ["backend_status", "id", "user", "slice", "role"],
+ detailFields: ["backend_status", "user", "slice", "role"],
+ });
+
+ define_model(this, {urlRoot: SLICEROLE_API,
+ modelName: "sliceRole",
+ listFields: ["backend_status", "id", "role"],
+ detailFields: ["backend_status", "role"],
+ });
+
+ define_model(this, {urlRoot: NODE_API,
+ foreignCollections: ["sites", "deployments"],
+ modelName: "node",
+ foreignFields: {"site": "sites", "deployment": "deployments"},
+ listFields: ["backend_status", "id", "name", "site", "deployment"],
+ detailFields: ["backend_status", "name", "site", "deployment"],
+ });
+
+ define_model(this, {urlRoot: SITE_API,
+ relatedCollections: {"users": "site", "slices": "site", "nodes": "site", "siteDeployments": "site"},
+ modelName: "site",
+ listFields: ["backend_status", "id", "name", "site_url", "enabled", "login_base", "is_public", "abbreviated_name"],
+ detailFields: ["backend_status", "name", "abbreviated_name", "url", "enabled", "is_public", "login_base"],
+ inputType: {"enabled": "checkbox", "is_public": "checkbox"},
+ });
+
+ define_model(this, {urlRoot: SITEDEPLOYMENT_API,
+ foreignCollections: ["sites", "deployments", "controllers"],
+ foreignFields: {"site": "sites", "deployment": "deployments", "controller": "controllers"},
+ modelName: "siteDeployment",
+ listFields: ["backend_status", "id", "site", "deployment", "controller", "availability_zone"],
+ detailFields: ["backend_status", "site", "deployment", "controller", "availability_zone"],
+ inputType: {"enabled": "checkbox", "is_public": "checkbox"},
+ });
+
+ define_model(this, {urlRoot: USER_API,
+ relatedCollections: {"slicePrivileges": "user", "slices": "owner"},
+ foreignCollections: ["sites"],
+ modelName: "user",
+ foreignFields: {"site": "sites"},
+ listFields: ["backend_status", "id", "username", "firstname", "lastname", "phone", "user_url", "site"],
+ detailFields: ["backend_status", "username", "firstname", "lastname", "phone", "user_url", "site"],
+ });
+
+ define_model(this, { urlRoot: DEPLOYMENT_API,
+ relatedCollections: {"nodes": "deployment", "slivers": "deploymentNetwork"},
+ m2mFields: {"flavors": "flavors", "sites": "sites", "images": "images"},
+ modelName: "deployment",
+ listFields: ["backend_status", "id", "name", "backend_type", "admin_tenant"],
+ detailFields: ["backend_status", "name", "backend_type", "admin_tenant", "flavors", "sites", "images"],
+ inputType: {"flavors": "picker", "sites": "picker", "images": "picker"},
+ });
+
+ define_model(this, {urlRoot: IMAGE_API,
+ model: this.image,
+ modelName: "image",
+ listFields: ["backend_status", "id", "name", "disk_format", "container_format", "path"],
+ detailFields: ["backend_status", "name", "disk_format", "admin_tenant"],
+ });
+
+ define_model(this, {urlRoot: NETWORKTEMPLATE_API,
+ modelName: "networkTemplate",
+ listFields: ["backend_status", "id", "name", "visibility", "translation", "shared_network_name", "shared_network_id"],
+ detailFields: ["backend_status", "name", "description", "visibility", "translation", "shared_network_name", "shared_network_id"],
+ });
+
+ define_model(this, {urlRoot: NETWORK_API,
+ relatedCollections: {"networkSlivers": "network"},
+ foreignCollections: ["slices", "networkTemplates"],
+ modelName: "network",
+ foreignFields: {"template": "networkTemplates", "owner": "slices"},
+ listFields: ["backend_status", "id", "name", "template", "ports", "labels", "owner"],
+ detailFields: ["backend_status", "name", "template", "ports", "labels", "owner"],
+ });
+
+ define_model(this, {urlRoot: NETWORKSLIVER_API,
+ modelName: "networkSliver",
+ foreignFields: {"network": "networks", "sliver": "slivers"},
+ listFields: ["backend_status", "id", "network", "sliver", "ip", "port_id"],
+ detailFields: ["backend_status", "network", "sliver", "ip", "port_id"],
+ });
+
+ define_model(this, {urlRoot: SERVICE_API,
+ modelName: "service",
+ listFields: ["backend_status", "id", "name", "enabled", "versionNumber", "published"],
+ detailFields: ["backend_status", "name", "description", "versionNumber"],
+ });
+
+ define_model(this, {urlRoot: FLAVOR_API,
+ modelName: "flavor",
+ m2mFields: {"deployments": "deployments"},
+ listFields: ["backend_status", "id", "name", "flavor", "order", "default"],
+ detailFields: ["backend_status", "name", "description", "flavor", "order", "default", "deployments"],
+ inputType: {"default": "checkbox", "deployments": "picker"},
+ });
+
+ define_model(this, {urlRoot: CONTROLLER_API,
+ modelName: "controller",
+ listFields: ["backend_status", "id", "name", "version", "backend_type"],
+ detailFields: ["backend_status", "name", "version", "backend_type", "auth_url", "admin_user", "admin_password", "admin_tenant"],
+ });
+
+ /* removed
+ define_model(this, {urlRoot: CONTROLLERSITEDEPLOYMENT_API,
+ modelName: "controllerSiteDeployment",
+ foreignCollections: ["site_deployments", "controllers"],
+ foreignFields: {"site_deployment": "siteDeployments", "controller": "controllers"},
+ listFields: ["backend_status", "id", "site_deployment", "controller", "tenant_id"],
+ detailFields: ["backend_status", "site_deployment", "controller", "tenant_id"],
+ });
+ */
+
+ /* DELETED in site-controller branch
+
+ define_model(this, {urlRoot: NETWORKDEPLOYMENT_API,
+ modelName: "networkDeployment",
+ foreignFields: {"network": "networks", "deployment": "deployments"},
+ listFields: ["backend_status", "id", "network", "deployment", "net_id"],
+ detailFields: ["backend_status", "network", "deployment", "net_id"],
+ });
+
+ define_model(this, {urlRoot: SLICEDEPLOYMENT_API,
+ foreignCollections: ["slices", "deployments"],
+ modelName: "sliceDeployment",
+ foreignFields: {"slice": "slices", "deployment": "deployments"},
+ listFields: ["backend_status", "id", "slice", "deployment", "tenant_id"],
+ detailFields: ["backend_status", "slice", "deployment", "tenant_id"],
+ });
+
+ define_model(this, {urlRoot: USERDEPLOYMENT_API,
+ foreignCollections: ["users","deployments"],
+ modelName: "userDeployment",
+ foreignFields: {"deployment": "deployments", "user": "users"},
+ listFields: ["backend_status", "id", "user", "deployment", "kuser_id"],
+ detailFields: ["backend_status", "user", "deployment", "kuser_id"],
+ });
+
+ END stuff deleted in site-controller branch */
+
+ /* not deleted, but obsolete since it has degenerated to a ManyToMany with no other fields
+
+ define_model(this, {urlRoot: IMAGEDEPLOYMENTS_API,
+ modelName: "imageDeployment",
+ foreignCollections: ["images", "deployments"],
+ listFields: ["backend_status", "id", "image", "deployment", "glance_image_id"],
+ detailFields: ["backend_status", "image", "deployment", "glance_image_id"],
+ });
+
+ */