module openconfig-channel-monitor {

  yang-version "1";

  // namespace
  namespace "http://openconfig.net/yang/channel-monitor";

  prefix "oc-chan-monitor";

  // import some basic types
  import openconfig-extensions { prefix oc-ext; }
  import openconfig-types { prefix oc-types; }
  import openconfig-interfaces { prefix oc-if; }
  import openconfig-platform { prefix oc-platform; }
  import openconfig-transport-types { prefix oc-opt-types; }


  // meta
  organization "OpenConfig working group";

  contact
    "OpenConfig working group
      www.openconfig.net";

  description
    "This model describes operational state data for an optical
    channel monitor (OCM) for optical transport line system
    elements such as wavelength routers (ROADMs) and amplifiers.";

  oc-ext:openconfig-version "0.3.0";

  revision "2017-07-08" {
    description
      "Support multiple OCMs, add 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-09-14" {
    description
      "Initial revision";
    reference "0.1.0";
  }



  // grouping statements

  grouping media-channel-port-config {
    description
      "Configuration data for a media channel source/dest port";

    leaf port-name {
      type oc-if:base-interface-ref;
      description
        "Reference to the corresponding node interface";
    }
  }

  grouping media-channel-port-state {
    description
      "Operational state data for a media channel source/dest port";
  }

  grouping media-channel-source-port-top {
    description
      "Top-level grouping for source of the media channel";

    container source {
      description
        "Top-level container for media channel source";

      container config {
        description
          "Configuration data for the media channel source";

        uses media-channel-port-config;
      }

      container state {

        config false;

        description
          "Operational state data for the media channel source";

        uses media-channel-port-config;
        uses media-channel-port-state;
      }
    }
  }

  grouping media-channel-dest-port-top {
    description
      "Top-level grouping for destination of the media channel";

    container dest {
      description
        "Top-level container for media channel destination";

      container config {
        description
          "Configuration data for the media channel destination";

        uses media-channel-port-config;
      }

      container state {

        config false;

        description
          "Operational state data for the media channel destination";

        uses media-channel-port-config;
        uses media-channel-port-state;
      }
    }
  }

  grouping media-channel-psd-state {
    description
      "Operational state data for the media channel PSD";

    leaf lower-frequency {
      type oc-opt-types:frequency-type;
      description
        "Lower frequency of the specified PSD";
    }

    leaf upper-frequency {
      type oc-opt-types:frequency-type;
      description
        "Upper frequency of the specified PSD";
    }

    leaf psd {
      type oc-types:ieeefloat32;
      units "nW/MHz";
      description
        "Power spectral density expressed in nanowatts per
        megahertz, nW/MHz.  These units allow the value to often
        be greater than 1.0.  It also avoids dealing with zero values
        for 0dBm.  For example, a 40GHz wide channel
        with 0dBm power would be:
          0dBm = 1mW = 10^6nW
          40GHz = 40,000MHz
          0dBm/40GHz = 10^6nW/40,000MHz = 1000/40 = 25";
    }
  }


  grouping media-channel-psd-top {
    description
      "Top-level grouping ";

    container channels {
      description
        "Enclosing container for the list of values describing
        the power spectral density distribution";

      list channel {
        key "lower-frequency upper-frequency";
        config false;
        description
          "List of tuples describing the PSD distribution";

        leaf lower-frequency {
          type leafref {
            path "../state/lower-frequency";
          }
          description
            "Reference to the list key";
        }

        leaf upper-frequency {
          type leafref {
            path "../state/upper-frequency";
          }
          description
            "Reference to the list key";
        }


        container state {

          config false;

          description
            "Operational state data for PSD";

          uses media-channel-psd-state;
        }
      }
    }
  }

  grouping media-channel-config {
    description
      "Configuration data for media channel definitions";

    leaf index {
      type uint32;
      description
        "Identifier for the defined media channel";
    }

    leaf lower-frequency {
      type oc-opt-types:frequency-type;
      description
        "The lower frequency for the spectrum defined by this media
        channel";
    }

    leaf upper-frequency {
      type oc-opt-types:frequency-type;
      description
        "The upper frequency for the spectrum defined by this media
        channel";
    }

  }

  grouping channel-monitor-config {
    description
      "Configuration data for the optical channel monitor";

    leaf name {
      type leafref {
        path "/oc-platform:components/oc-platform:component/" +
          "oc-platform:name";
      }
      description
        "Reference to system-supplied name of the port on the
        optical channel monitor (OCM). If this port is embedded
        in another card (i.e. an amplifier card) the device
        should still define a port representing the OCM even if
        it is internal and not physically present on the
        faceplate of the card";
    }

    leaf monitor-port {
      type leafref {
        path "/oc-platform:components/oc-platform:component/" +
          "oc-platform:name";
      }
      description
        "Reference to system-supplied name of the port that the
        channel monitor is physically connected to. This port
        will be of type MONITOR. This port is a tap off of the
        monitored-port and would be in the same card as the
        monitored port. If this port is embedded in another card
        (i.e. an amplifier card) the device should still define
        a port representing the monitor port if it is internal
        and not physically present on the faceplate of the card";
    }
  }

  grouping channel-monitor-state {
    description
      "Operational state data ";
  }

  grouping channel-monitor-top {
    description
      "Top-level grouping ";

    container channel-monitors {
      description
        "Top-level container for optical channel monitors";

      list channel-monitor {
        key "name";
        description
          "List of channel monitors, keyed by channel monitor name.";

        leaf name {
          type leafref {
            path "../config/name";
          }
          description
            "References the optical channel monitor name";
        }

        container config {
          description
            "Configuration data ";

          uses channel-monitor-config;
        }

        container state {

          config false;

          description
            "Operational state data ";

          uses channel-monitor-config;
          uses channel-monitor-state;
        }

        uses media-channel-psd-top;
      }
    }
  }

  // data definition statements

  uses channel-monitor-top;


  // augment statements

  // rpc statements

  // notification statements

}
