option app_label = "core"; // use thi policy to allow access to admins only policy admin_policy < ctx.user.is_admin > message XOSBase { option skip_init = True; option custom_header = "xosbase_header"; option abstract = True; option custom_python=True; // field 1 is reserved for "id" required string created = 2 [content_type = "date", auto_now_add = True, bookkeeping_state = True, help_text = "Time this model was created"]; required string updated = 3 [default = "now()", content_type = "date", bookkeeping_state = True, help_text = "Time this model was changed by a non-synchronizer"]; optional string enacted = 4 [content_type = "date", blank = True, default = None, bookkeeping_state = True, help_text = "When synced, set to the timestamp of the data that was synced"]; optional string policed = 5 [content_type = "date", blank = True, default = None, bookkeeping_state = True, help_text = "When policed, set to the timestamp of the data that was policed"]; optional string backend_register = 6 [default = "{}", max_length = 1024, feedback_state = True]; required bool backend_need_delete = 7 [default = False, bookkeeping_state = True]; required bool backend_need_reap = 8 [default = False, bookkeeping_state = True]; required string backend_status = 9 [default = "Provisioning in progress", max_length = 1024, feedback_state = True]; required int32 backend_code = 10 [default = 0, feedback_state = True]; required bool deleted = 11 [default = False, bookkeeping_state = True]; required bool write_protect = 12 [default = False, bookkeeping_state = True]; required bool lazy_blocked = 13 [default = False, bookkeeping_state = True]; required bool no_sync = 14 [default = False, bookkeeping_state = True]; required bool no_policy = 15 [default = False, bookkeeping_state = True]; optional string policy_status = 16 [default = "Policy in process", max_length = 1024, feedback_state = True]; optional int32 policy_code = 17 [default = 0, feedback_state = True]; required string leaf_model_name = 18 [max_length = 1024, bookkeeping_state = True, help_text = "The most specialized model in this chain of inheritance, often defined by a service developer"]; required bool backend_need_delete_policy = 19 [default = False, bookkeeping_state = True, help_text = "True if delete model_policy must be run before object can be reaped"]; required bool xos_managed = 20 [default = True, help_text = "True if xos is responsible for creating/deleting this object", gui_hidden = True]; optional string backend_handle = 21 [max_length = 1024, feedback_state = True, blank=True, help_text = "Handle used by the backend to track this object", gui_hidden = True]; optional string changed_by_step = 22 [content_type = "date", blank = True, default = None, bookkeeping_state = True, gui_hidden = True, help_text = "Time this model was changed by a sync step"]; optional string changed_by_policy = 23 [content_type = "date", blank = True, default = None, bookkeeping_state = True, gui_hidden = True, help_text = "Time this model was changed by a model policy"]; } // The calling user represents the user being accessed, or is a site admin. policy user_policy < ctx.user.is_admin | ctx.user.id = obj.id | (exists Privilege: Privilege.accessor_id = ctx.user.id & Privilege.accessor_type = "User" & Privilege.permission = "role:admin" & Privilege.object_type = "Site" & Privilege.object_id = ctx.user.site.id) > message User::user_policy (AbstractBaseUser,PlModelMixIn) { option skip_django = True; option description = "An XOS User"; // field 1 is reserved for "id" required string email = 2 [db_index = True, max_length = 256, blank = False, tosca_key=True]; required string username = 3 [default = "Something", max_length = 256, content_type = "stripped", blank = False, db_index = False]; required string password = 4 [default = "Something", max_length = 256, blank = False, db_index = False]; optional string last_login = 5 [db_index = False, content_type = "date", blank = True]; required string firstname = 6 [max_length = 200, content_type = "stripped", blank = False, help_text = "person's given name", db_index = False]; required string lastname = 7 [max_length = 200, content_type = "stripped", blank = False, help_text = "person's surname", db_index = False]; optional string phone = 8 [max_length = 100, content_type = "stripped", blank = True, help_text = "phone number contact", db_index = False]; optional string user_url = 9 [db_index = False, max_length = 200, content_type = "url", blank = True]; required manytoone site->Site:users = 10:1001 [help_text = "Site this user will be homed too", db_index = True, blank = False]; optional string public_key = 11 [help_text = "Public key string", db_index = False, blank = True, text = True]; required bool is_active = 12 [default = True, db_index = False]; required bool is_admin = 13 [default = False, db_index = False]; required bool is_staff = 14 [default = True, db_index = False]; required bool is_readonly = 15 [default = False, db_index = False]; required bool is_registering = 16 [default = False, db_index = False]; required bool is_appuser = 17 [default = False, db_index = False]; optional string login_page = 18 [max_length = 200, content_type = "stripped", blank = True, help_text = "send this user to a specific page on login", db_index = False]; required string created = 19 [content_type = "date", auto_now_add = True, help_text = "Time this model was created", bookkeeping_state = True]; required string updated = 20 [default = "now()", content_type = "date", help_text = "Time this model was changed by a non-synchronizer"]; optional string enacted = 21 [content_type = "date", blank = True, default = None, help_text = "When synced, set to the timestamp of the data that was synced"]; optional string policed = 22 [content_type = "date", blank = True, default = None, help_text = "When policed, set to the timestamp of the data that was policed"]; required string backend_status = 23 [default = "Provisioning in progress", max_length = 1024, content_type = "stripped", blank = False, db_index = False]; required int32 backend_code = 24 [default = 0]; required bool backend_need_delete = 25 [default = False, db_index = False]; required bool backend_need_reap = 26 [default = False, db_index = False]; required bool deleted = 27 [default = False, db_index = False]; required bool write_protect = 28 [default = False, db_index = False]; required bool lazy_blocked = 29 [default = False, db_index = False]; required bool no_sync = 30 [default = False, db_index = False]; required bool no_policy = 31 [default = False, db_index = False]; required string timezone = 32 [default = "America/New_York", max_length = 100, blank = False, db_index = False]; optional string policy_status = 33 [default = "0 - Policy in process", max_length = 1024]; optional int32 policy_code = 34 [default = 0]; required string leaf_model_name = 35 [max_length = 1024, help_text = "The most specialized model in this chain of inheritance, often defined by a service developer", bookkeeping_state = True]; required bool backend_need_delete_policy = 36 [default = False, help_text = "True if delete model_policy must be run before object can be reaped"]; required bool xos_managed = 37 [default = True, help_text = "True if xos is responsible for creating/deleting this object", gui_hidden = True]; optional string backend_handle = 38 [max_length = 1024, feedback_state = True, blank=True, help_text = "Handle used by the backend to track this object", gui_hidden = True]; optional string changed_by_step = 39 [content_type = "date", blank = True, default = None, gui_hidden = True, help_text = "Time this model was changed by a sync step"]; optional string changed_by_policy = 40 [content_type = "date", blank = True, default = None, gui_hidden = True, help_text = "Time this model was changed by a model policy"]; } // A user may give a permission that he has to another user policy grant_policy < ctx.user.is_admin | exists Privilege:Privilege.object_type = obj.object_type & Privilege.object_id = obj.object_id & Privilege.accessor_type = "User" & Privilege.accessor_id = ctx.user.id & Privilege.permission = "role:admin" > message Privilege::grant_policy (XOSBase) { required int32 accessor_id = 1 [blank=False]; required string accessor_type = 2 [max_length=1024, blank = False]; required int32 object_id = 4 [blank=False]; required string object_type = 5 [max_length=1024, blank = False]; required string permission = 6 [default = "all", max_length=1024, tosca_key=True]; required string granted = 7 [content_type = "date", auto_now_add = True, max_length=1024]; optional string expires = 8 [content_type = "date", max_length=1024]; } message AddressPool (XOSBase) { option custom_python=True; required string name = 1 [db_index = False, max_length = 32, blank = False, unique = True, help_text="Name of this AddressPool"]; optional string addresses = 2 [db_index = False, blank = True, text = True, help_text="Space-separated list of available addresses"]; required string gateway_ip = 3 [max_length = 32, help_text="Gateway IP address for this AddressPool"]; required string gateway_mac = 4 [max_length = 32, help_text="Gateway MAC address for this AddressPool"]; required string cidr = 5 [max_length = 32, help_text="Subnet for this AddressPool"]; optional string inuse = 6 [db_index = False, blank = True, text = True, help_text="Space-separated list of inuse addresses"]; optional manytoone service->Service:addresspools = 7:1001 [db_index = True, blank = True, help_text="Service this AddressPool belongs to"]; } message BackupFile (XOSBase) { required string name = 1 [ help_text = "human-readable name of this backup file", max_length = 256]; required string uri = 2 [ help_text = "location of the backup file", max_length = 1024]; optional string checksum = 3 [ help_text = "checksum of backup file, formatted as algorithm:hash", max_length = 1024]; // status: // retrieved - file has been retrieved from URI // sent - file has been sent to URI // inprogress - file transfer is in progress optional string status = 4 [ help_text = "status of file transfer", choices = "(('retrieved', 'retrieved'), ('sent', 'sent'), ('inprogress', 'inprogress'))", feedback_state = True, max_length = 32]; optional string backend_filename = 5 [ help_text = "for internal use, local filename", feedback_state = True, max_length = 1024]; } message BackupOperation (XOSBase) { option custom_python=True; // `file` is required for restores. // `file` is optional for backups. If file is unspecified then XOS will create a backup file using // a default mechanism. optional manytoone file->BackupFile:operations = 1:1001 [ help_text = "File to backup to or restore from"]; required string component = 2 [ help_text = "component that this operation applies to", // XOS is currently the only allowed component choices = "(('xos', 'XOS'), )", default = "xos", max_length = 32]; required string operation = 3 [ help_text = "operation to perform", choices = "(('create', 'create'), ('restore', 'restore'), ('verify', 'verify'))", max_length = 32]; optional string status = 4 [ help_text = "status of operation", choices = "(('created', 'created'), ('restored', 'restored'), ('failed', 'failed'), ('inprogress', 'in progress'), ('orphaned', 'orphaned'))", feedback_state = True, max_length = 32]; optional string error_msg = 5 [ help_text = "error message from backup processor, if status is failure", feedback_state = True, max_length = 4096]; // `effective_date` may be different from `XOSBase.enacted` if a synchronizer is performing // an operation on an external component. `XOSBase.enacted` is always set to the time the // model is saved, which could differ from the time the backup or restore completed by // a short time. optional string effective_date = 6 [ help_text = "the time and date the operation was completed", content_type = "date", feedback_state = True]; optional string uuid = 7 [ help_text = "unique identifer of this request", bookkeeping_state = True, max_length = 80]; } message ComputeServiceInstance (ServiceInstance) { required manytoone slice->Slice:computeserviceinstances = 1:1001 [db_index = True, blank = False, help_text = "Slice that controls this ServiceInstance"]; required manytoone image->Image:computeserviceinstances = 2:1001 [db_index = True, blank = False, help_text = "Image used to instantiate this ServiceInstance"]; } // Everyone has read access // For write access, you have to be a site_admin policy site_policy < ctx.user.is_admin | (ctx.write_access -> exists Privilege: Privilege.object_type = "Site" & Privilege.object_id = obj.id & Privilege.accessor_id = ctx.user.id & Privilege.permission = "role:admin") > // If you can access (read or write) the site, you can also access its slices // Otherwise, you need an explicit privilege on the Slice (admin for write access) // or admin privilege on the associated site. policy slice_policy < ctx.user.is_admin | (*site_policy(site) & (ctx.user = obj.creator | (exists Privilege: Privilege.accessor_id = ctx.user.id & Privilege.accessor_type = "User" & Privilege.object_type = "Slice" & Privilege.object_id = obj.id & (ctx.write_access -> Privilege.permission = "role:admin")) ) | (exists Privilege: Privilege.accessor_id = ctx.user.id & Privilege.accessor_type = "User" & Privilege.object_type = "Slice" & Privilege.object_id = obj.id) | (exists Privilege: Privilege.accessor_id = ctx.user.id & Privilege.accessor_type = "User" & Privilege.object_type = "Site" & Privilege.object_id = obj.site.id & Privilege.permission = "role:admin") ) > message Flavor (XOSBase) { required string name = 1 [max_length = 32, content_type = "stripped", blank = False, help_text = "name of this flavor, as displayed to users", db_index = False, unique = True]; optional string description = 2 [db_index = False, max_length = 1024, content_type = "stripped"]; required string flavor = 3 [max_length = 32, content_type = "stripped", help_text = "flavor string used to configure deployments"]; } message Image (XOSBase) { required string name = 1 [db_index = False, max_length = 256, content_type = "stripped", blank = False, unique_with = "tag"]; required string kind = 2 [default = "vm", choices = "(('vm', 'Virtual Machine'), ('container', 'Container'))", max_length = 30, blank = False, db_index = False]; optional string disk_format = 3 [db_index = False, max_length = 256, content_type = "stripped", blank = True]; optional string container_format = 4 [db_index = False, max_length = 256, content_type = "stripped", blank = True]; optional string path = 5 [max_length = 256, content_type = "stripped", blank = True, help_text = "Path to image on local disk", db_index = False]; optional string tag = 6 [max_length = 256, content_type = "stripped", blank = True, help_text = "For Docker Images, tag of image", db_index = False]; } policy network_policy < *slice_policy(owner) > message Network::network_policy (XOSBase) { required string name = 1 [db_index = False, max_length = 32, blank = False, unique = True]; required manytoone template->NetworkTemplate:network = 2:1001 [db_index = True, blank = False]; optional string subnet = 3 [max_length = 32]; optional string start_ip = 4 [max_length = 32]; optional string end_ip = 5 [max_length = 32]; optional string ports = 6 [max_length = 1024]; optional string labels = 7 [max_length = 1024]; required manytoone owner->Slice:ownedNetworks = 8:1004 [help_text = "Slice that owns control of this Network", db_index = True, blank = False]; required bool permit_all_slices = 10 [default = False, db_index = False]; required bool autoconnect = 17 [help_text = "This network can be autoconnected to the slice that owns it", default = True, db_index = False]; optional manytomany permitted_slices->Slice/Network_permitted_slices:availableNetworks = 18:1005 []; } message NetworkParameter (XOSBase) { required manytoone parameter->NetworkParameterType:networkparameters = 1:1001 [help_text = "The type of the parameter", db_index = True, blank = False]; required string value = 2 [help_text = "The value of this parameter", max_length = 1024, db_index = False, blank = False]; required string content_type = 4 [max_length = 1024, content_type = "stripped", blank = False, help_text = "Content type id linked to this network parameter", db_index = False]; required uint32 object_id = 5 [db_index = False, blank = False, help_text = "Object linked to this NetworkParameter"]; } message NetworkParameterType (XOSBase) { required string name = 1 [help_text = "The name of this parameter", max_length = 128, db_index = True, blank = False, unique = True]; optional string description = 2 [max_length = 1024]; } policy network_slice_validator < (obj.slice in obj.network.permitted_slices.all()) | (obj.slice = obj.network.owner) | obj.network.permit_all_slices > policy network_slice_policy < *slice_policy(slice) & *network_policy(network) > message NetworkSlice::network_slice_policy (XOSBase) { option validators = "network_slice_validator:Slice {obj.slice.name} is not allowed to connect to networks {obj.network}"; required manytoone network->Network:networkslices = 1:1002 [db_index = True, blank = False, unique_with = "slice", tosca_key=True]; required manytoone slice->Slice:networkslices = 2:1006 [db_index = True, blank = False, tosca_key=True]; } message NetworkTemplate (XOSBase) { required string name = 1 [db_index = False, max_length = 32, blank = False, unique = True]; optional string description = 2 [max_length = 1024]; required string visibility = 4 [default = "private", choices = "(('public', 'public'), ('private', 'private'))", max_length = 30, blank = False, db_index = False]; required string translation = 5 [default = "none", choices = "(('none', 'none'), ('NAT', 'NAT'))", max_length = 30, blank = False, db_index = False]; optional string access = 6 [choices = "((None, 'None'), ('indirect', 'Indirect'), ('direct', 'Direct'))", max_length = 30, blank = True, help_text = "Advertise this network as a means for other slices to contact this slice", db_index = False]; optional string shared_network_name = 7 [db_index = False, max_length = 30, blank = True]; optional string shared_network_id = 8 [help_text = "Quantum network", max_length = 256, db_index = False, blank = True]; required string topology_kind = 9 [default = "bigswitch", choices = "(('bigswitch', 'BigSwitch'), ('physical', 'Physical'), ('custom', 'Custom'))", max_length = 30, blank = False, db_index = False]; optional string controller_kind = 10 [blank = True, max_length = 30, db_index = False, choices = "((None, 'None'), ('onos', 'ONOS'), ('custom', 'Custom'))"]; optional string vtn_kind = 11 [default = "PRIVATE", choices = "(('PRIVATE', 'Private'), ('PUBLIC', 'Public'), ('MANAGEMENT_LOCAL', 'Management Local'), ('MANAGEMENT_HOST', 'Management Host'), ('VSG', 'VSG'), ('ACCESS_AGENT', 'Access Agent'), ('FLAT', 'Flat'))", max_length = 30, blank = True, db_index = False]; } message Node (XOSBase) { required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of the Node", db_index = False, unique = True]; optional string bridgeId = 3 [max_length = 200, content_type = "stripped", blank = True, help_text = "Bridge Id", db_index = False]; optional string dataPlaneIntf = 4 [max_length = 200, content_type = "stripped", blank = True, help_text = "Dataplane Interface", db_index = False]; optional string dataPlaneIp = 5 [max_length = 200, content_type = "stripped", blank = True, help_text = "Dataplane Ip", db_index = False]; optional string hostManagementIface = 6 [max_length = 200, content_type = "stripped", blank = True, help_text = "Host Management Interface", db_index = False]; required manytoone site->Site:nodes = 7:1006 [db_index = True, blank = False, default=get_first_site]; } message NodeLabel (XOSBase) { option custom_python=True; required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "label name", db_index = False, unique = True]; optional manytomany node->Node/NodeLabel_node:nodelabels = 2:1002 []; } policy port_policy < *network_policy(network) > message Port::port_policy (XOSBase) { required manytoone network->Network:links = 1:1003 [db_index = True, blank = False, unique_with = "service_instance", help_text = "Network bound to this port"]; optional string ip = 3 [max_length = 39, content_type = "ip", blank = True, help_text = "Instance ip address", db_index = False]; optional string port_id = 4 [help_text = "Neutron port id", max_length = 256, db_index = False, blank = True]; optional string mac = 5 [help_text = "MAC address associated with this port", max_length = 256, db_index = False, blank = True]; required bool xos_created = 6 [default = False]; optional manytoone service_instance->ServiceInstance:ports = 7:1001 [db_index = True, blank = True, help_text = "ServiceInstance bound to this port"]; } message Principal (XOSBase) { required string name = 1 [max_length = 128, db_index = True, blank = False, help_text = "The name of this principal"]; required manytoone trust_domain->TrustDomain:principals = 2:1001 [db_index = True, blank = False, help_text = "Trust domain this principal resides in"]; } message Role (XOSBase) { required string role_type = 1 [db_index = False, max_length = 80, content_type = "stripped", blank = False]; optional string role = 2 [db_index = False, max_length = 80, content_type = "stripped", blank = True]; optional string description = 3 [max_length = 120, content_type = "stripped"]; } policy service_policy message Service (XOSBase,AttributeMixin) { option description = "A service managed by XOS"; option custom_python=True; optional string description = 1 [ help_text = "Description of Service", text = True]; required bool enabled = 2 [ help_text = "Whether or not service is Enabled", default = True, gui_hidden = True]; required string kind = 3 [ help_text = "Kind of service", choices="(('generic', 'Generic'), ('data', 'Data Plane'), ('control', 'Control Plane'), ('oss', 'OSS'))", content_type = "stripped", default = "generic", max_length = 30]; required string name = 4 [ help_text = "Unique name of service", content_type = "stripped", max_length = 30, unique = True]; optional string versionNumber = 5 [ help_text = "Version of Service Definition", content_type = "stripped", max_length = 30]; required bool published = 6 [ help_text = "True if this service should be published in XOS", default = True, gui_hidden = True]; // deprecated? optional string icon_url = 8 [ content_type = "stripped", gui_hidden = True, max_length = 1024]; // deprecated? optional string public_key = 9 [ help_text = "Public key string", gui_hidden = True, text = True]; // likely only used by VM-based services. deprecated? optional string private_key_fn = 10 [ help_text = "Filename of private key file, located within core container", content_type = "stripped", gui_hidden = True, max_length = 4096]; // likely only used by VM-based services. deprecated? optional string service_specific_id = 11 [ help_text = "Service-specific identifier, opaque to XOS core", content_type = "stripped", max_length = 30]; optional string service_specific_attribute = 12 [ help_text = "Service-specific string attribute, opaque to XOS core", gui_hidden = True, text = True]; optional manytoone site->Site:service = 13:1012 [ help_text = "The Site this Service belongs to", db_index = True]; } message ServicePort (XOSBase) { option description = "Exposes a port in a service outside of the pod, implementation depends on Compute Service"; required string name = 1 [ help_text = "Unique service port name", max_length = 128]; required int32 external_port = 2 [ help_text = "external port number"]; required int32 internal_port = 3 [ help_text = "internal port number"]; required string protocol = 4 [ help_text = "Protocol", default="TCP", max_length = 32]; required manytoone service->Service:serviceports = 5:1002 [ help_text = "The Service this ServicePort is associated with", db_index = True]; } message ServiceAttribute (XOSBase) { option description = "An (key, value) attribute associated with a Service"; required string name = 1 [ help_text = "Attribute Name", max_length = 128, unique_with="service"]; required string value = 2 [ help_text = "Attribute Value", text = True]; required manytoone service->Service:serviceattributes = 3:1003 [ help_text = "The Service this attribute is associated with", db_index = True]; } message ServiceDependency (XOSBase) { option description = "A dependency relation between a provider and a subscriber service"; required manytoone provider_service->Service:provided_dependencies = 1:1004 [ help_text = "The service that provides this dependency", db_index = True, tosca_key=True]; required manytoone subscriber_service->Service:subscribed_dependencies = 2:1005 [ help_text = "The services that subscribes to this dependency", db_index=True, tosca_key=True]; required string connect_method = 3 [ help_text = "method to connect the two services", choices = "(('none', 'None'), ('private', 'Private'), ('public', 'Public'))", default="none", max_length = 30]; } message Site::site_policy (XOSBase) { required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name for this Site", db_index = False, unique = True]; optional string site_url = 2 [max_length = 512, content_type = "url", blank = True, help_text = "Site's Home URL Page", db_index = False]; required bool enabled = 3 [help_text = "Status for this Site", default = True]; required bool hosts_nodes = 4 [help_text = "Indicates whether or not the site host nodes", default = True]; required bool hosts_users = 5 [help_text = "Indicates whether or not the site manages user accounts", default = True]; optional float longitude = 6 [db_index = False, blank = True]; optional float latitude = 7 [db_index = False, blank = True]; required string login_base = 8 [max_length = 50, content_type = "stripped", blank = False, help_text = "Prefix for Slices associated with this Site", db_index = False]; required bool is_public = 9 [help_text = "Indicates the visibility of this site to other members", default = True]; required string abbreviated_name = 10 [db_index = False, max_length = 80, content_type = "stripped", blank = False]; } policy slice_name_no_spaces < {{ ' ' not in obj.name }} > policy slice_has_creator < obj.creator > message Slice::slice_policy (XOSBase) { option validators = "slice_name_no_spaces:Slice name contains spaces, slice_has_creator:Slice has no creator"; option plural = "Slices"; option custom_python=True; required string name = 1 [max_length = 80, content_type = "stripped", blank = False, help_text = "The Name of the Slice", db_index = False, unique = True]; required bool enabled = 2 [help_text = "Status for this Slice", default = True]; optional string description = 4 [help_text = "High level description of the slice and expected activities", text = True]; required manytoone site->Site:slices = 6:1005 [help_text = "The Site this Slice belongs to", db_index = True, blank = False]; required int32 max_instances = 7 [default = 10, db_index = False, blank = False]; optional manytoone service->Service:slices = 8:1006 [db_index = True, blank = True]; optional string network = 9 [blank = True, max_length = 256, db_index = False, choices = "((None, 'Default'), ('host', 'Host'), ('bridged', 'Bridged'), ('noauto', 'No Automatic Networks'))"]; optional string exposed_ports = 10 [db_index = False, max_length = 256, blank = True]; optional manytoone creator->User:slices = 12:1004 [db_index = True]; optional manytoone default_flavor->Flavor:slices = 13:1002 [db_index = True, blank = True]; optional manytoone default_image->Image:slices = 14:1005 [db_index = True, blank = True]; optional manytoone default_node->Node:slices = 15:1003 [db_index = True, blank = True]; optional string mount_data_sets = 16 [default = "GenBank", max_length = 256, content_type = "stripped", blank = True, db_index = False]; required string default_isolation = 17 [default = "vm", choices = "(('vm', 'Virtual Machine'), ('container', 'Container'), ('container_vm', 'Container In VM'))", max_length = 30, blank = False, db_index = False]; optional manytoone trust_domain->TrustDomain:slices = 18:1002 [db_index = True, help_text = "Trust domain this slice resides in"]; optional manytoone principal->Principal:slices = 19:1001 [db_index = True, help_text = "Principal this slice may use to interact with other components"]; optional int32 controller_replica_count = 20 [default = 0, help_text = "Replica count, controller-dependent"]; optional string controller_kind = 21 [max_length = 256, content_type = "stripped", blank = True, help_text = "Type of controller, vim-dependent", db_index = False]; } policy tag_policy < ctx.user.is_admin > message Tag::tag_policy (XOSBase) { required manytoone service->Service:tags = 1:1007 [help_text = "The Service this Tag is associated with", db_index = True, blank = False]; required string name = 2 [help_text = "The name of this tag", max_length = 128, db_index = True, blank = False]; required string value = 3 [max_length = 1024, content_type = "stripped", blank = False, help_text = "The value of this tag", db_index = False]; required string content_type = 4 [max_length = 1024, content_type = "stripped", blank = False, help_text = "Content type id linked to this tag", db_index = False]; required uint32 object_id = 5 [db_index = False, blank = False, help_text = "Object linked to this tag"]; } message InterfaceType (XOSBase) { option description = "Defines an InterfaceType that may be used by Services to connect ServiceInstances"; required string name = 1 [ help_text = "Name of this interface type", content_type = "stripped", max_length = 200, unique_with = "direction"]; required string direction = 2 [ help_text = "Direction, either in or out", choices = "(('in', 'In'), ('out', 'Out'))", content_type = "stripped", max_length = 30]; } message ServiceInterface (XOSBase) { option description = "Describes the type of connection attached to a ServiceInstanceLink"; required manytoone service->Service:service_interfaces = 1:1008 [ help_text = "Service that this ServiceInterface is associated with", db_index = True, tosca_key=True]; required manytoone interface_type->InterfaceType:service_interfaces = 2:1001 [ help_text = "Interface type that describes this interface", db_index = True, tosca_key=True]; } message ServiceInstance (XOSBase, AttributeMixin) { option description = "A portion of a service broken up into a tenant-sized piece"; option custom_python=True; optional string name = 1 [ help_text = "Name of ServiceInstance", content_type = "stripped", max_length = 200]; required manytoone owner->Service:service_instances = 2:1009 [ help_text = "The Service that owns this ServiceInstance", db_index = True]; optional string service_specific_id = 3 [ help_text = "Service-specific identifier, opaque to the XOS core", content_type = "stripped", gui_hidden = True, max_length = 30]; optional string service_specific_attribute = 10 [ help_text = "Service-specific text attribute, opaque to the XOS core", gui_hidden = True, text = True]; optional uint32 link_deleted_count = 11 [ help_text = "Incremented each time a provided_link is deleted from this ServiceInstance", default = 0, gui_hidden = True]; optional manytoone master_serviceinstance->ServiceInstance:child_serviceinstances = 12:1002 [ help_text = "The master service instance that set this service instance up", gui_hidden = True]; } message ServiceInstanceLink (XOSBase) { option description = "A link in a chain between two ServiceInstances"; option custom_python=True; required manytoone provider_service_instance->ServiceInstance:provided_links = 1:1003 [ help_text = "Eastbound serviceinstance of this link", db_index = True, tosca_key=True]; optional manytoone provider_service_interface->ServiceInterface:provided_links = 2:1004 [ help_text = "Interface descrption of the eastbound linkage point", db_index = True]; optional manytoone subscriber_service_instance->ServiceInstance:subscribed_links = 3:1005 [ help_text = "Westbound ServiceInstance of this link", db_index = True]; optional manytoone subscriber_service->Service:subscribed_links = 4:1010 [ help_text = "Interface description of the westbound linkage point", db_index = True, tosca_key_one_of = subscriber_service_instance]; optional manytoone subscriber_network->Network:subscribed_links = 5:1004 [ help_text = "Alternative to subscriber_service_instance, if a Network model is the subscriber instead of a ServiceInstance", db_index = True, tosca_key_one_of=subscriber_service_instance]; } message ServiceInstanceAttribute (XOSBase) { option description = "A (key, value) attribute associated with a ServiceInstance"; required string name = 1 [ help_text = "Attribute Name", max_length = 128, unique_with = "service_instance"]; required string value = 2 [ help_text = "Attribute Value", text = True]; required manytoone service_instance->ServiceInstance:service_instance_attributes = 3:1006 [ help_text = "The Tenant this attribute is associated with", db_index = True]; } message TrustDomain (XOSBase) { required string name = 1 [max_length = 256, db_index = True, blank = False, help_text = "Name of this trust domain"]; required manytoone owner->Service:owned_trust_domains = 2:1011 [db_index = True, blank = False, help_text = "Service partioned by this trust domain"]; } message XOSCore (XOSBase) { option singular="XOSCore"; option plural="XOSCores"; required string name = 1 [default = "XOS", max_length = 200, content_type = "stripped", blank = False, help_text = "Name of XOS", db_index = False, unique = True]; required string maintenance_mode = 2 [ help_text = "Displays current maintenance mode of XOS", max_length = 256, default = "NORMAL", choices = "(('NORMAL', 'NORMAL'), ('DRAIN', 'DRAIN'), ('READONLY', 'READONLY'), ('OFFLINE', 'OFFLINE'))", tosca_key = True]; } message XOSGuiExtension::admin_policy (XOSBase) { option verbose_name="XOS GUI Extension"; option description="This model holds the instruction to load an extension in the GUI"; // option no_sync = True; // option no_policy = True; required string name = 1 [max_length = 200, content_type = "stripped", blank = False, help_text = "Name of the GUI Extensions", db_index = False, unique = True]; required string files = 2 [max_length = 1024, content_type = "stripped", blank = False, help_text = "List of comma separated file composing the view", db_index = False]; } message ServiceGraphConstraint (XOSBase) { option verbose_name="Graph Constraint"; option description="Define the position of the nodes in the service graph"; required string constraints = 1 [max_length = 1024, content_type = "stripped", help_text = "A composite array defining service positions in the graph, eg [volt, vsg, [address_manager, vrouter]]", tosca_key=True]; optional int32 priority = 2 [help_text = "The priority of the constraint, the one with highest priority will be used", default=0]; }