Adding OpenConfig YANG models.

Change-Id: I0a2fdd5826e80933cf4b9ae939ff3051acec02aa
diff --git a/models/openconfig/src/main/yang/optical-transport/openconfig-transport-line-protection.yang b/models/openconfig/src/main/yang/optical-transport/openconfig-transport-line-protection.yang
new file mode 100644
index 0000000..311b315
--- /dev/null
+++ b/models/openconfig/src/main/yang/optical-transport/openconfig-transport-line-protection.yang
@@ -0,0 +1,511 @@
+module openconfig-transport-line-protection {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/optical-transport-line-protection";
+
+  prefix "oc-line-protect";
+
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-platform { prefix oc-platform; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This model describes configuration and operational state data
+    for optical line protection elements, deployed as part of a
+    transport line system. An Automatic Protection Switch (APS)
+    is typically installed in the same device as the amplifiers
+    and wave-router, however an APS can also be a standalone
+    device. In both scenarios, it serves the same purpose of
+    providing protection using two dark fiber pairs to ensure the
+    amplifiers can still receive a signal if one of the two fiber
+    pairs is broken.";
+
+  //
+  // Automatic Protection Switch (APS) port details and directionality.
+  //                 _________
+  //                 |       |
+  //                 |       | <=== LINE-PRIMARY-IN
+  //                 |       |
+  // COMMON-IN  ===> |       | ===> LINE-PRIMARY-OUT
+  //                 |       |
+  //                 |  APS  |
+  // COMMON-OUT <=== |       |
+  //                 |       | <=== LINE-SECONDARY-IN
+  //                 |       |
+  //                 |       | ===> LINE-SECONDARY-OUT
+  //                 |_______|
+  //
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision "2017-07-08" {
+    description
+      "Support multiple OCMs, add monitor port type
+      and refs to hw ports, ";
+    reference "0.3.0";
+  }
+
+  revision "2017-03-28" {
+    description
+      "Added min/max/avg stats, status for media channels, OCM, APS";
+    reference "0.2.0";
+  }
+
+  revision "2016-08-05" {
+    description
+      "Initial public release";
+    reference "0.1.0";
+  }
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  identity APS_PATHS {
+    description
+      "Base identity for identifying the line paths on an
+      automatic protection switch";
+  }
+
+  identity PRIMARY {
+    base APS_PATHS;
+    description
+      "The primary line path connected to an automatic protection
+      switch port indicating the primary/preferred path";
+  }
+
+  identity SECONDARY {
+    base APS_PATHS;
+    description
+      "The secondary line path connected to an automatic protection
+      switch port indicating the secondary path";
+  }
+
+  // grouping statements
+
+  grouping aps-input-port-config {
+    description
+      "Grouping for config related to unidirectional automatic
+      protection switch input ports";
+
+    leaf enabled {
+      type boolean;
+      default "true";
+      description
+        "This leaf contains the configured, desired state of the
+        port. Disabling the port turns off alarm reporting for
+        the port";
+    }
+
+    leaf target-attenuation {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "Target attenuation of the variable optical attenuator
+        associated with the port in increments of 0.01 dB.";
+    }
+  }
+
+  grouping aps-output-port-config {
+    description
+      "Grouping for config related to unidirectional automatic
+      protection switch output ports";
+
+    leaf target-attenuation {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "Target attenuation of the variable optical attenuator
+        associated with the port in increments of 0.01 dB";
+    }
+  }
+
+  grouping aps-input-port-state {
+    description
+      "Grouping for state related to unidirectional automatic
+      protection switch input ports";
+
+    leaf attenuation {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "The attenuation of the variable optical attenuator
+        associated with the port in increments of 0.01 dB.";
+    }
+
+    container optical-power {
+      description
+        "The optical input power of this port in units of
+        0.01dBm. Optical input power represents the signal
+        traversing from an external destination into the module.
+        The power is measured before any attenuation. If avg/min/max
+        statistics are not supported, the target is expected to
+        just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+  }
+
+  grouping aps-output-port-state {
+    description
+      "Grouping for state related to unidirectional automatic
+      protection switch output ports";
+
+    leaf attenuation {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "The attenuation of the variable optical attenuator
+        associated with the port in increments of 0.01 dB";
+    }
+
+    container optical-power {
+      description
+        "The optical output power of this port in units of
+        0.01dBm. Optical output power represents the signal
+        traversing from the module to an external destination. The
+        power is measured after any attenuation. If avg/min/max
+        statistics are not supported, the target is expected to
+        just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+  }
+
+  grouping aps-ports {
+    description
+      "Top level grouping for automatic protection switch ports";
+
+    container line-primary-in {
+      description
+        "Container for information related to the line primary
+        input port";
+
+      container config {
+        description
+          "Configuration data for the line primary input port";
+
+        uses aps-input-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "State data for the line primary input port";
+
+        uses aps-input-port-config;
+        uses aps-input-port-state;
+      }
+
+    }
+
+    container line-primary-out {
+      description
+        "Container for information related to the line primary
+        output port";
+
+      container config {
+        description
+          "Configuration data for the line primary output port";
+
+        uses aps-output-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "State data for the line primary output port";
+
+        uses aps-output-port-config;
+        uses aps-output-port-state;
+      }
+    }
+
+    container line-secondary-in {
+      description
+        "Container for information related to the line secondary
+        input port";
+
+      container config {
+        description
+          "Configuration data for the line secondary input port";
+
+        uses aps-input-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "State data for the line secondary input port";
+
+        uses aps-input-port-config;
+        uses aps-input-port-state;
+      }
+    }
+
+    container line-secondary-out {
+      description
+        "Container for information related to the line secondary
+        output port";
+
+      container config {
+        description
+          "Configuration data for the line secondary output port";
+
+        uses aps-output-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "State data for the line secondary output port";
+
+        uses aps-output-port-config;
+        uses aps-output-port-state;
+      }
+    }
+
+    container common-in {
+      description
+        "Container for information related to the line common
+        input port";
+
+      container config {
+        description
+          "Configuration data for the line common input port";
+
+        uses aps-input-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "State data for the line common input port";
+
+        uses aps-input-port-config;
+        uses aps-input-port-state;
+      }
+    }
+
+    container common-output {
+      description
+        "Container for information related to the line common
+        output port";
+
+      container config {
+        description
+          "Configuration data for the line common output port";
+
+        uses aps-output-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "State data for the line common output port";
+
+        uses aps-output-port-config;
+        uses aps-output-port-state;
+      }
+    }
+  }
+
+  grouping aps-config {
+    description
+      "Configuration data for automatic protection switch modules";
+
+    leaf name {
+      type leafref {
+        path "/oc-platform:components/oc-platform:component/" +
+          "oc-platform:name";
+      }
+      description
+        "Reference to the component name (in the platform model)
+        corresponding to this automatic protection switch module
+        in the device";
+    }
+
+    leaf revertive {
+      type boolean;
+      description
+        "Revertive behavior of the module.
+        If True, then automatically revert after protection switch
+        once the fault is restored.";
+    }
+
+    leaf primary-switch-threshold {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dBm;
+      description
+        "The threshold at which the primary line port will switch to
+        the opposite line port in increments of 0.01 dBm. If the
+        hardware supports only one switch threshold for primary and
+        and secondary ports then it is recommended to set both
+        primary-switch-threshold and secondary-switch-threshold to
+        the same value to be explicit";
+    }
+
+    leaf primary-switch-hysteresis {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "The delta in 0.01 dB between the primary-switch-threshold
+        and the signal received before initiating a reversion in
+        order to prevent toggling between ports when an input
+        signal is very close to threshold. If the hardware supports
+        only one switch hysteresis for primary and secondary ports
+        then it is recommended to set both primary-switch-threshold
+        and secondary-switch-threshold to the same value to be
+        explicit";
+    }
+
+    leaf secondary-switch-threshold {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dBm;
+      description
+        "The threshold at which the secondary line port will switch to
+        the opposite line port in increments of 0.01 dBm. If the
+        hardware supports only one switch threshold for primary and
+        and secondary ports then it is recommended to set both
+        primary-switch-threshold and secondary-switch-threshold to
+        the same value to be explicit";
+    }
+
+    leaf secondary-switch-hysteresis {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "The delta in 0.01 dB between the secondary-switch-threshold
+        and the signal received before initiating a reversion in
+        order to prevent toggling between ports when an input
+        signal is very close to threshold. If the hardware supports
+        only one switch hysteresis for primary and secondary ports
+        then it is recommended to set both primary-switch-threshold
+        and secondary-switch-threshold to the same value to be
+        explicit";
+    }
+  }
+
+  grouping aps-state {
+    description
+      "State data for automatic protection switch modules";
+
+    leaf active-path {
+      type identityref {
+        base APS_PATHS;
+      }
+      description
+        "Indicates which line path on the automatic protection switch
+        is currently the active path connected to the common port";
+    }
+  }
+
+  grouping automatic-protection-switch-top {
+    description
+      "Top level grouping for automatic protection switch data";
+
+    container aps-modules {
+      description
+        "Enclosing container for list of automatic protection
+	       switch modules";
+
+      list aps-module {
+        key "name";
+        description
+          "List of automatic protection switch modules present
+          in the device";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the config name list key";
+        }
+
+        container config {
+          description
+            "Configuration data for an automatic protection
+            switch module";
+
+          uses aps-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for an automatic protection
+            switch module";
+
+          uses aps-config;
+          uses aps-state;
+        }
+
+        container ports {
+          description
+            "Top level grouping for automatic protection switch ports";
+
+          uses aps-ports;
+        }
+      }
+    }
+  }
+
+  grouping transport-line-protection-top {
+    description
+      "Top level grouping for transport line protection data";
+
+    container aps {
+      description
+        "Top level grouping for automatic protection switch data";
+
+      uses automatic-protection-switch-top;
+    }
+  }
+
+  // data definition statements
+
+  uses transport-line-protection-top;
+
+}