summaryrefslogtreecommitdiffstats
path: root/docs/release/overview.rst
blob: 8ba26078edb395429f40f8475385fedf8661e4c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
.. _opnfv-overview:

.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. SPDX-License-Identifier: CC-BY-4.0
.. (c) Open Platform for NFV Project, Inc. and its contributors

===============
OPNFV Overview
===============

Introduction
============

Network Functions Virtualization (NFV) is transforming the networking industry via
software-defined infrastructures and open source is the proven method for quickly developing
software for commercial products and services that can move markets.
Open Platform for NFV (OPNFV) facilitates the development and evolution of NFV
components across various open source ecosystems. Through system level integration,
deployment and testing, OPNFV constructs a reference NFV platform to accelerate the
transformation of enterprise and service provider networks.
As an open source project, OPNFV is uniquely positioned to bring together the work
of standards bodies, open source communities, service providers and commercial suppliers to deliver
a de facto NFV platform for the industry.

By integrating components from upstream projects, the community is able to conduct performance
and use case-based testing on a variety of solutions to ensure the platform’s suitability for
NFV use cases. OPNFV also works upstream with other open source communities to bring contributions
and learnings from its work directly to those communities in the form of blueprints, patches, bugs,
and new code.

OPNFV initially focused on building NFV Infrastructure (NFVI) and Virtualised Infrastructure
Management (VIM) by integrating components from upstream projects such as OpenDaylight,
OpenStack, Ceph Storage, KVM, Open vSwitch, and Linux.
More recently, OPNFV has extended its portfolio of forwarding solutions to include fd.io and ODP,
is able to run on both Intel and ARM commercial and white-box hardware, support VM, Container and
BareMetal workloads, and includes Management and Network Orchestration MANO components primarily
for application composition and management in the Danube release.

These capabilities, along with application programmable interfaces (APIs) to other NFV
elements, form the basic infrastructure required for Virtualized Network Functions (VNF)
and MANO components.

Concentrating on these components while also considering proposed projects on additional
topics (such as the MANO components and applications themselves), OPNFV aims to enhance
NFV services by increasing performance and power efficiency improving reliability,
availability and serviceability, and delivering comprehensive platform instrumentation.


OPNFV Platform Architecture
===========================

The OPNFV project addresses a number of aspects in the development of a consistent virtualisation
platform including common hardware requirements, software architecture, MANO and applications.


OPNFV Platform Overview Diagram

.. image:: ../images/opnfvplatformgraphic.png
   :alt: Overview infographic of the opnfv platform and projects.


To address these areas effectively, the OPNFV platform architecture can be decomposed
into the following basic building blocks:

* Hardware: with the Infra working group, Pharos project and associated activities
* Software Platform: through the platform integration and deployment projects
* MANO: through the MANO working group and associated projects
* Applications: which affect all other areas and drive requirements for OPNFV

OPNFV Lab Infrastructure
========================

The infrastructure working group oversees such topics as lab management, workflow,
definitions, metrics and tools for OPNFV infrastructure.

Fundamental to the WG is the
`Pharos Specification <https://wiki.opnfv.org/display/pharos/Pharos+Specification>`_
which provides a set of defined lab infrastructures over a geographically and technically
diverse federated global OPNFV lab.

Labs may instantiate bare-metal and virtual environments that are accessed remotely by the
community and used for OPNFV platform and feature development, build, deploy and testing.
No two labs are the same and the heterogeneity of the Pharos environment provides the ideal
platform for establishing hardware and software abstractions providing well understood
performance characteristics.

Community labs are hosted by OPNFV member companies on a voluntary basis.
The Linux Foundation also hosts an OPNFV lab that provides centralized CI
and other production resources which are linked to community labs.
Future lab capabilities will include the ability easily automate deploy and test of any
OPNFV install scenario in any lab environment as well as on a nested "lab as a service"
virtual infrastructure.

OPNFV Software Platform Architecture
====================================

The OPNFV software platform is comprised exclusively of open source implementations of
platform component pieces.  OPNFV is able to draw from the rich ecosystem of NFV related
technologies available in open-source then integrate, test, measure and improve these
components in conjunction with our source communities.

While the composition of the OPNFV software platform is highly complex and constituted of many
projects and components, a subset of these projects gain the most attention from the OPNFV community
to drive the development of new technologies and capabilities.

