Version information
This version is compatible with:
- Puppet Enterprise 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, 2016.4.x
- Puppet >= 4.10.0 < 8.0.0
- , , , , ,
Start using this module
Add this module to your Puppetfile:
mod 'pest-bamboo', '4.0.2'
Learn more about managing modules with a PuppetfileDocumentation
puppet-bamboo
- Overview
- Prerequisites
- Usage
- Reference
- Limitations
- Development and Contributing
- Authors and Contributors
Overview
This is a Puppet module to manage the installation and initial configuration of Atlassian Bamboo, a continuous integration and build server.
- Manages the download and installation of Bamboo
- Manages some configuration settings, such as Tomcat ports, proxy configuration, Java options, and JVM tuning.
- Manages a user, group, and home
- Manages a service for Bamboo
There's still some post-installation steps that will need to be completed manually, such as entering a license and configuring the database.
This is a fork of [joshbeard/puppet-bamboo]https://github.com/joshbeard/puppet-bamboo which itself is a fork of maestrodev/bamboo, which appears to be dormant. It includes improvements from other authors as well, notably, Simon Croomes.
This module tries to follow conventions in the Confluence, Jira, and BitBucket modules
Prerequisites
- puppetlabs/augeas_core: https://forge.puppet.com/puppetlabs/augeas_core
- puppet/archive: https://forge.puppetlabs.com/puppet/archive
- puppetlabs/stdlib: https://forge.puppet.com/puppetlabs/stdlib
- A Java installation (e.g. via puppetlabs/java)
Consult the Atlassian Bamboo documentation for specific system requirements for your platform and version. This module does not manage a Java installation.
NOTE: Since Bamboo 5.10, Atlassian no longer supports JDK < 8
Usage
Defaults
To have Puppet install Bamboo with the default parameters, declare the bamboo class:
class { 'bamboo': }
The bamboo
class serves as a single "point of entry" for the module.
Examples
Customizations
class { 'bamboo':
version => '6.7.1',
installdir => '/opt/bamboo',
homedir => '/var/local/bamboo',
user => 'bamboo',
java_home => '/over/the/rainbow/java',
download_url => 'https://mirrors.example.com/atlassian/bamboo',
context_path => 'bamboo',
umask => '0022',
proxy => {
scheme => 'https',
proxyName => 'bamboo.example.com',
proxyPort => '443',
},
}
Using Hiera
contain bamboo
bamboo::version: '6.7.1'
bamboo::checksum: '774ec0917cccc5b90b7be3df4d661620'
bamboo::installdir: '/opt/bamboo'
bamboo::jvm_xms: '512m'
bamboo::jvm_xmx: '1024m'
bamboo::proxy:
scheme: 'https'
proxyName: 'bamboo.intranet.org'
proxyPort: '443'
bamboo::umask: '0022'
bamboo::download_url: 'https://repo.intranet.org/atlassian'
bamboo::java_home: '/etc/alternatives/java_sdk'
Context Path
Specifying a context_path
for instances where Bamboo is being served
from a path (e.g. example.com/bamboo)
class { 'bamboo':
context_path => 'bamboo',
}
This configures the embedded Bamboo Tomcat instance with the context path.
Reverse Proxy
For instances where Bamboo is behind a reverse proxy
class { 'bamboo':
proxy => {
scheme => 'https',
proxyName => 'bamboo.example.com',
proxyPort => '443',
},
}
This configures the embedded Bamboo Tomcat instance's connector.
The proxy parameter accepts a hash of Tomcat options for configuring the connector's proxy settings. Refer to Tomcat's documentation for more information.
Installation locations
class { 'bamboo':
installdir => '/opt/bamboo',
homedir => '/opt/local/bamboo',
}
JVM Tuning
class { 'bamboo':
java_home => '/usr/lib/java/custom',
jvm_xms => '512m',
jvm_xmx => '2048m',
jvm_permgen => '512m',
jvm_opts => '-Dcustomopt',
}
Tomcat Tuning
Bamboo's powered by an embedded Tomcat instance, which can be tweaked.
class { 'bamboo':
tomcat_port => '9090',
max_threads => '256',
min_spare_threads => '50',
connection_timeout => '30000',
accept_count => '200',
}
Reference
Class: bamboo
Parameters
version
Default: '6.7.1'
The version of Bamboo to download and install. Should be in a MAJOR.MINOR.PATH format.
Refer to https://www.atlassian.com/software/bamboo/download
extension
Default: 'tar.gz'
The file extension of the remote archive. This is typically .tar.gz
.
Accepts .tar.gz
or .zip
installdir
Default: '/usr/local/bamboo'
The base directory for extracting/installing Bamboo to. Note that it will
decompress inside this directory to a directory such as
atlassian-bamboo-6.7.1/
So an installdir
of /usr/local/bamboo
will
ultimately install Bamboo to /usr/local/bamboo/atlassian-bamboo-6.7.1/
by
default.
Refer to manage_installdir
and appdir
manage_installdir
Default: true
Boolean. Whether this module should be responsible for managing the
installdir
appdir
Default: ${installdir}/atlassian-bamboo-${version}
This is the directory that Bamboo gets extracted to within the 'installdir'
By default, this is a subdirectory with the specific version appended to it.
You might want to customize this if you don't want to use the default
atlassian-bamboo-${version}
convention.
manage_appdir
Default: true
Boolean. Whether this module should be responsible for managing the appdir
homedir
Default: '/var/local/bamboo'
The home directory for the Bamboo user. This path will be managed by this
module, even if manage_user
is false.
context_path
Default: '' (empty)
For instances where Bamboo is being served from a sub path, such as
example.com/bamboo
, where the context_path
would be bamboo
tomcat_port
Default: '8085'
The HTTP port for serving Bamboo.
max_threads
Default: '150'
Maps to Tomcat's maxThreads
HTTP attribute.
Refer to https://tomcat.apache.org/tomcat-7.0-doc/config/http.html for more information.
min_spare_threads
Default: '25'
Maps to Tomcat's minSpareThreads
HTTP attribute.
Refer to https://tomcat.apache.org/tomcat-7.0-doc/config/http.html for more information.
connection_timeout
Default: '20000'
Maps to Tomcat's connectionTimeout
HTTP attribute.
Refer to https://tomcat.apache.org/tomcat-7.0-doc/config/http.html for more information.
accept_count
Default: '100'
Maps to Tomcat's acceptCount
HTTP attribute.
Refer to https://tomcat.apache.org/tomcat-7.0-doc/config/http.html for more information.
proxy
Default: {}
Bamboo's proxy configuration for instances where Bamboo's being served with a reverse proxy in front of it (e.g. Apache or Nginx).
manage_user
Default: true
Specifies whether the module should manage the user or not.
manage_group
Default: true
Specifies whether the module should manage the group or not.
user
Default: 'bamboo'
Bamboo's installation will be owned by this user and the service will run as this user.
group
Default: 'bamboo'
Bamboo's installation will be owned by this group.
uid
Default: undef
Optionally specify a UID for the user.
gid
Default: undef
Optionally specify a GID for the group.
password
Default: '*'
Specify a password for the user.
shell
Default: '/bin/bash'
Specify a shell for the user.
java_home
Default: '/usr/lib/jvm/java'
Absolute path to the Java installation.
jvm_xms
Default: '256m'
Amount of memory the JVM will be started with.
jvm_xmx
Default: '1024m'
Maximum amount of memory the JVM has available.
You may need to increase this if you see java.lang.OutOfMemoryError
jvm_permgen
Default: '256m'
Size of the permanent generation heap. Unlikely that you need to tune this.
jvm_opts
Default: ''
Any custom options to start the JVM with.
jvm_optional
Default: ''
From Bamboo's default setenv.sh
:
Occasionally Atlassian Support may recommend that you set some specific JVM
arguments. You can use this variable below to do that.
download_url
Default: 'https://www.atlassian.com/software/bamboo/downloads/binary'
The base url to download Bamboo from. This should be the URL up to the actual filename. The default downloads from Atlassian's site.
proxy_server
Default: undef
Specify a proxy server to use on the archive
resource for downloading Bamboo, with port number
if needed. (e.g. https://example.com:8080)
proxy_server_type
Default: undef
Proxy server type (none|http|https|ftp) to use on the archive
resource for downloading Bamboo.
manage_service
Default: true
Whether this module should manage the service.
service_ensure
Default: 'running'
The state of the service, if managed.
service_enable
Default: true
Whether the service should start on boot.
service_file
Default: OS-specific (refer to manifests/params.pp
)
Path to the init script or service file (systemd).
service_template
Default: $bamboo::params::service_template
Template for the init script/service definition. The module includes an init
script and systemd service configuration, but you can use your own if you'd
like. This should refer to a Puppet module template. E.g.
modulename/bamboo.init.erb
shutdown_wait
Default: 20
Seconds to wait for the Bamboo process to stop. (e.g. service bamboo stop will wait this interval before attempting to kill the process and returning).
facts_ensure
Default: 'present'
Valid values are 'present' or 'absent'
Will provide an external fact called bamboo_version
with the installed
Bamboo version.
facter_dir
Default: See bamboo::params
Absolute path to the external facts directory. Refer to https://docs.puppet.com/facter/latest/custom_facts.html#external-facts
create_facter_dir
Default: true
Boolean
Whether this module should ensure the "facts.d" directory for external facts
is created. This module uses an Exec
resource to do that recursively if
this is true.
stop_command
Default: service bamboo stop && sleep 15
The command to execute prior to upgrading. This should stop any running Bamboo instance. This is executed after downloading the specified version and before extracting it to install it.
This requires the bamboo_version
fact.
initconfig_manage
Default: false
Specifies whether the initconfig file should be managed by this module.
initconfig_path
Default: $::osfamily
specific - see bamboo::params
Absolute path to the init config file (sysconfig, defaults). This file is
sourced by the init script if it exists.
Defaults to /etc/sysconfig/bamboo
on Red Hat family systems.
Defaults to /etc/default/bamboo
on Debian family systems.
initconfig_content
Default: '' (empty)
If initconfig_manage => true
, this string should be the content to populate
the init config file with.
umask
Default: undef
(will use Bamboo's default)
Specifies a UMASK to run Bamboo with.
checksum
Download archive file checksum.
checksum_type
Type of checksum for the archive file download.
Specifies the checksum_type
parameter on the puppet/archive resource.
Valid options: (none|md5|sha1|sha2|sha256|sha384|sha512)
Default: md5
Other Classes
The following classes are called from the base class. You shouldn't need to declare these directly.
Limitations
Tested Platforms
- EL 6
- EL 7
- Debian 8
- Debian 9
- Ubuntu 14.04
- Ubuntu 16.04
- Ubuntu 18.04
- Puppet 4.x
- Puppet 5.x
- Puppet 6.x
Bamboo Configuration
This module does not manage the initial set up of Bamboo - the steps that are
done via the web interface once installed and running. This doesn't appear
to be easily managed automatically. This includes database configuration and
the license. Ultimately, this configuration is placed in
${homedir}/bamboo-cfg.xml
. Contributions are welcome to help manage this.
Development and Contributing
Please submit a ticket for any issues, bug fixes, questions, and feature requests.
Pull requests with passing tests and updated tests are appreciated. Please add yourself to the CONTRIBUTORS
file and update the README
for documentation if appropriate.
Travis CI is used for testing.
How to test the Bamboo module
Install the dependencies:
bundle install
To see what's available:
bundle exec rake -T
Syntax validation, lint, and spec tests:
bundle exec rake validate
Unit tests:
bundle exec rake parallel_spec
Syntax validation:
bundle exec rake validate
Puppet Lint:
bundle exec rake lint
Acceptance tests (beaker):
# By default, this will test against CentOS 7 in a Docker container
bundle exec rake beaker:default
Other Beaker tests:
# Test against centos-6 using Docker
PUPPET_INSTALL_TYPE=agent \
BEAKER_debug=true \
BEAKER_PUPPET_COLLECTION=puppet6 \
BEAKER_TESTMODE=apply \
BEAKER_set=docker/centos-6 \
bundle exec rake beaker
# Test against centos-7 using Docker
PUPPET_INSTALL_TYPE=agent \
BEAKER_debug=true \
BEAKER_PUPPET_COLLECTION=puppet6 \
BEAKER_TESTMODE=apply \
BEAKER_set=docker/centos-7 \
bundle exec rake beaker
# Test against debian-8 using Docker
PUPPET_INSTALL_TYPE=agent \
BEAKER_debug=true \
BEAKER_PUPPET_COLLECTION=puppet6 \
BEAKER_TESTMODE=apply \
BEAKER_set=docker/debian-8 \
bundle exec rake beaker
# Test against debian-9 using Docker
PUPPET_INSTALL_TYPE=agent \
BEAKER_debug=true \
BEAKER_PUPPET_COLLECTION=puppet6 \
BEAKER_TESTMODE=apply \
BEAKER_set=docker/debian-9 \
bundle exec rake beaker
# Test against ubuntu-14.04 using Docker
PUPPET_INSTALL_TYPE=agent \
BEAKER_debug=true \
BEAKER_PUPPET_COLLECTION=puppet6 \
BEAKER_TESTMODE=apply \
BEAKER_set=docker/ubuntu-14.04 \
bundle exec rake beaker
# Test against ubuntu-16.04 using Docker
PUPPET_INSTALL_TYPE=agent \
BEAKER_debug=true \
BEAKER_PUPPET_COLLECTION=puppet6 \
BEAKER_TESTMODE=apply \
BEAKER_set=docker/ubuntu-16.04 \
bundle exec rake beaker
# Test against ubuntu-18.04 using Docker
PUPPET_INSTALL_TYPE=agent \
BEAKER_debug=true \
BEAKER_PUPPET_COLLECTION=puppet6 \
BEAKER_TESTMODE=apply \
BEAKER_set=docker/ubuntu-18.04 \
bundle exec rake beaker
You can set the BAMBOO_DOWNLOAD_URL
and BAMBOO_VERSION
environment
variables for setting the corresponding ::bamboo
class parameters for the
beaker tests.
Authors and Contributors
- Refer to the CONTRIBUTORS file.
- Original module by MaestroDev (http://www.maestrodev.com)
- Josh Beard (josh@signalboxes.net) https://github.com/joshbeard
- Carlos Sanchez (csanchez@maestrodev.com)
2021-11-17 - Release 4.0.2
Summary
- Adjustments by
pdk update
- Dropped
assert_private()
to fix collector failures - Dropped end of life distributions
- Changed bamboo default version to
8.0.3
- Extended test suite to puppet 7
- Updated module dependencies
2020-11-17 - Release 4.0.1
Summary
- Extended test suite to puppet 5 and puppet 6
- Updated README.md and metadata.json
- Added .sync.yml for
pdk update
2020-11-17 - Release 4.0.0
Summary
- Requires Puppet 4.10.0
- Changed default version to latest bamboo release 7.1.4
- Introduced types on init.pp
- Fixed spec tests for
pdk test unit
2019-04-23 - Release 3.6.0
Summary
- Use the archive module instead of the staging module (@bt-lemery PR #21)
- Refresh systemd if service file changes
2019-04-19 - Release 3.5.1
Summary
- Fix an issue with Bamboo > 6.8.0 in managing the Tomcat server connector proxy settings (PR #23)
2018-11-29 - Release 3.5.0
Summary
- Fix issue where environment variables (HOME) were preserved from the login user (root) and not set to Bamboo's in the service init. (30d12a5)
- Add
bamboo::umask
parameter to specify a custom UMASK. - Updates to tests
- Bump default Bamboo version to 6.7.1
- Adopt PDK
2016-12-21 - Release 3.4.1
Summary
- Fix issue where stale external fact is present, causing an upgrade attempt on every run. (issue #14)
- Don't set permgen by default
2016-12-13 - Release 3.4.0
Summary
-
Add ability to manage service config (/etc/(sysconfig|default)/bamboo)
- Add 3 new parameters:
initconfig_manage
,initconfig_path
, andinitconfig_content
(@exeral PR #7)
- Add 3 new parameters:
-
Support Debian and Ubuntu
-
Fix uknown
puppet_confdir
(resolves #11) (@ssteveli PR #12) -
update default bamboo version to 5.14.3.1
-
metadata: depend on
puppet/staging
instead ofnanliu/staging
-
testing: add acceptance tests (beaker) (resolves #10)
-
testing: update spec tests (resolves #10)
2016-11-17 - Release 3.3.0
Summary
- Optionally provide
bamboo_version
external fact - Support stopping service prior to upgrading (resolves #8)
- Update default version to 5.13.2
- README - minor typo correction on homedir parameter name in example (@exeral PR #9)
- metadata: use 'puppet-staging' instead of deprecated 'nanliu-staging'
2016-07-20 - Release 3.2.2
Summary
- Support point releases (x.x.x.x) (@spacepants PR #6)
- Update default version to 5.12.3.1
2016-02-04 - Release 3.2.1
Summary
- Provide param to disable managing the 'installdir' (@Etherdaemon PR #4)
- Provide param to disable managing the 'appdir' (@Etherdaemon PR #4)
- Provide param to specify a custom 'appdir' (@Etherdaemon PR #4)
2015-11-17 - Release 3.1.2
Summary
- Bump default Bamboo version to 5.9.7 from 5.9.4 (@tarrantmarshall PR #3)
- Specify catalina pid file in setenv.sh (@tarrantmarshall PR #3)
2015-10-09 - Release 3.1.1
Summary
- Documentation added
- Expanded unit testing
- Manage home directory even if user isn't managed
2015-10-08 - Release 3.1.0
Summary
- Improvements to init script
- Better status and stop handling - check process table and wait for process shutdown
- Remove lockfile - check process table
2015-10-07 - Release 3.0.0
Summary
- Forked module from dormant upstream and significant refactoring
- Abstract functionality into separate classes
- Add more customization options, including the ability to manage various Bamboo configuration settings (Tomcat)
- Abandon support for older versions of Bamboo
Release 2.0.0
- Works with Bamboo 4.4+
Release 1.0.0
- Works with Bamboo up to 4.4
Dependencies
- puppetlabs-stdlib (>= 4.25.1 < 9.0.0)
- puppet-archive (>= 1.0.0 < 7.0.0)
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 [yyyy] [name of copyright owner] 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.