module cord-service-volt {
  namespace "urn:onlab:cord:service:volt";
  prefix volt;
  yang-version 1.1;

  import ietf-yang-types { prefix yang; }
  import xos-core { prefix xos; }

  organization
   "Open Networking Lab (CORD) / Corenova Technologies";

  contact
    "Larry Peterson <llp@onlab.us>
     Peter K. Lee <peter@corenova.com>";

  revision 2016-09-09 {
    description "Initial revision.";
  }

  identity volt-service { base xos:service; }

  feature onos-app-olt {
    description "System facility to configure VLAN tags on the OLT.";
  }
  feature onos-app-aaa {
    description "System facility to broker authentication between CPE and Radius server.";
  }

  typedef bandwidth {
    type xos:bandwidth;
    default 1000000000; // VOLT bandwidth default is 1Gbps
  }
  typedef subscriber-flow {
    type leafref {
      path "/volt:service/volt:provider/volt:port/volt:id";
    }
  }

  grouping devices-list {
    grouping olt-device {
      description
        "This grouping describes an OLT device which contains ODN link attachments.";
    
      leaf name {
        description "name of OLT device";
        type string {
          length 1..254;
        }
      }
      leaf mac { type yang:mac-address; mandatory true; }

      container uplink {
        description "Uplink description of the OLT device.";
        leaf network { type yang:uuid; }
        leaf tag {
          if-feature onos-app-olt;
          type xos:vlan;
          description
            "Represents S-Tag for instructing OLT to associate a VLAN tag for
             traffic originating from OLT device.";
        }
      }
    
      list link {
        description
          "Each link represents an ONU/ONT (Optical Network Termination) endpoint
           connection.";

        key serial;
        unique tag;
      
        leaf mac    { type yang:mac-address; mandatory true; }
        leaf serial { type string; mandatory true; }
        leaf active { type boolean; default false; }
        leaf tag {
          if-feature onos-app-olt;
          type xos:vlan;
          description
            "Represents C-Tag for instructing ONT to add/remove vlan tag for
             traffic within OLT device.";
        }
      }
    }
    list device {
      description
        "Each entry represents an OLT device.";
      key mac;
      //unique 'uplink/tag';
      uses olt-device;
    }
  }
  grouping provider {
    description
      "This grouping represents a VOLT agent/provider which manages multiple
       OLT devices. The VOLT agent provides aggregate abstraction of
       the entire PON as a sigle switch to the controller. Each port
       entry of the agent represents each ONU/ONT endpoint as a
       separate openflow port.";

    uses devices-list {
      description
        "Each entry represents an OLT device managed by the agent.";
    }
    list port {
      description
        "Each entry represents an ONU/ONT endpoint connected across OLT devices.";
      key id;
      leaf id {
        description "OpenFlow Port ID";
        type yang:uuid;
        mandatory true;
      }
      leaf link {
        type leafref {
          path '../../device/link/serial';
        }
        mandatory true;
      }
    }
    container radius {
      if-feature onos-app-aaa;
      // configuration for how to broker authentication requests
    }
  }
  grouping subscriber {
    description
      "This grouping represents a VOLT service subscriber along with
       references to ONU/ONT access endpoints used by the subscriber.";
    
    list tag {
      description
        "Each entry represents a unique combination of the OLT uplink VLAN
         (outer tag) and the ONU/ONT link VLAN (inner tag) connecting
         into the fabric for the subscriber.";
      
      key 'outer inner';
      leaf outer {
        type leafref {
          path "/volt:service/volt:provider/volt:device/volt:uplink/volt:tag";
        }
      }
      leaf inner {
        type leafref {
          path "/volt:service/volt:provider/volt:device/volt:link/volt:tag";
        }
      }
    }
    leaf-list flows {
      description
        "Each entry represents a unique openflow port ID that the subscriber
         uses to connect into the fabric from the VOLT service.";
      config false;
      type subscriber-flow;
    }
  }

  /*
   * Configuration data
   */
  container service {
    uses xos:service {
      refine kind { default volt-service; }
      augment "provider"   { uses volt:provider; }
      augment "subscriber" { uses volt:subscriber; }
    }
  }
}