---------------------------------
Virtual Infrastructure Management
---------------------------------

OPNFV derives it's virtual infrastructure management from one of our largest upstream ecosystems
OpenStack.  OpenStack provides a complete reference cloud management system and associated technologies.
While the OpenStack community sustains a broad set of projects, not all technologies are relevant in
an NFV domain, the OPNFV community consumes a sub-set of OpenStack projects where the usage and
composition may vary depending on the installer and scenario.

For details on the scenarios available in OPNFV and the specific composition of components
refer to the :ref:`OPNFV User Guide & Configuration Guide <opnfv-user-config>`

-----------------
Operating Systems
-----------------

OPNFV currently uses Linux on all target machines, this can include Ubuntu, Centos or SUSE linux. The
specific version of Linux used for any deployment is documented in the installation guide.

-----------------------
Networking Technologies
-----------------------

SDN Controllers
---------------

OPNFV, as an NFV focused project, has a significant investment on networking technologies
and provides a broad variety of integrated open source reference solutions.  The diversity
of controllers able to be used in OPNFV is supported by a similarly diverse set of
forwarding technologies.

There are many SDN controllers available today relevant to virtual environments
where the OPNFV community supports and contributes to a number of these.  The controllers
being worked on by the community during this release of OPNFV include:

* Neutron: an OpenStack project to provide “network connectivity as a service” between
  interface devices (e.g., vNICs) managed by other OpenStack services (e.g., nova).
* OpenDaylight: addresses multivendor, traditional and greenfield networks, establishing the
  industry’s de facto SDN platform and providing the foundation for networks of the future.
* ONOS: a carrier-grade SDN network operating system designed for high availability,
  performance, scale-out.

.. OpenContrail SDN controller is planned to be supported in the next release.

Data Plane
----------

OPNFV extends Linux virtual networking capabilities by using virtual switching
and routing components. The OPNFV community proactively engages with these source
communities to address performance, scale and resiliency needs apparent in carrier
networks.

* FD.io (Fast data - Input/Output): a collection of several projects and libraries to
  amplify the transformation that began with Data Plane Development Kit (DPDK) to support
  flexible, programmable and composable services on a generic hardware platform.
* Open vSwitch: a production quality, multilayer virtual switch designed to enable
  massive network automation through programmatic extension, while still supporting standard
  management interfaces and protocols.

Deployment Architecture
=======================

A typical OPNFV deployment starts with three controller nodes running in a high availability
configuration including control plane components from OpenStack, SDN, etc. and a minimum
of two compute nodes for deployment of workloads (VNFs).
A detailed description of the hardware requirements required to support the 5 node configuration
can be found in pharos specification: `Pharos Project <https://www.opnfv.org/developers/pharos>`_

In addition to the deployment on a highly available physical infrastructure, OPNFV can be
deployed for development and lab purposes in a virtual environment.  In this case each of the hosts
is provided by a virtual machine and allows control and workload placement using nested virtualization.

The initial deployment is done using a staging server, referred to as the "jumphost".
This server-either physical or virtual-is first installed with the installation program
that then installs OpenStack and other components on the controller nodes and compute nodes.
See the :ref:`OPNFV User Guide & Configuration Guide <opnfv-user-config>` for more details.


The OPNFV Testing Ecosystem
===========================

The OPNFV community has set out to address the needs of virtualization in the carrier
network and as such platform validation and measurements are a cornerstone to the
iterative releases and objectives.

To simplify the complex task of feature, component and platform validation and characterization
the testing community has established a fully automated method for addressing all key areas of
platform validation. This required the integration of a variety of testing frameworks in our CI
systems, real time and automated analysis of results, storage and publication of key facts for
each run as shown in the following diagram.

.. image:: ../images/OPNFV_testing_working_group.png
  :alt: Overview infographic of the OPNFV testing Ecosystem

Release Verification
====================

The OPNFV community relies on its testing community to establish release criteria for each OPNFV
release. Each release cycle the testing criteria become more stringent and better representative
of our feature and resiliency requirements.


As each OPNFV release establishes a set of deployment scenarios to validate, the testing
infrastructure and test suites need to accommodate these features and capabilities. It’s not
only in the validation of the scenarios themselves where complexity increases, there are test
cases that require multiple datacenters to execute when evaluating features, including multisite
and distributed datacenter solutions.

