diff --git a/html/images/os/lenovo.svg b/html/images/os/lenovo.svg
index 78cf175517..681214c105 100644
--- a/html/images/os/lenovo.svg
+++ b/html/images/os/lenovo.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/includes/definitions/cnos.yaml b/includes/definitions/cnos.yaml
new file mode 100644
index 0000000000..412ee69d42
--- /dev/null
+++ b/includes/definitions/cnos.yaml
@@ -0,0 +1,12 @@
+os: cnos
+text: 'Lenovo Cloud Network Operating System'
+type: network
+icon: lenovo
+group: lenovo
+over:
+ - { graph: device_bits, text: 'Device Traffic' }
+ - { graph: device_processor, text: 'CPU Usage' }
+ - { graph: device_mempool, text: 'Memory Usage' }
+discovery:
+ - sysObjectID:
+ - .1.3.6.1.4.1.19046.1.7
diff --git a/includes/definitions/discovery/cnos.yaml b/includes/definitions/discovery/cnos.yaml
new file mode 100644
index 0000000000..f476fa2d2b
--- /dev/null
+++ b/includes/definitions/discovery/cnos.yaml
@@ -0,0 +1,55 @@
+mib: LENOVO-ENV-MIB
+modules:
+ sensors:
+ state:
+ data:
+ -
+ oid: lenovoEnvMibPowerSupplyEntry
+ value: lenovoEnvMibPowerSupplyState
+ num_oid: .1.3.6.1.4.1.19046.2.3.11.1.1.1.5.
+ descr: 'PS{{ $lenovoEnvMibPowerSupplyID }}'
+ index: 'lenovoEnvMibPowerSupplyState.{{ $index }}'
+ states:
+ - { value: 0, descr: off, graph: 1, generic: 1 }
+ - { value: 1, descr: on, graph: 1, generic: 0 }
+ - { value: 2, descr: absent, graph: 1, generic: 1 }
+ - { value: 3, descr: outputFault, graph: 1, generic: 2 }
+ - { value: -1, descr: unknown, graph: 1, generic: 3 }
+ -
+ oid: lenovoEnvMibFanEntry
+ value: lenovoEnvMibFanState
+ num_oid: .1.3.6.1.4.1.19046.2.3.11.1.2.1.1.5.
+ descr: lenovoEnvMibFanName
+ index: 'lenovoEnvMibFanState.{{ $index }}'
+ states:
+ - { value: 0, descr: ok, graph: 1, generic: 0 }
+ - { value: 1, descr: absent, graph: 1, generic: 1 }
+ - { value: 2, descr: fault, graph: 1, generic: 2 }
+ - { value: -1, descr: unknown, graph: 1, generic: 3 }
+ -
+ oid: lenovoEnvMibTempSensorEntry
+ value: lenovoEnvMibTempSensorState
+ num_oid: .1.3.6.1.4.1.19046.2.3.11.1.3.1.1.5.
+ descr: lenovoEnvMibTempSensorDesc
+ index: 'lenovoEnvMibTempSensorState.{{ $index }}'
+ states:
+ - { value: 0, descr: ok, graph: 1, generic: 0 }
+ - { value: 1, descr: fault, graph: 1, generic: 2 }
+ - { value: -1, descr: unknown, graph: 1, generic: 3 }
+ fanspeed:
+ data:
+ -
+ oid: lenovoEnvMibFanEntry
+ value: lenovoEnvMibFanSpeedRPM
+ num_oid: .1.3.6.1.4.1.19046.2.3.11.1.2.1.8.
+ index: 'lenovoEnvMibFanSpeedRPM.{{ $index }}'
+ descr: lenovoEnvMibFanName
+
+ temperature:
+ data:
+ -
+ oid: lenovoEnvMibTempSensorEntry
+ value: lenovoEnvMibTempSensorTemperature
+ num_oid: .1.3.6.1.4.1.19046.2.3.11.1.3.1.6.
+ index: 'lenovoEnvTempSensorTemperature.{{ $index }}'
+ descr: lenovoEnvMibTempSensorName
diff --git a/mibs/lenovo/ LENOVO-PRODUCTS-MIB b/mibs/lenovo/ LENOVO-PRODUCTS-MIB
new file mode 100644
index 0000000000..a10009062e
--- /dev/null
+++ b/mibs/lenovo/ LENOVO-PRODUCTS-MIB
@@ -0,0 +1,104 @@
+-- LENOVO-PRODUCTS-MIB: Lenovo product object identifier assignments
+-- Copyright (c) 2014-2017 Lenovo Group Ltd. All rights reserved.
+
+LENOVO-PRODUCTS-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY
+ FROM SNMPv2-SMI
+ lenovoProducts, lenovoModules
+ FROM LENOVO-SMI-MIB;
+
+lenovoProductsMIB MODULE-IDENTITY
+ LAST-UPDATED "201705010000Z"
+ ORGANIZATION "Lenovo"
+ CONTACT-INFO
+ "Lenovo
+
+ Postal: 1009 Think Place
+ Morrisville, NC 27560
+ USA
+
+ Tel: +1 (919) 968-4465
+
+ E-mail: snmp@lenovo.com"
+ DESCRIPTION
+ "This module defines the object identifiers returned as values for
+ sysObjectID for Lenovo hardware."
+ REVISION "201604200000Z"
+ DESCRIPTION "Initial version."
+ REVISION "201705010000Z"
+ DESCRIPTION "Add sysObjectId for G8332 CNOS product"
+ REVISION "201705020000Z"
+ DESCRIPTION "Add sysObjectIDs for NE1032, NE1032T, NE1072, and NE10032 switches."
+
+ ::= { lenovoModules 1 }
+
+-- Lenovo Server Products
+lenovoServerProducts OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Root object identifier for Lenovo server products."
+ ::= { lenovoProducts 11 }
+
+-- Lenovo Network Flex Products
+flex OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Root object identifier for Lenovo Flex network products."
+ ::= { lenovoProducts 18}
+
+--Lenovo Flex System SI4091 10Gb System Interconnect Module
+si4091 OBJECT IDENTIFIER ::= { flex 23}
+
+
+-- Lenovo Network RackSwitch (ToR) Products
+tor OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Root object identifier for Lenovo RackSwitch network products."
+ ::= { lenovoProducts 7}
+
+-- Lenovo RackSwitch G8296
+g8296 OBJECT IDENTIFIER ::= { tor 22}
+
+-- Lenovo RackSwitch G8272
+g8272 OBJECT IDENTIFIER ::= { tor 24}
+
+-- Lenovo RackSwitch G8296 CNOS
+g8296-cnos OBJECT IDENTIFIER ::= { tor 29}
+
+-- Lenovo RackSwitch G8272 CNOS
+g8272-cnos OBJECT IDENTIFIER ::= { tor 30}
+
+-- Lenovo RackSwitch G8332 CNOS
+g8332-cnos OBJECT IDENTIFIER ::= { tor 31}
+
+-- Lenovo ThinkSystem NE1032 RackSwitch
+ne1032 OBJECT IDENTIFIER ::= { tor 32}
+
+-- Lenovo ThinkSystem NE1032T RackSwitch
+ne1032t OBJECT IDENTIFIER ::= { tor 33}
+
+-- Lenovo ThinkSystem NE1072T RackSwitch
+ne1072t OBJECT IDENTIFIER ::= { tor 34}
+
+-- Lenovo ThinkSystem NE10032 RackSwitch
+ne10032 OBJECT IDENTIFIER ::= { tor 36}
+
+-- Lenovo ThinkSystem NE2572 RackSwitch
+ne2572 OBJECT IDENTIFIER ::= { tor 41}
+
+-- Lenovo CE0128T Switch
+ce0128t OBJECT IDENTIFIER ::= { tor 37}
+
+-- Lenovo CE0128P Switch
+ce0128p OBJECT IDENTIFIER ::= { tor 38}
+
+-- Lenovo CE0152T Switch
+ce0152t OBJECT IDENTIFIER ::= { tor 39}
+
+-- Lenovo ThinkSystem NE2572 RackSwitch
+ne2572 OBJECT IDENTIFIER ::= { tor 41}
+
+END
diff --git a/mibs/lenovo/LENOVO-ENV-MIB b/mibs/lenovo/LENOVO-ENV-MIB
new file mode 100644
index 0000000000..8e3460982c
--- /dev/null
+++ b/mibs/lenovo/LENOVO-ENV-MIB
@@ -0,0 +1,476 @@
+LENOVO-ENV-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY, OBJECT-TYPE, Integer32, Gauge32
+ FROM SNMPv2-SMI
+ TEXTUAL-CONVENTION
+ FROM SNMPv2-TC
+ SnmpAdminString
+ FROM SNMP-FRAMEWORK-MIB
+ PhysicalIndex
+ FROM ENTITY-MIB
+ network-mibs
+ FROM LENOVO-SMI-MIB;
+
+-------------------------------------------------------------------------------
+-- Module Identity
+-------------------------------------------------------------------------------
+
+lenovoEnvMIB MODULE-IDENTITY
+ LAST-UPDATED "201609230000Z" -- 09/23/2016 00:00GMT
+ ORGANIZATION "Lenovo"
+ CONTACT-INFO "
+ Lenovo
+ 3325 Scott Blvd.
+ Santa Clara, CA 95054
+ "
+ DESCRIPTION "
+ Defines environmental notifications
+ "
+ REVISION "201609230000Z" -- 09/23/2016 00:00GMT
+ DESCRIPTION "Initial version."
+
+ ::= { network-mibs 11 }
+
+-------------------------------------------------------------------------------
+-- Textual Conventions
+-------------------------------------------------------------------------------
+
+LenovoEnvMibPowerSupplyState ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Status of the Power Supply"
+ SYNTAX INTEGER {
+ off(0),
+ on(1),
+ absent(2),
+ outputFault (3)
+ }
+
+LenovoEnvMibFanState ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Status of the Fan"
+ SYNTAX INTEGER {
+ ok(0),
+ absent(1),
+ fault (2)
+ }
+
+LenovoEnvMibTempSensorState ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Status of the temperature sensor"
+ SYNTAX INTEGER {
+ ok(0),
+ fault(1)
+ }
+
+LenovoEnvMibTempSensorThreshold ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Threshold that was crossed that generated the notification"
+ SYNTAX INTEGER {
+ warning(0),
+ failure(1),
+ ok(2)
+ }
+
+LenovoEnvMibFanAirFlow ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Air flow direction of the Fan"
+ SYNTAX INTEGER {
+ front2back(0),
+ back2front(1),
+ notinstalled(2)
+ }
+
+-------------------------------------------------------------------------------
+-- Objects
+-------------------------------------------------------------------------------
+
+lenovoEnvMibObjects OBJECT IDENTIFIER ::= { lenovoEnvMIB 1 }
+
+lenovoEnvMibPowerSupplyTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF LenovoEnvMibPowerSupplyEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "This table contains information for the
+ various power supplies in the switch."
+ ::= { lenovoEnvMibObjects 1 }
+
+lenovoEnvMibPowerSupplyEntry OBJECT-TYPE
+ SYNTAX LenovoEnvMibPowerSupplyEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A single row containing information for a power supply.
+ The power supply description and name are derived from
+ values in the Entity MIB. Row is indexed using the same
+ index used by the Physical Table of the Entity MIB"
+ INDEX { lenovoEnvMibPowerSupplyIndex }
+ ::= { lenovoEnvMibPowerSupplyTable 1 }
+
+LenovoEnvMibPowerSupplyEntry ::= SEQUENCE {
+ lenovoEnvMibPowerSupplyIndex PhysicalIndex,
+ lenovoEnvMibPowerSupplyID Integer32,
+ lenovoEnvMibPowerSupplyDesc SnmpAdminString,
+ lenovoEnvMibPowerSupplyName SnmpAdminString,
+ lenovoEnvMibPowerSupplyState LenovoEnvMibPowerSupplyState
+}
+
+lenovoEnvMibPowerSupplyIndex OBJECT-TYPE
+ SYNTAX PhysicalIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Index of entry for power supply in Physical Table of Entity MIB"
+ ::= { lenovoEnvMibPowerSupplyEntry 1 }
+
+lenovoEnvMibPowerSupplyID OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "ID of power supply"
+ ::= { lenovoEnvMibPowerSupplyEntry 2 }
+
+lenovoEnvMibPowerSupplyDesc OBJECT-TYPE
+ SYNTAX SnmpAdminString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Description of power supply"
+ ::= { lenovoEnvMibPowerSupplyEntry 3 }
+
+lenovoEnvMibPowerSupplyName OBJECT-TYPE
+ SYNTAX SnmpAdminString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Name of power supply"
+ ::= { lenovoEnvMibPowerSupplyEntry 4 }
+
+lenovoEnvMibPowerSupplyState OBJECT-TYPE
+ SYNTAX LenovoEnvMibPowerSupplyState
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "State of the power supply"
+ ::= { lenovoEnvMibPowerSupplyEntry 5 }
+
+lenovoEnvMibFanTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF LenovoEnvMibFanEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "This table contains information for the
+ various fans in the switch."
+ ::= { lenovoEnvMibObjects 2 }
+
+lenovoEnvMibFanEntry OBJECT-TYPE
+ SYNTAX LenovoEnvMibFanEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A single row containing information for a fan.
+ The fan description and name are derived from
+ values in the Entity MIB. Row is indexed using the same
+ index used by the Physical Table of the Entity MIB"
+ INDEX { lenovoEnvMibFanIndex }
+ ::= { lenovoEnvMibFanTable 1 }
+
+LenovoEnvMibFanEntry ::= SEQUENCE {
+ lenovoEnvMibFanIndex PhysicalIndex,
+ lenovoEnvMibFanID Integer32,
+ lenovoEnvMibFanDesc SnmpAdminString,
+ lenovoEnvMibFanName SnmpAdminString,
+ lenovoEnvMibFanState LenovoEnvMibFanState,
+ lenovoEnvMibFanAirFlow LenovoEnvMibFanAirFlow,
+ lenovoEnvMibFanModule Integer32,
+ lenovoEnvMibFanSpeedRPM Integer32,
+ lenovoEnvMibFanSpeedPercent Gauge32
+}
+
+lenovoEnvMibFanIndex OBJECT-TYPE
+ SYNTAX PhysicalIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Index of entry for fan in Physical Table of Entity MIB"
+ ::= { lenovoEnvMibFanEntry 1 }
+
+lenovoEnvMibFanID OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "ID of fan"
+ ::= { lenovoEnvMibFanEntry 2 }
+
+
+lenovoEnvMibFanDesc OBJECT-TYPE
+ SYNTAX SnmpAdminString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Description of fan"
+ ::= { lenovoEnvMibFanEntry 3 }
+
+
+lenovoEnvMibFanName OBJECT-TYPE
+ SYNTAX SnmpAdminString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Name of fan"
+ ::= { lenovoEnvMibFanEntry 4 }
+
+
+lenovoEnvMibFanState OBJECT-TYPE
+ SYNTAX LenovoEnvMibFanState
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "State of the fan"
+ ::= { lenovoEnvMibFanEntry 5 }
+
+
+lenovoEnvMibFanAirFlow OBJECT-TYPE
+ SYNTAX LenovoEnvMibFanAirFlow
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Airflow direction of the fan"
+ ::= { lenovoEnvMibFanEntry 6 }
+
+
+lenovoEnvMibFanModule OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Module number of the fan"
+ ::= { lenovoEnvMibFanEntry 7 }
+
+lenovoEnvMibFanSpeedRPM OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Speed of the fan in revolutions per minute (RPM)"
+ ::= { lenovoEnvMibFanEntry 8 }
+
+
+lenovoEnvMibFanSpeedPercent OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Speed of the fan as a percentage"
+ ::= { lenovoEnvMibFanEntry 9 }
+
+lenovoEnvMibTempSensorTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF LenovoEnvMibTempSensorEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "This table contains information for the
+ various temperature sensors in the switch."
+ ::= { lenovoEnvMibObjects 3 }
+
+lenovoEnvMibTempSensorEntry OBJECT-TYPE
+ SYNTAX LenovoEnvMibTempSensorEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A single row containing information for a temperature sensor.
+ The temperature sensor description and name are derived from
+ values in the Entity MIB. Row is indexed using the same
+ index used by the Physical Table of the Entity MIB"
+ INDEX { lenovoEnvMibTempSensorIndex }
+ ::= { lenovoEnvMibTempSensorTable 1 }
+
+LenovoEnvMibTempSensorEntry ::= SEQUENCE {
+ lenovoEnvMibTempSensorIndex PhysicalIndex,
+ lenovoEnvMibTempSensorID Integer32,
+ lenovoEnvMibTempSensorDesc SnmpAdminString,
+ lenovoEnvMibTempSensorName SnmpAdminString,
+ lenovoEnvMibTempSensorState LenovoEnvMibTempSensorState,
+ lenovoEnvMibTempSensorTemperature Integer32
+}
+
+lenovoEnvMibTempSensorIndex OBJECT-TYPE
+ SYNTAX PhysicalIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Index of entry for temperature sensor in Physical Table of Entity MIB"
+ ::= { lenovoEnvMibTempSensorEntry 1 }
+
+lenovoEnvMibTempSensorID OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "ID of temperature sensor"
+ ::= { lenovoEnvMibTempSensorEntry 2 }
+
+lenovoEnvMibTempSensorDesc OBJECT-TYPE
+ SYNTAX SnmpAdminString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Description of temperature sensor"
+ ::= { lenovoEnvMibTempSensorEntry 3 }
+
+lenovoEnvMibTempSensorName OBJECT-TYPE
+ SYNTAX SnmpAdminString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Name of temperature sensor"
+ ::= { lenovoEnvMibTempSensorEntry 4 }
+
+lenovoEnvMibTempSensorState OBJECT-TYPE
+ SYNTAX LenovoEnvMibTempSensorState
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "State of the temperature sensor"
+ ::= { lenovoEnvMibTempSensorEntry 5 }
+
+lenovoEnvMibTempSensorTemperature OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Temperature of the sensor in Celcius"
+ ::= { lenovoEnvMibTempSensorEntry 6 }
+
+lenovoEnvMibTempSensorThresholds OBJECT IDENTIFIER ::= { lenovoEnvMibObjects 4 }
+
+lenovoEnvMIBTempSensorWarning OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "System temperature sensor warning threshold value"
+ ::= { lenovoEnvMibTempSensorThresholds 1 }
+
+lenovoEnvMIBTempSensorShutdown OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "System temperature sensor shutdown/failure threshold value"
+ ::= { lenovoEnvMibTempSensorThresholds 2 }
+
+lenovoEnvMIBTempSensorSetPoint OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "System temperature sensor set point threshold value"
+ ::= { lenovoEnvMibTempSensorThresholds 3 }
+
+-------------------------------------------------------------------------------
+-- Notifications
+-------------------------------------------------------------------------------
+
+lenovoEnvMibNotificationPrefix OBJECT IDENTIFIER ::= { lenovoEnvMIB 3 }
+
+lenovoEnvMibNotifications OBJECT IDENTIFIER ::= { lenovoEnvMibNotificationPrefix 0 }
+
+lenovoEnvMibNotificationObjects OBJECT IDENTIFIER ::= { lenovoEnvMibNotificationPrefix 1 }
+
+lenovoEnvMibTempSensorThreshold OBJECT-TYPE
+ SYNTAX LenovoEnvMibTempSensorThreshold
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Threshold that was crossed that generated the notification"
+ ::= { lenovoEnvMibNotificationObjects 1 }
+
+lenovoEnvMibPowerSupplyFailure NOTIFICATION-TYPE
+ OBJECTS {
+ lenovoEnvMibPowerSupplyID,
+ lenovoEnvMibPowerSupplyName,
+ lenovoEnvMibPowerSupplyState
+ }
+ STATUS current
+ DESCRIPTION
+ "This trap signifies that a power supply has failed."
+ --#SEVERITY CRITICAL
+ ::= { lenovoEnvMibNotifications 1 }
+
+lenovoEnvMibPowerSupplyFixed NOTIFICATION-TYPE
+ OBJECTS {
+ lenovoEnvMibPowerSupplyID,
+ lenovoEnvMibPowerSupplyName,
+ lenovoEnvMibPowerSupplyState
+ }
+ STATUS current
+ DESCRIPTION
+ "This trap signifies that a power supply has been restored."
+ --#SEVERITY INFORMATIONAL
+ ::= { lenovoEnvMibNotifications 2 }
+
+lenovoEnvMibFanFailure NOTIFICATION-TYPE
+ OBJECTS {
+ lenovoEnvMibFanID,
+ lenovoEnvMibFanName,
+ lenovoEnvMibFanState,
+ lenovoEnvMibFanRPM
+ }
+ STATUS current
+ DESCRIPTION
+ "This trap signifies that a fan has failed."
+ --#SEVERITY CRITICAL
+ ::= { lenovoEnvMibNotifications 3 }
+
+lenovoEnvMibFanFixed NOTIFICATION-TYPE
+ OBJECTS {
+ lenovoEnvMibFanID,
+ lenovoEnvMibFanName,
+ lenovoEnvMibFanState,
+ lenovoEnvMibFanRPM
+ }
+ STATUS current
+ DESCRIPTION
+ "This trap signifies that a fan has been restored."
+ --#SEVERITY INFORMATIONAL
+ ::= { lenovoEnvMibNotifications 4 }
+
+lenovoEnvMibTempSensorFailure NOTIFICATION-TYPE
+ OBJECTS {
+ lenovoEnvMibTempSensorID,
+ lenovoEnvMibTempSensorName,
+ lenovoEnvMibTempSensorState,
+ lenovoEnvMibTempSensorTemperature,
+ lenovoEnvMibTempSensorThreshold
+ }
+ STATUS current
+ DESCRIPTION
+ "This trap signifies that a temperature sensor has failed."
+ --#SEVERITY CRITICAL
+ ::= { lenovoEnvMibNotifications 5 }
+
+lenovoEnvMibTempSensorFixed NOTIFICATION-TYPE
+ OBJECTS {
+ lenovoEnvMibTempSensorID,
+ lenovoEnvMibTempSensorName,
+ lenovoEnvMibTempSensorState,
+ lenovoEnvMibTempSensorTemperature,
+ lenovoEnvMibTempSensorThreshold
+ }
+ STATUS current
+ DESCRIPTION
+ "This trap signifies that a temperature sensor has been restored."
+ --#SEVERITY INFORMATIONAL
+ ::= { lenovoEnvMibNotifications 6 }
+
+END
+
diff --git a/mibs/lenovo/LENOVO-SMI-MIB b/mibs/lenovo/LENOVO-SMI-MIB
new file mode 100644
index 0000000000..6722ef6225
--- /dev/null
+++ b/mibs/lenovo/LENOVO-SMI-MIB
@@ -0,0 +1,73 @@
+-- LENOVO-SMI-MIB: Lenovo structure of management information
+-- Copyright (c) 2014-2016 Lenovo. All rights reserved.
+
+LENOVO-SMI-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY,
+ OBJECT-IDENTITY,
+ enterprises
+ FROM SNMPv2-SMI;
+
+lenovo MODULE-IDENTITY
+ LAST-UPDATED "201608150000Z"
+ ORGANIZATION "Lenovo Group Ltd."
+ CONTACT-INFO
+ "Lenovo
+ Postal: 1009 Think Place
+ Morrisville, NC 27560
+ USA
+ Tel: +1 (919) 968-4465
+ E-mail: snmp@lenovo.com"
+ DESCRIPTION
+ "The Structure of Management Information for the
+ Lenovo Enterprise Business Group."
+ REVISION "201610271830Z"
+ DESCRIPTION
+ "Initial version."
+ ::= { enterprises 19046 } -- assigned by IANA
+
+lenovoProducts OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Root object identifier from which sysObjectID values are assigned.
+ Values are defined in LENOVO-PRODUCTS-MIB."
+ ::= { lenovo 1 }
+
+lenovoNetworkMibs OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Root object identifier for management-related Lenovo network MIBs."
+ ::= { lenovo 2 }
+
+tor-mibs OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Root for pre-10.x Lenovo RackSwitch switch MIBs."
+ ::= { lenovoNetworkMibs 7 }
+
+flex-mibs OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Root for pre-10.x Lenovo Flex chassis switch MIBs."
+ ::= { lenovoNetworkMibs 18 }
+
+network-mibs OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Root for Lenovo device-independent switch MIBs."
+ ::= { lenovoNetworkMibs 3 }
+
+lenovoServerMibs OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Root object identifier for management-related Lenovo server MIBs."
+ ::= { lenovo 11 }
+
+lenovoModules OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Root bject identifier from which MODULE-IDENTITY values may be assigned."
+ ::= { lenovo 4 }
+
+END
diff --git a/tests/data/cnos.json b/tests/data/cnos.json
new file mode 100644
index 0000000000..17dd7376c0
--- /dev/null
+++ b/tests/data/cnos.json
@@ -0,0 +1,79 @@
+{
+ "applications": {
+ "discovery": {
+ "applications": [],
+ "application_metrics": []
+ },
+ "poller": "matches discovery"
+ },
+ "bgp-peers": {
+ "discovery": {
+ "devices": [
+ {
+ "bgpLocalAs": null
+ }
+ ],
+ "bgpPeers": [],
+ "bgpPeers_cbgp": []
+ },
+ "poller": "matches discovery"
+ },
+ "mempools": {
+ "discovery": {
+ "mempools": []
+ },
+ "poller": "matches discovery"
+ },
+ "ports": {
+ "discovery": {
+ "ports": []
+ },
+ "poller": "matches discovery"
+ },
+ "os": {
+ "discovery": {
+ "devices": [
+ {
+ "sysName": "",
+ "sysObjectID": ".1.3.6.1.4.1.19046.1.7.34",
+ "sysDescr": "Lenovo ThinkSystem NE1072T RackSwitch",
+ "sysContact": null,
+ "version": null,
+ "hardware": "",
+ "features": null,
+ "location": null,
+ "os": "cnos",
+ "type": "network",
+ "serial": null,
+ "icon": "lenovo.svg"
+ }
+ ]
+ },
+ "poller": "matches discovery"
+ },
+ "processors": {
+ "discovery": {
+ "processors": []
+ },
+ "poller": "matches discovery"
+ },
+ "sensors": {
+ "discovery": {
+ "sensors": [],
+ "state_indexes": []
+ },
+ "poller": "matches discovery"
+ },
+ "storage": {
+ "discovery": {
+ "storage": []
+ },
+ "poller": "matches discovery"
+ },
+ "wireless": {
+ "discovery": {
+ "wireless_sensors": []
+ },
+ "poller": "matches discovery"
+ }
+}
diff --git a/tests/snmpsim/cnos.snmprec b/tests/snmpsim/cnos.snmprec
new file mode 100644
index 0000000000..e4f35fed3f
--- /dev/null
+++ b/tests/snmpsim/cnos.snmprec
@@ -0,0 +1,2 @@
+1.3.6.1.2.1.1.1.0|4|Lenovo ThinkSystem NE1072T RackSwitch
+1.3.6.1.2.1.1.2.0|6|.1.3.6.1.4.1.19046.1.7.34