oneview
Version information
This version is compatible with:
- Puppet Enterprise 2023.8.x, 2023.7.x, 2023.6.x, 2023.5.x, 2023.4.x, 2023.3.x, 2023.2.x, 2023.1.x, 2023.0.x, 2021.7.x, 2021.6.x, 2021.5.x, 2021.4.x, 2021.3.x, 2021.2.x, 2021.1.x, 2021.0.x, 2019.8.x, 2019.7.x, 2019.5.x, 2019.4.x, 2019.3.x, 2019.2.x, 2019.1.x, 2019.0.x, 2018.1.x, 2017.3.x, 2017.2.x, 2017.1.x, 2016.5.x, 2016.4.x
- Puppet >= 4.1.0
- windows, ubuntu, suse, redhat, mac_os_x, debian, centos
Start using this module
Add this module to your Puppetfile:
mod 'hewlettpackard-oneview', '2.7.0'
Learn more about managing modules with a PuppetfileDocumentation
Puppet Module for HPE OneView
Table of Contents
- Overview
- Module description
- Setup
- Usage
- Reference
- Contributing and feature requests
- Testing
- License
- Version and changes
- Authors
Overview
The Puppet Module for HPE OneView provides resource style declaration capabilities to Puppet manifests for managing HPE OneView Appliances.
Module description
The Puppet Module for HPE OneView allows for management of HPE OneView Appliances through the use of puppet manifests and resource style declarations, which makes internal use of the HPE OneView Ruby SDK and HPE OneView API.
It adds several resource types to puppet, and uses ensurable methods such as present
, absent
and other custom ensurable methods to manage the appliance to allow users to easily create, update, query and delete resources.
For more information on the Puppet Module for HPE OneView resource types and their specifications, see the Usage and examples.
Setup
Requirements
- Puppet V4.1 or greater
- Ruby V2.3.1 or greater
- oneview-sdk-ruby V5.11.0 or greater (available as a gem)
Beginning with the Puppet Module for HPE OneView
To install this module from the Puppet Forge, with enough permissions to install puppet modules, use the command:
puppet module install hewlettpackard-oneview
Alternatively, you can clone the source code from https://github.com/HewlettPackard/oneview-puppet into your Puppet module path using the following command:
git clone https://github.com/HewlettPackard/oneview-puppet <your_module_path>/oneview
:exclamation: NOTE: HPE recommends that the cloned directory be named oneview
. It should also be noted that if the directory name contains any dashes it will not be found by puppet.
Usage
OneView appliance authentication
The attributes required for authenticating with your HPE OneView Appliance are:
ONEVIEW_URL
- The web address for the HPE OneView appliance. For example, https://oneview.example.comONEVIEW_TOKEN
- Set either this or the ONEVIEW_USER and ONEVIEW_PASSWORD.ONEVIEW_USER
- The HPE OneView appliance username.ONEVIEW_PASSWORD
- The HPE OneView appliance password.ONEVIEW_API_VERSION
- This defaults to the 200 API version (Minimum supported by oneview-sdk gem).ONEVIEW_LOG_LEVEL
- The log level of the HPE OneView appliance. This defaults to infoONEVIEW_SSL_ENABLED
- HPE recommends setting this value to trueONEVIEW_HARDWARE_VARIANT
- Set this to C7000 or Synergy, according to the appliance's enclosure's model. This defaults to C7000 :warning: TheSynergy
hardware variant is only available for API version >= 300 (OneView 3.0) :warning:
You can assign attributes for your appliances using three methods:
-
Create a json file named
login.json
on your working directory, and enter the authentication information for your appliance. See login_rename.json for an example. -
If you do not want to use the login file on the working directory, any json file containing the authentication information for the appliance can be used by setting the following environment variable:
ONEVIEW_AUTH_FILE
- This environment variable should contain the full path to the json file containing the authentication information.
-
Directly declare the authentication attributes mentioned previously as environment variables. The module will automatically use those values.
:exclamation: NOTE: All information stored on the login file or json files should be in clear text. To avoid security issues HPE recommends verifying the access permissions for those files.
Synergy Image Streamer authentication
The attributes required for authenticating with your HPE Synergy Image Streamer appliance are:
IMAGE_STREAMER_URL
- The web address for the HPE Image Streamer appliance. For example, https://imagestreamer.example.comIMAGE_STREAMER_API_VERSION
- The API version for the HPE Image Streamer. This defaults to 300IMAGE_STREAMER_LOG_LEVEL
- The log level of the HPE Image Streamer appliance. This defaults to infoIMAGE_STREAMER_SSL_ENABLED
- HPE recommends setting this value to true
The following attribute must be set only if you haven't configured the credentials to authenticate with your HPE OneView Appliance:
IMAGE_STREAMER_TOKEN
- The authentication token for the HPE Image Streamer. This is the same token used to access the HPE OneView REST API.
:exclamation: NOTE: All information stored on the login file or json files should be in clear text. To avoid security issues HPE recommends verifying the access permissions for those files.
You can assign attributes for your appliances using three methods:
-
Create a json file named
login_image_streamer.json
on your working directory, and enter the authentication information for your appliance. See login_image_streamer.json for an example. :exclamation: NOTE: You must provide a token only if you haven't configured the credentials to authenticate with your HPE OneView Appliance. -
If you do not want to use the login file on the working directory, any json file containing the authentication information for the appliance can be used by setting the following environment variable:
IMAGE_STREAMER_AUTH_FILE
- This environment variable should contain the full path to the json file containing the authentication information.
-
Directly declare the authentication attributes mentioned previously as environment variables. The module will automatically use those values.
:exclamation: NOTE: All information stored on the login file or json files should be in clear text. To avoid security issues HPE recommends verifying the access permissions for those files.
Running Examples with Docker
If you'd rather run the examples in a Docker container, you can use the Dockerfile at the top level of this repo. All you need is Docker and git (optional).
-
Clone this repo and cd into it:
$ git clone https://github.com/HewlettPackard/oneview-puppet.git $ cd oneview-puppet
Note: You can navigate to the repo url and download the repo as a zip file if you don't want to use git
-
You can build docker image locally or pull the docker image from Docker Hub.
Build docker image locally
- Build the docker image locally:
$ docker build -t puppet-oneview .
Using Docker Hub Image
- Pull docker image from Docker Hub:
The
hewlettpackardenterprise/hpe-oneview-sdk-for-puppet:<tag>
docker image contains an installation of oneview-puppet installation you can use by just pulling down the Docker Image:The Docker Store image tag consist of two sections: <sdk_version-OV_version>
# Download and store a local copy of hpe-oneview-sdk-for-puppet and # use it as a Docker image. $ docker pull hewlettpackardenterprise/hpe-oneview-sdk-for-puppet:v2.6.0-OV5.2 # Run docker container with below commands. $docker run -it --rm \ -v $(pwd)/:/puppet -e ONEVIEW_URL='https://ov.example.com' \ -e ONEVIEW_USER='Administrator' \ -e ONEVIEW_PASSWORD='secret123' \ -e ONEVIEW_SSL_ENABLED=true, \ -e ONEVIEW_LOG_LEVEL='info' \ -e ONEVIEW_API_VERSION=800 \ hewlettpackardenterprise/hpe-oneview-sdk-for-puppet:v2.6.0-OV5.2 puppet apply fc_network.pp --debug --trace
Now you can run any of the example manifests in this directory:
- Build the docker image locally:
# Run the container, passing in your credentials to OneView and specifying which example to run.
# Replace "pwd" with the path of the manifest you'd like to run
# Replace "fc_network" with the name of the manifest you'd like to run
$ docker run -it --rm \
-v $(pwd)/:/puppet
-e ONEVIEW_URL='https://ov.example.com' \
-e ONEVIEW_USER='Administrator' \
-e ONEVIEW_PASSWORD='secret123' \
-e ONEVIEW_SSL_ENABLED=true, \
-e ONEVIEW_LOG_LEVEL='info' \
-e ONEVIEW_API_VERSION=800 \
puppet-oneview puppet apply fc_network.pp --debug --trace
To run an Image Streamer example manifests:
# Note that we need an additional (I3S_URL) environment variable set
# (Replace "plan_script" with the name of the recipe you'd like to run)
$ docker run -it --rm \
-v $(pwd)/:/puppet
-e IMAGE_STREAMER_URL= 'https://imagestreamer.example.com' \
-e IMAGE_STREAMER_API_VERSION=600 \
-e IMAGE_STREAMER_LOG_LEVEL='info' \
-e IMAGE_STREAMER_SSL_ENABLED=true \
puppet-oneview puppet apply image_streamer/deployment_plan.pp --debug --trace
That's it! If you'd like to modify a manifest, simply modify the manifest file, then re-run the image.
Types and Providers
General
Most resources of the Puppet module for HPE OneView accept the following ensurable methods:
present
- Creates/adds/updates resources on which those operations are permitted.absent
- Deletes/removes resources.found
- Searches for resources of a specific type on the appliance (with or without specific filters), and prints the information to the standard output.
The majority of the ensurable methods on the resources require a data
parameter.
Inside data
a hash should be informed with all the information required for the operation to be performed.
All get_
ensurable methods send information that is retrieved to the standard output.
To provide easier deployment and management of infrastructure, all resources tags that either contain or require an Uri
can receive either the "name" or a "name, resource type" combination of parameters instead of the uri as the field value, unless otherwise specified.
For a uri clearly related to a resource, such as in enclosureUri
, the name can be given instead of the uri, For example:
enclosureUri => 'Puppet Example Enclosure'
instead of
enclosureUri => '/rest/enclosures/09SGH100X6J1'
and in the case of a general tag which does not specify its resource, such as mountUri, a "name, resource type" can be provided, For example:
mountUri => 'Puppet Example Enclosure, enclosure',
instead of
mountUri => '/rest/enclosures/09SGH100X6J1',
A sample snippet of a manifest:
oneview_ethernet_network{'Ethernet Network Create':
ensure => 'present',
data => {
name => 'Puppet network',
vlanId => '1045',
purpose => 'General',
smartLink => true,
privateNetwork => false,
connectionTemplateUri => nil,
type => 'ethernet-networkV3'
}
}
oneview_fc_network{'fc1':
ensure => 'present',
data => {
name => 'OneViewSDK Test FC Network',
connectionTemplateUri => nil,
autoLoginRedistribution => true,
fabricType => 'FabricAttach',
}
}
oneview_volume{'volume_1':
ensure => 'present',
data => {
name => 'Oneview_Puppet_TEST_VOLUME_1',
description => 'Test volume with common creation: Storage System + Storage Pool',
provisioningParameters => {
provisionType => 'Full',
shareable => true,
requestedCapacity => 1024 * 1024 * 1024,
storagePoolUri => 'FST_CPG1',
},
snapshotPoolUri => 'FST_CPG1'
}
}
General examples of the usage for each resource and ensurable can be found in the examples directory.
For more details for each resource type that the Puppet module for HPE OneView adds and their unique ensurable methods, refer to Resources.
Reference
The Puppet Module for HPE OneView uses the HPE OneView-Ruby-SDK to make all API calls and the HPE OneView API to execute all actions.
More information on the OneView-Ruby-SDK can be found on the official git repository: https://github.com/HewlettPackard/oneview-sdk-ruby
For additional information about the HPE OneView API and about the attributes and options it manages, go to: http://h17007.www1.hpe.com/docs/enterprise/servers/oneview2.0/cic-api/en/api-docs/current/index.html
Contributing and feature requests
Contributing: You know the drill. Fork it, branch it, change it, commit it, and pull-request it. We are passionate about improving this project, and glad to accept help to make it better.
NOTE: We reserve the right to reject changes that we feel do not fit the scope of this project. For feature additions, please open an issue to discuss your ideas before doing the work.
Feature Requests: If you have needs not being met by the current implementation, please let us know (via a new issue). This feedback is crucial for us to deliver a useful product. Do not assume we have already thought of everything, because we assure you that is not the case.
Testing
-
Style:
- Rubocop:
$ rake rubocop
- Puppet Lint:
$ rake lint
- Metadata:
$ rake metadata_lint
- Rubocop:
-
Unit:
$ rake spec
-
Run all tests:
$ rake test
For more information please refer to the Testing guidelines.
License
This project is licensed under the Apache 2.0 license. Please see LICENSE for more information.
Version and changes
To view history and notes for this version, view the Changelog.
Authors
- Ana Campesan - @anazard
- Chris Hurley - @chrishpe
- Felipe Bulsoni - @fgbulsoni
- Ricardo Piantola - @piantola
v2.7.0(2020-08-04)
Notes
- This release extends support of the SDK to OneView REST API version 1800 (OneView v5.30).
Oneview Features supported
- Connection Template
- Enclosure
- Enclosure Group
- Ethernet Network
- FC Network
- FCOE Network
- Hypervisor Cluster Profile
- Hypervisor Manager
- Interconnect
- Logical Enclosure
- Logical Interconnect
- Logical Interconnect Group
- Network Set
- Server Certificate
- Server Hardware
- Server Hardware Type
- Server Profile
- Server Profile Template
- Storage Pool
- Storage System
- Storage Volume Template
- Uplink Set
- Volume
- Volume Attachment
v2.6.0(2020-06-08)
Notes
- This release extends support of the SDK to OneView REST API version 1600 (OneView v5.20).
Oneview Features supported
- Connection Template
- Enclosure
- Enclosure Group
- Ethernet Network
- FC Network
- FCOE Network
- Hypervisor Cluster Profile
- Hypervisor Manager
- Interconnect
- Logical Enclosure
- Logical Interconnect
- Logical Interconnect Group
- Network Set
- Server Certificate
- Server Hardware
- Server Hardware Type
- Server Profile
- Server Profile Template
- Storage pool
- Storage system
- Storage volume template
- Uplink Set
- Volume
- Volume attachment
Image Streamer support
- Artifact Bundle
- Deployment plan
Bug fixes & Enhancements:
- #245LIG is not getting created with uplinkset of networkType FCNetwork
- #254Make oneview-puppet module compatible with PDK
v2.5.0 (2020-04-27)
Notes
- This release supports OneView Rest API versions 800/1000/1200 for Hypervisor resources.
- Added support to Server Certificate REST API version 600/800/1000/1200 through OneView.
- Added usecases for the following scenarios
- Infrastructure provisioning with OS on Synergy with Image Streamer.
- Infrastructure provisioning on Synergy with compute (with server settings), networking, and storage.
- Create and update infrastructure provisioning on Synergy with JBODS.
Oneview Features supported
- Hypervisor Cluster Profile
- Hypervisor Manager
- Server Certificate
Bug fixes & Enhancements:
- #236 Dockerfile is failing because of incorrect Ruby version.
v2.4.0 (2020-03-03)
Notes
- This release supports OneView Rest API versions 800/1000/1200 minimally where we can use OneView v4.10/v4.20/v5.0 with this SDK. No new fields are added/deleted to support OneView Rest API 800/1000/1200. Complete support will be done in next releases.
Bug fixes & Enhancements:
- #215 Creating a Server Profile based on a Template does not autofill its blank attributes with the template's
- #218 Not able to pass connection names in the SPT creation as the networkUri is not parsing in the connectionSettings
Oneview Features supported
- Connection template
- Ethernet network
- Enclosure
- Enclosure group
- FC network
- FCoE network
- Interconnect
- Interconnect link topology
- Interconnect type
- Logical enclosure
- Logical interconnect
- Logical interconnect group
- Network set
- SAS logical interconnect
- Server hardware
- Server hardware type
- Server profile
- Server profile template
- Storage pool
- Storage system
- Storage volume template
- Uplink set
- Volume
- Volume attachment
Image Streamer support
- Deployment plan
v2.3.0 (2018-06-26)
Version highlights:
- Added full support to OneView Rest API version 500 and 600 for the hardware variants C7000 and Synergy to the already existing features.
- Added support to the Image Streamer REST API version 500 and 600 for OS provisioning through OneView
- Added new common method
load_resource
, which should improve efficiency when loading resources of different resource types - Added TESTING.md file to explain the testing strategy in the module.
- Solved security issues regarding Rubocop by updating the gem dependency to use the latest version currently available (0.51.0).
Bug fixes & Enhancements:
- #123 Remove rest call from tests
- #165 Creating a Server Profile based on a Template does not autofill its blank attributes with the template's
- #172 Unit tests updated for ruby version 2.4.0 and above.
- #207 Server Profile Template update not working
Security specific issues:
- #169 Update rubocop to latest version
Notes
This release extends the full support for the Synergy and C7000 APIs to all the resources previously supported.
Oneview Features supported
- Connection template
- Enclosure group
- Ethernet network
- FC network
- FCoE network
- Internal link set
- Interconnect
- Interconnect link topology
- Interconnect type
- Logical enclosure
- Logical interconnect
- Logical interconnect group
- Logical switch
- Logical switch group
- Managed san
- Network set
- OS deployment plan
- SAS interconnect
- SAS interconnect type
- SAS logical interconnect
- SAS logical interconnect group
- SAS logical JBOD
- SAS logical JBOD attachment
- Server hardware
- Server profile
- Server profile template
- Storage pool
- Storage system
- Storage volume template
- Switch
- Switch type
- Uplink set
- Volume
Image Streamer support
- Deployment plan
- Golden image
- OS build plan
- OS volume
- Plan script
v2.2.2 (2017-07-07)
Version highlights:
- Provider names are now case insensitive
- Added the 'oneview' Puppet feature to require the 'oneview-sdk'
Bug fixes & Enhancements:
- #159 Provider name should not be case sensitive
- #161 Add rescue to requirement of 'oneview-sdk' to avoid catalog issues
v2.2.1 (2017-05-22)
Version highlights:
- Major refactor on internal methods. Improved idempotency, logging project-wide and reduced lines of code count.
- Raised 'oneview-sdk' version used to ~> 4.4.
- Several bugfixes and improvements.
Bug fixes & Enhancements:
- #95 Improve server profile idempotency
- #101 Improve server profile template idempotency
- #145 Refactor oneview_resource class and common for v2.2.0
- #148 Cannot create uplinkset for LIG on a Synergy frame
- #149 Server Profile - Network uris set inside the connections return error
- #151 SAS Logical Interconnect Group - Name to URI conversion fails on logicalInterconnectGroupUri fields
- #153 Idempotence error: Running a ensure => 'present' on a oneview_firmware_bundle resource
2.2.0 (2017-03-28)
Version highlights:
- Added support to the Image Streamer REST API version 300 for OS provisioning through OneView.
Puppet Types Added
- Image_streamer_artifact_bundle
- Image_streamer_build_plan
- Image_streamer_deployment_group
- Image_streamer_deployment_plan
- Image_streamer_golden_image
- Image_streamer_os_volume
- Image_streamer_plan_script
Bug fixes & Enhancements:
- #103 Unit tests should not require auth files/environment variables from the user
- #105 Create or update uplink sets through logical interconnect groups
- #116 Simplify login to i3s
- #119 Update unit tests to match updated remove_extra_unmanaged_volume from oneview-ruby-sdk
- #121 Deployment Plan and Golden Image should use the default uri parser
- #122 Uri_parsing should support upper case for uri
- #132 Allow option force for Image_streamer_golden_image download operations
- #133 Allow set a timeout for Image_streamer_golden_image upload
- #139 Error running oneview_logical_interconnect's ensure method get_default_settings after upgrading OneView SDK to >= v4.1
2.1.0 (2017-02-03)
Version highlights:
- Added full support to OneView Rest API version 300 for the hardware variants C7000 and Synergy to the already existing features.
- Implemented the Oneview_resource class to act as parent for the other resources, reducing code duplication and complexity.
- Enabled the 'puppet resource <oneview_type>' for most of the providers, allowing the resources to be queried.
- Overall refactor and code cleanup.
Notes
This release extends the full support for the Synergy and C7000 APIs to all the resources previously supported, and adds a few new resources specific to Synergy.
Puppet Types Added
- Oneview_drive_enclosure
- Oneview_sas_interconnect
- Oneview_sas_logical_interconnect
- Oneview_sas_logical_interconnect_group
Oneview Features supported
- Connection template
- Datacenter
- Drive enclosure
- Enclosure
- Enclosure group
- Ethernet network
- Fabric
- FC network
- FCoE network
- Firmware bundle
- Firmware driver
- Interconnect
- Interconnect link topology
- Internal link set
- Logical downlink
- Logical enclosure
- Logical interconnect
- Logical interconnect group
- Logical switch
- Logical switch group
- Managed SAN
- Network set
- Power device
- Rack
- SAN manager
- SAS interconnect
- SAS interconnect type
- SAS logical interconnect
- SAS logical interconnect group
- SAS logical JBOD
- SAS logical JBOD attachment
- Server hardware
- Server hardware type
- Server profile
- Server profile template
- Storage pool
- Storage system
- Switch
- Unmanaged device
- Uplink set
- Volume
- Volume attachment
- Volume template
2.0.0 (2017-01-05)
Notes
This is the Second major version of the Puppet module for the HPE OneView. It extends the support for the OneView API version 300, and adds support for Synergy hardware.
Major changes
- Added full support to OneView Rest API version 300 for the hardware variants C7000 and Synergy to the already existing features:
- Ethernet network
- FC network
- FCoE network
- Network set
- Support to Synergy hardware has been added. The 'hardware_variant' option is specified in the client and the providers in this module handle the correct execution.
- Updated the requirements for the module for using the oneview-sdk gem with versions greated than 3.0.0.
1.0.1 (2016-11-28)
- Added the .travis.yml file to the root of the project
- Configured continuous integration with Travis CI for the repository
- Disabled BlockLength for rubocop
- Added OS Support to metadata file
- Added shields to the README.md file
- Fixed issue on one of the firmware bundle unit tests
1.0.0 (2016-10-06)
Notes
This is the official release of the Puppet module for the HPE OneView. It features the creation of providers and types needed for managing OneView resources, example files for each type created, as well as a full set of unit and integration tests for each type and provider, with total code coverage averaging over 90%. For now it only supports C7000 enclosure types.
Summary
- Created all resources types and providers for the OneView API 200
- Created smoke, unit, and integration tests for all resources
Puppet Types Added
- Oneview_connection_template
- Oneview_datacenter
- Oneview_enclosure
- Oneview_enclosure_group
- Oneview_ethernet_network
- Oneview_fabric
- Oneview_fc_network
- Oneview_fcoe_network
- Oneview_firmware_bundle
- Oneview_firmware_driver
- Oneview_interconnect
- Oneview_logical_downlink
- Oneview_logical_enclosure
- Oneview_logical_interconnect
- Oneview_logical_interconnect_group
- Oneview_logical_switch
- Oneview_logical_switch_group
- Oneview_managed_san
- Oneview_network_set
- Oneview_power_device
- Oneview_racks
- Oneview_san_manager
- Oneview_server_hardware
- Oneview_server_hardware_type
- Oneview_server_profile
- Oneview_server_profile_template
- Oneview_storage_pool
- Oneview_storage_system
- Oneview_switch
- Oneview_unmanaged_device
- Oneview_uplink_set
- Oneview_volume
- Oneview_volume_attachment
- Oneview_volume_template
Oneview Features supported
- Connection template
- Datacenter
- Enclosure
- Enclosure group
- Ethernet network
- Fabric
- FC network
- FCOE network
- Firmware bundle
- Firmware driver
- Interconnect
- Logical downlink
- Logical enclosure
- Logical interconnect
- Logical interconnect group
- Logical switch
- Logical switch group
- Managed SAN
- Network set
- Power device
- Racks
- SAN manager
- Server hardware
- Server hardware type
- Server profile
- Server profile template
- Storage pool
- Storage system
- Switch
- Unmanaged device
- Uplink set
- Volume
- Volume attachment
- Volume template
Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2015-2016 Hewlett Packard Enterprise 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.