The release criteria as established by the testing teams include passing a set of test cases
derived from the functional testing project ‘functest,’ a set of test cases derived from our
platform system and performance test project ‘yardstick,’ and a selection of test cases for
feature capabilities derived from other test projects such as bottlenecks, vsperf, cperf and
storperf. The scenario needs to be able to be deployed, pass these tests, and be removed from
the infrastructure iteratively (no less that 4 times) in order to fulfil the release criteria.

--------
Functest
--------

Functest provides a functional testing framework incorporating a number of test suites
and test cases that test and verify OPNFV platform functionality.
The scope of Functest and relevant test cases can be found in the :ref:`Functest User Guide <functest-userguide>`

Functest provides both feature project and component test suite integration, leveraging
OpenStack and SDN controllers testing frameworks to verify the key components of the OPNFV
platform are running successfully.

---------
Yardstick
---------

Yardstick is a testing project for verifying the infrastructure compliance when running VNF applications.
Yardstick benchmarks a number of characteristics and performance vectors on the infrastructure making it
a valuable pre-deployment NFVI testing tools.

Yardstick provides a flexible testing framework for launching other OPNFV testing projects.

There are two types of test cases in Yardstick:

* Yardstick generic test cases and OPNFV feature test cases;
  including basic characteristics benchmarking in compute/storage/network area.
* OPNFV feature test cases include basic telecom feature testing from OPNFV projects;
  for example nfv-kvm, sfc, ipv6, Parser, Availability and SDN VPN

System Evaluation and compliance testing
========================================

The OPNFV community is developing a set of test suites intended to evaluate a set of reference
behaviors and capabilities for NFV systems developed externally from the OPNFV ecosystem to
evaluate and measure their ability to provide the features and capabilities developed in the
OPNFV ecosystem.

The Dovetail project will provide a test framework and methodology able to be used on any NFV platform,
including an agreed set of test cases establishing an evaluation criteria for exercising
an OPNFV compatible system. The Dovetail project has begun establishing the test framework
and will provide a preliminary methodology for the Danube release. Work will continue to
develop these test cases to establish a stand alone compliance evaluation solution
in future releases.

Additional Testing
==================

Besides the test suites and cases for release verification, additional testing is performed to validate
specific features or characteristics of the OPNFV platform.
These testing framework and test cases may include some specific needs; such as extended measurements,
additional testing stimuli, or tests simulating environmental disturbances or failures.

These additional testing activities provide a more complete evaluation of the OPNFV platform.
Some of the projects focused on these testing areas include:

------
VSPERF
------

VSPERF provides an automated test-framework and comprehensive test suite for measuring data-plane
performance of the NFVI including switching technology, physical and virtual network interfaces.
The provided test cases with network topologies can be customized while also allowing individual
versions of Operating System, vSwitch and hypervisor to be specified.

-----------
Bottlenecks
-----------

Bottlenecks provides a framework to find system limitations and bottlenecks, providing
root cause isolation capabilities to facilitate system evaluation.


.. _`OPNFV Configuration Guide`: `OPNFV User Guide & Configuration Guide`
.. _`OPNFV User Guide`: `OPNFV User Guide & Configuration Guide`
.. _`Dovetail project`: https://wiki.opnfv.org/display/dovetail
Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
LIBVIRT-HYPERVISOR-MIB DEFINITIONS ::= BEGIN

IMPORTS
    MODULE-IDENTITY, OBJECT-TYPE, Integer32, Unsigned32, Counter64
        FROM SNMPv2-SMI

    hostAssist
        FROM Intel-SA-MIB

    DisplayString
        FROM SNMPv2-TC;

--*****************************************************************************
--
-- MODULE IDENTITY AND REVISION GROUP
--
--*****************************************************************************

