Adding OpenConfig YANG models.

Change-Id: I0a2fdd5826e80933cf4b9ae939ff3051acec02aa
diff --git a/models/openconfig/src/main/yang/stp/openconfig-spanning-tree.yang b/models/openconfig/src/main/yang/stp/openconfig-spanning-tree.yang
new file mode 100644
index 0000000..3a70d5e
--- /dev/null
+++ b/models/openconfig/src/main/yang/stp/openconfig-spanning-tree.yang
@@ -0,0 +1,823 @@
+module openconfig-spanning-tree {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/spanning-tree";
+
+  prefix "oc-stp";
+
+  import openconfig-spanning-tree-types { prefix oc-stp-types; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-vlan-types { prefix oc-vlan-types; }
+  import openconfig-yang-types { prefix oc-yang; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines configuration and operational state data
+    for the spanning tree protocol.";
+
+  oc-ext:openconfig-version "0.2.0";
+
+  revision "2017-07-14" {
+    description
+      "Migrated to OpenConfig types; fixed missing applied state
+      in rapid-pvst";
+    reference "0.2.0";
+  }
+
+  revision "2016-10-03" {
+    description
+      "Initial public revision";
+    reference "0.1.0";
+  }
+
+
+  // identity statements
+
+
+  // grouping statements
+
+  grouping stp-interfaces-state {
+    description
+      "Grouping of STP operational data for bridge port";
+
+    leaf port-num {
+      type uint16;
+      description
+        "The port number of the bridge port";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPort";
+    }
+
+    leaf role {
+      type identityref {
+        base oc-stp-types:STP_PORT_ROLE;
+      }
+      description
+        "The current role of the bridge port";
+      reference
+        "IEEE8021-MSTP-MIB ieee8021MstpPortRole";
+    }
+
+    leaf port-state {
+      type identityref {
+        base oc-stp-types:STP_PORT_STATE;
+      }
+      description
+        "The current state of the bridge port";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortState";
+    }
+
+    leaf designated-root-priority {
+      type oc-stp-types:stp-bridge-priority-type;
+      description
+        "The bridge priority of the bridge recorded as the
+        root in the configuration BPDUs transmitted by the designated
+        bridge for the segment to which the port is attached";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedRoot";
+    }
+
+    leaf designated-root-address {
+      type oc-yang:mac-address;
+      description
+        "The bridge address of the bridge recorded as the
+        root in the configuration BPDUs transmitted by the designated
+        bridge for the segment to which the port is attached";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedRoot";
+    }
+
+    leaf designated-cost {
+      type uint32;
+      description
+        "The path cost of the Designated Port of the
+        segment connected to this port";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedCost";
+    }
+
+    leaf designated-bridge-priority {
+      type oc-stp-types:stp-bridge-priority-type;
+      description
+        "The bridge priority of the bridge that this port considers
+        to be the designated bridge for this port's segment.";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedBridge";
+    }
+
+    leaf designated-bridge-address {
+      type oc-yang:mac-address;
+      description
+        "The bridge address of the bridge that this port considers
+        to be the designated bridge for this port's segment.";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedBridge";
+    }
+
+    leaf designated-port-priority {
+      type oc-stp-types:stp-port-priority-type;
+      description
+        "The Port priority of the port on the Designated
+        Bridge for this port's segment, two octet string";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedPort";
+    }
+
+    leaf designated-port-num {
+      type uint16;
+      description
+        "The Port number of the port on the Designated
+        Bridge for this port's segment, two octet string";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedPort";
+    }
+
+    leaf forward-transisitions {
+      type oc-yang:counter64;
+      description
+        "The number of times this port has transitioned
+        from the Learning state to the Forwarding state";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortForwardTransitions";
+    }
+
+    container counters {
+      description
+        "The BPDU packet transmition statistics";
+
+      leaf bpdu-sent {
+        type oc-yang:counter64;
+        description
+          "The number of BPDU packet sent";
+      }
+
+      leaf bpdu-received {
+        type oc-yang:counter64;
+        description
+          "The number of BPDU packet received";
+      }
+    }
+  }
+
+  grouping stp-interfaces-config {
+    description
+      "Grouping of STP configuration for bridge port";
+
+    leaf name {
+      type oc-if:base-interface-ref;
+      description
+        "Reference to the STP ethernet interface";
+    }
+
+    leaf cost {
+      type uint32 {
+        range 1..200000000;
+      }
+      description
+        "The port's contribution, when it is the Root Port,
+        to the Root Path Cost for the Bridge";
+      reference
+        "IEEE 802.1D 17.13.11 PortPathCost";
+    }
+
+    leaf port-priority {
+      type oc-stp-types:stp-port-priority-type;
+      description
+        "The manageable component of the Port Identifier,
+        also known as the Port Priority";
+      reference
+        "IEEE 802.1D 17.13.10 Port Identifier Priority";
+    }
+  }
+
+  grouping stp-interfaces-top {
+    description
+      "Grouping of STP configuration and operation data for
+      bridge port";
+
+    container interfaces {
+      description
+        "Enclosing container for the list of interface references";
+
+      list interface {
+        key "name";
+        description
+          "List of interfaces on which STP is enable";
+
+      	leaf name {
+      	  type leafref {
+      	    path "../config/name";
+      	  }
+      	  description
+      	    "Reference to the list key";
+      	}
+
+      	container config {
+      	  description
+      	    "Configuration data for STP on each interface";
+
+      	  uses stp-interfaces-config;
+      	}
+
+      	container state {
+
+      	  config false;
+
+      	  description
+      	    "Operational state data for STP on each interface";
+
+      	  uses stp-interfaces-config;
+      	  uses stp-interfaces-state;
+      	}
+      }
+    }
+  }
+
+  grouping bridge-priority-config {
+    description
+      "Grouping for bridge priority";
+
+    leaf bridge-priority {
+      type oc-stp-types:stp-bridge-priority-type;
+      description
+        "The manageable component of the Bridge Identifier";
+      reference
+        "IEEE 802.1D 17.13.7 Bridge Identifier Priority";
+    }
+  }
+
+  grouping stp-common-state {
+    description
+      "Grouping for common STP operation data";
+
+    leaf bridge-address {
+      type oc-yang:mac-address;
+      description
+        "A unique 48-bit Universally Administered MAC Address
+        assigned to the bridge";
+      reference
+        "IEEE 802.1D 7.12.5 Unique identification of a bridge";
+    }
+
+    leaf designated-root-priority {
+      type oc-stp-types:stp-bridge-priority-type;
+      description
+        "The bridge priority of the root of the spanning
+        tree, as determined by the Spanning Tree Protocol,
+        as executed by this node";
+	    reference
+        "RFC4188 BRIDGE-MIB dot1dStpDesignatedRoot";
+    }
+
+    leaf designated-root-address {
+      type oc-yang:mac-address;
+      description
+        "The bridge address of the root of the spanning
+        tree, as determined by the Spanning Tree Protocol,
+        as executed by this node";
+      reference
+        "RFC4188 BRIDGE-MIB dot1dStpDesignatedRoot";
+    }
+
+    leaf root-port {
+      type uint16;
+      description
+        "The port number of the port which offers the lowest
+        cost path from this bridge to the root bridge";
+      reference
+        "RFC4188 BRIDGE-MIB dot1dStpRootPort";
+    }
+
+    leaf root-cost {
+      type uint32;
+      description
+        "The cost of the path to the root as seen from this bridge";
+      reference
+        "RFC4188 BRIDGE-MIB dot1dStpRootCost";
+    }
+
+    leaf hold-time {
+      type uint8;
+      description
+        "This time value determines the interval length
+        during which no more than two Configuration bridge
+        PDUs shall be transmitted by this node";
+      reference
+        "RFC4188 BRIDGE-MIB dot1dStpHoldTime";
+    }
+
+    leaf topology-changes {
+      type oc-yang:counter64;
+      description
+        "The total number of topology changes detected by
+        this bridge since the management entity was last
+        reset or initialized";
+      reference
+        "RFC4188 BRIDGE-MIB dot1dStpTopChanges";
+    }
+
+    leaf time-since-topology-change {
+      type oc-types:timeticks64;
+      description
+        "The time (in hundredths of a second) since the
+        last time a topology change was detected by the
+        bridge entity
+
+        The value is the timestamp in seconds relative to
+        the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+      reference
+        "RFC4188 BRIDGE-MIB dot1dStpTimeSinceTopologyChange";
+    }
+  }
+
+  grouping stp-timer-config {
+    description
+      "Grouping for common STP parameters";
+
+    leaf hello-time {
+      type uint8 {
+        range 1..10;
+      }
+      units "seconds";
+      description
+        "The interval between periodic transmissions of
+        configuration messages by designated ports";
+      reference
+        "IEEE 802.1D 17.13.6 Bridge Hello Time";
+    }
+
+    leaf max-age {
+      type uint8 {
+        range 6..40;
+      }
+      units "seconds";
+      description
+        "The maximum age of the information transmitted by the
+        bridge when it is the root bridge";
+      reference
+        "IEEE 802.1D 17.13.8 Bridge Max Age";
+    }
+
+    leaf forwarding-delay {
+      type uint8 {
+        range 4..30;
+      }
+      units "seconds";
+      description
+        "The delay used by STP bridges to transition root and
+        designated ports to forwarding";
+      reference
+        "IEEE 802.1D 17.13.5 Bridge Forward Delay";
+    }
+
+    leaf hold-count {
+      type uint8 {
+        range 1..10;
+      }
+      default 6;
+      description
+        "the maximum number of BPDUs per second that the
+         switch can send from an interface";
+      reference
+        "IEEE 802.1D 17.13.12 Transmit Hold Count";
+    }
+  }
+
+  grouping stp-rapid-pvst-config {
+    description
+      "Configuration parameters relating to rapid PVST";
+
+    leaf vlan-id {
+      type oc-vlan-types:vlan-id;
+      description
+        "Interface VLAN ID";
+    }
+  }
+
+  grouping stp-rapid-pvst-top {
+    description
+      "Top grouping for rapid per vlan spanning tree configuration
+      and operation data";
+
+    list vlan {
+      key "vlan-id";
+      description
+        "List of the vlans";
+
+      leaf vlan-id {
+        type leafref {
+          path "../config/vlan-id";
+        }
+        description
+          "Reference to the list key";
+      }
+
+      container config {
+      	description
+      	  "Configuration data for each vlan";
+
+        uses stp-rapid-pvst-config;
+        uses stp-timer-config;
+        uses bridge-priority-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational data for each vlan";
+
+        uses stp-rapid-pvst-config;
+        uses stp-timer-config;
+        uses bridge-priority-config;
+        uses stp-common-state;
+      }
+
+      uses stp-interfaces-top;
+    }
+  }
+
+  grouping mst-instance-config {
+    description
+      "Grouping for mstp instance configuration";
+
+    leaf mst-id {
+      type uint16 {
+        range "1..4094";
+      }
+      description
+        "In an MSTP Bridge, an MSTID, i.e., a value used to identify
+        a spanning tree (or MST) instance.";
+      reference
+        "IEEE8021-TC-MIB IEEE8021MstIdentifier";
+    }
+
+    leaf-list vlan {
+      type union {
+        type oc-vlan-types:vlan-id;
+        type oc-vlan-types:vlan-range;
+      }
+      description
+        "list of vlans mapped to the MST instance";
+    }
+  }
+
+  grouping mst-instance-top {
+    description
+      "Top level grouping for mstp instances";
+
+    list mst-instance {
+      key "mst-id";
+      description
+        "List of the mstp instances";
+
+      leaf mst-id {
+        type leafref {
+          path "../config/mst-id";
+        }
+        description
+          "Reference to the list key";
+      }
+
+      container config {
+        description
+          "Configuration data for MSTP instance";
+
+        uses mst-instance-config;
+        uses bridge-priority-config;
+      }
+
+      container state {
+        config false;
+
+        description
+          "Operational data for MSTP instance";
+
+        uses mst-instance-config;
+        uses bridge-priority-config;
+        uses stp-common-state;
+      }
+
+      uses stp-interfaces-top;
+    }
+  }
+
+  grouping mstp-config {
+    description
+      "Grouping for MSTP configuration data";
+
+    leaf name {
+      type string {
+        length "1..32";
+      }
+      description
+        "The Configuration Name in the MST Configuration Identifier";
+      reference
+        "IEEE 802.1Q 13.8 MST Configuration Identifier (MCID)";
+    }
+
+    leaf revision {
+      type uint32;
+      description
+        "The Revision Level in the MST Configuration Identifier";
+      reference
+        "IEEE 802.1Q 13.8 MST Configuration Identifier";
+    }
+
+    leaf max-hop {
+      type uint8 {
+        range 1..255;
+      }
+      description
+        "The max hop determines the number of bridges in an MST
+        region that a BPDU can traverse before it is discarded";
+      reference
+        "IEEE 802.1Q 13.26.4 BridgeTimes";
+    }
+
+    uses stp-timer-config;
+  }
+
+  grouping mstp-state {
+    description
+      "Operational state data for MSTP";
+  }
+
+  grouping stp-mstp-top {
+    description
+      "Top grouping for MSTP configuration and operation data";
+
+    container config {
+      description
+        "Configuration data for MSTP";
+
+      uses mstp-config;
+    }
+
+    container state {
+      config false;
+
+      description
+        "Operational data for MSTP";
+
+      uses mstp-config;
+      uses mstp-state;
+    }
+
+    container mst-instances {
+      description
+        "Configuration and operation data for MSTP instances";
+
+      uses mst-instance-top;
+    }
+  }
+
+  grouping stp-rstp-top {
+    description
+      "Top grouping for RSTP configuration and operation data";
+
+    container config {
+      description
+        "Configuration data for RSTP";
+
+      uses stp-timer-config;
+      uses bridge-priority-config;
+    }
+
+    container state {
+      config false;
+
+      description
+        "Operational state data for RSTP";
+
+      uses stp-timer-config;
+      uses bridge-priority-config;
+      uses stp-common-state;
+    }
+
+    uses stp-interfaces-top;
+  }
+
+  grouping stp-interface-common-config {
+    description
+      "Configuration data for interface specific STP features";
+
+    leaf name {
+      type oc-if:base-interface-ref;
+      description
+        "Reference to the STP Ethernet interface";
+    }
+
+    leaf edge-port {
+      type identityref {
+        base oc-stp-types:STP_EDGE_PORT;
+      }
+      description
+        "Configure the edge port state";
+    }
+
+    leaf link-type {
+      type oc-stp-types:stp-link-type;
+      description
+        "specifies the interface's link type";
+    }
+
+    leaf guard {
+      type oc-stp-types:stp-guard-type;
+      description
+        "Enable root guard or loop guard";
+    }
+
+    uses stp-bpdu-config;
+
+  }
+
+  grouping stp-interface-common-state {
+    description
+      "Operational state data for STP on interfaces";
+  }
+
+  grouping stp-interface-common-top {
+    description
+      "Top-level grouping for interface specific STP features";
+
+    list interface {
+      key "name";
+      description
+        "List of interfaces on which STP is enable";
+
+      leaf name {
+        type leafref {
+          path "../config/name";
+        }
+        description
+          "Reference to the list key";
+      }
+
+      container config {
+        description
+          "Configuration data for STP on each bridge port";
+
+        uses stp-interface-common-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for STP on each bridge port";
+
+        uses stp-interface-common-config;
+        uses stp-interface-common-state;
+      }
+    }
+  }
+
+  grouping stp-bpdu-config {
+    description
+      "Grouping for STP BPDU configuration";
+
+    leaf bpdu-guard {
+      type boolean;
+      description
+        "Enable edge port BPDU guard";
+    }
+
+    leaf bpdu-filter {
+      type boolean;
+      description
+        "Enable edge port BPDU filter";
+    }
+  }
+
+  grouping stp-global-config {
+    description
+      "Global spanning tree configuration";
+
+    leaf-list enabled-protocol {
+      type identityref {
+        base oc-stp-types:STP_PROTOCOL;
+      }
+      description
+        "List of the spanning tree protocols enabled on the
+        device";
+    }
+
+    leaf bridge-assurance {
+      type boolean;
+      description
+        "Enable bridge assurance to protect against unidirectional
+        link failure";
+    }
+
+    leaf etherchannel-misconfig-guard {
+      type boolean;
+      description
+        "EtherChannel guard detects a misconfigured EtherChannel
+        when interfaces on the switch are configured as an
+        EtherChannel while interfaces on the other device are not
+        or when not all the interfaces on the other device are in
+        the same EtherChannel.";
+    }
+
+    leaf bpduguard-timeout-recovery {
+      type uint8;
+      units "seconds";
+      description
+        "Amount of time, in seconds, the interface receiving BPDUs
+        is disabled. Once the timeout expires, the interface is
+        brought back into service.";
+    }
+
+    leaf loop-guard {
+      type boolean;
+      description
+        "The loop guard default setting for the bridge";
+    }
+
+    uses stp-bpdu-config;
+
+  }
+
+  grouping stp-global-state {
+    description
+      "Global operational state for STP";
+  }
+
+  grouping stp-global-base {
+    description
+      "Grouping for global spanning tree data";
+
+    container config {
+      description
+        "Global spanning tree configuration";
+      uses stp-global-config;
+    }
+
+    container state {
+      config false;
+
+      description
+        "Global spanning tree state";
+      uses stp-global-config;
+      uses stp-global-state;
+    }
+  }
+
+  grouping stp-top {
+    description
+      "Top-level grouping for spanning-tree model";
+
+    container stp {
+      description
+        "Top-level container for spanning tree configuration and
+        state data";
+
+      container global {
+        description
+          "Global configuration and state data";
+
+        uses stp-global-base;
+      }
+
+      container rstp {
+
+        description
+          "Rapid Spanning-tree protocol configuration and operation
+          data";
+
+        uses stp-rstp-top;
+      }
+
+      container mstp {
+        description
+          "Multi Spanning-tree protocol configuration and operation
+          data";
+
+        uses stp-mstp-top;
+      }
+
+      container rapid-pvst {
+      	description
+      	  "Rapid per vlan Spanning-tree protocol configuration and
+          operational data";
+
+      	uses stp-rapid-pvst-top;
+      }
+
+      container interfaces {
+        description
+          "Enclosing container for the list of interface references";
+
+        uses stp-interface-common-top;
+      }
+    }
+  }
+
+  // data definition statements
+
+  uses stp-top;
+
+}