module xos-core {
  namespace "urn:onlab:xos:core";
  prefix xos;
  yang-version 1.1;

  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.";
  }
  
  import ietf-yang-types { prefix yang; }
  import ietf-inet-types { prefix inet; }

  feature synchronizer {
    description
      "Enables configuration synchronization to the distributed store.";
  }
  
  identity kind;
  identity generic    { base kind; }
  identity subscriber { base kind; }

  typedef unique-identifier {
    description "defines valid formats for external reference id";
    type union {
      type uint32 { range 1..max; }
      type yang:uuid;
      type inet:uri;
    }
  }

  grouping tenant-root {
    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.";

    leaf id {
      type unique-identifier;
      mandatory true;
    }
    leaf kind {
      type identityref {
        base kind;
      }
      default generic;
    }
    leaf name {
      type string {
        length 0..255;
      }
      description "Specify name of the TenantRoot";
    }

    leaf service-specific-attribute { type string; }
    leaf service-specific-id {
      type unique-identifier;
      mandatory true;
    }

    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?
  }

  /*** 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";
    }
  }
  
}
