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;

}
