blob: 2bce2cf53aa08bebccea3e38ba3ec62f5db803ac [file] [log] [blame]
module xos-core {
namespace "urn:onlab:xos:core";
prefix xos;
yang-version 1.1;
import ietf-yang-types { prefix yang; }
import ietf-inet-types { prefix inet; }
import xos-types { prefix xtype; }
organization
"Open Networking Lab (XOS) / Corenova Technologies";
contact
"Larry Peterson <llp@onlab.us>
Peter K. Lee <peter@corenova.com>";
description
"This module contains a collection of core models for XOS.
Copyright (c) 2016 ON.LAB and the persons identified as authors of
the code. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, is permitted pursuant to, and subject to the license
terms of the Apache License, Version 2.0 which accompanies this
distribution, and is available at
(http://www.apache.org/licenses/LICENSE-2.0).";
revision 2016-07-14 {
description "Initial revision.";
}
feature synchronizer {
description
"Enables configuration synchronization to the distributed store.";
}
identity kind;
identity generic { base kind; }
identity service { base kind; }
grouping attribute-pair {
leaf name { type string { length 0..128; } }
leaf value { type string; }
// don't need pointer back to service
}
grouping sync-record {
description "Synchronizer-specific properties for model records";
leaf created { type yang:date-and-time; }
leaf updated { type yang:date-and-time; }
leaf enacted { type yang:date-and-time; }
leaf policed { type yang:date-and-time; }
leaf writable { type boolean; default true; }
leaf locked { type boolean; default false; }
leaf deleted { type boolean; default false; }
leaf dirty {
config false;
type boolean;
default false;
}
container sync {
anydata register {
description "scratchpad used by the Observer";
}
leaf progress {
type enumeration {
enum provisioning {
value 0;
description "Provisioning in progress";
}
}
}
leaf disabled { type boolean; default false; }
leaf enforced { type boolean; default true; }
list policy {
// TODO: how are policy defined/enforced?
}
}
action diff {
when "../dirty == true";
description "retrieve diff of model state if dirty";
}
action save {
description "trigger save into data store via synchronizer";
}
}
grouping base-common {
leaf id {
type xtype:unique-identifier;
mandatory true;
}
leaf name {
type string {
length 0..255;
}
}
list attribute {
uses attribute-pair;
key name;
status deprecated;
reference "XOS: service-specific-attribute";
description "backwards-compatible attribute association";
}
leaf service-specific-id {
type xtype:unique-identifier;
mandatory true;
status deprecated;
}
container record {
if-feature synchronizer;
uses sync-record;
}
}
grouping tenant-root {
uses base-common {
refine 'name' {
description "Specify name of the TenantRoot";
}
}
description
"A Tenant Root is one of the things that can sit at the root of a chain
of tenancy. This object represents a node.";
list subscribed-tenant {
config false;
// not exactly clear how this is populated
}
}
grouping subscriber {
uses tenant-root {
refine kind { default subscriber; }
}
// seems we should have interesting attributes specific to subscriber?
}
grouping provider {
uses tenant-root {
refine kind { default provider; }
}
// seems we should have interesting attributes specific to provider?
}
grouping service {
uses base-common {
refine 'name' {
description "Name of the Service";
}
}
leaf kind {
type identityref {
base kind;
}
default generic;
}
leaf description {
type string {
length 0..254;
}
description "Description of the Service";
}
leaf version {
type string { length 0..30; }
description "Version of Service Definition";
}
leaf enabled { type boolean; default true; }
leaf published { type boolean; default true; }
container links {
leaf view { type inet:uri; }
leaf icon { type inet:uri; }
}
list keypair {
description "collection of public/private key pair(s)";
// should be a specific typedef for storing this content
leaf public { type string { length 0..1024; } }
leaf private { type string { length 0..1024; } }
}
list provider {
description
"Each entry represents a provider of the service. Each unique service
should augment this block with service specific attributes.";
key id;
uses xos:provider;
}
list subscriber {
description
"Each entry represents a subscriber of the service. Each unique service
should augment this block with service specific attributes.";
key id;
uses xos:subscriber;
notification subscriber-added;
notification subscriber-deleted;
}
list slice {
uses xos:slice;
}
// TOOD: need to better understand relationship between Service and Slice
action scale {
description "Adjust scale for slice(s)";
}
// TODO: need to better understand relationship between Service and VTN
}
grouping tenancy {
uses base-common;
choice provider {
description "only one type of provider node is valid.";
case service { leaf provider-service { type instance-identifier; } }
}
choice subscriber {
description "only one type of subscriber node is valid.";
case service { leaf subscriber-service { type instance-identifier; } }
case tenant { leaf subscriber-tenant { type instance-identifier; } }
case user { leaf subscriber-user { type instance-identifier; } }
case root { leaf subscriber-root { type instance-identifier; } }
case network { leaf subscriber-network { type instance-identifier; } }
}
leaf connect-method {
//when "../kind == 'static-tenant'";
type enumeration {
enum public { description "Public"; }
enum private { description "Private"; }
enum private-unidirectional { description "Private Uni-directional"; }
enum na { description "Not Applicable"; }
}
default na;
}
// TODO: should be able to deal with TenantWithContainer here
}
grouping slice {
description
"A slice is a logically centralized container for network and compute resources"
uses base-common;
leaf enabled {
type boolean;
default true;
}
leaf omf-friendly {
type boolean;
default false;
status deprecated;
}
leaf slice-url {
description "A URL describing the purpose of this slice";
type xtype:url-field;
// blank true;
}
leaf max-instances {
description "The maximum number of VMs that this slice is allowed to allocate";
type uint32;
}
leaf service {
description "The service that runs in this slice";
type xtype:service;
}
leaf network {
description "The network that the slice uses to connect to other slices and to the Internet.";
type string;
}
leaf exposed-ports {
description "The ports to be exposed for other slices to connect to";
type string;
}
leaf service-class {
type xtype:service-class;
status deprecated;
}
leaf creator {
type xtype:user;
}
leaf default-flavor {
type xtype:flavor;
}
leaf default-image {
type xtype:image;
}
leaf default-node {
type xtype:node;
}
leaf mount-data-sets {
type string {
length 0..256;
}
default "GenBank";
}
leaf default_isolation {
type string {
length 0..30;
}
default "vm";
}
leaf-list tags {
// below leafref is not valid since there is no /tag
type leafref {
path "/tag[id = current()/../id]/id";
}
}
}
/*** main configuration tree for XOS ***/
container api {
description
"The primary configuration interaction endpoint";
container service {
description
"placeholder endpoint for services to augment";
}
container tenant {
description
"placeholder endpoint for tenants to augment";
}
}
}