Update cookbooks and roles
Change-Id: I832c3edd2114c6346c8f6f319b9c522662e0d158
This commit is contained in:
parent
6b2c6862b0
commit
46169eefe0
@ -17,8 +17,8 @@
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
default['build_essential']['compiletime'] = false
|
||||
#default['build_essential']['compiletime'] = true
|
||||
#default['build_essential']['compiletime'] = false
|
||||
default['build_essential']['compiletime'] = true
|
||||
|
||||
case node['platform_family']
|
||||
when "mac_os_x"
|
||||
|
21
chef/cookbooks/lvm/.gitignore
vendored
Normal file
21
chef/cookbooks/lvm/.gitignore
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
*~
|
||||
*#
|
||||
.#*
|
||||
\#*#
|
||||
.*.sw[a-z]
|
||||
*.un~
|
||||
*.tmp
|
||||
*.bk
|
||||
*.bkup
|
||||
.kitchen.local.yml
|
||||
Berksfile.lock
|
||||
Gemfile.lock
|
||||
|
||||
.bundle/
|
||||
.cache/
|
||||
.kitchen/
|
||||
.vagrant/
|
||||
.vagrant.d/
|
||||
bin/
|
||||
tmp/
|
||||
vendor/
|
70
chef/cookbooks/lvm/.kitchen.yml
Normal file
70
chef/cookbooks/lvm/.kitchen.yml
Normal file
@ -0,0 +1,70 @@
|
||||
---
|
||||
driver_plugin: vagrant
|
||||
driver_plugin: digitalocean
|
||||
driver_config:
|
||||
digitalocean_client_id: <%= ENV['DIGITAL_OCEAN_CLIENT_ID'] %>
|
||||
digitalocean_api_key: <%= ENV['DIGITAL_OCEAN_API_KEY'] %>
|
||||
aws_access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
|
||||
aws_secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
|
||||
aws_ssh_key_id: <%= ENV['AWS_KEYPAIR_NAME'] %>
|
||||
ssh_key: <%= ENV['AWS_PRIVATE_KEY_PATH'] %>
|
||||
rackspace_username: <%= ENV['RACKSPACE_USERNAME'] %>
|
||||
rackspace_api_key: <%= ENV['RACKSPACE_API_KEY'] %>
|
||||
require_chef_omnibus: latest
|
||||
|
||||
platforms:
|
||||
- name: centos-5.8
|
||||
driver_plugin: digitalocean
|
||||
driver_config:
|
||||
image_id: 1601
|
||||
flavor_id: 63
|
||||
region_id: 4
|
||||
ssh_key_ids: <%= ENV['DIGITAL_OCEAN_SSH_KEY_IDS'] %>
|
||||
|
||||
- name: centos-6.4
|
||||
driver_plugin: digitalocean
|
||||
driver_config:
|
||||
image_id: 562354
|
||||
flavor_id: 63
|
||||
region_id: 4
|
||||
ssh_key_ids: <%= ENV['DIGITAL_OCEAN_SSH_KEY_IDS'] %>
|
||||
|
||||
- name: amazon-2013.09
|
||||
driver_plugin: ec2
|
||||
driver_config:
|
||||
image_id: ami-3be4bc52
|
||||
username: ec2-user
|
||||
|
||||
# - name: fedora-19
|
||||
# driver_plugin: digitalocean
|
||||
# driver_config:
|
||||
# image_id: 696598
|
||||
# flavor_id: 63
|
||||
# region_id: 4
|
||||
# ssh_key_ids: <%= ENV['DIGITAL_OCEAN_SSH_KEY_IDS'] %>
|
||||
|
||||
- name: ubuntu-1004
|
||||
driver_plugin: digitalocean
|
||||
driver_config:
|
||||
image_id: 14097
|
||||
flavor_id: 63
|
||||
region_id: 4
|
||||
ssh_key_ids: <%= ENV['DIGITAL_OCEAN_SSH_KEY_IDS'] %>
|
||||
run_list:
|
||||
- recipe[apt]
|
||||
|
||||
- name: ubuntu-1204
|
||||
driver_plugin: digitalocean
|
||||
driver_config:
|
||||
image_id: 1505447
|
||||
flavor_id: 63
|
||||
region_id: 4
|
||||
ssh_key_ids: <%= ENV['DIGITAL_OCEAN_SSH_KEY_IDS'] %>
|
||||
run_list:
|
||||
- recipe[apt]
|
||||
|
||||
suites:
|
||||
- name: create
|
||||
run_list:
|
||||
- recipe[lvm]
|
||||
- recipe[fake::create]
|
23
chef/cookbooks/lvm/.rubocop.yml
Normal file
23
chef/cookbooks/lvm/.rubocop.yml
Normal file
@ -0,0 +1,23 @@
|
||||
AlignParameters:
|
||||
Enabled: false
|
||||
|
||||
Encoding:
|
||||
Enabled: false
|
||||
|
||||
LineLength:
|
||||
Max: 200
|
||||
|
||||
HashSyntax:
|
||||
EnforcedStyle: hash_rockets
|
||||
|
||||
MethodLength:
|
||||
Max: 30
|
||||
|
||||
CyclomaticComplexity:
|
||||
Max: 16
|
||||
|
||||
ParameterLists:
|
||||
Enabled: false
|
||||
|
||||
ClassLength:
|
||||
Max: 117
|
9
chef/cookbooks/lvm/.travis.yml
Normal file
9
chef/cookbooks/lvm/.travis.yml
Normal file
@ -0,0 +1,9 @@
|
||||
rvm:
|
||||
- 1.9.3
|
||||
- 2.0.0
|
||||
before_script:
|
||||
- bundle exec berks install
|
||||
script:
|
||||
- bundle exec foodcritic -f any .
|
||||
- bundle exec rspec --color --format progress
|
||||
- bundle exec rubocop
|
8
chef/cookbooks/lvm/Berksfile
Normal file
8
chef/cookbooks/lvm/Berksfile
Normal file
@ -0,0 +1,8 @@
|
||||
site :opscode
|
||||
metadata
|
||||
|
||||
group :integration do
|
||||
cookbook 'apt', '~> 2.0'
|
||||
cookbook 'yum', '~> 2.0'
|
||||
cookbook 'fake', path: 'test/fixtures/cookbooks/fake'
|
||||
end
|
63
chef/cookbooks/lvm/CHANGELOG.md
Normal file
63
chef/cookbooks/lvm/CHANGELOG.md
Normal file
@ -0,0 +1,63 @@
|
||||
lvm Cookbook CHANGELOG
|
||||
======================
|
||||
This file is used to list changes made in each version of the lvm cookbook.
|
||||
|
||||
|
||||
v1.0.4 (2013-12-28)
|
||||
-------------------
|
||||
### Bug
|
||||
- **[COOK-3987](https://tickets.opscode.com/browse/COOK-3987)** - Volumes are created with the wrong # of extents. Size = '2%VG' is treated as a size of 2 extents.
|
||||
|
||||
|
||||
v1.0.2
|
||||
------
|
||||
### Bug
|
||||
- **[COOK-3935](https://tickets.opscode.com/browse/COOK-3935)** - fix minor typo
|
||||
- Fixing up style
|
||||
- Updating test harness
|
||||
|
||||
|
||||
v1.0.0
|
||||
------
|
||||
### Improvement
|
||||
- **[COOK-3357](https://tickets.opscode.com/browse/COOK-3357)** - Complete refactor into a heavy-weight provider with tests
|
||||
|
||||
v0.8.12
|
||||
-------
|
||||
### Improvement
|
||||
- **[COOK-2991](https://tickets.opscode.com/browse/COOK-2991)** - Add SLES support
|
||||
|
||||
### Bug
|
||||
- **[COOK-2348](https://tickets.opscode.com/browse/COOK-2348)** - Fix `lvm_logical_volume` when `mount_point` parameter is a String
|
||||
|
||||
v0.8.10
|
||||
-------
|
||||
### Bug
|
||||
- [COOK-3031]: `ruby_block` to create logical volume is improperly named, causing collisions
|
||||
|
||||
v0.8.8
|
||||
------
|
||||
- [COOK-2283] - lvm version mismatch on fresh amazon linux install
|
||||
- [COOK-2733] - Fix invalid only_if command in lvm cookbook
|
||||
- [COOK-2822] - install, don't upgrade, lvm2 package
|
||||
|
||||
v0.8.6
|
||||
------
|
||||
- [COOK-2348] - lvm `logical_volume` doesn't work with `mount_point` parameter as String
|
||||
|
||||
v0.8.4
|
||||
------
|
||||
- [COOK-1977] - Typo "stripesize" in LVM cookbook
|
||||
- [COOK-1994] - Cannot create a logical volume if fstype is not given
|
||||
|
||||
v0.8.2
|
||||
------
|
||||
- [COOK-1857] - `lvm_logical_volume` resource callback conflicts with code in provider.
|
||||
|
||||
v0.8.0
|
||||
------
|
||||
- Added providers for managing the creation of LVM physical volumes, volume groups, and logical volumes.
|
||||
|
||||
v0.7.1
|
||||
------
|
||||
- Current public release
|
257
chef/cookbooks/lvm/CONTRIBUTING.md
Normal file
257
chef/cookbooks/lvm/CONTRIBUTING.md
Normal file
@ -0,0 +1,257 @@
|
||||
# Contributing to Opscode Cookbooks
|
||||
|
||||
We are glad you want to contribute to Opscode Cookbooks! The first
|
||||
step is the desire to improve the project.
|
||||
|
||||
You can find the answers to additional frequently asked questions
|
||||
[on the wiki](http://wiki.opscode.com/display/chef/How+to+Contribute).
|
||||
|
||||
You can find additional information about
|
||||
[contributing to cookbooks](http://wiki.opscode.com/display/chef/How+to+Contribute+to+Opscode+Cookbooks)
|
||||
on the wiki as well.
|
||||
|
||||
## Quick-contribute
|
||||
|
||||
* Create an account on our [bug tracker](http://tickets.opscode.com)
|
||||
* Sign our contributor agreement (CLA)
|
||||
[ online](https://secure.echosign.com/public/hostedForm?formid=PJIF5694K6L)
|
||||
(keep reading if you're contributing on behalf of your employer)
|
||||
* Create a ticket for your change on the
|
||||
[bug tracker](http://tickets.opscode.com)
|
||||
* Link to your patch as a rebased git branch or pull request from the
|
||||
ticket
|
||||
* Resolve the ticket as fixed
|
||||
|
||||
We regularly review contributions and will get back to you if we have
|
||||
any suggestions or concerns.
|
||||
|
||||
## The Apache License and the CLA/CCLA
|
||||
|
||||
Licensing is very important to open source projects, it helps ensure
|
||||
the software continues to be available under the terms that the author
|
||||
desired. Chef uses the Apache 2.0 license to strike a balance between
|
||||
open contribution and allowing you to use the software however you
|
||||
would like to.
|
||||
|
||||
The license tells you what rights you have that are provided by the
|
||||
copyright holder. It is important that the contributor fully
|
||||
understands what rights they are licensing and agrees to them.
|
||||
Sometimes the copyright holder isn't the contributor, most often when
|
||||
the contributor is doing work for a company.
|
||||
|
||||
To make a good faith effort to ensure these criteria are met, Opscode
|
||||
requires a Contributor License Agreement (CLA) or a Corporate
|
||||
Contributor License Agreement (CCLA) for all contributions. This is
|
||||
without exception due to some matters not being related to copyright
|
||||
and to avoid having to continually check with our lawyers about small
|
||||
patches.
|
||||
|
||||
It only takes a few minutes to complete a CLA, and you retain the
|
||||
copyright to your contribution.
|
||||
|
||||
You can complete our contributor agreement (CLA)
|
||||
[ online](https://secure.echosign.com/public/hostedForm?formid=PJIF5694K6L).
|
||||
If you're contributing on behalf of your employer, have your employer
|
||||
fill out our
|
||||
[Corporate CLA](https://secure.echosign.com/public/hostedForm?formid=PIE6C7AX856)
|
||||
instead.
|
||||
|
||||
## Ticket Tracker (JIRA)
|
||||
|
||||
The [ticket tracker](http://tickets.opscode.com) is the most important
|
||||
documentation for the code base. It provides significant historical
|
||||
information, such as:
|
||||
|
||||
* Which release a bug fix is included in
|
||||
* Discussion regarding the design and merits of features
|
||||
* Error output to aid in finding similar bugs
|
||||
|
||||
Each ticket should aim to fix one bug or add one feature.
|
||||
|
||||
## Using git
|
||||
|
||||
You can get a quick copy of the repository for this cookbook by
|
||||
running `git clone
|
||||
git://github.com/opscode-coobkooks/COOKBOOKNAME.git`.
|
||||
|
||||
For collaboration purposes, it is best if you create a Github account
|
||||
and fork the repository to your own account. Once you do this you will
|
||||
be able to push your changes to your Github repository for others to
|
||||
see and use.
|
||||
|
||||
If you have another repository in your GitHub account named the same
|
||||
as the cookbook, we suggest you suffix the repository with -cookbook.
|
||||
|
||||
### Branches and Commits
|
||||
|
||||
You should submit your patch as a git branch named after the ticket,
|
||||
such as COOK-1337. This is called a _topic branch_ and allows users to
|
||||
associate a branch of code with the ticket.
|
||||
|
||||
It is a best practice to have your commit message have a _summary
|
||||
line_ that includes the ticket number, followed by an empty line and
|
||||
then a brief description of the commit. This also helps other
|
||||
contributors understand the purpose of changes to the code.
|
||||
|
||||
[COOK-1757] - platform_family and style
|
||||
|
||||
* use platform_family for platform checking
|
||||
* update notifies syntax to "resource_type[resource_name]" instead of
|
||||
resources() lookup
|
||||
* COOK-692 - delete config files dropped off by packages in conf.d
|
||||
* dropped debian 4 support because all other platforms have the same
|
||||
values, and it is older than "old stable" debian release
|
||||
|
||||
Remember that not all users use Chef in the same way or on the same
|
||||
operating systems as you, so it is helpful to be clear about your use
|
||||
case and change so they can understand it even when it doesn't apply
|
||||
to them.
|
||||
|
||||
### Github and Pull Requests
|
||||
|
||||
All of Opscode's open source cookbook projects are available on
|
||||
[Github](http://www.github.com/opscode-cookbooks).
|
||||
|
||||
We don't require you to use Github, and we will even take patch diffs
|
||||
attached to tickets on the tracker. However Github has a lot of
|
||||
convenient features, such as being able to see a diff of changes
|
||||
between a pull request and the main repository quickly without
|
||||
downloading the branch.
|
||||
|
||||
If you do choose to use a pull request, please provide a link to the
|
||||
pull request from the ticket __and__ a link to the ticket from the
|
||||
pull request. Because pull requests only have two states, open and
|
||||
closed, we can't easily filter pull requests that are waiting for a
|
||||
reply from the author for various reasons.
|
||||
|
||||
### More information
|
||||
|
||||
Additional help with git is available on the
|
||||
[Working with Git](http://wiki.opscode.com/display/chef/Working+with+Git)
|
||||
wiki page.
|
||||
|
||||
## Functional and Unit Tests
|
||||
|
||||
This cookbook is set up to run tests under
|
||||
[Opscode's test-kitchen](https://github.com/opscode/test-kitchen). It
|
||||
uses minitest-chef to run integration tests after the node has been
|
||||
converged to verify that the state of the node.
|
||||
|
||||
Test kitchen should run completely without exception using the default
|
||||
[baseboxes provided by Opscode](https://github.com/opscode/bento).
|
||||
Because Test Kitchen creates VirtualBox machines and runs through
|
||||
every configuration in the Kitchenfile, it may take some time for
|
||||
these tests to complete.
|
||||
|
||||
If your changes are only for a specific recipe, run only its
|
||||
configuration with Test Kitchen. If you are adding a new recipe, or
|
||||
other functionality such as a LWRP or definition, please add
|
||||
appropriate tests and ensure they run with Test Kitchen.
|
||||
|
||||
If any don't pass, investigate them before submitting your patch.
|
||||
|
||||
Any new feature should have unit tests included with the patch with
|
||||
good code coverage to help protect it from future changes. Similarly,
|
||||
patches that fix a bug or regression should have a _regression test_.
|
||||
Simply put, this is a test that would fail without your patch but
|
||||
passes with it. The goal is to ensure this bug doesn't regress in the
|
||||
future. Consider a regular expression that doesn't match a certain
|
||||
pattern that it should, so you provide a patch and a test to ensure
|
||||
that the part of the code that uses this regular expression works as
|
||||
expected. Later another contributor may modify this regular expression
|
||||
in a way that breaks your use cases. The test you wrote will fail,
|
||||
signalling to them to research your ticket and use case and accounting
|
||||
for it.
|
||||
|
||||
If you need help writing tests, please ask on the Chef Developer's
|
||||
mailing list, or the #chef-hacking IRC channel.
|
||||
|
||||
## Code Review
|
||||
|
||||
Opscode regularly reviews code contributions and provides suggestions
|
||||
for improvement in the code itself or the implementation.
|
||||
|
||||
We find contributions by searching the ticket tracker for _resolved_
|
||||
tickets with a status of _fixed_. If we have feedback we will reopen
|
||||
the ticket and you should resolve it again when you've made the
|
||||
changes or have a response to our feedback. When we believe the patch
|
||||
is ready to be merged, we will tag the _Code Reviewed_ field with
|
||||
_Reviewed_.
|
||||
|
||||
Depending on the project, these tickets are then merged within a week
|
||||
or two, depending on the current release cycle.
|
||||
|
||||
## Release Cycle
|
||||
|
||||
The versioning for Opscode Cookbook projects is X.Y.Z.
|
||||
|
||||
* X is a major release, which may not be fully compatible with prior
|
||||
major releases
|
||||
* Y is a minor release, which adds both new features and bug fixes
|
||||
* Z is a patch release, which adds just bug fixes
|
||||
|
||||
A released version of a cookbook will end in an even number, e.g.
|
||||
"1.2.4" or "0.8.0". When development for the next version of the
|
||||
cookbook begins, the "Z" patch number is incremented to the next odd
|
||||
number, however the next release of the cookbook may be a major or
|
||||
minor incrementing version.
|
||||
|
||||
Releases of Opscode's cookbooks are usually announced on the Chef user
|
||||
mailing list. Releases of several cookbooks may be batched together
|
||||
and announced on the [Opscode Blog](http://www.opscode.com/blog).
|
||||
|
||||
## Working with the community
|
||||
|
||||
These resources will help you learn more about Chef and connect to
|
||||
other members of the Chef community:
|
||||
|
||||
* [chef](http://lists.opscode.com/sympa/info/chef) and
|
||||
[chef-dev](http://lists.opscode.com/sympa/info/chef-dev) mailing
|
||||
lists
|
||||
* #chef and #chef-hacking IRC channels on irc.freenode.net
|
||||
* [Community Cookbook site](http://community.opscode.com)
|
||||
* [Chef wiki](http://wiki.opscode.com/display/chef)
|
||||
* Opscode Chef [product page](http://www.opscode.com/chef)
|
||||
|
||||
|
||||
## Cookbook Contribution Do's and Don't's
|
||||
|
||||
Please do include tests for your contribution. If you need help, ask
|
||||
on the
|
||||
[chef-dev mailing list](http://lists.opscode.com/sympa/info/chef-dev)
|
||||
or the
|
||||
[#chef-hacking IRC channel](http://community.opscode.com/chat/chef-hacking).
|
||||
Not all platforms that a cookbook supports may be supported by Test
|
||||
Kitchen. Please provide evidence of testing your contribution if it
|
||||
isn't trivial so we don't have to duplicate effort in testing. Chef
|
||||
10.14+ "doc" formatted output is sufficient.
|
||||
|
||||
Please do indicate new platform (families) or platform versions in the
|
||||
commit message, and update the relevant ticket.
|
||||
|
||||
If a contribution adds new platforms or platform versions, indicate
|
||||
such in the body of the commit message(s), and update the relevant
|
||||
COOK ticket. When writing commit messages, it is helpful for others if
|
||||
you indicate the COOK ticket. For example:
|
||||
|
||||
git commit -m '[COOK-1041] - Updated pool resource to correctly
|
||||
delete.'
|
||||
|
||||
Please do use [foodcritic](http://acrmp.github.com/foodcritic) to
|
||||
lint-check the cookbook. Except FC007, it should pass all correctness
|
||||
rules. FC007 is okay as long as the dependent cookbooks are *required*
|
||||
for the default behavior of the cookbook, such as to support an
|
||||
uncommon platform, secondary recipe, etc.
|
||||
|
||||
Please do ensure that your changes do not break or modify behavior for
|
||||
other platforms supported by the cookbook. For example if your changes
|
||||
are for Debian, make sure that they do not break on CentOS.
|
||||
|
||||
Please do not modify the version number in the metadata.rb, Opscode
|
||||
will select the appropriate version based on the release cycle
|
||||
information above.
|
||||
|
||||
Please do not update the CHANGELOG.md for a new version. Not all
|
||||
changes to a cookbook may be merged and released in the same versions.
|
||||
Opscode will update the CHANGELOG.md when releasing a new version of
|
||||
the cookbook.
|
13
chef/cookbooks/lvm/Gemfile
Normal file
13
chef/cookbooks/lvm/Gemfile
Normal file
@ -0,0 +1,13 @@
|
||||
source 'https://rubygems.org'
|
||||
|
||||
gem 'berkshelf', '~> 2.0'
|
||||
gem 'chefspec', '~> 3.0'
|
||||
gem 'foodcritic', '~> 3.0'
|
||||
gem 'rubocop'
|
||||
|
||||
group :integration do
|
||||
gem 'test-kitchen', '~> 1.0'
|
||||
gem 'kitchen-vagrant', '~> 0.11'
|
||||
gem 'kitchen-digitalocean'
|
||||
gem 'kitchen-ec2'
|
||||
end
|
201
chef/cookbooks/lvm/LICENSE
Normal file
201
chef/cookbooks/lvm/LICENSE
Normal file
@ -0,0 +1,201 @@
|
||||
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.
|
345
chef/cookbooks/lvm/README.md
Normal file
345
chef/cookbooks/lvm/README.md
Normal file
@ -0,0 +1,345 @@
|
||||
lvm Cookbook
|
||||
============
|
||||
[](http://travis-ci.org/opscode-cookbooks/lvm)
|
||||
|
||||
Installs lvm2 package and includes resources for managing LVM. The default recipe simply installs LVM and the supporting Ruby gem. The cookbook includes providers for managing LVMs.
|
||||
|
||||
|
||||
Requirements
|
||||
------------
|
||||
- Chef 10 or higher
|
||||
|
||||
|
||||
Resources/Providers
|
||||
-------------------
|
||||
#### `lvm_physical_volume`
|
||||
Manages LVM physical volumes.
|
||||
|
||||
##### Actions
|
||||
<table>
|
||||
<tr>
|
||||
<th>Action</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>:create</td>
|
||||
<td>(default) Creates a new physical volume</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
##### Parameters
|
||||
<table>
|
||||
<tr>
|
||||
<th>Parameter</th>
|
||||
<th>Description</th>
|
||||
<th>Example</th>
|
||||
<th>Default</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>name</td>
|
||||
<td>(required) The device to create the new physical volume on</td>
|
||||
<td><tt>'/dev/sda'</tt></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
##### Examples
|
||||
```ruby
|
||||
lvm_physical_volume '/dev/sda'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `lvm_logical_volume`
|
||||
Manages LVM logical volumes.
|
||||
|
||||
##### Actions
|
||||
<table>
|
||||
<tr>
|
||||
<th>Action</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>:create</td>
|
||||
<td>(default) Creates a new logical volume</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
##### Parameters
|
||||
<table>
|
||||
<tr>
|
||||
<th>Attribute</th>
|
||||
<th>Description</th>
|
||||
<th>Example</th>
|
||||
<th>Default</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>name</td>
|
||||
<td>(name attribute) Name of the logical volume</td>
|
||||
<td><tt>bacon</tt></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>group</td>
|
||||
<td>(required) Volume group in which to create the new volume (not required if the volume is declared inside of an `lvm_volume_group` block)</td>
|
||||
<td><tt>bits</tt></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>size</td>
|
||||
<td>(required) Size of the volume.
|
||||
<ul>
|
||||
<li>It can be the size of the volume with units (k, K, m, M, g, G, t, T)</li>
|
||||
<li>It can be specified as the percentage of the size of the volume group</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li><tt>10G</tt></li>
|
||||
<li><tt>25%VG</tt></li>
|
||||
</ul>
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>filesystem</td>
|
||||
<td>The format for the file system</td>
|
||||
<td><tt>'ext4'</tt></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>mount_point</td>
|
||||
<td>
|
||||
Either a String containing the path to the mount point, or a Hash with the following keys:
|
||||
<ul>
|
||||
<li><tt>location<tt> - (required) the directory to mount the volume on</li>
|
||||
<li><tt>options</tt> - the mount options for the volume</li>
|
||||
<li><tt>dump</tt> - the <tt>dump</tt> field for the fstab entry</li>
|
||||
<li><tt>pass</tt> - the <tt>pass</tt> field for the fstab entry</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td><tt>'/var/my/mount'</tt></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>physical_volumes</td>
|
||||
<td>Array of physical volumes that the volume will be
|
||||
restricted to</td>
|
||||
<td><tt>['/dev/sda', '/dev/sdb']</tt></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>stripes</td>
|
||||
<td>Number of stripes for the volume</td>
|
||||
<td><tt>5</tt></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>stripe_size</td>
|
||||
<td>Number of kilobytes per stripe segment (must be a power of 2 less than or equal to the physical extent size for the volume group)</td>
|
||||
<td><tt>24</tt></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>mirrors</td>
|
||||
<td>Number of mirrors for the volume</td>
|
||||
<td><tt>5</tt></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>contiguous</td>
|
||||
<td>Whether or not volume should use the contiguous allocation
|
||||
policy</td>
|
||||
<td><tt>true</tt></td>
|
||||
<td><tt>false</tt></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>readahead</td>
|
||||
<td>The readahead sector count for the volume (can be a value
|
||||
between 2 and 120, 'auto', or 'none')</td>
|
||||
<td><tt>'auto'</tt></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
##### Examples
|
||||
|
||||
```ruby
|
||||
lvm_logical_volume 'home' do
|
||||
group 'vg00'
|
||||
size '25%VG'
|
||||
filesystem 'ext4'
|
||||
mount_point '/home'
|
||||
stripes 3
|
||||
mirrors 2
|
||||
end
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `lvm_volume_group`
|
||||
Manages LVM volume groups.
|
||||
|
||||
##### Actions
|
||||
<table>
|
||||
<tr>
|
||||
<th>Action</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>:create</td>
|
||||
<td>(default) Creates a new volume group</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
##### Parameters
|
||||
<table>
|
||||
<tr>
|
||||
<th>Attribute</th>
|
||||
<th>Description</th>
|
||||
<th>Example</th>
|
||||
<th>Default</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>name</td>
|
||||
<td>(required) Name of the volume group</td>
|
||||
<td><tt>'bacon'</tt></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>physical_volumes</td>
|
||||
<td>(required) The device or list of devices to use as physical volumes (if they haven't already been initialized as physical volumes, they will be initialized automatically)</td>
|
||||
<td><tt>['/dev/sda', '/dev/sdb']</tt></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>physical_extent_size</td>
|
||||
<td>The physical extent size for the volume group</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>logical_volume</td>
|
||||
<td>Shortcut for creating a new `lvm_logical_volume` definition (the logical volumes will be created in the order they are declared)</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
##### Examples
|
||||
```ruby
|
||||
lvm_volume_group 'vg00' do
|
||||
physical_volumes ['/dev/sda', '/dev/sdb', '/dev/sdc']
|
||||
|
||||
logical_volume 'logs' do
|
||||
size '1G'
|
||||
filesystem 'xfs'
|
||||
mount_point location: '/var/log', options: 'noatime,nodiratime'
|
||||
stripes 3
|
||||
end
|
||||
|
||||
logical_volume 'home' do
|
||||
size '25%VG'
|
||||
filesystem 'ext4'
|
||||
mount_point '/home'
|
||||
stripes 3
|
||||
mirrors 2
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
|
||||
Usage
|
||||
-----
|
||||
If you're using [Berkshelf](http://berkshelf.com), just add this cookbook to your `Berksfile`:
|
||||
|
||||
```ruby
|
||||
cookbook 'lvm'
|
||||
```
|
||||
|
||||
You can also install it from the community site:
|
||||
|
||||
```ruby
|
||||
knife cookbook site install lvm
|
||||
```
|
||||
|
||||
Include the default recipe in your run list on a node, in a role, or in another recipe:
|
||||
|
||||
```ruby
|
||||
run_list(
|
||||
'recipe[lvm::default]'
|
||||
)
|
||||
```
|
||||
|
||||
Depend on `lvm` in any cookbook that uses its Resources/Providers:
|
||||
|
||||
```ruby
|
||||
# other_cookbook/metadata.rb
|
||||
depends 'lvm'
|
||||
```
|
||||
|
||||
|
||||
Caveats
|
||||
-------
|
||||
This cookbook depends on the [di-ruby-lvm](https://github.com/DrillingInfo/di-ruby-lvm) and [di-ruby-lvm-attrib](https://github.com/DrillingInfo/di-ruby-lvm-attrib) gems. The di-ruby-lvm-attrib gem in particular is a common cause of failures when using the providers. If you get a failure with an error message similar to
|
||||
|
||||
```text
|
||||
No such file or directory - /opt/chef/.../di-ruby-lvm-attrib-0.0.3/lib/lvm/attributes/2.02.86(2)/lvs.yaml
|
||||
```
|
||||
|
||||
then you are running a version of lvm that the gems do not support. However, getting support added is usually pretty easy. Just follow the instructions on "Adding Attributes" in the [di-ruby-lvm-attrib README](https://github.com/DrillingInfo/di-ruby-lvm-attrib).
|
||||
|
||||
|
||||
Development
|
||||
-----------
|
||||
This section details "quick development" steps. For a detailed explanation, see [[Contributing.md]].
|
||||
|
||||
1. Clone this repository from GitHub:
|
||||
|
||||
$ git clone git@github.com:opscode-cookbooks/lvm.git
|
||||
|
||||
2. Create a git branch
|
||||
|
||||
$ git checkout -b my_bug_fix
|
||||
|
||||
3. Install dependencies:
|
||||
|
||||
$ bundle install
|
||||
|
||||
4. Make your changes/patches/fixes, committing appropiately
|
||||
5. **Write tests**
|
||||
6. Run the tests:
|
||||
- `bundle exec foodcritic -f any .`
|
||||
- `bundle exec rspec`
|
||||
- `bundle exec rubocop`
|
||||
- `bundle exec kitchen test`
|
||||
|
||||
In detail:
|
||||
- Foodcritic will catch any Chef-specific style errors
|
||||
- RSpec will run the unit tests
|
||||
- Rubocop will check for Ruby-specific style errors
|
||||
- Test Kitchen will run and converge the recipes
|
||||
|
||||
|
||||
License and Authors
|
||||
-------------------
|
||||
- Author:: Joshua Timberman <joshua@opscode.com>
|
||||
- Author:: Greg Symons <gsymons@drillinginfo.com>
|
||||
|
||||
```text
|
||||
Copyright:: 2011, Opscode, Inc
|
||||
|
||||
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.
|
||||
```
|
53
chef/cookbooks/lvm/TESTING.md
Normal file
53
chef/cookbooks/lvm/TESTING.md
Normal file
@ -0,0 +1,53 @@
|
||||
This cookbook uses a variety of testing components:
|
||||
|
||||
- Unit tests: [ChefSpec](https://github.com/acrmp/chefspec)
|
||||
- Integration tests: [Test Kitchen](https://github.com/opscode/test-kitchen)
|
||||
- Chef Style lints: [Foodcritic](https://github.com/acrmp/foodcritic)
|
||||
- Ruby Style lints: [Rubocop](https://github.com/bbatsov/rubocop)
|
||||
|
||||
|
||||
Prerequisites
|
||||
-------------
|
||||
To develop on this cookbook, you must have a sane Ruby 1.9+ environment. Given the nature of this installation process (and it's variance across multiple operating systems), we will leave this installation process to the user.
|
||||
|
||||
You must also have `bundler` installed:
|
||||
|
||||
$ gem install bundler
|
||||
|
||||
You must also have Vagrant and VirtualBox installed:
|
||||
|
||||
- [Vagrant](https://vagrantup.com)
|
||||
- [VirtualBox](https://virtualbox.org)
|
||||
|
||||
Once installed, you must install the `vagrant-berkshelf` plugin:
|
||||
|
||||
$ vagrant plugin install vagrant-berkshelf
|
||||
|
||||
|
||||
Development
|
||||
-----------
|
||||
1. Clone the git repository from GitHub:
|
||||
|
||||
$ git clone git@github.com:opscode-cookbooks/COOKBOOK.git
|
||||
|
||||
2. Install the dependencies using bundler:
|
||||
|
||||
$ bundle install
|
||||
|
||||
3. Create a branch for your changes:
|
||||
|
||||
$ git checkout -b my_bug_fix
|
||||
|
||||
4. Make any changes
|
||||
5. Write tests to support those changes. It is highly recommended you write both unit and integration tests.
|
||||
6. Run the tests:
|
||||
- `bundle exec rspec`
|
||||
- `bundle exec foodcritic .`
|
||||
- `bundle exec rubocop`
|
||||
- `bundle exec kitchen test`
|
||||
|
||||
7. Assuming the tests pass, open a Pull Request on GitHub
|
||||
8. Open a JIRA ticket for this compontent, linking the JIRA ticket to the Pull Request and visa versa.
|
||||
9. Mark the JIRA ticket as "Fix Provided"
|
||||
|
||||
For more information, see [Opscode's Contribution Guidelines](https://wiki.opscode.com/display/chef/How+to+Contribute).
|
157
chef/cookbooks/lvm/libraries/provider_lvm_logical_volume.rb
Normal file
157
chef/cookbooks/lvm/libraries/provider_lvm_logical_volume.rb
Normal file
@ -0,0 +1,157 @@
|
||||
#
|
||||
# Cookbook Name:: lvm
|
||||
# Library:: provider_lvm_logical_volume
|
||||
#
|
||||
# Copyright 2009-2013, Opscode, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
require 'chef/mixin/shell_out'
|
||||
|
||||
class Chef
|
||||
class Provider
|
||||
# The provider for lvm_logical_volume resource
|
||||
#
|
||||
class LvmLogicalVolume < Chef::Provider
|
||||
include Chef::Mixin::ShellOut
|
||||
|
||||
# Loads the current resource attributes
|
||||
#
|
||||
# @return [Chef::Resource::LvmLogicalVolume] the lvm_logical_volume resource
|
||||
#
|
||||
def load_current_resource
|
||||
@current_resource ||= Chef::Resource::LvmLogicalVolume.new(@new_resource.name)
|
||||
@current_resource
|
||||
end
|
||||
|
||||
# The create action
|
||||
#
|
||||
def action_create # rubocop:disable MethodLength
|
||||
require 'lvm'
|
||||
lvm = LVM::LVM.new
|
||||
name = new_resource.name
|
||||
group = new_resource.group
|
||||
fs_type = new_resource.filesystem
|
||||
device_name = "/dev/mapper/#{to_dm_name(group)}-#{to_dm_name(name)}"
|
||||
|
||||
vg = lvm.volume_groups[new_resource.group]
|
||||
# Create the logical volume
|
||||
if vg.nil? || vg.logical_volumes.select { |lv| lv.name == name }.empty?
|
||||
device_name = "/dev/mapper/#{to_dm_name(group)}-#{to_dm_name(name)}"
|
||||
size =
|
||||
case new_resource.size
|
||||
when /\d+[kKmMgGtT]/
|
||||
"--size #{new_resource.size}"
|
||||
when /(\d{1,2}|100)%(FREE|VG|PVS)/
|
||||
"--extents #{new_resource.size}"
|
||||
when /(\d+)/
|
||||
"--size #{$1}" # rubocop:disable PerlBackrefs
|
||||
end
|
||||
|
||||
stripes = new_resource.stripes ? "--stripes #{new_resource.stripes}" : ''
|
||||
stripe_size = new_resource.stripe_size ? "--stripesize #{new_resource.stripe_size}" : ''
|
||||
mirrors = new_resource.mirrors ? "--mirrors #{new_resource.mirrors}" : ''
|
||||
contiguous = new_resource.contiguous ? '--contiguous y' : ''
|
||||
readahead = new_resource.readahead ? "--readahead #{new_resource.readahead}" : ''
|
||||
physical_volumes = [new_resource.physical_volumes].flatten.join ' ' if new_resource.physical_volumes
|
||||
|
||||
command = "lvcreate #{size} #{stripes} #{stripe_size} #{mirrors} #{contiguous} #{readahead} --name #{name} #{group} #{physical_volumes}"
|
||||
Chef::Log.debug "Executing lvm command: '#{command}'"
|
||||
output = lvm.raw(command)
|
||||
Chef::Log.debug "Command output: '#{output}'"
|
||||
new_resource.updated_by_last_action(true)
|
||||
else
|
||||
Chef::Log.info "Logical volume '#{name}' already exists. Not creating..."
|
||||
end
|
||||
|
||||
# If file system is specified, format the logical volume
|
||||
if fs_type.nil?
|
||||
Chef::Log.info 'File system type is not set. Not formatting...'
|
||||
elsif device_formatted?(device_name, fs_type)
|
||||
Chef::Log.info "Volume '#{device_name}' is already formatted. Not formatting..."
|
||||
else
|
||||
shell_out!("yes | mkfs -t #{fs_type} #{device_name}")
|
||||
new_resource.updated_by_last_action(true)
|
||||
end
|
||||
|
||||
# If the mount point is specified, mount the logical volume
|
||||
if new_resource.mount_point
|
||||
if new_resource.mount_point.is_a?(String)
|
||||
mount_spec = { :location => new_resource.mount_point }
|
||||
else
|
||||
mount_spec = new_resource.mount_point
|
||||
end
|
||||
|
||||
# Create the mount point
|
||||
dir_resource = directory mount_spec[:location] do
|
||||
mode 0777
|
||||
owner 'root'
|
||||
group 'root'
|
||||
recursive true
|
||||
action :nothing
|
||||
end
|
||||
dir_resource.run_action(:create)
|
||||
# Mark the resource as updated if the directory resource is updated
|
||||
new_resource.updated_by_last_action(dir_resource.updated?)
|
||||
|
||||
# Mount the logical volume
|
||||
mount_resource = mount mount_spec[:location] do
|
||||
options mount_spec[:options]
|
||||
dump mount_spec[:dump]
|
||||
pass mount_spec[:pass]
|
||||
device device_name
|
||||
fstype fs_type
|
||||
action :nothing
|
||||
end
|
||||
mount_resource.run_action(:mount)
|
||||
mount_resource.run_action(:enable)
|
||||
# Mark the resource as updated if the mount resource is updated
|
||||
new_resource.updated_by_last_action(mount_resource.updated?)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Converts the device name to the dm name format
|
||||
#
|
||||
# The device mapper will double any hyphens found in a volume group or
|
||||
# logical volume name so that it can properly locate the separator between
|
||||
# the volume group and the logical volume in the device name.
|
||||
#
|
||||
# @param name [String] the name to map
|
||||
#
|
||||
# @return [String] the mapped dm name
|
||||
#
|
||||
def to_dm_name(name)
|
||||
name.gsub(/-/, '--')
|
||||
end
|
||||
|
||||
# Checks if the device is formatted with the given file system type
|
||||
#
|
||||
# @param device_name [String] the device name
|
||||
# @param fs_type [String] the file system type
|
||||
#
|
||||
# @return [Boolean] whether the device is formatted with the given file
|
||||
# system type or not
|
||||
#
|
||||
def device_formatted?(device_name, fs_type)
|
||||
Chef::Log.debug "Checking to see if #{device_name} is formatted..."
|
||||
# Do not raise when there is an error in running the blkid command. If the exitstatus is not 0,
|
||||
# the device is perhaps not formatted.
|
||||
blkid = shell_out("blkid -o value -s TYPE #{device_name}")
|
||||
blkid.exitstatus == 0 && blkid.stdout.strip == fs_type.strip
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
51
chef/cookbooks/lvm/libraries/provider_lvm_physical_volume.rb
Normal file
51
chef/cookbooks/lvm/libraries/provider_lvm_physical_volume.rb
Normal file
@ -0,0 +1,51 @@
|
||||
#
|
||||
# Cookbook Name:: lvm
|
||||
# Library:: provider_lvm_physical_volume
|
||||
#
|
||||
# Copyright 2009-2013, Opscode, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
require 'chef/provider'
|
||||
|
||||
class Chef
|
||||
class Provider
|
||||
# The provider for lvm_physical_volume resource
|
||||
#
|
||||
class LvmPhysicalVolume < Chef::Provider
|
||||
# Loads the current resource attributes
|
||||
#
|
||||
# @return [Chef::Resource::LvmPhysicalVolume] the lvm_physical_volume resource
|
||||
#
|
||||
def load_current_resource
|
||||
@current_resource ||= Chef::Resource::LvmPhysicalVolume.new(@new_resource.name)
|
||||
@current_resource
|
||||
end
|
||||
|
||||
# The create action
|
||||
#
|
||||
def action_create
|
||||
require 'lvm'
|
||||
lvm = LVM::LVM.new
|
||||
if lvm.physical_volumes[new_resource.name].nil?
|
||||
Chef::Log.info "Creating physical volume '#{new_resource.name}'"
|
||||
lvm.raw "pvcreate #{new_resource.name}"
|
||||
new_resource.updated_by_last_action(true)
|
||||
else
|
||||
Chef::Log.info "Physical volume '#{new_resource.name}' found. Not creating..."
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
106
chef/cookbooks/lvm/libraries/provider_lvm_volume_group.rb
Normal file
106
chef/cookbooks/lvm/libraries/provider_lvm_volume_group.rb
Normal file
@ -0,0 +1,106 @@
|
||||
#
|
||||
# Cookbook Name:: lvm
|
||||
# Library:: provider_lvm_volume_group
|
||||
#
|
||||
# Copyright 2009-2013, Opscode, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
require 'chef/mixin/shell_out'
|
||||
|
||||
class Chef
|
||||
class Provider
|
||||
# The provider for lvm_volume_group resource
|
||||
#
|
||||
class LvmVolumeGroup < Chef::Provider
|
||||
include Chef::Mixin::ShellOut
|
||||
|
||||
# Loads the current resource attributes
|
||||
#
|
||||
# @return [Chef::Resource::LvmVolumeGroup] the lvm_volume_group resource
|
||||
#
|
||||
def load_current_resource
|
||||
@current_resource ||= Chef::Resource::LvmVolumeGroup.new(@new_resource.name)
|
||||
@current_resource
|
||||
end
|
||||
|
||||
# The create action
|
||||
#
|
||||
def action_create
|
||||
require 'lvm'
|
||||
name = new_resource.name
|
||||
physical_volume_list = [new_resource.physical_volumes].flatten
|
||||
|
||||
# Make sure any pvs are not being used as filesystems (e.g. ephemeral0 on
|
||||
# AWS is always mounted at /mnt as an ext3 fs).
|
||||
#
|
||||
physical_volume_list.select { |pv| ::File.exist?(pv) }.each do |pv|
|
||||
# If the device is mounted, the mount point will be returned else nil will be returned.
|
||||
# mount_point is required by the mount resource for umount and disable actions.
|
||||
#
|
||||
mount_point = get_mount_point(pv)
|
||||
unless mount_point.nil?
|
||||
mount_resource = mount mount_point do
|
||||
device pv
|
||||
action :nothing
|
||||
end
|
||||
mount_resource.run_action(:umount)
|
||||
mount_resource.run_action(:disable)
|
||||
end
|
||||
end
|
||||
|
||||
lvm = LVM::LVM.new
|
||||
# Create the volume group
|
||||
if lvm.volume_groups[name]
|
||||
Chef::Log.info "Volume group '#{name}' already exists. Not creating..."
|
||||
else
|
||||
physical_volumes = physical_volume_list.join(' ')
|
||||
physical_extent_size = new_resource.physical_extent_size ? "-s #{new_resource.physical_extent_size}" : ''
|
||||
command = "vgcreate #{name} #{physical_extent_size} #{physical_volumes}"
|
||||
|
||||
Chef::Log.debug "Executing lvm command: '#{command}'"
|
||||
output = lvm.raw command
|
||||
Chef::Log.debug "Command output: '#{output}'"
|
||||
# Create the logical volumes specified as sub-resources
|
||||
new_resource.logical_volumes.each do |lv|
|
||||
lv.group new_resource.name
|
||||
lv.run_action :create
|
||||
end
|
||||
new_resource.updated_by_last_action(true)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Obtains the mount point of a device and returns nil if the device is not mounted
|
||||
#
|
||||
# @param device [String] the physical device
|
||||
#
|
||||
# @return [String] the mount point of the device if mounted and nil otherwise
|
||||
#
|
||||
def get_mount_point(device)
|
||||
mount_point = nil
|
||||
shell_out!('mount').stdout.each_line do |line|
|
||||
matched = line.match(/#{Regexp.escape(device)}\s+on\s+(.*)\s+type.*/)
|
||||
# If a match is found in the mount, obtain the mount point and return it
|
||||
unless matched.nil?
|
||||
mount_point = matched[1]
|
||||
break
|
||||
end
|
||||
end
|
||||
mount_point
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
231
chef/cookbooks/lvm/libraries/resource_lvm_logical_volume.rb
Normal file
231
chef/cookbooks/lvm/libraries/resource_lvm_logical_volume.rb
Normal file
@ -0,0 +1,231 @@
|
||||
#
|
||||
# Cookbook Name:: lvm
|
||||
# Library:: resource_lvm_logical_volume
|
||||
#
|
||||
# Copyright 2009-2013, Opscode, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
require 'chef/resource'
|
||||
|
||||
class Chef
|
||||
class Resource
|
||||
# The lvm_logical_volume resource
|
||||
#
|
||||
class LvmLogicalVolume < Chef::Resource
|
||||
# Initializes the lvm_logical_volume resource
|
||||
#
|
||||
# @param name [String] name of the resource
|
||||
# @param run_context [Chef::RunContext] the run context of chef run
|
||||
#
|
||||
# @return [Chef::Resource::LvmLogicalVolume] the lvm_logical_volume resource
|
||||
#
|
||||
def initialize(name, run_context = nil)
|
||||
super
|
||||
@resource_name = :lvm_logical_volume
|
||||
@action = :create
|
||||
@allowed_actions.push :create
|
||||
@provider = Chef::Provider::LvmLogicalVolume
|
||||
end
|
||||
|
||||
# Attribute: name - name of the logical volume
|
||||
#
|
||||
# @param arg [String] the name of the logical volume
|
||||
#
|
||||
# @return [String] the name of the logical volume
|
||||
#
|
||||
def name(arg = nil)
|
||||
set_or_return(
|
||||
:name,
|
||||
arg,
|
||||
:kind_of => String,
|
||||
:regex => /[\w+.-]+/,
|
||||
:name_attribute => true,
|
||||
:required => true,
|
||||
:callbacks => {
|
||||
"cannot be '.', '..', 'snapshot', or 'pvmove'" => proc do |value|
|
||||
!(value == '.' || value == '..' || value == 'snapshot' || value == 'pvmove')
|
||||
end,
|
||||
"cannot contain the strings '_mlog' or '_mimage'" => proc do |value|
|
||||
!value.match(/.*(_mlog|_mimage).*/)
|
||||
end
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
# Attribute: group - the volume group the logical volume belongs to
|
||||
#
|
||||
# @param arg [String] the volume group name
|
||||
#
|
||||
# @return [String] the volume group name
|
||||
#
|
||||
def group(arg = nil)
|
||||
set_or_return(
|
||||
:group,
|
||||
arg,
|
||||
:kind_of => String
|
||||
)
|
||||
end
|
||||
|
||||
# Attribute: size - size of the logical volume
|
||||
#
|
||||
# @param arg [String] the size of the logical volume
|
||||
#
|
||||
# @return [String] the size of the logical volume
|
||||
#
|
||||
def size(arg = nil)
|
||||
set_or_return(
|
||||
:size,
|
||||
arg,
|
||||
:kind_of => String,
|
||||
:regex => /^(\d+[kKmMgGtTpPeE]|(\d{1,2}|100)%(FREE|VG|PVS)|\d+)$/,
|
||||
:required => true
|
||||
)
|
||||
end
|
||||
|
||||
# Attribute: filesystem - the file system type
|
||||
#
|
||||
# @param arg [String] the file system type
|
||||
#
|
||||
# @return [String] the file system type
|
||||
#
|
||||
def filesystem(arg = nil)
|
||||
set_or_return(
|
||||
:filesystem,
|
||||
arg,
|
||||
:kind_of => String
|
||||
)
|
||||
end
|
||||
|
||||
# Attribute: mount_point - mount point for the logical volume
|
||||
#
|
||||
# @param arg [String] the mount point
|
||||
#
|
||||
# @return [String] the mount point
|
||||
#
|
||||
def mount_point(arg = nil)
|
||||
set_or_return(
|
||||
:mount_point,
|
||||
arg,
|
||||
:kind_of => [String, Hash],
|
||||
:callbacks => {
|
||||
': location is required!' => proc do |value|
|
||||
value.class == String || (value[:location] && !value[:location].empty?)
|
||||
end,
|
||||
': location must be an absolute path!' => proc do |value|
|
||||
# this can be a string or a hash, so attempt to match either for
|
||||
# the regex
|
||||
matches = value =~ /^\/[^\0]*/ || value[:location] =~ /^\/[^\0]*/
|
||||
!matches.nil?
|
||||
end
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
# Attribute: physical_volumes - list of physical volumes to be used for creation
|
||||
#
|
||||
# @param arg [String, Array] - list of physical devices
|
||||
#
|
||||
# @return [String, Array] - list of physical devices
|
||||
#
|
||||
def physical_volumes(arg = nil)
|
||||
set_or_return(
|
||||
:physical_volumes,
|
||||
arg,
|
||||
:kind_of => [String, Array]
|
||||
)
|
||||
end
|
||||
|
||||
# Attribute: stripes - number of stripes for the volume
|
||||
#
|
||||
# @param arg [String] number of stripes
|
||||
#
|
||||
# @return [String] number of stripes
|
||||
#
|
||||
def stripes(arg = nil)
|
||||
set_or_return(
|
||||
:stripes,
|
||||
arg,
|
||||
:kind_of => Integer,
|
||||
:callbacks => {
|
||||
'must be greater than 0' => proc { |value| value > 0 }
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
# Attribute: stripe_size - the stripe size
|
||||
#
|
||||
# @param arg [String] the stripe size
|
||||
#
|
||||
# @return [String] the stripe size
|
||||
#
|
||||
def stripe_size(arg = nil)
|
||||
set_or_return(
|
||||
:stripe_size,
|
||||
arg,
|
||||
:kind_of => Integer,
|
||||
:callbacks => {
|
||||
'must be a power of 2' => proc { |value| Math.log2(value) % 1 == 0 }
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
# Attribute: mirrors - number of mirrors for the volume
|
||||
#
|
||||
# @param arg [Integer] number of mirrors
|
||||
#
|
||||
# @return [Integer] number of mirrors
|
||||
#
|
||||
def mirrors(arg = nil)
|
||||
set_or_return(
|
||||
:mirrors,
|
||||
arg,
|
||||
:kind_of => Integer,
|
||||
:callbacks => {
|
||||
'must be greater than 0' => proc { |value| value > 0 }
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
# Attribute: contiguous - whether to use contiguous allocation policy
|
||||
#
|
||||
# @param arg [Boolean] whether to use contiguous allocation policy
|
||||
#
|
||||
# @return [Boolean] the contiguous allocation policy setting
|
||||
#
|
||||
def contiguous(arg = nil)
|
||||
set_or_return(
|
||||
:contiguous,
|
||||
arg,
|
||||
:kind_of => [TrueClass, FalseClass]
|
||||
)
|
||||
end
|
||||
|
||||
# Attribute: readahead - the read ahead sector count of the logical volume
|
||||
#
|
||||
# @param arg [Integer, String] the read ahead sector count
|
||||
#
|
||||
# @return [Integer, String] the read ahead sector count
|
||||
#
|
||||
def readahead(arg = nil)
|
||||
set_or_return(
|
||||
:readahead,
|
||||
arg,
|
||||
:kind_of => [Integer, String],
|
||||
:equal_to => [2..120, 'auto', 'none'].flatten!
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
59
chef/cookbooks/lvm/libraries/resource_lvm_physical_volume.rb
Normal file
59
chef/cookbooks/lvm/libraries/resource_lvm_physical_volume.rb
Normal file
@ -0,0 +1,59 @@
|
||||
#
|
||||
# Cookbook Name:: lvm
|
||||
# Library:: resource_lvm_physical_volume
|
||||
#
|
||||
# Copyright 2009-2013, Opscode, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
require 'chef/resource'
|
||||
|
||||
class Chef
|
||||
class Resource
|
||||
# The lvm_physical_volume resource
|
||||
#
|
||||
class LvmPhysicalVolume < Chef::Resource
|
||||
# Initializes lvm_physical_volume resource
|
||||
#
|
||||
# @param name [String] name of the resource
|
||||
# @param run_context [Chef::RunContext] the run context of chef run
|
||||
#
|
||||
# @return [Chef::Resource::LvmPhysicalVolume] the lvm_physical_volume resource
|
||||
#
|
||||
def initialize(name, run_context = nil)
|
||||
super
|
||||
@resource_name = :lvm_physical_volume
|
||||
@action = :create
|
||||
@allowed_actions.push :create
|
||||
@provider = Chef::Provider::LvmPhysicalVolume
|
||||
end
|
||||
|
||||
# Attribute: name - the physical device
|
||||
#
|
||||
# @param arg [String] the physical device
|
||||
#
|
||||
# @return [String] the physical device
|
||||
#
|
||||
def name(arg = nil)
|
||||
set_or_return(
|
||||
:name,
|
||||
arg,
|
||||
:kind_of => String,
|
||||
:name_attribute => true,
|
||||
:required => true
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
116
chef/cookbooks/lvm/libraries/resource_lvm_volume_group.rb
Normal file
116
chef/cookbooks/lvm/libraries/resource_lvm_volume_group.rb
Normal file
@ -0,0 +1,116 @@
|
||||
#
|
||||
# Cookbook Name:: lvm
|
||||
# Library:: resource_lvm_volume_group
|
||||
#
|
||||
# Copyright 2009-2013, Opscode, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
require 'chef/resource'
|
||||
|
||||
class Chef
|
||||
class Resource
|
||||
# The lvm_volume_group resource
|
||||
#
|
||||
class LvmVolumeGroup < Chef::Resource
|
||||
include Chef::DSL::Recipe
|
||||
|
||||
# Logical volumes to be created in the volume group
|
||||
attr_reader :logical_volumes
|
||||
|
||||
# Initializes the lvm_volume_group resource
|
||||
#
|
||||
# @param name [String] name of the resource
|
||||
# @param run_context [Chef::RunContext] the run context of chef run
|
||||
#
|
||||
# @return [Chef::Resource::LvmVolumeGroup] the lvm_volume_group resource
|
||||
#
|
||||
def initialize(name, run_context = nil)
|
||||
super
|
||||
@resource_name = :lvm_volume_group
|
||||
@action = :create
|
||||
@allowed_actions.push :create
|
||||
@logical_volumes = []
|
||||
@provider = Chef::Provider::LvmVolumeGroup
|
||||
end
|
||||
|
||||
# Attribute: name - name of the volume group
|
||||
#
|
||||
# @param arg [String] the name of the volume group
|
||||
#
|
||||
# @return [String] the name of the volume group
|
||||
#
|
||||
def name(arg = nil)
|
||||
set_or_return(
|
||||
:name,
|
||||
arg,
|
||||
:kind_of => String,
|
||||
:name_attribute => true,
|
||||
:regex => /[\w+.-]+/,
|
||||
:required => true,
|
||||
:callbacks => {
|
||||
"cannot be '.' or '..'" => proc do |value|
|
||||
!(value == '.' || value == '..')
|
||||
end
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
# Attribute: physical_volumes - list of physical devices this volume group should be restricted to
|
||||
#
|
||||
# @param arg [Array, String] list of physical devices
|
||||
#
|
||||
# @return [String] list of physical devices
|
||||
#
|
||||
def physical_volumes(arg = nil)
|
||||
set_or_return(
|
||||
:physical_volumes,
|
||||
arg,
|
||||
:kind_of => [Array, String],
|
||||
:required => true
|
||||
)
|
||||
end
|
||||
|
||||
# Attribute: physical_extent_size - the physical_extent_size
|
||||
#
|
||||
# @param arg [String] the physical extent size
|
||||
#
|
||||
# @return [String] the physical extent size
|
||||
#
|
||||
def physical_extent_size(arg = nil)
|
||||
set_or_return(
|
||||
:physical_extent_size,
|
||||
arg,
|
||||
:kind_of => String,
|
||||
:regex => /\d+[bBsSkKmMgGtTpPeE]?/
|
||||
)
|
||||
end
|
||||
|
||||
# A shortcut for creating a logical volume when creating the volume group
|
||||
#
|
||||
# @param name [String] the name of the logical volume
|
||||
# @param block [Proc] the block defining the lvm_logical_volume resource
|
||||
#
|
||||
# @return [Chef::Resource::LvmLogicalVolume] the lvm_logical_volume resource
|
||||
#
|
||||
def logical_volume(name, &block)
|
||||
Chef::Log.debug "Creating logical volume #{name}"
|
||||
volume = lvm_logical_volume(name, &block)
|
||||
volume.action :nothing
|
||||
@logical_volumes << volume
|
||||
volume
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
14
chef/cookbooks/lvm/metadata.rb
Normal file
14
chef/cookbooks/lvm/metadata.rb
Normal file
@ -0,0 +1,14 @@
|
||||
name 'lvm'
|
||||
maintainer 'Opscode, Inc.'
|
||||
maintainer_email 'cookbooks@opscode.com'
|
||||
license 'Apache 2.0'
|
||||
description 'Installs lvm2 package'
|
||||
version '1.0.5'
|
||||
|
||||
supports 'centos'
|
||||
supports 'debian'
|
||||
supports 'redhat'
|
||||
supports 'sles'
|
||||
supports 'ubuntu'
|
||||
|
||||
recipe 'lvm', 'Installs lvm2 package'
|
22
chef/cookbooks/lvm/recipes/default.rb
Normal file
22
chef/cookbooks/lvm/recipes/default.rb
Normal file
@ -0,0 +1,22 @@
|
||||
#
|
||||
# Cookbook Name:: lvm
|
||||
# Recipe:: default
|
||||
#
|
||||
# Copyright 2009-2013, Opscode, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
package 'lvm2'
|
||||
chef_gem 'di-ruby-lvm'
|
||||
chef_gem 'set_partition'
|
15
chef/cookbooks/lvm/spec/default_spec.rb
Normal file
15
chef/cookbooks/lvm/spec/default_spec.rb
Normal file
@ -0,0 +1,15 @@
|
||||
require 'spec_helper'
|
||||
|
||||
describe 'lvm::default' do
|
||||
let(:chef_run) do
|
||||
ChefSpec::Runner.new(:platform => 'ubuntu', :version => '12.04').converge('lvm::default')
|
||||
end
|
||||
|
||||
it 'installs lvm2' do
|
||||
expect(chef_run).to install_package('lvm2')
|
||||
end
|
||||
|
||||
it 'installs `di-ruby-lvm` as a Ruby gem' do
|
||||
expect(chef_run).to install_chef_gem('di-ruby-lvm')
|
||||
end
|
||||
end
|
2
chef/cookbooks/lvm/spec/spec_helper.rb
Normal file
2
chef/cookbooks/lvm/spec/spec_helper.rb
Normal file
@ -0,0 +1,2 @@
|
||||
require 'chefspec'
|
||||
require 'chefspec/berkshelf'
|
51
chef/cookbooks/lvm/test/fixtures/cookbooks/fake/libraries/helper.rb
vendored
Normal file
51
chef/cookbooks/lvm/test/fixtures/cookbooks/fake/libraries/helper.rb
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
#
|
||||
# Cookbook Name:: fake
|
||||
# Library:: helper
|
||||
#
|
||||
# Copyright (C) 2013 Opscode, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
module LvmTest
|
||||
# Helper definitions for lvmtest
|
||||
module Helper
|
||||
# Creates given loop devices
|
||||
#
|
||||
# @param devices [Integer] the devices to create
|
||||
#
|
||||
def self.create_loop_devices(devices)
|
||||
Array(devices).each do |device|
|
||||
num = device.slice(/\d+/)
|
||||
mk_vfile_cmd = "dd if=/dev/zero of=/vfile#{num} bs=1024 count=65536"
|
||||
Mixlib::ShellOut.new(mk_vfile_cmd).run_command.error!
|
||||
mk_loop_dev_cmd = "losetup #{device} /vfile#{num}"
|
||||
Mixlib::ShellOut.new(mk_loop_dev_cmd).run_command.error!
|
||||
end
|
||||
end
|
||||
|
||||
# Removes the given loop devices
|
||||
#
|
||||
# @param devices [Array, String] list of loop devices to remove
|
||||
#
|
||||
def self.remove_loop_devices(devices)
|
||||
require 'fileutils'
|
||||
Array(devices).each do |device|
|
||||
Chef::Log.info "Removing loop device: #{device}"
|
||||
num = device.slice(/\d+/)
|
||||
Mixlib::ShellOut.new("losetup -d #{device}").run_command.error!
|
||||
FileUtils.rm_rf("/vfile#{num}")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
8
chef/cookbooks/lvm/test/fixtures/cookbooks/fake/metadata.rb
vendored
Normal file
8
chef/cookbooks/lvm/test/fixtures/cookbooks/fake/metadata.rb
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
name 'fake'
|
||||
maintainer 'Opscode, Inc.'
|
||||
maintainer_email 'cookbooks@opscode.com'
|
||||
license 'Apache 2.0'
|
||||
description 'A fake cookbook to test lvm cookbook'
|
||||
version '0.1.0'
|
||||
|
||||
depends 'lvm'
|
86
chef/cookbooks/lvm/test/fixtures/cookbooks/fake/recipes/create.rb
vendored
Normal file
86
chef/cookbooks/lvm/test/fixtures/cookbooks/fake/recipes/create.rb
vendored
Normal file
@ -0,0 +1,86 @@
|
||||
#
|
||||
# Cookbook Name:: fake
|
||||
# Recipe:: create
|
||||
#
|
||||
# Copyright (C) 2013 Opscode, Inc.
|
||||
#
|
||||
# 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 distribued 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.
|
||||
#
|
||||
|
||||
# The test device to use
|
||||
devices = [
|
||||
'/dev/loop0',
|
||||
'/dev/loop1',
|
||||
'/dev/loop2',
|
||||
'/dev/loop3',
|
||||
'/dev/loop4',
|
||||
'/dev/loop5',
|
||||
'/dev/loop6',
|
||||
'/dev/loop7'
|
||||
]
|
||||
|
||||
# Creates the loop back device
|
||||
LvmTest::Helper.create_loop_devices(devices)
|
||||
|
||||
# Creates the physical device
|
||||
|
||||
log 'Creating physical volume for test'
|
||||
devices.each do |device|
|
||||
lvm_physical_volume device
|
||||
end
|
||||
|
||||
# Verify that the create action is idempotent
|
||||
lvm_physical_volume devices.first
|
||||
|
||||
# Creates the volume group
|
||||
#
|
||||
lvm_volume_group 'vg-data' do
|
||||
physical_volumes ['/dev/loop0', '/dev/loop1', '/dev/loop2', '/dev/loop3']
|
||||
|
||||
logical_volume 'logs' do
|
||||
size '10M'
|
||||
filesystem 'ext2'
|
||||
mount_point :location => '/mnt/logs', :options => 'noatime,nodiratime'
|
||||
stripes 2
|
||||
end
|
||||
|
||||
logical_volume 'home' do
|
||||
size '5M'
|
||||
filesystem 'ext2'
|
||||
mount_point '/mnt/home'
|
||||
stripes 1
|
||||
mirrors 2
|
||||
end
|
||||
end
|
||||
|
||||
lvm_volume_group 'vg-test' do
|
||||
physical_volumes ['/dev/loop4', '/dev/loop5', '/dev/loop6', '/dev/loop7']
|
||||
end
|
||||
|
||||
# Creates the logical volume
|
||||
#
|
||||
lvm_logical_volume 'test' do
|
||||
group 'vg-test'
|
||||
size '50%VG'
|
||||
filesystem 'ext3'
|
||||
mount_point '/mnt/test'
|
||||
end
|
||||
|
||||
# Creates a small logical volume
|
||||
#
|
||||
lvm_logical_volume 'small' do
|
||||
group 'vg-test'
|
||||
size '2%VG'
|
||||
filesystem 'ext3'
|
||||
mount_point '/mnt/small'
|
||||
end
|
@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env bats
|
||||
|
||||
# On CentOS 5.9, most of the commands used here are not in PATH. So add them
|
||||
# here.
|
||||
export PATH=$PATH:/sbin:/usr/sbin
|
||||
|
||||
@test "creates the physical volumes" {
|
||||
pvs | grep /dev/loop0
|
||||
pvs | grep /dev/loop1
|
||||
pvs | grep /dev/loop2
|
||||
pvs | grep /dev/loop3
|
||||
pvs | grep /dev/loop4
|
||||
}
|
||||
|
||||
@test "creates the volume group vg-data" {
|
||||
vgs | grep vg-data
|
||||
}
|
||||
|
||||
@test "creates the logical volume logs on vg-data" {
|
||||
lvs | grep logs | grep vg-data
|
||||
}
|
||||
|
||||
@test "logical volume logs is formatted as ext2 filesystem" {
|
||||
blkid /dev/mapper/vg--data-logs | grep "TYPE=\"ext2\""
|
||||
}
|
||||
|
||||
@test "mounts the logical volume logs to /mnt/logs" {
|
||||
mountpoint /mnt/logs
|
||||
mount | grep /dev/mapper/vg--data-logs | grep /mnt/logs
|
||||
}
|
||||
|
||||
@test "creates the logical volume home on vg-data" {
|
||||
lvs | grep home | grep vg-data
|
||||
}
|
||||
|
||||
@test "logical volume home is formatted as ext2 filesystem" {
|
||||
blkid /dev/mapper/vg--data-home | grep "TYPE=\"ext2\""
|
||||
}
|
||||
|
||||
@test "mounts the logical volume home to /mnt/home" {
|
||||
mountpoint /mnt/home
|
||||
mount | grep /dev/mapper/vg--data-home | grep /mnt/home
|
||||
}
|
||||
|
||||
@test "creates the volume group vg-test" {
|
||||
vgs | grep vg-test
|
||||
}
|
||||
|
||||
@test "creates the logical volume 'test' on 'vg-test'" {
|
||||
lvs | grep test | grep vg-test
|
||||
}
|
||||
|
||||
@test "logical volume 'test' is formatted as 'ext3' filesystem" {
|
||||
blkid /dev/mapper/vg--test-test | grep "TYPE=\"ext3\""
|
||||
}
|
||||
|
||||
@test "mounts the logical volume to /mnt/test" {
|
||||
mountpoint /mnt/test
|
||||
mount | grep /dev/mapper/vg--test-test | grep /mnt/test
|
||||
}
|
||||
|
||||
@test "creates the logical volume 'small' on 'vg-test'" {
|
||||
lvs | grep small | grep vg-test
|
||||
}
|
||||
|
||||
@test "logical volume 'test' is formatted as 'ext3' filesystem" {
|
||||
blkid /dev/mapper/vg--test-small | grep "TYPE=\"ext3\""
|
||||
}
|
||||
|
||||
@test "mounts the logical volume to /mnt/small" {
|
||||
mountpoint /mnt/small
|
||||
mount | grep /dev/mapper/vg--test-small | grep /mnt/small
|
||||
}
|
||||
|
||||
@test "creates the logical volume using 2% of the available vg extents" {
|
||||
vgsize="$(vgdisplay vg-test|awk '/Total PE/ {print $3}')"
|
||||
lvsize="$(lvdisplay /dev/mapper/vg--test-small|awk '/Current LE/ {print $3}')"
|
||||
vg2pct="$(( $vgsize/50 ))"
|
||||
[ "$lvsize" -ge "$vg2pct" ]
|
||||
}
|
2
chef/cookbooks/net/.gitignore
vendored
Normal file
2
chef/cookbooks/net/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
.bundle
|
||||
.cookbooks/
|
4
chef/cookbooks/net/.travis.yml
Normal file
4
chef/cookbooks/net/.travis.yml
Normal file
@ -0,0 +1,4 @@
|
||||
language: ruby
|
||||
rvm:
|
||||
- 1.9.3
|
||||
script: ./run_tests.bash
|
1
chef/cookbooks/net/Berksfile
Normal file
1
chef/cookbooks/net/Berksfile
Normal file
@ -0,0 +1 @@
|
||||
metadata
|
1
chef/cookbooks/net/Berksfile.lock
Normal file
1
chef/cookbooks/net/Berksfile.lock
Normal file
@ -0,0 +1 @@
|
||||
cookbook 'parted', :path => '/home/jdewey/git/cookbook-parted'
|
5
chef/cookbooks/net/Gemfile
Normal file
5
chef/cookbooks/net/Gemfile
Normal file
@ -0,0 +1,5 @@
|
||||
source :rubygems
|
||||
|
||||
gem "berkshelf", "~> 1.0.4"
|
||||
gem "chefspec", "~> 0.9.0"
|
||||
gem "foodcritic", "~> 1.6.1"
|
177
chef/cookbooks/net/Gemfile.lock
Normal file
177
chef/cookbooks/net/Gemfile.lock
Normal file
@ -0,0 +1,177 @@
|
||||
GEM
|
||||
remote: http://rubygems.org/
|
||||
specs:
|
||||
activemodel (3.2.11)
|
||||
activesupport (= 3.2.11)
|
||||
builder (~> 3.0.0)
|
||||
activesupport (3.2.11)
|
||||
i18n (~> 0.6)
|
||||
multi_json (~> 1.0)
|
||||
addressable (2.3.2)
|
||||
archive-tar-minitar (0.5.2)
|
||||
berkshelf (1.0.4)
|
||||
activesupport
|
||||
chef (>= 10.16.2)
|
||||
chozo (>= 0.2.3)
|
||||
hashie
|
||||
minitar
|
||||
multi_json (>= 1.3.0)
|
||||
ridley (>= 0.4.1)
|
||||
solve (>= 0.4.0.rc1)
|
||||
thor (~> 0.16.0)
|
||||
vagrant (~> 1.0.5)
|
||||
yajl-ruby
|
||||
builder (3.0.4)
|
||||
bunny (0.7.9)
|
||||
celluloid (0.12.4)
|
||||
facter (>= 1.6.12)
|
||||
timers (>= 1.0.0)
|
||||
chef (10.18.2)
|
||||
bunny (>= 0.6.0, < 0.8.0)
|
||||
erubis
|
||||
highline (>= 1.6.9)
|
||||
json (>= 1.4.4, <= 1.6.1)
|
||||
mixlib-authentication (>= 1.3.0)
|
||||
mixlib-cli (>= 1.1.0)
|
||||
mixlib-config (>= 1.1.2)
|
||||
mixlib-log (>= 1.3.0)
|
||||
mixlib-shellout
|
||||
moneta (< 0.7.0)
|
||||
net-ssh (~> 2.2.2)
|
||||
net-ssh-multi (~> 1.1.0)
|
||||
ohai (>= 0.6.0)
|
||||
rest-client (>= 1.0.4, < 1.7.0)
|
||||
treetop (~> 1.4.9)
|
||||
uuidtools
|
||||
yajl-ruby (~> 1.1)
|
||||
chefspec (0.9.0)
|
||||
chef (>= 0.9.12)
|
||||
erubis
|
||||
minitest-chef-handler (~> 0.6.0)
|
||||
rspec (~> 2.11.0)
|
||||
childprocess (0.3.7)
|
||||
ffi (~> 1.0, >= 1.0.6)
|
||||
chozo (0.4.2)
|
||||
activesupport (>= 3.2.0)
|
||||
hashie
|
||||
multi_json (>= 1.3.0)
|
||||
ci_reporter (1.8.3)
|
||||
builder (>= 2.1.2)
|
||||
coderay (1.0.8)
|
||||
diff-lcs (1.1.3)
|
||||
erubis (2.7.0)
|
||||
facter (1.6.17)
|
||||
faraday (0.8.4)
|
||||
multipart-post (~> 1.1)
|
||||
ffi (1.3.1)
|
||||
foodcritic (1.6.1)
|
||||
erubis
|
||||
gherkin (~> 2.11.1)
|
||||
gist (~> 3.1.0)
|
||||
nokogiri (= 1.5.0)
|
||||
pry (~> 0.9.8.4)
|
||||
rak (~> 1.4)
|
||||
treetop (~> 1.4.10)
|
||||
yajl-ruby (~> 1.1.0)
|
||||
gherkin (2.11.5)
|
||||
json (>= 1.4.6)
|
||||
gist (3.1.1)
|
||||
hashie (1.2.0)
|
||||
highline (1.6.15)
|
||||
i18n (0.6.1)
|
||||
ipaddress (0.8.0)
|
||||
json (1.5.4)
|
||||
log4r (1.1.10)
|
||||
method_source (0.7.1)
|
||||
mime-types (1.19)
|
||||
minitar (0.5.4)
|
||||
minitest (4.5.0)
|
||||
minitest-chef-handler (0.6.5)
|
||||
chef
|
||||
ci_reporter
|
||||
minitest
|
||||
mixlib-authentication (1.3.0)
|
||||
mixlib-log
|
||||
mixlib-cli (1.3.0)
|
||||
mixlib-config (1.1.2)
|
||||
mixlib-log (1.4.1)
|
||||
mixlib-shellout (1.1.0)
|
||||
moneta (0.6.0)
|
||||
multi_json (1.5.0)
|
||||
multipart-post (1.1.5)
|
||||
net-http-persistent (2.8)
|
||||
net-scp (1.0.4)
|
||||
net-ssh (>= 1.99.1)
|
||||
net-ssh (2.2.2)
|
||||
net-ssh-gateway (1.1.0)
|
||||
net-ssh (>= 1.99.1)
|
||||
net-ssh-multi (1.1)
|
||||
net-ssh (>= 2.1.4)
|
||||
net-ssh-gateway (>= 0.99.0)
|
||||
nokogiri (1.5.0)
|
||||
ohai (6.16.0)
|
||||
ipaddress
|
||||
mixlib-cli
|
||||
mixlib-config
|
||||
mixlib-log
|
||||
mixlib-shellout
|
||||
systemu
|
||||
yajl-ruby
|
||||
polyglot (0.3.3)
|
||||
pry (0.9.8.4)
|
||||
coderay (~> 1.0.5)
|
||||
method_source (~> 0.7.1)
|
||||
slop (>= 2.4.4, < 3)
|
||||
rak (1.4)
|
||||
rest-client (1.6.7)
|
||||
mime-types (>= 1.16)
|
||||
ridley (0.6.3)
|
||||
activemodel (>= 3.2.0)
|
||||
activesupport (>= 3.2.0)
|
||||
addressable
|
||||
celluloid
|
||||
chozo (>= 0.2.2)
|
||||
erubis
|
||||
faraday
|
||||
json (>= 1.5.0)
|
||||
mixlib-authentication
|
||||
mixlib-log
|
||||
multi_json (>= 1.0.4)
|
||||
net-http-persistent (>= 2.8)
|
||||
net-ssh
|
||||
rspec (2.11.0)
|
||||
rspec-core (~> 2.11.0)
|
||||
rspec-expectations (~> 2.11.0)
|
||||
rspec-mocks (~> 2.11.0)
|
||||
rspec-core (2.11.1)
|
||||
rspec-expectations (2.11.3)
|
||||
diff-lcs (~> 1.1.3)
|
||||
rspec-mocks (2.11.3)
|
||||
slop (2.4.4)
|
||||
solve (0.4.1)
|
||||
json
|
||||
systemu (2.5.2)
|
||||
thor (0.16.0)
|
||||
timers (1.1.0)
|
||||
treetop (1.4.12)
|
||||
polyglot
|
||||
polyglot (>= 0.3.1)
|
||||
uuidtools (2.1.3)
|
||||
vagrant (1.0.5)
|
||||
archive-tar-minitar (= 0.5.2)
|
||||
childprocess (~> 0.3.1)
|
||||
erubis (~> 2.7.0)
|
||||
i18n (~> 0.6.0)
|
||||
json (~> 1.5.1)
|
||||
log4r (~> 1.1.9)
|
||||
net-scp (~> 1.0.4)
|
||||
net-ssh (~> 2.2.2)
|
||||
yajl-ruby (1.1.0)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
berkshelf (~> 1.0.4)
|
||||
chefspec (~> 0.9.0)
|
||||
foodcritic (~> 1.6.1)
|
176
chef/cookbooks/net/LICENSE
Normal file
176
chef/cookbooks/net/LICENSE
Normal file
@ -0,0 +1,176 @@
|
||||
|
||||
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.
|
||||
|
0
chef/cookbooks/net/README.md
Normal file
0
chef/cookbooks/net/README.md
Normal file
43
chef/cookbooks/net/attributes/default.rb
Normal file
43
chef/cookbooks/net/attributes/default.rb
Normal file
@ -0,0 +1,43 @@
|
||||
#
|
||||
# Cookbook Name:: net
|
||||
# Attributes:: default
|
||||
#
|
||||
# Copyright 2014, Sam Su
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
default['nic']['vender']['drvier'] = {
|
||||
"Mellanox" => {
|
||||
"localpath" => '/tmp/mlnx_en-2.1-1.0.0.0.gfeee0c2.2.6.32_431.el6.x86_64.x86_64.rpm',
|
||||
"source" => 'http://10.1.0.201/download/mlnx_en-2.1-1.0.0.0.gfeee0c2.2.6.32_431.el6.x86_64.x86_64.rpm',
|
||||
"load" => "rmmod mlx4_core; modprobe mlx4_en",
|
||||
"status" => ''
|
||||
}
|
||||
}
|
||||
|
||||
default['nic']['config'] = {
|
||||
"eth5" => {
|
||||
"ip" => '',
|
||||
"network" => "10.5.0.0",
|
||||
"netmask" => "255.255.0.0",
|
||||
"conf" => "/etc/sysconfig/network-scripts/ifcfg-eth5",
|
||||
"status" => ''
|
||||
},
|
||||
"eth6" => {
|
||||
"ip" => '',
|
||||
"network" => "10.6.0.0",
|
||||
"netmask" => "255.255.0.0",
|
||||
"conf" => "/etc/sysconfig/network-scripts/ifcfg-eth6",
|
||||
"status" => ''
|
||||
}
|
||||
}
|
13
chef/cookbooks/net/metadata.rb
Normal file
13
chef/cookbooks/net/metadata.rb
Normal file
@ -0,0 +1,13 @@
|
||||
name "net"
|
||||
maintainer "Sam"
|
||||
maintainer_email "sam.su@huawei.com"
|
||||
license "Apache 2.0"
|
||||
description "Install NIC driver and configure NIC's IP address"
|
||||
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
|
||||
version "1.0.0"
|
||||
|
||||
recipe "default", "Installs/Configures 10g NICs"
|
||||
|
||||
%w{ centos debian ubuntu }.each do |os|
|
||||
supports os
|
||||
end
|
70
chef/cookbooks/net/providers/ip.rb
Normal file
70
chef/cookbooks/net/providers/ip.rb
Normal file
@ -0,0 +1,70 @@
|
||||
#
|
||||
# Cookbook Name:: net
|
||||
# Provider:: net
|
||||
#
|
||||
# Copyright 2014, Sam Su
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
require 'chef/mixin/shell_out'
|
||||
include Chef::Mixin::ShellOut
|
||||
|
||||
def set resource
|
||||
cmd = "ifconfig eth0 |grep 'inet addr' | cut -f 2 -d ':' | cut -f 1 -d ' '"
|
||||
rc = shell_out(cmd)
|
||||
if rc.valid_exit_codes.include?(0)
|
||||
net = node['nic']['config']["#{resource.device}"]
|
||||
if net['status'].eql?('') or net['status'].nil?
|
||||
ip = %x{ifconfig eth0 |grep 'inet addr' | cut -f 2 -d ":" | cut -f 1 -d " "}.split[0].split('.')
|
||||
ip[0] = net['network'].split('.')[0]
|
||||
ip[1] = net['network'].split('.')[1]
|
||||
mac = %x{ifconfig #{resource.device}|grep "HWaddr"}.split()[4]
|
||||
node.set['nic']['config']["#{resource.device}"]['ip'] = ip.join('.')
|
||||
node.set['nic']['config']["#{resource.device}"]['mac'] = mac
|
||||
node.set['nic']['config']["#{resource.device}"]['status'] = "initial"
|
||||
else
|
||||
Chef::Log.error("Cannot get the device info of #{resource.device}.")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
action :create do
|
||||
set new_resource
|
||||
net = node['nic']['config']["#{new_resource.device}"]
|
||||
if !net['status'].nil? and net['status'].include?("initial")
|
||||
if not ::File.exist?(net['conf'])
|
||||
service "network" do
|
||||
action :enable
|
||||
subscribes :restart, "template[net['conf']]"
|
||||
end
|
||||
|
||||
template net['conf'] do
|
||||
source "ifcfg.erb"
|
||||
mode 00644
|
||||
owner "root"
|
||||
group "root"
|
||||
variables({
|
||||
:eth => new_resource.device,
|
||||
:mac => net['mac'],
|
||||
:ip => net['ip'],
|
||||
:netmask => net['netmask']
|
||||
})
|
||||
notifies :restart, "service[network]", :immediately
|
||||
end
|
||||
node.set['nic']['config']["#{new_resource.device}"]['status'] = "config"
|
||||
end
|
||||
new_resource.updated_by_last_action(true)
|
||||
end
|
||||
end
|
||||
|
70
chef/cookbooks/net/providers/nic.rb
Normal file
70
chef/cookbooks/net/providers/nic.rb
Normal file
@ -0,0 +1,70 @@
|
||||
#
|
||||
# Cookbook Name:: net
|
||||
# Provider:: net
|
||||
#
|
||||
# Copyright 2014, Sam Su
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
require 'chef/mixin/shell_out'
|
||||
include Chef::Mixin::ShellOut
|
||||
|
||||
def check resource
|
||||
cmd = "lspci |grep -i #{resource.vender_name}"
|
||||
rc = shell_out(cmd)
|
||||
if rc.valid_exit_codes.include?(0)
|
||||
driver = node['nic']['vender']['drvier']["#{new_resource.vender_name}"]
|
||||
if driver['status'].eql?('')
|
||||
node.set['nic']['vender']['drvier']["#{resource.vender_name}"]['status'] = "exist"
|
||||
end
|
||||
else
|
||||
Chef::Log.error("There is not exist the device of #{resource.vender_name}.")
|
||||
end
|
||||
end
|
||||
|
||||
action :prepare do
|
||||
package "pciutils" do
|
||||
action :upgrade
|
||||
end
|
||||
new_resource.updated_by_last_action(true)
|
||||
end
|
||||
|
||||
action :install do
|
||||
check new_resource
|
||||
driver = node['nic']['vender']['drvier']["#{new_resource.vender_name}"]
|
||||
if driver['status'].include?("exist")
|
||||
#download driver file
|
||||
if not ::File.exist?(driver['localpath'])
|
||||
remote_file driver['localpath'] do
|
||||
source driver['source']
|
||||
end
|
||||
end
|
||||
|
||||
execute "load_driver" do
|
||||
command node['nic']['vender']['drvier']["#{new_resource.vender_name}"]['load']
|
||||
action :nothing
|
||||
subscribes :run, "package[nic_driver]", :immediately
|
||||
end
|
||||
|
||||
# install driver
|
||||
package "nic_driver" do
|
||||
source driver['localpath']
|
||||
action :install
|
||||
notifies :run, 'execute[load_driver]', :immediately
|
||||
end
|
||||
|
||||
node.set['nic']['vender']['drvier']["#{new_resource.vender_name}"]['status'] = "installed"
|
||||
new_resource.updated_by_last_action(true)
|
||||
end
|
||||
end
|
||||
|
36
chef/cookbooks/net/recipes/default.rb
Normal file
36
chef/cookbooks/net/recipes/default.rb
Normal file
@ -0,0 +1,36 @@
|
||||
#
|
||||
# Cookbook Name:: net
|
||||
# Recipe:: default
|
||||
#
|
||||
# Copyright 2014, Sam Su
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
net_nic "prepare" do
|
||||
action :prepare
|
||||
end
|
||||
|
||||
|
||||
node['nic']['vender']['drvier'].each_key do |vender|
|
||||
# Install the driver package
|
||||
net_nic vender do
|
||||
action :install
|
||||
end
|
||||
end
|
||||
|
||||
node['nic']['config'].each_key do |nic|
|
||||
net_ip nic.to_s do
|
||||
action :create
|
||||
end
|
||||
end
|
27
chef/cookbooks/net/resources/ip.rb
Normal file
27
chef/cookbooks/net/resources/ip.rb
Normal file
@ -0,0 +1,27 @@
|
||||
#
|
||||
# Cookbook Name:: net
|
||||
# Resource:: net
|
||||
#
|
||||
# Copyright 2014, Sam Su
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
actions :create
|
||||
|
||||
attribute :device, :kind_of => String, :name_attribute => true
|
||||
|
||||
def initialize(*args)
|
||||
super
|
||||
@action = :create
|
||||
end
|
27
chef/cookbooks/net/resources/nic.rb
Normal file
27
chef/cookbooks/net/resources/nic.rb
Normal file
@ -0,0 +1,27 @@
|
||||
#
|
||||
# Cookbook Name:: net
|
||||
# Resource:: net
|
||||
#
|
||||
# Copyright 2014, Sam Su
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
actions :prepare, :install
|
||||
|
||||
attribute :vender_name, :kind_of => String, :name_attribute => true
|
||||
|
||||
def initialize(*args)
|
||||
super
|
||||
@action = :prepare
|
||||
end
|
11
chef/cookbooks/net/templates/default/ifcfg.erb
Normal file
11
chef/cookbooks/net/templates/default/ifcfg.erb
Normal file
@ -0,0 +1,11 @@
|
||||
## Automaticlly generated by Chef
|
||||
## DO NOT change the file, if want to change the IP address,
|
||||
## please change the default attribute file of the cookbok "net"
|
||||
##
|
||||
DEVICE=<%= @eth %>
|
||||
ONBOOT=yes
|
||||
HWADDR=<%= @mac %>
|
||||
TYPE=Ethernet
|
||||
BOOTPROTO=static
|
||||
IPADDR=<%= @ip %>
|
||||
NETMASK=<%= @netmask %>
|
@ -113,7 +113,7 @@ default["openstack"]["block-storage"]["volume"]["driver"] = "cinder.volume.drive
|
||||
default["openstack"]["block-storage"]["volume"]["volume_group"] = "cinder-volumes"
|
||||
default["openstack"]["block-storage"]["volume"]["iscsi_helper"] = "tgtadm"
|
||||
default["openstack"]["volume"]["mode"] = "loopfile"
|
||||
default["openstack"]["volume"]["size"] = "3G"
|
||||
default["openstack"]["volume"]["disk"] = "/dev/sdb"
|
||||
|
||||
|
||||
# Ceph/RADOS options
|
||||
|
BIN
chef/cookbooks/openstack-block-storage/providers/.volume.rb.swp
Normal file
BIN
chef/cookbooks/openstack-block-storage/providers/.volume.rb.swp
Normal file
Binary file not shown.
173
chef/cookbooks/openstack-block-storage/providers/volume.rb
Normal file
173
chef/cookbooks/openstack-block-storage/providers/volume.rb
Normal file
@ -0,0 +1,173 @@
|
||||
#
|
||||
# Cookbook Name:: openstack-block-storage
|
||||
# Provider:: openstack-block-storage
|
||||
#
|
||||
# Copyright 2014-2014, Sam Su
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
require 'chef/mixin/shell_out'
|
||||
include Chef::Mixin::ShellOut
|
||||
|
||||
def partition_num resource
|
||||
cmd = "parted #{resource.device} --script -- p | awk '{print $1}'"
|
||||
rc = shell_out(cmd)
|
||||
p_num = rc.stdout.split.select{|e| e[/\d/]}
|
||||
if p_num.include? "Number"
|
||||
last_num = 0
|
||||
Chef::Log.info("There is not any partition created at #{resource.device} yet.")
|
||||
end
|
||||
return p_num
|
||||
end
|
||||
|
||||
def partition_start_size resource
|
||||
cmd = "parted #{resource.device} --script -- p | awk '{print $3}' | tail -n 2"
|
||||
rc = shell_out(cmd)
|
||||
resource.start_size = rc.stdout.split[0]
|
||||
if resource.start_size.include? "End"
|
||||
resource.start_size = 0
|
||||
end
|
||||
end
|
||||
|
||||
def disk_total_size resource
|
||||
cmd = "parted #{resource.device} --script -- p | grep #{resource.device} | cut -f 2 -d ':'"
|
||||
rc = shell_out(cmd)
|
||||
resource.total_size = rc.stdout.split[0]
|
||||
end
|
||||
|
||||
def mklabel resource
|
||||
queryresult = %x{parted #{resource.device} --script -- print |grep 'Partition Table: #{new_resource.label_type}'}
|
||||
if not queryresult.include?(new_resource.label_type)
|
||||
cmd = "parted #{resource.device} --script -- mklabel #{resource.label_type}"
|
||||
rc = shell_out(cmd)
|
||||
if not rc.exitstatus.eql?(0)
|
||||
Chef::Log.error("Creating disk label was failed.")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def mkpart resource
|
||||
disk_total_size resource
|
||||
partition_start_size resource
|
||||
if not resource.start_size.eql?(resource.total_size)
|
||||
p_num_old = partition_num resource
|
||||
output = %x{parted #{resource.device} --script -- mkpart #{resource.part_type} #{resource.start_size} -1}
|
||||
p_num_new = partition_num resource
|
||||
p_num = (p_num_new - p_num_old)[0]
|
||||
if p_num.nil?
|
||||
Chef::Log.error("Making partition was failed.")
|
||||
else
|
||||
resource.partition = resource.device + p_num
|
||||
if node['partitions'].nil?
|
||||
node.set['partitions'] = resource.partition.lines.to_a
|
||||
else
|
||||
if not node['partitions'].include?(resource.partition)
|
||||
node.set['partitions'] = node['partitions'] + resource.partition.lines.to_a
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def file_partition_size
|
||||
output = %x{df -h /}
|
||||
available_size = (output.lines.to_a[1].split[3].nil?) \
|
||||
?(output.lines.to_a[1].split + output.lines.to_a[2].split)[3] \
|
||||
:(output.lines.to_a[1].split[3])
|
||||
file_size = ((available_size.scan(/\d+/)[0].to_i)/2).to_s +
|
||||
available_size.scan(/[MGTEY]/)[0]
|
||||
return file_size
|
||||
end
|
||||
|
||||
def select_loop_device resource
|
||||
output = %x{losetup -a|grep "/mnt/cinder-volumes"}.split(':')
|
||||
if output.empty?
|
||||
used_loop_device = %x{losetup -a |cut -f 1 -d ':'}.split
|
||||
total_loop_device = %x{ls /dev/loop*}.split
|
||||
available_loop = total_loop_device - used_loop_device
|
||||
if available_loop.nil?
|
||||
resource.partition = nil
|
||||
Chef::Log.error("There is not any loop device available.")
|
||||
else
|
||||
resource.partition = available_loop[0]
|
||||
end
|
||||
else
|
||||
resource.partition = output[0]
|
||||
end
|
||||
end
|
||||
|
||||
def create_file_partition resource
|
||||
# use half root partition space as file volume
|
||||
if not ::File.exist?("/mnt/cinder-volumes")
|
||||
cmd = "dd if=/dev/zero of=/mnt/cinder-volumes bs=1 count=0 seek=#{file_partition_size}"
|
||||
rc = shell_out(cmd)
|
||||
end
|
||||
output = %x{losetup -a|grep '/mnt/cinder-volumes'}
|
||||
if not output.include?("/mnt/cinder-volumes")
|
||||
select_loop_device resource
|
||||
if not resource.partition.nil?
|
||||
output = %x{losetup #{resource.partition} /mnt/cinder-volumes}
|
||||
end
|
||||
else
|
||||
resource.partition = output.split(":")[0]
|
||||
end
|
||||
if node['partitions'].nil?
|
||||
node.set['partitions'] = resource.partition.lines.to_a if not resource.partition.nil?
|
||||
else
|
||||
if not node['partitions'].include?(resource.partition)
|
||||
node.set['partitions'] = node['partitions'] + resource.partition.lines.to_a
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def create_disk_partition resource
|
||||
mklabel resource
|
||||
mkpart resource
|
||||
end
|
||||
|
||||
action :create_partition do
|
||||
if node['partitions'].nil? or not node['partitions'].any?{|s| s.include?(new_resource.device)}
|
||||
disk_total_size new_resource
|
||||
partition_start_size new_resource
|
||||
if new_resource.start_size.eql?(new_resource.total_size)
|
||||
create_file_partition new_resource
|
||||
else
|
||||
create_disk_partition new_resource
|
||||
end
|
||||
new_resource.updated_by_last_action(true)
|
||||
end
|
||||
end
|
||||
|
||||
action :mk_cinder_vol do
|
||||
if node['partitions'].nil?
|
||||
Chef::Log.error("\nThere is not any partition created before trying to create a volume.")
|
||||
else
|
||||
node['partitions'].each do |partition|
|
||||
if partition.include?(new_resource.device) or partition.include?("/dev/loop")
|
||||
query = %x{vgscan |grep cinder-volumes}
|
||||
if query.eql?("")
|
||||
execute "vgcreate cinder-volumes #{partition}" do
|
||||
new_resource.updated_by_last_action(true)
|
||||
end
|
||||
else
|
||||
query = %x{pvscan |grep cinder-volumes|grep #{partition}}
|
||||
if query.eql?("")
|
||||
execute "vgextend cinder-volumes #{partition}" do
|
||||
new_resource.updated_by_last_action(true)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
@ -49,6 +49,12 @@ directory ::File.dirname(node["openstack"]["block-storage"]["api"]["auth"]["cach
|
||||
mode 00700
|
||||
end
|
||||
|
||||
directory "/var/lock/cinder" do
|
||||
owner node["openstack"]["block-storage"]["user"]
|
||||
group node["openstack"]["block-storage"]["group"]
|
||||
mode 00700
|
||||
end
|
||||
|
||||
service "cinder-api" do
|
||||
service_name platform_options["cinder_api_service"]
|
||||
supports :status => true, :restart => true
|
||||
|
20
chef/cookbooks/openstack-block-storage/recipes/test.rb
Normal file
20
chef/cookbooks/openstack-block-storage/recipes/test.rb
Normal file
@ -0,0 +1,20 @@
|
||||
#include_recipe "openstack-block-storage::cinder-common"
|
||||
#include_recipe "parted::default"
|
||||
|
||||
node.set['create_partition'] = false
|
||||
node.set['partitions'] = nil
|
||||
openstack_block_storage_volume "/dev/sdb" do
|
||||
action :create_partition
|
||||
end
|
||||
|
||||
openstack_block_storage_volume "/dev/sdc" do
|
||||
action :create_partition
|
||||
end
|
||||
|
||||
openstack_block_storage_volume "/dev/sdb" do
|
||||
action :mk_cinder_vol
|
||||
end
|
||||
|
||||
openstack_block_storage_volume "/dev/sdc" do
|
||||
action :mk_cinder_vol
|
||||
end
|
@ -28,6 +28,10 @@ include_recipe "openstack-block-storage::cinder-common"
|
||||
|
||||
platform_options = node["openstack"]["block-storage"]["platform"]
|
||||
|
||||
package "parted" do
|
||||
action :upgrade
|
||||
end
|
||||
|
||||
platform_options["cinder_volume_packages"].each do |pkg|
|
||||
package pkg do
|
||||
options platform_options["package_overrides"]
|
||||
@ -51,9 +55,10 @@ platform_options["cinder_iscsitarget_packages"].each do |pkg|
|
||||
end
|
||||
end
|
||||
|
||||
execute "create_cinder_volumes" do
|
||||
command "sh /tmp/cinder_volumes.sh"
|
||||
action :nothing
|
||||
directory "/var/lock/cinder" do
|
||||
owner node["openstack"]["block-storage"]["user"]
|
||||
group node["openstack"]["block-storage"]["group"]
|
||||
mode 00700
|
||||
end
|
||||
|
||||
case node["openstack"]["block-storage"]["volume"]["driver"]
|
||||
@ -93,17 +98,35 @@ case node["openstack"]["block-storage"]["volume"]["driver"]
|
||||
end
|
||||
|
||||
when "cinder.volume.drivers.lvm.LVMISCSIDriver"
|
||||
template "/tmp/cinder_volumes.sh" do
|
||||
source "cinder_volumes.sh.erb"
|
||||
owner "root"
|
||||
group "root"
|
||||
mode 00755
|
||||
variables(
|
||||
:volumesize => node["openstack"]["volume"]["size"]
|
||||
)
|
||||
notifies :run, "execute[create_cinder_volumes]", :delayed
|
||||
only_if { node["openstack"]["volume"]["mode"] == "loopfile" }
|
||||
package "bc" do
|
||||
action :install
|
||||
end
|
||||
|
||||
openstack_block_storage_volume node["openstack"]["volume"]["disk"] do
|
||||
action :create_partition
|
||||
end
|
||||
|
||||
openstack_block_storage_volume node["openstack"]["volume"]["disk"] do
|
||||
action :mk_cinder_vol
|
||||
end
|
||||
|
||||
# template "/tmp/cinder_volumes.sh" do
|
||||
# source "cinder_volumes.sh.erb"
|
||||
# owner "root"
|
||||
# group "root"
|
||||
# mode 00755
|
||||
# variables(
|
||||
# :volumesize => node["openstack"]["volume"]["size"]
|
||||
# )
|
||||
# notifies :run, "execute[create_cinder_volumes]", :immediately
|
||||
# only_if { node["openstack"]["volume"]["mode"] == "loopfile" }
|
||||
# end
|
||||
|
||||
# execute "create_cinder_volumes" do
|
||||
# command "sh /tmp/cinder_volumes.sh"
|
||||
# action :run
|
||||
# only_if { node["openstack"]["volume"]["mode"] == "loopfile" }
|
||||
# end
|
||||
end
|
||||
|
||||
service "cinder-volume" do
|
||||
|
36
chef/cookbooks/openstack-block-storage/resources/volume.rb
Normal file
36
chef/cookbooks/openstack-block-storage/resources/volume.rb
Normal file
@ -0,0 +1,36 @@
|
||||
#
|
||||
# Cookbook Name:: openstack-block-storage
|
||||
# Resource:: openstack-block-storage
|
||||
#
|
||||
# Copyright 2014-2014, Sam Su
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
actions :create_partition, :mk_cinder_vol
|
||||
|
||||
attribute :device, :kind_of => String, :name_attribute => true
|
||||
attribute :label_type, :kind_of => String, :default => "gpt"
|
||||
attribute :file_system, :kind_of => String, :default => "ext4"
|
||||
attribute :part_type, :kind_of => String, :default => "primary"
|
||||
#attribute :partition, :kind_of => String, :default => "0"
|
||||
|
||||
attr_accessor :last_num
|
||||
attr_accessor :start_size
|
||||
attr_accessor :total_size
|
||||
attr_accessor :partition
|
||||
|
||||
def initialize(*args)
|
||||
super
|
||||
@action = :mk_cinder_vol
|
||||
end
|
@ -11,7 +11,7 @@ verbose=<%= node["openstack"]["block-storage"]["verbose"] %>
|
||||
#### (BoolOpt) Print more verbose output
|
||||
|
||||
# lock_path
|
||||
lock_path=<%= node["openstack"]["block-storage"]["lock_path"] %>
|
||||
#lock_path=<%= node["openstack"]["block-storage"]["lock_path"] %>
|
||||
notification_driver=cinder.openstack.common.notifier.rpc_notifier
|
||||
|
||||
# log_config=<None>
|
||||
|
@ -1,12 +1,30 @@
|
||||
#!/bin/bash
|
||||
# This file is going to create a loop file as volume disk.
|
||||
#
|
||||
ERRTRAP()
|
||||
{
|
||||
echo "[FILE: "$PWD/$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")", LINE: $1] Error: Command or function exited with status $?"
|
||||
}
|
||||
|
||||
trap 'ERRTRAP $LINENO' ERR
|
||||
|
||||
vgdisplay |grep cinder-volumes
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
dd if=/dev/zero of=/mnt/cinder-volumes bs=1 count=0 seek=<%=@volumesize %>
|
||||
losetup /dev/loop0 /mnt/cinder-volumes
|
||||
pvcreate /dev/loop0
|
||||
vgcreate cinder-volumes /dev/loop0
|
||||
SPACESIZE=$(df -P |grep -vE "^tmpfs|cdrom|tmp" | sed '1d' | awk '{print $4}' | sort -nr | sed -n -e '1{p;q}')
|
||||
MOUNTPOINT=$(df -P |grep -vE "^tmpfs|cdrom|tmp" | sed '1d' | awk '{print $6}' | sort -nr | sed -n -e '1{p;q}')
|
||||
G_SPACESIZE=$(echo "$SPACESIZE/1000/1000/2" | bc -l)
|
||||
echo $G_SPACESIZE
|
||||
VOLSIZE=${G_SPACESIZE/.*}
|
||||
echo $VOLSIZE
|
||||
if [ $VOLSIZE -ge "1" ]; then
|
||||
dd if=/dev/zero of=$MOUNTPOINT/cinder-volumes bs=1 count=0 seek="$VOLSIZE"G
|
||||
losetup /dev/loop0 $MOUNTPOINT/cinder-volumes
|
||||
pvcreate /dev/loop0
|
||||
vgcreate cinder-volumes /dev/loop0
|
||||
else
|
||||
echo "The current spare disk space only $SPACESIZE < 1G, no enough disk space is available for the cinder-volume"
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
|
@ -26,10 +26,6 @@
|
||||
# pass = secret "passwords", "nova"
|
||||
#
|
||||
# The value of pass will be "nova"
|
||||
ENV['http_proxy']=Chef::Config.http_proxy
|
||||
ENV['https_proxy']=Chef::Config.https_proxy
|
||||
ENV['no_proxy']=Chef::Config.no_proxy
|
||||
|
||||
default["openstack"]["developer_mode"] = true
|
||||
|
||||
# The type of token signing to use (uuid or pki)
|
||||
@ -282,8 +278,8 @@ default['openstack']['identity']['admin_token'] = "openstack_identity_bootstrap_
|
||||
default['openstack']['identity']['admin_tenant_name'] = "admin"
|
||||
default['openstack']['identity']['admin_user'] = "admin"
|
||||
default['openstack']['identity']['admin_password'] = "admin"
|
||||
#default['openstack']['identity']['roles']['admin'] = "admin"
|
||||
#default['openstack']['identity']['roles']['member'] = "Member"
|
||||
default['openstack']['identity']['roles']['admin'] = "admin"
|
||||
default['openstack']['identity']['roles']['member'] = "Member"
|
||||
|
||||
# define enable services
|
||||
default['openstack']['services'] = {
|
||||
|
@ -332,7 +332,8 @@ node.override["openstack"]["network"]["openvswitch"]["tunnel_bridge"] = mydata['
|
||||
# this hypervisor or set the local_ip_interface parameter to use the IP
|
||||
# address of the specified interface. If local_ip_interface is set
|
||||
# it will take precedence.
|
||||
local_ip_interface = mydata['networking']['plugins']['ovs']["#{tenant_network_type}"]['local_ip_interface']
|
||||
#local_ip_interface = mydata['networking']['plugins']['ovs']["#{tenant_network_type}"]['local_ip_interface']
|
||||
local_ip_interface = mydata['networking']['tenant']['interface']
|
||||
if local_ip_interface != ("nil")
|
||||
local_ip= address_for(local_ip_interface)
|
||||
else
|
||||
|
@ -297,9 +297,9 @@ when "ubuntu"
|
||||
default["openstack"]["compute"]["platform"] = {
|
||||
"api_ec2_packages" => ["nova-api-ec2"],
|
||||
"api_ec2_service" => "nova-api-ec2",
|
||||
"api_os_compute_packages" => ["nova-api-os-compute"],
|
||||
"api_os_compute_process_name" => "nova-api-os-compute",
|
||||
"api_os_compute_service" => "nova-api-os-compute",
|
||||
"api_os_compute_packages" => ["nova-api"],
|
||||
"api_os_compute_process_name" => "nova-api",
|
||||
"api_os_compute_service" => "nova-api",
|
||||
"memcache_python_packages" => ["python-memcache"],
|
||||
"neutron_python_packages" => ["python-quantumclient", "python-pyparsing"],
|
||||
"compute_api_metadata_packages" => ["nova-api-metadata"],
|
||||
|
@ -52,7 +52,6 @@ end
|
||||
compute_compute_packages.each do |pkg|
|
||||
package pkg do
|
||||
options platform_options["package_overrides"]
|
||||
|
||||
action :upgrade
|
||||
end
|
||||
end
|
||||
|
@ -51,7 +51,7 @@ service proxy_service do
|
||||
supports :status => true, :restart => true
|
||||
subscribes :restart, resources("template[/etc/nova/nova.conf]")
|
||||
|
||||
action :enable
|
||||
action [:enable, :start]
|
||||
end
|
||||
|
||||
service "nova-console" do
|
||||
|
@ -9,7 +9,11 @@
|
||||
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R]
|
||||
</VirtualHost>
|
||||
|
||||
WSGISocketPrefix run/wsgi
|
||||
<% if %w{debian ubuntu}.include?(node["platform"]) -%>
|
||||
WSGISocketPrefix /var/run/apache2/wsgi
|
||||
<% else -%>
|
||||
WSGISocketPrefix run/wsgi
|
||||
<% end -%>
|
||||
|
||||
<VirtualHost *:443>
|
||||
<% if node["openstack"]["dashboard"]["server_hostname"] -%>
|
||||
|
@ -90,12 +90,12 @@ default["openstack"]["image"]["registry"]["bind_interface"] = nil
|
||||
default["openstack"]["image"]["data_api"] = "glance.db.sqlalchemy.api"
|
||||
|
||||
# Default Image Locations
|
||||
default["openstack"]["image"]["image_upload"] = false
|
||||
default["openstack"]["image"]["upload_images"] = [ "cirros" ]
|
||||
default["openstack"]["image"]["image_upload"] = true
|
||||
default["openstack"]["image"]["upload_images"] = [ "cirros-0.3.1-x86_64" ]
|
||||
default["openstack"]["image"]["upload_image"]["precise"] = "http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img"
|
||||
default["openstack"]["image"]["upload_image"]["oneiric"] = "http://cloud-images.ubuntu.com/oneiric/current/oneiric-server-cloudimg-amd64-disk1.img"
|
||||
default["openstack"]["image"]["upload_image"]["natty"] = "http://cloud-images.ubuntu.com/natty/current/natty-server-cloudimg-amd64-disk1.img"
|
||||
default["openstack"]["image"]["upload_image"]["cirros"] = "https://launchpadlibrarian.net/83305348/cirros-0.3.0-x86_64-disk.img"
|
||||
default["openstack"]["image"]["upload_image"]["cirros-0.3.1-x86_64"] = "http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-disk.img"
|
||||
# more images available at https://github.com/rackerjoe/oz-image-build
|
||||
default["openstack"]["image"]["upload_image"]["centos"] = "http://c250663.r63.cf1.rackcdn.com/centos60_x86_64.qcow2"
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
@ -50,7 +50,7 @@ service "image-api" do
|
||||
service_name platform_options["image_api_service"]
|
||||
supports :status => true, :restart => true
|
||||
|
||||
action :enable
|
||||
action [:enable,:start]
|
||||
end
|
||||
|
||||
directory "/etc/glance" do
|
||||
@ -59,6 +59,12 @@ directory "/etc/glance" do
|
||||
mode 00700
|
||||
end
|
||||
|
||||
directory "/var/cache/glance/" do
|
||||
owner node["openstack"]["image"]["user"]
|
||||
group node["openstack"]["image"]["group"]
|
||||
mode 00700
|
||||
end
|
||||
|
||||
directory ::File.dirname node["openstack"]["image"]["api"]["auth"]["cache_dir"] do
|
||||
owner node["openstack"]["image"]["user"]
|
||||
group node["openstack"]["image"]["group"]
|
||||
@ -94,8 +100,8 @@ end
|
||||
|
||||
#db_user = node["openstack"]["image"]["db"]["username"]
|
||||
#db_pass = db_password "glance"
|
||||
db_user = node["openstack"]["db"]["image"]["password"]
|
||||
db_pass = db_password node["openstack"]["db"]["image"]["password"]
|
||||
db_user = node["openstack"]["db"]["image"]["username"]
|
||||
db_pass = node["openstack"]["db"]["image"]["password"]
|
||||
|
||||
sql_connection = db_uri("image", db_user, db_pass)
|
||||
|
||||
|
@ -33,8 +33,10 @@ package "python-keystone" do
|
||||
action :install
|
||||
end
|
||||
|
||||
db_user = node['openstack']['db']['image']['username']
|
||||
db_pass = db_password node['openstack']['db']['image']['password']
|
||||
#db_user = node['openstack']['db']['image']['username']
|
||||
#db_pass = db_password node['openstack']['db']['image']['password']
|
||||
db_user = node["openstack"]["db"]["image"]["username"]
|
||||
db_pass = node["openstack"]["db"]["image"]["password"]
|
||||
|
||||
sql_connection = db_uri("image", db_user, db_pass)
|
||||
|
||||
@ -91,6 +93,18 @@ directory "/etc/glance" do
|
||||
mode 00700
|
||||
end
|
||||
|
||||
directory "/var/log/glance" do
|
||||
owner node["openstack"]["image"]["user"]
|
||||
group node["openstack"]["image"]["group"]
|
||||
mode 00700
|
||||
end
|
||||
|
||||
directory "/var/cache/glance/" do
|
||||
owner node["openstack"]["image"]["user"]
|
||||
group node["openstack"]["image"]["group"]
|
||||
mode 00700
|
||||
end
|
||||
|
||||
if node["openstack"]["image"]["registry"]["bind_interface"].nil?
|
||||
bind_address = registry_endpoint.host
|
||||
else
|
||||
@ -99,8 +113,8 @@ end
|
||||
|
||||
template "/etc/glance/glance-registry.conf" do
|
||||
source "glance-registry.conf.erb"
|
||||
owner "root"
|
||||
group "root"
|
||||
owner node["openstack"]["image"]["user"]
|
||||
group node["openstack"]["image"]["group"]
|
||||
mode 00644
|
||||
variables(
|
||||
:registry_bind_address => bind_address,
|
||||
@ -121,32 +135,12 @@ end
|
||||
|
||||
template "/etc/glance/glance-registry-paste.ini" do
|
||||
source "glance-registry-paste.ini.erb"
|
||||
owner "root"
|
||||
group "root"
|
||||
owner node["openstack"]["image"]["user"]
|
||||
group node["openstack"]["image"]["group"]
|
||||
mode 00644
|
||||
|
||||
notifies :restart, "service[image-registry]", :immediately
|
||||
end
|
||||
|
||||
execute "tinyimage" do
|
||||
command "sh /tmp/tinyimage.sh"
|
||||
action :nothing
|
||||
end
|
||||
|
||||
identity_endpoint = endpoint "identity-api"
|
||||
auth_uri = ::URI.decode identity_endpoint.to_s
|
||||
|
||||
template "/tmp/tinyimage.sh" do
|
||||
source "tinyimage.sh.erb"
|
||||
owner "root"
|
||||
group "root"
|
||||
mode 00755
|
||||
variables(
|
||||
:os_username => node['openstack']['identity']['admin_user'],
|
||||
:os_password => node['openstack']['identity']['admin_password'],
|
||||
:os_tenant_name => node['openstack']['identity']['admin_tenant_name'],
|
||||
:os_auth_url => auth_uri
|
||||
)
|
||||
|
||||
notifies :run, "execute[tinyimage]", :delayed
|
||||
end
|
||||
|
@ -5,33 +5,34 @@ OS_PASSWORD=<%= @os_password %>
|
||||
OS_TENANT_NAME=<%= @os_tenant_name %>
|
||||
OS_AUTH_URL=<%= @os_auth_url %>
|
||||
|
||||
IMAGEDIR=/tmp/images
|
||||
|
||||
glance --os-username=<%= @os_username %> \
|
||||
--os-password=<%= @os_password %> \
|
||||
--os-tenant-name=<%= @os_tenant_name %> \
|
||||
--os-auth-url=<%= @os_auth_url %> \
|
||||
image-list |grep "cirros-0.3.1"
|
||||
if [ $? -ne 0 ]; then
|
||||
mkdir -p /tmp/images
|
||||
cd /tmp/images/
|
||||
yum install -y wget
|
||||
wget http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-disk.img
|
||||
glance --os-username=<%= @os_username %> \
|
||||
--os-password=<%= @os_password %> \
|
||||
--os-tenant-name=<%= @os_tenant_name %> \
|
||||
--os-auth-url=<%= @os_auth_url %> \
|
||||
image-create \
|
||||
--name="cirros-0.3.1-x86_64" \
|
||||
--disk-format=qcow2 \
|
||||
--container-format bare < /tmp/images/cirros-0.3.1-x86_64-disk.img
|
||||
|
||||
wget http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-i386-disk.img
|
||||
glance --os-username=<%= @os_username %> \
|
||||
--os-password=<%= @os_password %> \
|
||||
--os-tenant-name=<%= @os_tenant_name %> \
|
||||
--os-auth-url=<%= @os_auth_url %> \
|
||||
image-create \
|
||||
--name="cirros-0.3.1-i386" \
|
||||
--disk-format=qcow2 \
|
||||
--container-format bare < /tmp/images/cirros-0.3.1-i386-disk.img
|
||||
if [ $? -ne 0 ]; then
|
||||
if [ -d "$IMAGEDIR" ]; then
|
||||
cd $IMAGEDIR
|
||||
glance --os-username=<%= @os_username %> \
|
||||
--os-password=<%= @os_password %> \
|
||||
--os-tenant-name=<%= @os_tenant_name %> \
|
||||
--os-auth-url=<%= @os_auth_url %> \
|
||||
image-create \
|
||||
--name="cirros-0.3.1-x86_64" \
|
||||
--disk-format=qcow2 \
|
||||
--container-format bare < $IMAGEDIR/cirros-0.3.1-x86_64-disk.img
|
||||
|
||||
glance --os-username=<%= @os_username %> \
|
||||
--os-password=<%= @os_password %> \
|
||||
--os-tenant-name=<%= @os_tenant_name %> \
|
||||
--os-auth-url=<%= @os_auth_url %> \
|
||||
image-create \
|
||||
--name="cirros-0.3.1-i386" \
|
||||
--disk-format=qcow2 \
|
||||
--container-format bare < $IMAGEDIR/cirros-0.3.1-i386-disk.img
|
||||
fi
|
||||
fi
|
||||
|
||||
|
@ -123,8 +123,8 @@ default["openstack"]["network"]["dhcp_driver"] = 'quantum.agent.linux.dhcp.Dnsma
|
||||
# must enable namespaces to use overlapping ips. Also,
|
||||
# you must have kernel build with CONFIG_NET_NS=y and
|
||||
# iproute2 package that supports namespaces.
|
||||
default["openstack"]["network"]["use_namespaces"] = "False"
|
||||
default["openstack"]["network"]["allow_overlapping_ips"] = "False"
|
||||
default["openstack"]["network"]["use_namespaces"] = "True"
|
||||
default["openstack"]["network"]["allow_overlapping_ips"] = "True"
|
||||
|
||||
# use quantum root wrap
|
||||
default["openstack"]["network"]["use_rootwrap"] = true
|
||||
|
@ -1,15 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
modinfo openvswitch |grep 56D59658C3B9FADCD146B12
|
||||
if [ $? -eq 0 ]; then
|
||||
cd /tmp/openvswitch
|
||||
|
||||
yum localinstall -y /tmp/openvswitch/kmod-openvswitch-1.11.0-1.el6.x86_64.rpm
|
||||
yum localinstall -y /tmp/openvswitch/openvswitch-1.11.0-1.x86_64.rpm
|
||||
service openvswitch start
|
||||
modinfo openvswitch
|
||||
|
||||
cd /tmp
|
||||
rm -rf /tmp/openvswitch
|
||||
fi
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -94,8 +94,8 @@ template "/etc/quantum/policy.json" do
|
||||
notifies :restart, "service[quantum-server]", :delayed
|
||||
end
|
||||
|
||||
# Add by Sam, CentOS think Qpid as it's default queue, it will auto add qpid
|
||||
# configuration at /etc/quantum/quantum.conf when invoke quantum-xxx-setup,
|
||||
# Added by Sam, CentOS think Qpid as it's default queue, it will auto add qpid
|
||||
# configuration at /etc/quantum/quantum.conf when invoke /usr/bin/quantum-xxx-setup,
|
||||
# because these scripts was hard coded a line as below:
|
||||
# "openstack-config --set ${Q_CONF} DEFAULT
|
||||
# rpc_backend quantum.openstack.common.rpc.impl_qpid"
|
||||
|
@ -31,7 +31,6 @@ main_plugin = node["openstack"]["network"]["interface_driver_map"][driver_name]
|
||||
core_plugin = node["openstack"]["network"]["core_plugin"]
|
||||
|
||||
if platform?("ubuntu", "debian")
|
||||
|
||||
# obtain kernel version for kernel header
|
||||
# installation on ubuntu and debian
|
||||
kernel_ver = node["kernel"]["release"]
|
||||
@ -59,22 +58,23 @@ end
|
||||
|
||||
# The current openvswitch package of centos 6.4 cannot create GRE tunnel successfully
|
||||
# The centos 6.4 kernel version is 2.6.32-358.18.1.el6.x86_64
|
||||
if platform?(%w(fedora redhat centos))
|
||||
remote_directory "/tmp/openvswitch" do
|
||||
source "openvswitch"
|
||||
files_owner "root"
|
||||
files_group "root"
|
||||
mode "0644"
|
||||
recursive true
|
||||
action :create
|
||||
end
|
||||
# This code block was deperated because the ovs package was updated.
|
||||
#if platform?(%w(fedora redhat centos))
|
||||
# remote_directory "/tmp/openvswitch" do
|
||||
# source "openvswitch"
|
||||
# files_owner "root"
|
||||
# files_group "root"
|
||||
# mode "0644"
|
||||
# recursive true
|
||||
# action :create
|
||||
# end
|
||||
|
||||
execute "update openvswitch package" do
|
||||
ignore_failure true
|
||||
command "chmod +x /tmp/openvswitch/install.sh; sh /tmp/openvswitch/install.sh"
|
||||
action :run
|
||||
end
|
||||
end
|
||||
# execute "update openvswitch package" do
|
||||
# ignore_failure true
|
||||
# command "chmod +x /tmp/openvswitch/install.sh; sh /tmp/openvswitch/install.sh"
|
||||
# action :run
|
||||
# end
|
||||
#end
|
||||
|
||||
service "quantum-server" do
|
||||
service_name node["openstack"]["network"]["platform"]["quantum_server_service"]
|
||||
|
17
chef/roles/os-controller.rb
Normal file
17
chef/roles/os-controller.rb
Normal file
@ -0,0 +1,17 @@
|
||||
name "os-single-controller"
|
||||
description "Roll-up role for all of the OpenStack Compute services on a single, non-HA controller."
|
||||
run_list(
|
||||
'role[os-dashboard]',
|
||||
'role[os-identity]',
|
||||
'role[os-identity-api]',
|
||||
'role[os-identity-api-admin]',
|
||||
'role[os-block-storage-api]',
|
||||
'role[os-block-storage-scheduler]',
|
||||
'role[os-compute-api]',
|
||||
'role[os-compute-api-os-compute]',
|
||||
'role[os-compute-cert]',
|
||||
'role[os-compute-controller]',
|
||||
'role[os-compute-scheduler]',
|
||||
'role[os-compute-vncproxy]',
|
||||
'role[os-network-server]'
|
||||
)
|
@ -2,10 +2,10 @@ name "os-single-controller"
|
||||
description "Roll-up role for all of the OpenStack Compute services on a single, non-HA controller."
|
||||
run_list(
|
||||
"role[os-base]",
|
||||
"role[os-ops-database]",
|
||||
"role[os-ops-messaging]",
|
||||
# "role[os-ops-database]",
|
||||
# "role[os-ops-messaging]",
|
||||
"role[os-identity]",
|
||||
"role[os-image]",
|
||||
# "role[os-image]",
|
||||
"role[os-network-server]",
|
||||
"role[os-block-storage]",
|
||||
"role[os-compute-scheduler]",
|
||||
|
Loading…
x
Reference in New Issue
Block a user