libvirtHypervisor MODULE-IDENTITY
    LAST-UPDATED "201710061110Z" -- coordinated universal time UTC format is YYMMDDHHmmZ
    ORGANIZATION "Intel, Server Management Software"
    CONTACT-INFO
        ""
    DESCRIPTION
        "This SNMP MIB module supports the libvirt SNMP subagent
        for monitoring information provided by monitoring metrics
        of virtualized guests, their attached block devices and
        network interfaces such as performance statistics, domain
        state, file system information, CPU pinning and CPU
        utilization, disk errors.

        Version:  1.0   09/08/2017

        Intel copyright information 2017"
    REVISION
        "201710061110Z"
    DESCRIPTION
        "Fixing types and units in MemoryTable"
    ::= { hostAssist 6 }

-------------------------------------------------------------------------------
-- Libvirt Hypervisor Domain Statistics Table
-------------------------------------------------------------------------------

lvhDomainTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF LvhDomainTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "This Group defines the Libvirt Domain Stats Table."
    ::= { libvirtHypervisor 1 }

lvhDomainTableEntry OBJECT-TYPE
    SYNTAX      LvhDomainTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "This Group defines the Libvirt Domain Stats Table Entry."
    INDEX       { lvhDomainName }
    ::= { lvhDomainTable 1 }

LvhDomainTableEntry                 ::= SEQUENCE {
    lvhDomainName                   DisplayString,
    lvhDomainStateState             INTEGER,
    lvhDomainStateReason            INTEGER,
    lvhCPUTotalTimeUser             Counter64,
    lvhCPUTotalTimeSystem           Counter64,
    lvhVirtCPUTotal                 Integer32,
    lvhMemoryTotal                  Integer32
}

lvhDomainName OBJECT-TYPE
    SYNTAX      DisplayString (SIZE (0..50))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Textual string containing a VM name."
    ::= { lvhDomainTableEntry 1 }

lvhDomainStateState OBJECT-TYPE
    SYNTAX      INTEGER {
                    unknown(0),
                    running(1),
                    blocked(2),
                    paused(3),
                    shutdown(4),
                    shutoff(5),
                    crashed(6),
                    pmususpended(7)
                }
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "State of the VM, returned as number from virDomainState enum."
    ::= { lvhDomainTableEntry 2 }

lvhDomainStateReason OBJECT-TYPE
    SYNTAX      Integer32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Reason for entering given state, returned as int from
        virDomain*Reason enum corresponding to given state."
    ::= { lvhDomainTableEntry 3 }

lvhCPUTotalTimeUser OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "nanoseconds"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "User CPU time spent in nanoseconds."
    ::= { lvhDomainTableEntry 4 }

lvhCPUTotalTimeSystem OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "nanoseconds"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "System CPU time spent in nanoseconds."
    ::= { lvhDomainTableEntry 5 }

lvhVirtCPUTotal OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "percent"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "CPU utilization in percentage."
    ::= { lvhDomainTableEntry 6 }

lvhMemoryTotal OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "bytes"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Memory in bytes used by the domain."
    ::= { lvhDomainTableEntry 7 }

-------------------------------------------------------------------------------
-- Libvirt Hypervisor Memory Statistics Table
-------------------------------------------------------------------------------

lvhMemoryTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF LvhMemoryTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "This Group defines the Libvirt Hypervisor Memory Table."
    ::= { libvirtHypervisor 2 }

lvhMemoryTableEntry OBJECT-TYPE
    SYNTAX      LvhMemoryTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "This Group defines the Libvirt Hypervisor Memory Table Entry."
    INDEX       { lvhMemoryDomainName }
    ::= { lvhMemoryTable 1 }

LvhMemoryTableEntry                 ::= SEQUENCE {
    lvhMemoryDomainName             DisplayString,
    lvhMemorySwapIn                 Unsigned32,
    lvhMemorySwapOut                Unsigned32,
    lvhMemoryMajorFault             Unsigned32,
    lvhMemoryMinorFault             Unsigned32,
    lvhMemoryUnused                 Unsigned32,
    lvhMemoryAvailable              Unsigned32,
    lvhMemoryActualBalloon          Unsigned32,
    lvhMemoryRss                    Unsigned32,
    lvhMemoryUsable                 Unsigned32,
    lvhMemoryLastUpdate             Counter64
}

lvhMemoryDomainName OBJECT-TYPE
    SYNTAX      DisplayString (SIZE (0..50))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Textual string containing a VM name."
    ::= { lvhMemoryTableEntry 1 }

lvhMemorySwapIn OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "bytes"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Amount of data read from swap space."
    ::= { lvhMemoryTableEntry 2 }

