module openconfig-platform-port {

  yang-version "1";

  // namespace
  namespace "http://openconfig.net/yang/platform/port";

  prefix "oc-port";

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


  // meta
  organization "OpenConfig working group";

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

  description
    "This module defines data related to PORT components in the openconfig-platform model";

  oc-ext:openconfig-version "0.3.0";

  revision "2018-01-20" {
    description
      "Added augmentation for interface-to-port reference";
    reference "0.3.0";
  }

  revision "2017-11-17" {
    description
      "Corrected augmentation path for port data";
    reference "0.2.0";
  }

  revision "2016-10-24" {
    description
      "Initial revision";
    reference "0.1.0";
  }

  // extension statements

  // feature statements

  // identity statements

  // typedef statements

  // grouping statements

  grouping port-breakout-config {
    description
      "Configuration data for the port breakout mode";

    leaf num-channels {
      type uint8;
      description
        "Sets the number of channels to 'breakout' on a port
        capable of channelization";
    }

    leaf channel-speed {
      type identityref {
        base oc-eth:ETHERNET_SPEED;
      }
      description
        "Sets the channel speed on each channel -- the
        supported values are defined by the
        ETHERNET_SPEED identity";
    }
  }

  grouping port-breakout-state {
    description
      "Operational state data for the port breakout mode ";
  }

  grouping port-breakout-top {
    description
      "Top-level grouping for port breakout data";

    container breakout-mode {
      description
        "Top-level container for port breakout data";

      container config {
        description
          "Configuration data for port breakout";

        uses port-breakout-config;
      }

      container state {

        config false;

        description
          "Operational state data for port breakout";

        uses port-breakout-config;
        uses port-breakout-state;
      }
    }
  }

  // data definition statements

  // augment statements

  augment "/oc-platform:components/oc-platform:component/" +
    "oc-platform:port" {
    description
      "Adding port breakout data to physical platform data";

    uses port-breakout-top {
      when "./oc-platform:state/oc-platform:type = 'PORT'" {
        description
          "This data is valid only for PORT components";
      }
    }
  }

  augment "/oc-if:interfaces/oc-if:interface/oc-if:state" {
    description
      "Adds a reference from the base interface to the corresponding
      port component in the device inventory.";

    leaf hardware-port {
      type leafref {
        path "/oc-platform:components/oc-platform:component/" +
          "oc-platform:name";
      }
      description
        "For non-channelized interfaces, references the hardware port
        corresponding to the base interface.";
    }
  }

  // rpc statements

  // notification statements

}