module org-openroadm-otn-otu-interfaces {
  namespace "http://org/openroadm/otn-otu-interfaces";
  prefix org-openroadm-otn-otu-interfaces;

  import org-openroadm-device {
    prefix org-openroadm-device;
  }
  import org-openroadm-interfaces {
    prefix openROADM-if;
  }
  import org-openroadm-maintenance-loopback {
    prefix org-openroadm-maint-loopback;
  }

  organization "Open ROADM MSA";
  contact
    "OpenROADM.org";
  description
    "YANG definitions for device facility otnotu interfaces.
     
     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
     AT&T Intellectual Property.  All other rights reserved.
     
     Redistribution and use in source and binary forms, with or without modification, 
     are permitted provided that the following conditions are met:
     
     * Redistributions of source code must retain the above copyright notice, this 
       list of conditions and the following disclaimer.
     * Redistributions in binary form must reproduce the above copyright notice, 
       this list of conditions and the following disclaimer in the documentation and/or 
       other materials provided with the distribution.
     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
       contributors may be used to endorse or promote products derived from this software 
       without specific prior written permission.
     
     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
     POSSIBILITY OF SUCH DAMAGE.
     
     Also contains code components extracted from IETF Interfaces.  These code components
     are copyrighted and licensed as follows:
     
     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
     All rights reserved.
     
     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
     publication of this document. Please review these documents carefully, as they
     describe your rights and restrictions with respect to this document. Code Components
     extracted from this document must include Simplified BSD License text as described in
     Section 4.e of the Trust Legal Provisions and are provided without warranty as
     described in the Simplified BSD License.";

  revision 2016-10-14 {
    description
      "Version 1.2";
  }

  identity otu-rate-identity {
    description
      "A unique rate identification of the OTU.";
  }

  identity OTU4 {
    base otu-rate-identity;
    description
      "Identity for an OTU4";
  }

  identity OTU3 {
    base otu-rate-identity;
    description
      "Identity for an OTU3";
  }

  identity OTU2 {
    base otu-rate-identity;
    description
      "Identity for an OTU2";
  }

  identity OTU2e {
    base otu-rate-identity;
    description
      "Identity for an OTU2e";
  }

  identity OTU1 {
    base otu-rate-identity;
    description
      "Identity for an OTU1";
  }

  identity OTU0 {
    base otu-rate-identity;
    description
      "Identity for an OTU0";
  }

  identity OTUflex {
    base otu-rate-identity;
    description
      "Identity for an OTUflex";
  }

  grouping otu-attributes {
    description
      "OTU attributes";
    leaf rate {
      type identityref {
        base otu-rate-identity;
      }
      description
        "rate identity of the OTU. 'identityref' is used
         to allow to extend for future higher rates";
    }
    leaf fec {
      type enumeration {
        enum "off" {
          value 0;
          description
            "fec off";
        }
        enum "rsfec" {
          value 1;
          description
            "rsfec";
        }
        enum "sdfeca1" {
          value 2;
          description
            "Clariphy SDFEC";
        }
        enum "efec" {
          value 3;
          description
            "G.975.1 I.4";
        }
        enum "ufec" {
          value 4;
          description
            "G.975.1 I.7";
        }
        enum "sdfec" {
          value 5;
          description
            "Soft decision FEC";
        }
        enum "sdfecb1" {
          value 6;
          description
            "SDFEC with SCFEC";
        }
        enum "scfec" {
          value 7;
          description
            "Stair case FEC";
        }
      }
      description
        "Forward Error Correction";
    }
  }

  grouping otu-container {
    container otu {
      description
        "Optical Channel Transport Unit (OTU)";
      uses otu-attributes;
      uses org-openroadm-maint-loopback:maint-loopback;
    }
  }

  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
    when "org-openroadm-device:type = 'openROADM-if:otnOtu'";
    uses otu-container;
  }
}