lvhMemorySwapOut OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "bytes"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Amount of memory written out to swap space."
    ::= { lvhMemoryTableEntry 3 }

lvhMemoryMajorFault OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "in 24h (x1024)"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Number of page faults when disk IO was required."
    ::= { lvhMemoryTableEntry 4 }

lvhMemoryMinorFault OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "in 24h (x1024)"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Number of other page faults."
    ::= { lvhMemoryTableEntry 5 }

lvhMemoryUnused OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "bytes"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Amount of memory left unused by the system."
    ::= { lvhMemoryTableEntry 6 }

lvhMemoryAvailable OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "bytes"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Amount of usable memory as seen by the domain."
    ::= { lvhMemoryTableEntry 7 }

lvhMemoryActualBalloon OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "bytes"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Memory currently used."
    ::= { lvhMemoryTableEntry 8 }

lvhMemoryRss OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "bytes"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Resident Set Size of running domain's process."
    ::= { lvhMemoryTableEntry 9 }

lvhMemoryUsable OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "bytes"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Amount of memory which can be reclaimed by
        balloon without causing host swapping."
    ::= { lvhMemoryTableEntry 10 }

lvhMemoryLastUpdate OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "seconds (x1024)"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Timestamp of the last update of statistics."
    ::= { lvhMemoryTableEntry 11 }

-------------------------------------------------------------------------------
-- Libvirt Hypervisor Perf Statistics Table
-------------------------------------------------------------------------------

lvhPerfTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF LvhPerfTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "This Group defines the Libvirt Hypervisor Perf Table."
    ::= { libvirtHypervisor 3 }

lvhPerfTableEntry OBJECT-TYPE
    SYNTAX      LvhPerfTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "This Group defines the Libvirt Hypervisor Perf Table Entry."
    INDEX       { lvhPerfDomainName }
    ::= { lvhPerfTable 1 }

LvhPerfTableEntry                   ::= SEQUENCE {
    lvhPerfDomainName               DisplayString,
    lvhPerfAlignmentFaults          Integer32,
    lvhPerfBranchInstructions       Integer32,
    lvhPerfBranchMisses             Integer32,
    lvhPerfBusCycles                Integer32,
    lvhPerfCacheMisses              Integer32,
    lvhPerfCacheReferences          Integer32,
    lvhPerfCmt                      Integer32,
    lvhPerfContextSwitches          Integer32,
    lvhPerfCPUClock                 Counter64,
    lvhPerfCPUCycles                Counter64,
    lvhPerfCPUMigrations            Integer32,
    lvhPerfEmulationFaults          Integer32,
    lvhPerfInstructions             Integer32,
    lvhPerfMbml                     Integer32,
    lvhPerfMbmt                     Integer32,
    lvhPerfPageFaults               Integer32,
    lvhPerfPageFaultsMaj            Integer32,
    lvhPerfPageFaultsMin            Integer32,
    lvhPerfRefCPUCycles             Counter64,
    lvhPerfTaskClock                Counter64
}

lvhPerfDomainName OBJECT-TYPE
    SYNTAX      DisplayString (SIZE (0..50))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Textual string containing a VM name."
    ::= { lvhPerfTableEntry 1 }

lvhPerfAlignmentFaults OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Count of alignment faults."
    ::= { lvhPerfTableEntry 2 }

lvhPerfBranchInstructions OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Count of branch instructions."
    ::= { lvhPerfTableEntry 3 }

lvhPerfBranchMisses OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Count of branch misses."
    ::= { lvhPerfTableEntry 4 }

lvhPerfBusCycles OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Count of bus cycles."
    ::= { lvhPerfTableEntry 5 }

lvhPerfCacheMisses OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Count of cache misses."
    ::= { lvhPerfTableEntry 6 }

lvhPerfCacheReferences OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Count of cache hits."
    ::= { lvhPerfTableEntry 7 }

lvhPerfCmt OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "bytes"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Cache usage in bytes."
    ::= { lvhPerfTableEntry 8 }

lvhPerfContextSwitches OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Count of context switches."
    ::= { lvhPerfTableEntry 9 }

lvhPerfCPUClock OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Count of CPU clock time."
    ::= { lvhPerfTableEntry 10 }

