summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--baro_tests/collectd.py106
-rw-r--r--baro_tests/config_server.py3
-rwxr-xr-xbaro_utils/get_ssh_keys.sh16
-rwxr-xr-xbaro_utils/mce-inject_dfbin0 -> 78496 bytes
-rw-r--r--docs/release/userguide/feature.userguide.rst158
-rw-r--r--mibs/Intel-Bios.txt67
-rw-r--r--mibs/Intel-Common-MIB.mib.txt113
-rw-r--r--mibs/Intel-Mcelog.txt115
-rw-r--r--mibs/Intel-Rdt.txt128
-rw-r--r--mibs/Intel-SA.txt10
10 files changed, 647 insertions, 69 deletions
diff --git a/baro_tests/collectd.py b/baro_tests/collectd.py
index 3f2067af..cd436df6 100644
--- a/baro_tests/collectd.py
+++ b/baro_tests/collectd.py
@@ -1,7 +1,7 @@
"""Executing test of plugins"""
# -*- coding: utf-8 -*-
-#Licensed under the Apache License, Version 2.0 (the "License"); you may
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
@@ -20,8 +20,18 @@ import time
import logging
from config_server import *
from tests import *
+from opnfv.deployment import factory
+from functest.utils import functest_utils
+from functest.utils.constants import CONST
CEILOMETER_NAME = 'ceilometer'
+ID_RSA_SRC = '/root/.ssh/id_rsa'
+ID_RSA_DST_DIR = '/home/opnfv/.ssh'
+ID_RSA_DST = ID_RSA_DST_DIR + '/id_rsa'
+INSTALLER_PARAMS_YAML = os.path.join(CONST.dir_repo_functest, 'functest/ci/installer_params.yaml')
+FUEL_IP = functest_utils.get_parameter_from_yaml('fuel.ip', INSTALLER_PARAMS_YAML)
+FUEL_USER = functest_utils.get_parameter_from_yaml('fuel.user', INSTALLER_PARAMS_YAML)
+FUEL_PW = functest_utils.get_parameter_from_yaml('fuel.password', INSTALLER_PARAMS_YAML)
class KeystoneException(Exception):
@@ -151,7 +161,7 @@ class CSVClient(object):
+ "{0}.domain.tld/{1}/{2}-{3}".format(
compute_node.get_id(), plugin_subdir, meter_category, date),
compute_node.get_ip())
- #Storing last two values
+ # Storing last two values
values = stdout
if len(values) < 2:
self._logger.error(
@@ -372,8 +382,8 @@ def _exec_testcase(
compute_node.get_id(), conf.get_plugin_interval(compute_node, name),
logger=logger, client=CeilometerClient(logger),
criteria_list=ceilometer_criteria_lists[name],
- resource_id_substrings = (ceilometer_substr_lists[name]
- if name in ceilometer_substr_lists else ['']))
+ resource_id_substrings=(ceilometer_substr_lists[name]
+ if name in ceilometer_substr_lists else ['']))
else:
res = test_csv_handles_plugin_data(
compute_node, conf.get_plugin_interval(compute_node, name), name,
@@ -387,6 +397,81 @@ def _exec_testcase(
_process_result(compute_node.get_id(), test_labels[name], res, results)
+def mcelog_install(logger):
+ """Install mcelog on compute nodes.
+
+ Keyword arguments:
+ logger - logger instance
+ """
+ _print_label('Enabling mcelog on compute nodes')
+ handler = factory.Factory.get_handler('fuel', FUEL_IP, FUEL_USER, installer_pwd='')
+ nodes = handler.get_nodes()
+ openstack_version = handler.get_openstack_version()
+ if openstack_version.find('14.') != 0:
+ logger.info('Mcelog will not be installed,'
+ + ' unsupported Openstack version found ({}).'.format(openstack_version))
+ else:
+ for node in nodes:
+ if node.is_compute():
+ ubuntu_release = node.run_cmd('lsb_release -r')
+ if '16.04' not in ubuntu_release:
+ logger.info('Mcelog will not be enabled'
+ + 'on node-{0}, unsupported Ubuntu release found ({1}).'.format(
+ node.get_dict()['id'], ubuntu_release))
+ else:
+ logger.info('Checking if mcelog is enabled on node-{}...'.format(
+ node.get_dict()['id']))
+ res = node.run_cmd('ls /root/')
+ if 'mce-inject_df' and 'corrected' in res:
+ logger.info('Mcelog seems to be already installed on node-{}.'.format(
+ node.get_dict()['id']))
+ res = node.run_cmd('modprobe mce-inject')
+ res = node.run_cmd('/root/mce-inject_df < /root/corrected')
+ else:
+ logger.info('Mcelog will be enabled on node-{}...'.format(
+ node.get_dict()['id']))
+ res = node.put_file('/home/opnfv/repos/barometer/baro_utils/mce-inject_df',
+ '/root/mce-inject_df')
+ res = node.run_cmd('chmod a+x /root/mce-inject_df')
+ res = node.run_cmd('echo "CPU 0 BANK 0" > /root/corrected')
+ res = node.run_cmd('echo "STATUS 0xcc00008000010090" >> /root/corrected')
+ res = node.run_cmd('echo "ADDR 0x0010FFFFFFF" >> /root/corrected')
+ res = node.run_cmd('modprobe mce-inject')
+ res = node.run_cmd('/root/mce-inject_df < /root/corrected')
+ logger.info('Mcelog is installed on all compute nodes')
+
+
+def mcelog_delete(logger):
+ """Uninstall mcelog from compute nodes.
+
+ Keyword arguments:
+ logger - logger instance
+ """
+ handler = factory.Factory.get_handler('fuel', FUEL_IP, FUEL_USER, installer_pwd='')
+ nodes = handler.get_nodes()
+ for node in nodes:
+ if node.is_compute():
+ output = node.run_cmd('ls /root/')
+ if 'mce-inject_df' in output:
+ res = node.run_cmd('rm /root/mce-inject_df')
+ if 'corrected' in output:
+ res = node.run_cmd('rm /root/corrected')
+ res = node.run_cmd('systemctl restart mcelog')
+ logger.info('Mcelog is deleted from all compute nodes')
+
+
+def get_ssh_keys():
+ if not os.path.isdir(ID_RSA_DST_DIR):
+ os.makedirs(ID_RSA_DST_DIR)
+ if not os.path.isfile(ID_RSA_DST):
+ logger.info("RSA key file {} doesn't exist, it will be downloaded from installer node.".format(ID_RSA_DST))
+ handler = factory.Factory.get_handler('fuel', FUEL_IP, FUEL_USER, installer_pwd=FUEL_PW)
+ fuel = handler.get_installer_node()
+ fuel.get_file(ID_RSA_SRC, ID_RSA_DST)
+ else:
+ logger.info("RSA key file {} exists.".format(ID_RSA_DST))
+
+
def main(bt_logger=None):
"""Check each compute node sends ceilometer metrics.
@@ -395,12 +480,14 @@ def main(bt_logger=None):
"""
logging.getLogger("paramiko").setLevel(logging.WARNING)
logging.getLogger("stevedore").setLevel(logging.WARNING)
+ logging.getLogger("opnfv.deployment.manager").setLevel(logging.WARNING)
if bt_logger is None:
_check_logger()
else:
global logger
logger = bt_logger
- conf = ConfigServer('10.20.0.2', 'root', logger)
+ get_ssh_keys()
+ conf = ConfigServer(FUEL_IP, FUEL_USER, logger)
controllers = conf.get_controllers()
if len(controllers) == 0:
logger.error('No controller nodes found!')
@@ -416,6 +503,8 @@ def main(bt_logger=None):
logger.info('computes: {}'.format([('{0}: {1} ({2})'.format(
node.get_id(), node.get_name(), node.get_ip())) for node in computes]))
+ mcelog_install(logger) # installation of mcelog
+
ceilometer_running_on_con = False
_print_label('Test Ceilometer on control nodes')
for controller in controllers:
@@ -439,7 +528,7 @@ def main(bt_logger=None):
node_id = compute_node.get_id()
out_plugins[node_id] = 'CSV'
compute_ids.append(node_id)
- #plugins_to_enable = plugin_labels.keys()
+ # plugins_to_enable = plugin_labels.keys()
plugins_to_enable = []
_print_label('NODE {}: Test Ceilometer Plug-in'.format(node_id))
logger.info('Checking if ceilometer plug-in is included.')
@@ -504,6 +593,8 @@ def main(bt_logger=None):
_print_label('NODE {}: Restoring config file'.format(node_id))
conf.restore_config(compute_node)
+ mcelog_delete(logger) # uninstalling mcelog from compute nodes
+
print_overall_summary(compute_ids, plugin_labels, results, out_plugins)
if ((len([res for res in results if not res[2]]) > 0)
@@ -512,5 +603,6 @@ def main(bt_logger=None):
return 1
return 0
+
if __name__ == '__main__':
- sys.exit(main())
+ sys.exit(main())
diff --git a/baro_tests/config_server.py b/baro_tests/config_server.py
index 4d649269..358a8ffe 100644
--- a/baro_tests/config_server.py
+++ b/baro_tests/config_server.py
@@ -69,8 +69,7 @@ class ConfigServer(object):
self.__private_key_file = ID_RSA_PATH
if not os.path.isfile(self.__private_key_file):
self.__logger.error(
- "Private key file '{}'".format(self.__private_key_file)
- + " not found. Please try to run {} script.".format(SSH_KEYS_SCRIPT))
+ "Private key file '{}' not found.".format(self.__private_key_file))
raise IOError("Private key file '{}' not found.".format(self.__private_key_file))
# get list of available nodes
diff --git a/baro_utils/get_ssh_keys.sh b/baro_utils/get_ssh_keys.sh
deleted file mode 100755
index f90c32c9..00000000
--- a/baro_utils/get_ssh_keys.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-# -*- coding: utf-8 -*-
-
-#Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-mkdir -p /home/opnfv/.ssh/
-scp root@"$INSTALLER_IP":/root/.ssh/* /home/opnfv/.ssh/
diff --git a/baro_utils/mce-inject_df b/baro_utils/mce-inject_df
new file mode 100755
index 00000000..9304181f
--- /dev/null
+++ b/baro_utils/mce-inject_df
Binary files differ
diff --git a/docs/release/userguide/feature.userguide.rst b/docs/release/userguide/feature.userguide.rst
index 2be44d33..4e9b0d01 100644
--- a/docs/release/userguide/feature.userguide.rst
+++ b/docs/release/userguide/feature.userguide.rst
@@ -27,6 +27,9 @@ Barometer has enabled the following collectd plugins:
* *dpdkstat plugin*: A read plugin that retrieve stats from the DPDK extended
NIC stats API.
+* *dpdkevents plugin*: A read plugin that retrieves DPDK link status and DPDK
+ forwarding cores liveliness status (DPDK Keep Alive).
+
* `ceilometer plugin`_: A write plugin that pushes the retrieved stats to
Ceilometer. It's capable of pushing any stats read through collectd to
Ceilometer, not just the DPDK stats.
@@ -35,26 +38,23 @@ Barometer has enabled the following collectd plugins:
and free hugepages on a platform as well as what is available in terms of
hugepages per socket.
-* *RDT plugin*: A read plugin that provides the last level cache utilitzation and
- memory bandwidth utilization
-
* *Open vSwitch events Plugin*: A read plugin that retrieves events from OVS.
+* *Open vSwitch stats Plugin*: A read plugin that retrieve flow and interface
+ stats from OVS.
+
* *mcelog plugin*: A read plugin that uses mcelog client protocol to check for
memory Machine Check Exceptions and sends the stats for reported exceptions
+* *RDT plugin*: A read plugin that provides the last level cache utilitzation and
+ memory bandwidth utilization
+
All the plugins above are available on the collectd master, except for the
-plugin as it's a python based plugin and only C plugins are accepted
+ceilometer plugin as it's a python based plugin and only C plugins are accepted
by the collectd community. The ceilometer plugin lives in the OpenStack
repositories.
-Other plugins under development or existing as a pull request into collectd master:
-
-* *dpdkevents*: A read plugin that retrieves DPDK link status and DPDK
- forwarding cores liveliness status (DPDK Keep Alive).
-
-* *Open vSwitch stats Plugin*: A read plugin that retrieve flow and interface
- stats from OVS.
+Other plugins existing as a pull request into collectd master:
* *SNMP Agent*: A write plugin that will act as a AgentX subagent that receives
and handles queries from SNMP master agent and returns the data collected
@@ -67,6 +67,7 @@ Other plugins under development or existing as a pull request into collectd mast
fanspeed, current, flow, power etc. Also, the plugin monitors Intelligent
Platform Management Interface (IPMI) System Event Log (SEL) and sends the
+
**Plugins included in the Danube release:**
* Hugepages
@@ -79,20 +80,22 @@ collectd capabilities and usage
.. Describe the specific capabilities and usage for <XYZ> feature.
.. Provide enough information that a user will be able to operate the feature on a deployed scenario.
-**NOTE** Plugins included in the OPNFV D release will be built-in to the fuel
-plugin and available in the /opt/opnfv directory on the fuel master. You don't
-need to clone the barometer/collectd repos to use these, but you can configure
-them as shown in the examples below. Please note, the collectd plugins in OPNFV
-are configured with reasonable defaults, but can be overriden.
+.. note:: Plugins included in the OPNFV D release will be built-in to the fuel
+ plugin and available in the /opt/opnfv directory on the fuel master. You don't
+ need to clone the barometer/collectd repos to use these, but you can configure
+ them as shown in the examples below.
+
+ The collectd plugins in OPNFV are configured with reasonable defaults, but can
+ be overriden.
Building all Barometer upstreamed plugins from scratch
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The plugins that have been merged to the collectd master branch can all be
built and configured through the barometer repository.
-**NOTE: sudo permissions are required to install collectd.**
-
-**NOTE: These are instructions for Ubuntu 16.04.**
+.. note::
+ * sudo permissions are required to install collectd.
+ * These are instructions for Ubuntu 16.04
To build and install these dependencies, clone the barometer repo:
@@ -113,29 +116,37 @@ To install collectd as a service and install all it's dependencies:
$ cd barometer/src && sudo make && sudo make install
This will install collectd as a service and the base install directory
-is /opt/collectd.
+will be /opt/collectd.
Sample configuration files can be found in '/opt/collectd/etc/collectd.conf.d'
-**Note**: Exec plugin requires non-root user to execute scripts. By default,
-`collectd_exec` user is used. Barometer scripts do *not* create this user. It
-needs to be manually added or exec plugin configuration has to be changed to use
-other, existing user before starting collectd service.
+.. note::
+ - If you plan on using the Exec plugin, the plugin requires non-root
+ user to execute scripts. By default, `collectd_exec` user is used. Barometer
+ scripts do *not* create this user. It needs to be manually added or exec plugin
+ configuration has to be changed to use other, existing user before starting
+ collectd service.
-Please note if you are using any Open vSwitch plugins you need to run:
+ - If you don't want to use one of the Barometer plugins, simply remove the
+ sample config file from '/opt/collectd/etc/collectd.conf.d'
+ - If you are using any Open vSwitch plugins you need to run:
.. code:: bash
$ sudo ovs-vsctl set-manager ptcp:6640
+
+Below is the per plugin installation and configuration guide, if you only want
+to install some/particular plugins.
+
DPDK statistics plugin
^^^^^^^^^^^^^^^^^^^^^^
Repo: https://github.com/collectd/collectd
Branch: master
-Dependencies: DPDK (http://dpdk.org/)
+Dependencies: DPDK (http://dpdk.org/) Min_Version: 16.04
To build and install DPDK to /usr please see:
https://github.com/collectd/collectd/blob/master/docs/BUILD.dpdkstat.md
@@ -154,41 +165,96 @@ Building and installing collectd:
This will install collectd to /opt/collectd
The collectd configuration file can be found at /opt/collectd/etc
-To configure the hugepages plugin you need to modify the configuration file to
+To configure the dpdkstats plugin you need to modify the configuration file to
include:
.. code:: bash
LoadPlugin dpdkstat
- <Plugin dpdkstat>
- Coremask "0xf"
- ProcessType "secondary"
- FilePrefix "rte"
- EnabledPortMask 0xffff
+ <Plugin "dpdkstat">
+ <EAL>
+ Coremask "0x2"
+ MemoryChannels "4"
+ ProcessType "secondary"
+ FilePrefix "rte"
+ </EAL>
+ EnabledPortMask 0xffff
+ PortName "interface1"
+ PortName "interface2"
</Plugin>
For more information on the plugin parameters, please see:
https://github.com/collectd/collectd/blob/master/src/collectd.conf.pod
-Please note if you are configuring collectd with the **static DPDK library**
-you must compile the DPDK library with the -fPIC flag:
+.. note:: If you are not building and installing DPDK system-wide
+ you will need to specify the specific paths to the header files and libraries
+ using LIBDPDK_CPPFLAGS and LIBDPDK_LDFLAGS. You will also need to add the DPDK
+ library symbols to the shared library path using ldconfig. Note that this
+ update to the shared library path is not persistant (i.e. it will not survive a
+ reboot).
+
+DPDK events plugin
+^^^^^^^^^^^^^^^^^^^^^^
+Repo: https://github.com/collectd/collectd
+
+Branch: master
+
+Dependencies: DPDK (http://dpdk.org/)
+
+To build and install DPDK to /usr please see:
+https://github.com/collectd/collectd/blob/master/docs/BUILD.dpdkstat.md
+
+Building and installing collectd:
.. code:: bash
- $ make EXTRA_CFLAGS=-fPIC
+ $ git clone https://github.com/maryamtahhan/collectd.git
+ $ cd collectd
+ $ ./build.sh
+ $ ./configure --enable-syslog --enable-logfile --enable-debug
+ $ make
+ $ sudo make install
-You must also modify the configuration step when building collectd:
+This will install collectd to /opt/collectd
+The collectd configuration file can be found at /opt/collectd/etc
+To configure the dpdkevents plugin you need to modify the configuration file to
+include:
.. code:: bash
- $ ./configure CFLAGS=" -lpthread -Wl,--whole-archive -Wl,-ldpdk -Wl,-lm -Wl,-lrt -Wl,-lpcap -Wl,-ldl -Wl,--no-whole-archive"
+ LoadPlugin dpdkevents
+ <Plugin "dpdkevents">
+ Interval 1
+ <EAL>
+ Coremask "0x1"
+ MemoryChannels "4"
+ ProcessType "secondary"
+ FilePrefix "rte"
+ </EAL>
+ <Event "link_status">
+ SendEventsOnUpdate true
+ EnabledPortMask 0xffff
+ PortName "interface1"
+ PortName "interface2"
+ SendNotification false
+ </Event>
+ <Event "keep_alive">
+ SendEventsOnUpdate true
+ LCoreMask "0xf"
+ KeepAliveShmName "/dpdk_keepalive_shm_name"
+ SendNotification false
+ </Event>
+ </Plugin>
+
+For more information on the plugin parameters, please see:
+https://github.com/collectd/collectd/blob/master/src/collectd.conf.pod
-Please also note that if you are not building and installing DPDK system-wide
-you will need to specify the specific paths to the header files and libraries
-using LIBDPDK_CPPFLAGS and LIBDPDK_LDFLAGS. You will also need to add the DPDK
-library symbols to the shared library path using ldconfig. Note that this
-update to the shared library path is not persistant (i.e. it will not survive a
-reboot). Pending a merge of https://github.com/collectd/collectd/pull/2073.
+.. note:: If you are not building and installing DPDK system-wide
+ you will need to specify the specific paths to the header files and libraries
+ using LIBDPDK_CPPFLAGS and LIBDPDK_LDFLAGS. You will also need to add the DPDK
+ library symbols to the shared library path using ldconfig. Note that this
+ update to the shared library path is not persistant (i.e. it will not survive a
+ reboot).
.. code:: bash
@@ -551,7 +617,10 @@ OvS Events Branch: master
OvS Stats Branch:feat_ovs_stats
-Dependencies: Open vSwitch, libyajl
+OvS Events MIBs: The SNMP OVS interface link status is provided by standard
+IF-MIB (http://www.net-snmp.org/docs/mibs/IF-MIB.txt)
+
+Dependencies: Open vSwitch, Yet Another JSON Library (https://github.com/lloyd/yajl)
On Ubuntu, install the dependencies:
@@ -601,6 +670,7 @@ need to modify the configuration file to include:
Socket "/var/run/openvswitch/db.sock"
Interfaces "br0" "veth0"
SendNotification false
+ DispatchValues true
</Plugin>
To configure the OVS stats plugin you need to modify the configuration file
diff --git a/mibs/Intel-Bios.txt b/mibs/Intel-Bios.txt
new file mode 100644
index 00000000..824cd09f
--- /dev/null
+++ b/mibs/Intel-Bios.txt
@@ -0,0 +1,67 @@
+INTEL-BIOS-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY, OBJECT-TYPE
+ FROM SNMPv2-SMI
+
+ hostAssist
+ FROM Intel-SA-MIB
+
+ DisplayString
+ FROM SNMPv2-TC;
+
+--*****************************************************************************
+--
+-- MODULE IDENTITY AND REVISION GROUP
+--
+--*****************************************************************************
+
+intelBios MODULE-IDENTITY
+ LAST-UPDATED "201610241700Z" -- coordinated universal time UTC format is YYMMDDHHmmZ
+ ORGANIZATION "Intel, Server Management Software"
+ CONTACT-INFO " "
+ DESCRIPTION "This SNMP MIB module retrieves System Management BIOS (SMBIOS)
+ information from DMI table using dmidecode.
+
+ Version: 1.0 10/24/2016
+
+ Intel copyright information 2016"
+ ::= { hostAssist 2 }
+
+-------------------------------------------------------------------------------
+-- BIOS scalars
+-------------------------------------------------------------------------------
+
+biosVendor OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..128))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The textual string describes the bios vendor."
+ ::= { intelBios 1 }
+
+biosVersion OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..128))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The textual string describes the bios version."
+ ::= { intelBios 2 }
+
+biosReleaseDate OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..128))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The textual string describes the bios release date."
+ ::= { intelBios 3 }
+
+biosRevision OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..128))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The textual string describes the bios revision."
+ ::= { intelBios 4 }
+
+END
diff --git a/mibs/Intel-Common-MIB.mib.txt b/mibs/Intel-Common-MIB.mib.txt
new file mode 100644
index 00000000..92c766ff
--- /dev/null
+++ b/mibs/Intel-Common-MIB.mib.txt
@@ -0,0 +1,113 @@
+Intel-Common-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ enterprises FROM RFC1155-SMI;
+
+-- Categories
+
+intel OBJECT IDENTIFIER ::= { enterprises 343 }
+
+--
+-- Intel Private space divides into 3 branches at the top. They are
+-- identifiers, products, and experimental.
+--
+-- 'identifers' branch typically contains objects which are used as
+-- constants. For example, if a mib contained an object identifier
+-- "appliance-type", somewhere down under identifiers would be a list
+-- containing OIDs for "refrigerator", "toaster", etc. Currently
+-- there are 3 groups under identifiers; systems, objects and
+-- comm-methods.
+-- 'systems' contains objects for system type such as PCs, hubs, etc.
+-- 'objects' contains identifiers for component pieces.
+-- 'comm-methods' refers to the transmission medium used in
+-- proxy-to-agent conversation.
+--
+-- 'products' branch contains objects which are specifically Intel
+-- products. Under this branch go all MIBs for Intel products.
+--
+-- 'experimental' is for exactly what the name implies.
+--
+-- 'information-technology' encompasses the work of the Information
+-- Technology (IT) group within Intel.
+--
+-- For example, an identifier for a toaster would exist under
+-- 'identifiers.systems.toasters' while another identifier for an
+-- Intel specific toaster MIB would live under 'products.appliances'.
+--
+
+identifiers OBJECT IDENTIFIER ::= { intel 1 }
+products OBJECT IDENTIFIER ::= { intel 2 }
+experimental OBJECT IDENTIFIER ::= { intel 3 }
+information-technology OBJECT IDENTIFIER ::= { intel 4 }
+sysProducts OBJECT IDENTIFIER ::= { intel 5 }
+mib2ext OBJECT IDENTIFIER ::= { intel 6 }
+hw OBJECT IDENTIFIER ::= { intel 7 }
+wekiva OBJECT IDENTIFIER ::= { intel 111 }
+-- Groups under 'identifiers'
+
+systems OBJECT IDENTIFIER ::= { identifiers 1 }
+objects OBJECT IDENTIFIER ::= { identifiers 2 }
+comm-methods OBJECT IDENTIFIER ::= { identifiers 3 }
+
+pc-systems OBJECT IDENTIFIER ::= { systems 1 }
+proxy-systems OBJECT IDENTIFIER ::= { systems 2 }
+hub-systems OBJECT IDENTIFIER ::= { systems 3 }
+switch-systems OBJECT IDENTIFIER ::= { systems 4 }
+
+local-proxy-1 OBJECT IDENTIFIER ::= { comm-methods 1 }
+pc-novell-1 OBJECT IDENTIFIER ::= { comm-methods 2 }
+
+-- Identifiers for 'hub-systems'
+-- Note: These items match the definitions for moduleType
+-- in intelhub.mib.
+
+express10-100Stack OBJECT IDENTIFIER ::= { hub-systems 1 }
+express12TX OBJECT IDENTIFIER ::= { hub-systems 2 }
+express24TX OBJECT IDENTIFIER ::= { hub-systems 3 }
+expressReserved OBJECT IDENTIFIER ::= { hub-systems 4 }
+expressBridge OBJECT IDENTIFIER ::= { hub-systems 6 }
+express210-12 OBJECT IDENTIFIER ::= { hub-systems 7 }
+express210-24 OBJECT IDENTIFIER ::= { hub-systems 8 }
+express220-12 OBJECT IDENTIFIER ::= { hub-systems 9 }
+express220-24 OBJECT IDENTIFIER ::= { hub-systems 10 }
+express300Stack OBJECT IDENTIFIER ::= { hub-systems 11 }
+express320-16 OBJECT IDENTIFIER ::= { hub-systems 12 }
+express320-24 OBJECT IDENTIFIER ::= { hub-systems 13 }
+
+-- Groups under 'products'
+
+pc-products OBJECT IDENTIFIER ::= { products 1 }
+hub-products OBJECT IDENTIFIER ::= { products 2 }
+proxy OBJECT IDENTIFIER ::= { products 3 }
+print-products OBJECT IDENTIFIER ::= { products 4 }
+network-products OBJECT IDENTIFIER ::= { products 5 }
+snmp-agents OBJECT IDENTIFIER ::= { products 6 }
+nic-products OBJECT IDENTIFIER ::= { products 7 }
+server-management OBJECT IDENTIFIER ::= { products 10 }
+switch-products OBJECT IDENTIFIER ::= { products 11 }
+i2o OBJECT IDENTIFIER ::= { products 120 }
+-- Groups under 'hub-products'
+
+express110 OBJECT IDENTIFIER ::= { hub-products 1 }
+
+-- Groups under 'print-products'
+
+netport-1 OBJECT IDENTIFIER ::= { print-products 1 }
+netport-2 OBJECT IDENTIFIER ::= { print-products 2 }
+netport-express OBJECT IDENTIFIER ::= { print-products 3 }
+
+-- Groups under 'network-products'
+
+lanDesk OBJECT IDENTIFIER ::= { network-products 1 }
+ld-alarms OBJECT IDENTIFIER ::= { lanDesk 1 }
+internetServer-2 OBJECT IDENTIFIER ::= { network-products 2 }
+iS-alarms OBJECT IDENTIFIER ::= { internetServer-2 1 }
+
+-- Groups under 'experimental'
+
+-- <none>
+
+--
+
+END
+
diff --git a/mibs/Intel-Mcelog.txt b/mibs/Intel-Mcelog.txt
new file mode 100644
index 00000000..90f4398b
--- /dev/null
+++ b/mibs/Intel-Mcelog.txt
@@ -0,0 +1,115 @@
+INTEL-MCELOG-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY, OBJECT-TYPE, Integer32
+ FROM SNMPv2-SMI
+
+ hostAssist
+ FROM Intel-SA-MIB
+
+ DisplayString
+ FROM SNMPv2-TC;
+
+--*****************************************************************************
+--
+-- MODULE IDENTITY AND REVISION GROUP
+--
+--*****************************************************************************
+
+intelMcelog MODULE-IDENTITY
+ LAST-UPDATED "201610241700Z" -- coordinated universal time UTC format is YYMMDDHHmmZ
+ ORGANIZATION "Intel, Server Management Software"
+ CONTACT-INFO " "
+ DESCRIPTION "This SNMP MIB module logs and accounts machine memory, IO, and CPU
+ hardware errors on modern x86 Linux systems.
+
+ Version: 1.0 10/24/2016
+
+ Intel copyright information 2016"
+ ::= { hostAssist 3 }
+
+OneBasedIndex ::= Integer32(1..2147483647)
+
+-------------------------------------------------------------------------------
+-- Intel Mcelog Table
+-------------------------------------------------------------------------------
+
+memoryTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF MemoryTableEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "This Group defines the Intel RDT Groups Table."
+ ::= { intelMcelog 2 }
+
+memoryTableEntry OBJECT-TYPE
+ SYNTAX MemoryTableEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION "This Group defines the Mcelog Memory Table Entry."
+ INDEX { memoryGroupIndex }
+ ::= { memoryTable 1 }
+
+MemoryTableEntry ::= SEQUENCE {
+ memoryGroupIndex OneBasedIndex,
+ memoryGroupDescr DisplayString,
+ memoryCorrectedErrors Integer32,
+ memoryCorrectedTimedErrors Integer32,
+ memoryUncorrectedErrors Integer32,
+ memoryUncorrectedTimedErrors Integer32
+}
+
+memoryGroupIndex OBJECT-TYPE
+ SYNTAX OneBasedIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This attribute defines the index of the Mcelog memory group."
+ ::= { memoryTableEntry 1 }
+
+memoryGroupDescr OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A textual string containing information about the socket and
+ DMI name (*TODO*)."
+ ::= { memoryTableEntry 2 }
+
+memoryCorrectedErrors OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This counter defines the total number of corrected errors."
+ ::= { memoryTableEntry 3 }
+
+memoryCorrectedTimedErrors OBJECT-TYPE
+ SYNTAX Integer32
+ UNITS "in 24h"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This counter defines the number of corrected errors in
+ last 24 hours."
+ ::= { memoryTableEntry 4 }
+
+memoryUncorrectedErrors OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This counter defines the total number of uncorrected errors."
+ ::= { memoryTableEntry 5 }
+
+memoryUncorrectedTimedErrors OBJECT-TYPE
+ SYNTAX Integer32
+ UNITS "in 24h"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This counter defines the number of uncorrected errors in
+ last 24 hours."
+ ::= { memoryTableEntry 6 }
+
+END
diff --git a/mibs/Intel-Rdt.txt b/mibs/Intel-Rdt.txt
new file mode 100644
index 00000000..8eb93d0a
--- /dev/null
+++ b/mibs/Intel-Rdt.txt
@@ -0,0 +1,128 @@
+INTEL-RDT-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY, OBJECT-TYPE, Integer32, Counter64
+ FROM SNMPv2-SMI
+
+ hostAssist
+ FROM Intel-SA-MIB
+
+ DisplayString
+ FROM SNMPv2-TC;
+
+--*****************************************************************************
+--
+-- MODULE IDENTITY AND REVISION GROUP
+--
+--*****************************************************************************
+
+intelRdt MODULE-IDENTITY
+ LAST-UPDATED "201610241700Z" -- coordinated universal time UTC format is YYMMDDHHmmZ
+ ORGANIZATION "Intel, Server Management Software"
+ CONTACT-INFO " "
+ DESCRIPTION "This SNMP MIB module supports the Intel RDT SNMP subagent for monitoring
+ information provided by monitoring features of Intel Resource Director
+ Technology (Intel(R) RDT) like Cache Monitoring Technology (CMT),
+ Memory Bandwidth Monitoring (MBM). These features provide information about
+ utilization of shared resources like last level cache occupancy, local
+ memory bandwidth usage, remote memory bandwidth usage, instructions per clock.
+
+ Version: 1.0 10/24/2016
+
+ Intel copyright information 2016"
+ ::= { hostAssist 1 }
+
+OneBasedIndex ::= Integer32(1..2147483647)
+
+-------------------------------------------------------------------------------
+-- Intel RDT Table
+-------------------------------------------------------------------------------
+
+rdtGroupNumber OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of network interfaces (regardless of their
+ current state) present on this system."
+ ::= { intelRdt 1 }
+
+rdtTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF RdtTableEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "This Group defines the Intel RDT Groups Table."
+ ::= { intelRdt 2 }
+
+rdtTableEntry OBJECT-TYPE
+ SYNTAX RdtTableEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION "This Group defines the Intel RDT Groups Table Entry."
+ INDEX { rdtGroupIndex }
+ ::= { rdtTable 1 }
+
+RdtTableEntry ::= SEQUENCE {
+ rdtGroupIndex OneBasedIndex,
+ rdtGroupDescr DisplayString,
+ rdtLlc Counter64,
+ rdtIpc Counter64,
+ rdtMbmRemote Counter64,
+ rdtMbmLocal Counter64
+}
+
+rdtGroupIndex OBJECT-TYPE
+ SYNTAX OneBasedIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This attribute defines the index of the Intel RDT group."
+ ::= { rdtTableEntry 1 }
+
+rdtGroupDescr OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A textual string containing information about the groups of cores
+ on which to monitor supported events."
+ ::= { rdtTableEntry 2 }
+
+rdtLlc OBJECT-TYPE
+ SYNTAX Counter64
+ UNITS "bytes"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This counter defines the last level cache occupancy."
+ ::= { rdtTableEntry 3 }
+
+rdtIpc OBJECT-TYPE
+ SYNTAX DisplayString
+ UNITS "ipc"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This counter defines the instructions per clock."
+ ::= { rdtTableEntry 4 }
+
+rdtMbmRemote OBJECT-TYPE
+ SYNTAX Counter64
+ UNITS "bytes/sec"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This counter defines the Remote (Socket) memory bandwidth usage."
+ ::= { rdtTableEntry 5 }
+
+rdtMbmLocal OBJECT-TYPE
+ SYNTAX Counter64
+ UNITS "bytes/sec"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This counter defines the Local (Socket) memory bandwidth usage."
+ ::= { rdtTableEntry 6 }
+
+END
diff --git a/mibs/Intel-SA.txt b/mibs/Intel-SA.txt
new file mode 100644
index 00000000..6e7dd87b
--- /dev/null
+++ b/mibs/Intel-SA.txt
@@ -0,0 +1,10 @@
+Intel-SA-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ server-management FROM Intel-Common-MIB;
+
+software OBJECT IDENTIFIER ::= { server-management 3 }
+baseboardGroup OBJECT IDENTIFIER ::= { software 5 }
+hostAssist OBJECT IDENTIFIER ::= { baseboardGroup 1 }
+
+END