#Core Models
CORD adopts a model-based design. Each service configured into a given CORD deployment has a service-specific model, but CORD also defines a set of core models. Service-specific models are anchored in these core models.
CORD's core models are defined by a set of xproto specifications. They are defined in their full detail in the source code. See: core.xproto. The following describes these core models -- along with the relationships (bindings) among them -- in words.
Service: Represents an elastically scalable, multi-tenant program, including the means to instantiate, control, and scale functionality.
In many CORD documents you will see mention of each service also having a "controller" but this effectively corresponds to the Service model itself, which is used to generate a "control interface" for the service. There is no explicit Controller model bound to a service. (There actually is a Controller model, but it represents the controller for a backend infrastructure service, such as OpenStack.)
ServiceInstance: Represents an instance of a service instantiated on behalf of a particular tenant. This is a generalization of the idea of a Compute-as-a-Service spinning up individual "compute instances," or using another common example, the ServiceInstance corresponding to a Storage Service might be called a "Volume" or a "Bucket." Confusingly, there are also instances of a Service model that represent different services, but this is a consequence of standard modeling terminology, whereas ServiceInstance is a core model in CORD (and yes, there are "instances of the ServiceInstance model").
ServiceDependency: Represents a dependency between a Subscriber Service on a Provider Service. The set of ServiceDependency and Service models defined in CORD collectively represent the edges and verticies of a Service Graph. (There is no explicit ServiceGraph model.) The dependency between a pair of services is parameterized by the method by which they are interconnected in the data plane. Connect methods include:
Slice: A distributed resource container that includes the compute and network resources that belong to (are used by) some Service.
Bound to a (possibly empty) set of Instances that provide compute resources for the Slice.
Bound to a set of Networks that connect the Slice's Instances to each other, and connect this Slice to the Slices of other Services.
Bound to a Flavor that defines how the Slice's Instances are scheduled.
Bound to an Image that boots in each of the Slice's Instances.
Instance: Represents a single compute instance associated with a Slice and instantiated on some physical Node. Each Instance is of some isolation type:
Network: A virtual network associated with a Slice. Networks are of one of the following types:
Image: A bootable image that runs in a virtual machine. Each Image implies a virtualization layer (e.g., Docker, KVM), so the latter need not be a distinct object.
Flavor: Represents a bundle of resources (e.g., disk, memory, and cores) allocated to an instance. Current flavors borrow from EC2.
Controller: Represents the binding of an object in the data model to a back-end element (e.g., an OpenStack head node). Includes the credentials required to invoke the backend resource.
Node: A physical server that can be virtualized and host Instances.
User: Represents an authenticated principal that is granted a set of privileges to invoke operations on a set of models, objects, and fields in the data model.
Privilege: Represents the right to perform a set of read, write, or grant operations on a set of models, objects, and fields.
Site: A logical grouping of Nodes that are co-located at the same geographic location, which also typically corresponds to the Nodes' location in the physical network.
Bound to a set of Users that are affiliated with the Site.
Bound to a set of Nodes located at the Site.
The typical use case involves one configuration of a CORD POD deployed at a single location. However, the underlying core includes allows for multi-site deployments.