lvhPerfCPUCycles OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Count of CPU cycles (total/elapsed)."
    ::= { lvhPerfTableEntry 11 }

lvhPerfCPUMigrations OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Count of CPU migrations."
    ::= { lvhPerfTableEntry 12 }

lvhPerfEmulationFaults OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Count of emulation faults."
    ::= { lvhPerfTableEntry 13 }

lvhPerfInstructions OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Count of instructions."
    ::= { lvhPerfTableEntry 14 }

lvhPerfMbml OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "bytes/s"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Traffic bandwidth for a memory controller."
    ::= { lvhPerfTableEntry 15 }

lvhPerfMbmt OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "bytes/s"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Total system bandwidth from one cache level."
    ::= { lvhPerfTableEntry 16 }

lvhPerfPageFaults OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Count of page faults."
    ::= { lvhPerfTableEntry 17 }

lvhPerfPageFaultsMaj OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Count of major page faults."
    ::= { lvhPerfTableEntry 18 }

lvhPerfPageFaultsMin OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Count of minor page faults."
    ::= { lvhPerfTableEntry 19 }

lvhPerfRefCPUCycles OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "The count of ref CPU cycles."
    ::= { lvhPerfTableEntry 20 }

lvhPerfTaskClock OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Count of task clock time."
    ::= { lvhPerfTableEntry 21 }

-------------------------------------------------------------------------------
-- Libvirt Hypervisor CPUAffinity Table
-------------------------------------------------------------------------------

lvhCPUAffinityTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF LvhCPUAffinityTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION "This Group defines the CPUAffinity Table Entry."
    ::= { libvirtHypervisor 4 }

lvhCPUAffinityTableEntry OBJECT-TYPE
    SYNTAX      LvhCPUAffinityTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION "This Group defines the Libvirt Hypervisor CPU Affinity Table Entry."
    INDEX       { lvhAffinityDomainName, lvhCPUIndex, lvhVCPUIndex }
    ::= { lvhCPUAffinityTable 1 }

LvhCPUAffinityTableEntry            ::= SEQUENCE {
    lvhAffinityDomainName           DisplayString,
    lvhCPUIndex                     Integer32,
    lvhVCPUIndex                    Integer32,
    lvhCPUAffinity                  Integer32
}

lvhAffinityDomainName OBJECT-TYPE
    SYNTAX      DisplayString (SIZE (0..50))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Textual string containing the VM name."
    ::= { lvhCPUAffinityTableEntry 1 }

lvhCPUIndex OBJECT-TYPE
    SYNTAX      Integer32 (0..999)
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "CPU index."
    ::= { lvhCPUAffinityTableEntry 2 }

lvhVCPUIndex OBJECT-TYPE
    SYNTAX      Integer32 (0..999)
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Virtual CPU index."
    ::= { lvhCPUAffinityTableEntry 3 }

lvhCPUAffinity OBJECT-TYPE
    SYNTAX      Integer32 (0..1)
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Pinning of domain VCPU to host physical CPU."
    ::= { lvhCPUAffinityTableEntry 4 }

-------------------------------------------------------------------------------
-- Libvirt Hypervisor VCPU Table
-------------------------------------------------------------------------------

lvhVirtVCPUTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF LvhVirtVCPUTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION "This Group defines the VirtVCPU Table Entry."
    ::= { libvirtHypervisor 5 }

lvhVirtVCPUTableEntry OBJECT-TYPE
    SYNTAX      LvhVirtVCPUTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION "This Group defines the Libvirt Hypervisor VirtVCPU Table Entry."
    INDEX       { lvhVCPUDomainName, lvhVCPUVCPUIndex }
    ::= { lvhVirtVCPUTable 1 }

LvhVirtVCPUTableEntry               ::= SEQUENCE {
    lvhVCPUDomainName               DisplayString,
    lvhVCPUVCPUIndex                Integer32,
    lvhVirtVCPU                     Counter64
}

lvhVCPUDomainName OBJECT-TYPE
    SYNTAX      DisplayString (SIZE (0..50))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Textual string containing the VM name."
    ::= { lvhVirtVCPUTableEntry 1 }

lvhVCPUVCPUIndex OBJECT-TYPE
    SYNTAX      Integer32 (0..999)
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Virtual CPU index."
    ::= { lvhVirtVCPUTableEntry 2 }

lvhVirtVCPU OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "nanoseconds"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Time spent by virtual CPU."
    ::= { lvhVirtVCPUTableEntry 3 }

-------------------------------------------------------------------------------
-- Libvirt Hypervisor DiskError Table
-------------------------------------------------------------------------------

lvhDiskErrorTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF LvhDiskErrorTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION "This Group defines the Libvirt Hypervisor DiskError Table."
    ::= { libvirtHypervisor 6 }

lvhDiskErrorTableEntry OBJECT-TYPE
    SYNTAX      LvhDiskErrorTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION "This Group defines the Libvirt Hypervisor DiskEror Table Entry."
    INDEX       { lvhDiskDomainName, lvhDiskName }
    ::= { lvhDiskErrorTable 1 }

LvhDiskErrorTableEntry                         ::= SEQUENCE {
    lvhDiskDomainName                          DisplayString,
    lvhDiskName                                DisplayString,
    lvhDiskError                               INTEGER
}

lvhDiskDomainName OBJECT-TYPE
    SYNTAX      DisplayString (SIZE (0..50))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Textual string containing a VM name."
    ::= { lvhDiskErrorTableEntry 1 }

lvhDiskName OBJECT-TYPE
    SYNTAX      DisplayString (SIZE (0..20))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Textual string containing a disk name."
    ::= { lvhDiskErrorTableEntry 2 }

lvhDiskError OBJECT-TYPE
    SYNTAX      INTEGER {
                    none(0),
                    unspec(1),
                    nospace(2)
                }
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Disk error code."
    ::= { lvhDiskErrorTableEntry 3 }

-------------------------------------------------------------------------------
-- Libvirt Hypervisor Block Device Statistics Table
-------------------------------------------------------------------------------

lvhBlockDeviceTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF LvhBlockDeviceTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "This Group defines the Libvirt Hypervisor Block Device Table."
    ::= { libvirtHypervisor 7 }

lvhBlockDeviceTableEntry OBJECT-TYPE
    SYNTAX      LvhBlockDeviceTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "This Group defines the Libvirt Hypervisor Block Device Table Entry."
    INDEX       { lvhBlockDomainName, lvhBlockDeviceName }
    ::= { lvhBlockDeviceTable 1 }

LvhBlockDeviceTableEntry            ::= SEQUENCE {
    lvhBlockDomainName              DisplayString,
    lvhBlockDeviceName              DisplayString,
    lvhDiskOpsRead                  Integer32,
    lvhDiskOpsWrite                 Integer32,
    lvhDiskOctetsRead               Integer32,
    lvhDiskOctetsWrite              Integer32,
    lvhDiskTimeCacheRead            Counter64,
    lvhDiskTimeCacheWrite           Counter64
}

lvhBlockDomainName OBJECT-TYPE
    SYNTAX      DisplayString (SIZE (0..50))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Textual string containing a VM name."
    ::= { lvhBlockDeviceTableEntry 1 }

lvhBlockDeviceName OBJECT-TYPE
    SYNTAX      DisplayString (SIZE (0..20))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Textual string containing a block device name."
    ::= { lvhBlockDeviceTableEntry 2 }

lvhDiskOpsRead OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Number of read requests."
    ::= { lvhBlockDeviceTableEntry 3 }

lvhDiskOpsWrite OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Number of write requests."
    ::= { lvhBlockDeviceTableEntry 4 }

lvhDiskOctetsRead OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Number of read bytes."
    ::= { lvhBlockDeviceTableEntry 5 }

lvhDiskOctetsWrite OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Number of write bytes."
    ::= { lvhBlockDeviceTableEntry 6 }

lvhDiskTimeCacheRead OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "nanoseconds"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Total time spent on cache reads."
    ::= { lvhBlockDeviceTableEntry 7 }

lvhDiskTimeCacheWrite OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "nanoseconds"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Total times spent on cache writes."
    ::= { lvhBlockDeviceTableEntry 8 }

-------------------------------------------------------------------------------
-- Libvirt Hypervisor Block Device Flush Statistics Table
-------------------------------------------------------------------------------

lvhBlockDevFlushTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF LvhBlockDevFlushTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "This Group defines the Libvirt Hypervisor Block Device Table."
    ::= { libvirtHypervisor 8 }

lvhBlockDevFlushTableEntry OBJECT-TYPE
    SYNTAX      LvhBlockDevFlushTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "This Group defines the Libvirt Hypervisor Block Device Table Entry."
    INDEX       { lvhBlockDevFlushDomainName, lvhBlockDevFlushDeviceName }
    ::= { lvhBlockDevFlushTable 1 }

LvhBlockDevFlushTableEntry          ::= SEQUENCE {
    lvhBlockDevFlushDomainName      DisplayString,
    lvhBlockDevFlushDeviceName      DisplayString,
    lvhTotalRequestsFlush           Integer32,
    lvhTotalTimeInMsFlush           Integer32
}

lvhBlockDevFlushDomainName OBJECT-TYPE
    SYNTAX      DisplayString (SIZE (0..50))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Textual string containing a VM name."
    ::= { lvhBlockDevFlushTableEntry 1 }

lvhBlockDevFlushDeviceName OBJECT-TYPE
    SYNTAX      DisplayString (SIZE (0..20))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Textual string containing a block device name."
    ::= { lvhBlockDevFlushTableEntry 2 }

lvhTotalRequestsFlush OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Total number of flush requests."
    ::= { lvhBlockDevFlushTableEntry 3 }

lvhTotalTimeInMsFlush OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "milliseconds"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "The total time spent on cache flushing."
    ::= { lvhBlockDevFlushTableEntry 4 }

-------------------------------------------------------------------------------
-- Libvirt Hypervisor Network Interface Statistics Table
-------------------------------------------------------------------------------

lvhNetworkIfaceTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF LvhNetworkIfaceTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION "This Group defines the Libvirt Hypervisor Network Interface
                Table."
    ::= { libvirtHypervisor 9 }

lvhNetworkIfaceTableEntry OBJECT-TYPE
    SYNTAX      LvhNetworkIfaceTableEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "This Group defines the Libvirt Hypervisor Network Interface Table Entry."
    INDEX       { lvhNetIfDomainName, lvhInterfaceName }
    ::= { lvhNetworkIfaceTable 1 }

LvhNetworkIfaceTableEntry           ::= SEQUENCE {
    lvhNetIfDomainName              DisplayString,
    lvhInterfaceName                DisplayString,
    lvhIfBytesReceived              Counter64,
    lvhIfBytesTransmitted           Counter64,
    lvhIfPacketsReceived            Counter64,
    lvhIfPacketsTransmitted         Counter64,
    lvhIfErrorsReceive              Counter64,
    lvhIfErrorsTransmission         Counter64,
    lvhIfDroppedReceive             Counter64,
    lvhIfDroppedTransmit            Counter64
}

lvhNetIfDomainName OBJECT-TYPE
    SYNTAX      DisplayString (SIZE (0..50))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Textual string containing a VM name."
    ::= { lvhNetworkIfaceTableEntry 1 }

lvhInterfaceName OBJECT-TYPE
    SYNTAX      DisplayString (SIZE (0..20))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Textual string containing a network interface name."
    ::= { lvhNetworkIfaceTableEntry 2 }

lvhIfBytesReceived OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Number of bytes received."
    ::= { lvhNetworkIfaceTableEntry 3 }

lvhIfBytesTransmitted OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Number of bytes transmitted."
    ::= { lvhNetworkIfaceTableEntry 4 }

lvhIfPacketsReceived OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Number of packets received."
    ::= { lvhNetworkIfaceTableEntry 5 }

lvhIfPacketsTransmitted OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Number of packets transmitted."
    ::= { lvhNetworkIfaceTableEntry 6 }

lvhIfErrorsReceive OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Number of receive errors."
    ::= { lvhNetworkIfaceTableEntry 7 }

lvhIfErrorsTransmission OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Number of transmission errors."
    ::= { lvhNetworkIfaceTableEntry 8 }

lvhIfDroppedReceive OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Number of receive packets dropped."
    ::= { lvhNetworkIfaceTableEntry 9 }

lvhIfDroppedTransmit OBJECT-TYPE
    SYNTAX      Counter64
    UNITS       "in 24h"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION "Number of transmit packets dropped."
    ::= { lvhNetworkIfaceTableEntry 10 }

END