Retire repository
Fuel repositories are all retired in openstack namespace, retire remaining fuel repos in x namespace since they are unused now. This change removes all content from the repository and adds the usual README file to point out that the repository is retired following the process from https://docs.openstack.org/infra/manual/drivers.html#retiring-a-project See also http://lists.openstack.org/pipermail/openstack-discuss/2019-December/011675.html A related change is: https://review.opendev.org/699752 . Change-Id: I71416586b629186f5887eb234c8f814a7e959821
|
@ -1,2 +0,0 @@
|
|||
.build
|
||||
*.rpm
|
202
LICENSE
|
@ -1,202 +0,0 @@
|
|||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "{}"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright {yyyy} {name of copyright owner}
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
52
README.md
|
@ -1,52 +0,0 @@
|
|||
fuel-plugin-purestorge-cinder
|
||||
============
|
||||
|
||||
Plugin description
|
||||
--------------
|
||||
|
||||
Pure Storage plugin for Fuel extends Mirantis OpenStack functionality by
|
||||
adding support for Pure Storage FlashArray block storage array.
|
||||
|
||||
The Pure Storage FlashArray is an iSCSI and Fibre Channel capable block
|
||||
storage device used as a Cinder backend
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
| Requirement | Version/Comment |
|
||||
|----------------------------------------------------------|-----------------|
|
||||
| Mirantis OpenStack compatibility | >= 9.1 |
|
||||
| Access to FlashArray VIP via cinder-volume node | |
|
||||
| Access to FlashArray VIP via compute/cinder-volume nodes | |
|
||||
| iSCSI/FC initiator on all compute/cinder-volume nodes | |
|
||||
|
||||
Limitations
|
||||
-----------
|
||||
|
||||
Pure Storage configuration
|
||||
---------------------
|
||||
|
||||
Prior to deployment ensure the following items are complete:
|
||||
|
||||
1. For an iSCSI implementation ensure the Pure Storage FlashArray can route 10G Storage Network
|
||||
to all Compute nodes as well as the Cinder Control/Manager node.
|
||||
2. For an FC implementation ensure the fibre Channel Zone Manager is configured correctly
|
||||
within the Openstack deployment
|
||||
3. Create an AD/LDAP account for the Pure Storage cluster to use as the OpenStack Administrator
|
||||
account (if no AD/LDAP use the 'pureuser' account).
|
||||
4. Obtain the management VIP address for the Pure Storage FlashArray
|
||||
|
||||
Pure Storage Cinder plugin installation
|
||||
---------------------------
|
||||
|
||||
All of the needed code for using Pure Storage in an OpenStack deployment is
|
||||
included in the upstream OpenStack distributioni with the exception of
|
||||
the Pure Storage Python SDK which is installed by this plugin. There are no additional
|
||||
libraries, software packages or licenses required beyond using this plugin.
|
||||
|
||||
Pure Storage plugin configuration
|
||||
----------------------------
|
||||
|
||||
No additional configuration is required for the Pure Storage Cinder plugin, but the Fibre
|
||||
Channel Zone Manager must be configured correctly if FC is selected as the block storage
|
||||
protocol to be used by the Pure Storage FlashArray
|
|
@ -0,0 +1,10 @@
|
|||
This project is no longer maintained.
|
||||
|
||||
The contents of this repository are still available in the Git
|
||||
source code management system. To see the contents of this
|
||||
repository before it reached its end of life, please check out the
|
||||
previous commit with "git checkout HEAD^1".
|
||||
|
||||
For any further questions, please email
|
||||
openstack-discuss@lists.openstack.org or join #openstack-dev on
|
||||
Freenode.
|
|
@ -1,20 +0,0 @@
|
|||
#
|
||||
# Copyright 2016 Pure Storage, 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.
|
||||
#
|
||||
$plugin_settings = hiera('fuel-plugin-purestorage-cinder')
|
||||
|
||||
class { 'plugin_purestorage_cinder::compute' :
|
||||
nova_multipath => $plugin_settings['pure_nova_multipath'],
|
||||
}
|
|
@ -1,54 +0,0 @@
|
|||
#
|
||||
# Copyright 2016 Pure Storage, 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.
|
||||
#
|
||||
$plugin_settings = hiera('fuel-plugin-purestorage-cinder')
|
||||
|
||||
class { 'plugin_purestorage_cinder::controller' :
|
||||
section => 'pure',
|
||||
glance_image_cache => $plugin_settings['pure_glance_image_cache'],
|
||||
glance_image_count => $plugin_settings["pure_glance_cache_count"],
|
||||
glance_image_size => $plugin_settings["pure_glance_cache_size"],
|
||||
replication => $plugin_settings['pure_replication'],
|
||||
remote_array => $plugin_settings["pure_replication_name"],
|
||||
remote_ip => $plugin_settings["pure_replication_ip"],
|
||||
remote_api => $plugin_settings["pure_replication_api"],
|
||||
replication_default => $plugin_settings['pure_replication_default'],
|
||||
replication_interval => $plugin_settings["pure_interval"],
|
||||
replication_short => $plugin_settings["pure_retention_short"],
|
||||
replication_long_day => $plugin_settings["pure_retention_long_day"],
|
||||
replication_long => $plugin_settings["pure_retention_long"],
|
||||
eradicate => $plugin_settings['pure_eradicate'],
|
||||
local_ip => $plugin_settings['pure_san_ip'],
|
||||
local_api => $plugin_settings['pure_api'],
|
||||
local_chap => $plugin_settings['pure_chap'],
|
||||
local_multipath => $plugin_settings['pure_multipath'],
|
||||
protocol => $plugin_settings['pure_protocol'],
|
||||
consis_group => $plugin_settings['pure_cg'],
|
||||
fczm_config => $plugin_settings['pure_fczm_config'],
|
||||
fc_vendor => $plugin_settings['pure_switch_vendor'],
|
||||
fabric_count => $plugin_settings['pure_fabric_count'],
|
||||
fabric_name_1 => $plugin_settings['pure_fabric_name_1'],
|
||||
fabric_name_2 => $plugin_settings['pure_fabric_name_2'],
|
||||
fc_ip_1 => $plugin_settings["pure_fabric_ip_1"],
|
||||
fc_ip_2 => $plugin_settings["pure_fabric_ip_2"],
|
||||
fc_user_1 => $plugin_settings["pure_username_1"],
|
||||
fc_user_2 => $plugin_settings["pure_username_2"],
|
||||
fc_passwd_1 => $plugin_settings["pure_password_1"],
|
||||
fc_passwd_2 => $plugin_settings["pure_password_2"],
|
||||
fc_prefix_1 => $plugin_settings["pure_fabric_name_1"],
|
||||
fc_prefix_2 => $plugin_settings["pure_fabric_name_2"],
|
||||
fc_vsan_1 => $plugin_settings["pure_vsan_1"],
|
||||
fc_vsan_2 => $plugin_settings["pure_vsan_2"],
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
# Recommended settings for Pure Storage FlashArray.
|
||||
# Use noop scheduler for high-performance solid-state storage
|
||||
ACTION=="add|change", KERNEL=="sd*[!0-9]", SUBSYSTEM=="block", ENV{ID_VENDOR}=="PURE", ATTR{queue/scheduler}="noop"
|
||||
# Reduce CPU overhead due to entropy collection
|
||||
ACTION=="add|change", KERNEL=="sd*[!0-9]", SUBSYSTEM=="block", ENV{ID_VENDOR}=="PURE", ATTR{queue/add_random}="0"
|
||||
# Spread CPU load by redirecting completions to originating CPU
|
||||
ACTION=="add|change", KERNEL=="sd*[!0-9]", SUBSYSTEM=="block", ENV{ID_VENDOR}=="PURE", ATTR{queue/rq_affinity}="2"
|
||||
# Set the HBA timeout to 60 seconds
|
||||
ACTION=="add", SUBSYSTEMS=="scsi", ATTRS{model}=="FlashArray ", RUN+="/bin/sh -c 'echo 60 > /sys$DEVPATH/device/timeout'"
|
|
@ -1,28 +0,0 @@
|
|||
blacklist {
|
||||
devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
|
||||
devnode "^hd[a-z][0-9]*"
|
||||
devnode "^cciss!c[0-9]d[0-9]*[p[0-9]*]"
|
||||
}
|
||||
|
||||
defaults {
|
||||
verbosity 2
|
||||
polling_interval 10
|
||||
wwids_file /etc/multipath/wwids
|
||||
find_multipaths no
|
||||
}
|
||||
|
||||
blacklist_exceptions {
|
||||
}
|
||||
|
||||
|
||||
devices {
|
||||
device {
|
||||
vendor "PURE"
|
||||
path_selector "round-robin 0"
|
||||
path_grouping_policy multibus
|
||||
path_checker tur
|
||||
fast_io_fail_tmo 10
|
||||
dev_loss_tmo 60
|
||||
no_path_retry 0
|
||||
}
|
||||
}
|
|
@ -1,99 +0,0 @@
|
|||
{
|
||||
"context_is_admin": "role:admin",
|
||||
"admin_or_owner": "is_admin:True or project_id:%(project_id)s",
|
||||
"default": "rule:admin_or_owner",
|
||||
|
||||
"admin_api": "is_admin:True",
|
||||
|
||||
"volume:create": "",
|
||||
"volume:delete": "rule:admin_or_owner",
|
||||
"volume:get": "rule:admin_or_owner",
|
||||
"volume:get_all": "rule:admin_or_owner",
|
||||
"volume:get_volume_metadata": "rule:admin_or_owner",
|
||||
"volume:delete_volume_metadata": "rule:admin_or_owner",
|
||||
"volume:update_volume_metadata": "rule:admin_or_owner",
|
||||
"volume:get_volume_admin_metadata": "rule:admin_api",
|
||||
"volume:update_volume_admin_metadata": "rule:admin_api",
|
||||
"volume:get_snapshot": "rule:admin_or_owner",
|
||||
"volume:get_all_snapshots": "rule:admin_or_owner",
|
||||
"volume:delete_snapshot": "rule:admin_or_owner",
|
||||
"volume:update_snapshot": "rule:admin_or_owner",
|
||||
"volume:extend": "rule:admin_or_owner",
|
||||
"volume:update_readonly_flag": "rule:admin_or_owner",
|
||||
"volume:retype": "rule:admin_or_owner",
|
||||
"volume:update": "rule:admin_or_owner",
|
||||
|
||||
"volume_extension:types_manage": "rule:admin_api",
|
||||
"volume_extension:types_extra_specs": "rule:admin_api",
|
||||
"volume_extension:volume_type_access": "rule:admin_or_owner",
|
||||
"volume_extension:volume_type_access:addProjectAccess": "rule:admin_api",
|
||||
"volume_extension:volume_type_access:removeProjectAccess": "rule:admin_api",
|
||||
"volume_extension:volume_type_encryption": "rule:admin_api",
|
||||
"volume_extension:volume_encryption_metadata": "rule:admin_or_owner",
|
||||
"volume_extension:extended_snapshot_attributes": "rule:admin_or_owner",
|
||||
"volume_extension:volume_image_metadata": "rule:admin_or_owner",
|
||||
|
||||
"volume_extension:quotas:show": "",
|
||||
"volume_extension:quotas:update": "rule:admin_api",
|
||||
"volume_extension:quota_classes": "rule:admin_api",
|
||||
|
||||
"volume_extension:volume_admin_actions:reset_status": "rule:admin_api",
|
||||
"volume_extension:snapshot_admin_actions:reset_status": "rule:admin_api",
|
||||
"volume_extension:backup_admin_actions:reset_status": "rule:admin_api",
|
||||
"volume_extension:volume_admin_actions:force_delete": "rule:admin_api",
|
||||
"volume_extension:volume_admin_actions:force_detach": "rule:admin_api",
|
||||
"volume_extension:snapshot_admin_actions:force_delete": "rule:admin_api",
|
||||
"volume_extension:backup_admin_actions:force_delete": "rule:admin_api",
|
||||
"volume_extension:volume_admin_actions:migrate_volume": "rule:admin_api",
|
||||
"volume_extension:volume_admin_actions:migrate_volume_completion": "rule:admin_api",
|
||||
|
||||
"volume_extension:volume_host_attribute": "rule:admin_api",
|
||||
"volume_extension:volume_tenant_attribute": "rule:admin_or_owner",
|
||||
"volume_extension:volume_mig_status_attribute": "rule:admin_api",
|
||||
"volume_extension:hosts": "rule:admin_api",
|
||||
"volume_extension:services:index": "rule:admin_api",
|
||||
"volume_extension:services:update" : "rule:admin_api",
|
||||
|
||||
"volume_extension:volume_manage": "rule:admin_api",
|
||||
"volume_extension:volume_unmanage": "rule:admin_api",
|
||||
|
||||
"volume_extension:capabilities": "rule:admin_api",
|
||||
|
||||
"volume:create_transfer": "rule:admin_or_owner",
|
||||
"volume:accept_transfer": "",
|
||||
"volume:delete_transfer": "rule:admin_or_owner",
|
||||
"volume:get_all_transfers": "rule:admin_or_owner",
|
||||
|
||||
"volume_extension:replication:promote": "rule:admin_api",
|
||||
"volume_extension:replication:reenable": "rule:admin_api",
|
||||
|
||||
"volume:enable_replication": "rule:admin_api",
|
||||
"volume:disable_replication": "rule:admin_api",
|
||||
"volume:failover_replication": "rule:admin_api",
|
||||
"volume:list_replication_targets": "rule:admin_api",
|
||||
|
||||
"backup:create" : "",
|
||||
"backup:delete": "rule:admin_or_owner",
|
||||
"backup:get": "rule:admin_or_owner",
|
||||
"backup:get_all": "rule:admin_or_owner",
|
||||
"backup:restore": "rule:admin_or_owner",
|
||||
"backup:backup-import": "rule:admin_api",
|
||||
"backup:backup-export": "rule:admin_api",
|
||||
|
||||
"snapshot_extension:snapshot_actions:update_snapshot_status": "",
|
||||
"snapshot_extension:snapshot_manage": "rule:admin_api",
|
||||
"snapshot_extension:snapshot_unmanage": "rule:admin_api",
|
||||
|
||||
"consistencygroup:create" : "",
|
||||
"consistencygroup:delete": "",
|
||||
"consistencygroup:update": "",
|
||||
"consistencygroup:get": "",
|
||||
"consistencygroup:get_all": "",
|
||||
|
||||
"consistencygroup:create_cgsnapshot" : "",
|
||||
"consistencygroup:delete_cgsnapshot": "",
|
||||
"consistencygroup:get_cgsnapshot": "",
|
||||
"consistencygroup:get_all_cgsnapshots": "",
|
||||
|
||||
"scheduler_extension:scheduler_stats:get_pools" : "rule:admin_api"
|
||||
}
|
|
@ -1,77 +0,0 @@
|
|||
#
|
||||
# Copyright 2015 Pure Storage, 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.
|
||||
#
|
||||
class plugin_purestorage_cinder::common {
|
||||
|
||||
include plugin_purestorage_cinder::params
|
||||
|
||||
package { $plugin_purestorage_cinder::params::pip_package_name:
|
||||
ensure => 'installed'
|
||||
}
|
||||
package { $plugin_purestorage_cinder::params::iscsi_package_name:
|
||||
ensure => 'installed'
|
||||
}
|
||||
package { $plugin_purestorage_cinder::params::multipath_package_name:
|
||||
ensure => 'installed'
|
||||
}
|
||||
case $::osfamily {
|
||||
'Debian': {
|
||||
service { $plugin_purestorage_cinder::params::iscsi_service_name:
|
||||
ensure => 'running',
|
||||
enable => true,
|
||||
hasrestart => true,
|
||||
require => Package[$plugin_purestorage_cinder::params::iscsi_package_name],
|
||||
}
|
||||
file { '99-pure-storage.rules':
|
||||
path => '/lib/udev/rules.d/99-pure-storage.rules',
|
||||
mode => '0644',
|
||||
owner => root,
|
||||
group => root,
|
||||
source => 'puppet:///modules/plugin_purestorage_cinder/99-pure-storage.rules',
|
||||
}
|
||||
}
|
||||
'RedHat': {
|
||||
file { '99-pure-storage.rules':
|
||||
path => '/etc/udev/rules.d/99-pure-storage.rules',
|
||||
mode => '0644',
|
||||
owner => root,
|
||||
group => root,
|
||||
source => 'puppet:///modules/plugin_purestorage_cinder/99-pure-storage.rules',
|
||||
}
|
||||
}
|
||||
default: {
|
||||
fail("unsuported osfamily ${::osfamily}, currently Debian and Redhat are the only supported platforms")
|
||||
}
|
||||
}
|
||||
|
||||
service { $plugin_purestorage_cinder::params::multipath_service_name:
|
||||
ensure => 'running',
|
||||
enable => true,
|
||||
hasrestart => true,
|
||||
hasstatus => false,
|
||||
status => 'pgrep multipathd',
|
||||
require => Package[$plugin_purestorage_cinder::params::multipath_package_name],
|
||||
}
|
||||
|
||||
file { 'multipath.conf':
|
||||
path => '/etc/multipath.conf',
|
||||
mode => '0644',
|
||||
owner => root,
|
||||
group => root,
|
||||
source => 'puppet:///modules/plugin_purestorage_cinder/multipath.conf',
|
||||
require => Package[$plugin_purestorage_cinder::params::multipath_package_name],
|
||||
notify => Service[$plugin_purestorage_cinder::params::multipath_package_name],
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
#
|
||||
# Copyright 2015 Pure Storage, 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.
|
||||
#
|
||||
class plugin_purestorage_cinder::compute (
|
||||
$nova_multipath,
|
||||
){
|
||||
|
||||
include plugin_purestorage_cinder::common
|
||||
include ::nova::params
|
||||
|
||||
service { 'nova-compute':
|
||||
ensure => 'running',
|
||||
name => $::nova::params::compute_service_name,
|
||||
enable => true,
|
||||
hasstatus => true,
|
||||
hasrestart => true,
|
||||
}
|
||||
|
||||
nova_config { 'libvirt/iscsi_use_multipath': value => $nova_multipath;
|
||||
'libvirt/hw_disk_discard': value => 'unmap' }
|
||||
|
||||
Nova_config<||> ~> Service['nova-compute']
|
||||
|
||||
}
|
|
@ -1,253 +0,0 @@
|
|||
# Copyright 2015 Pure Storage, 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.
|
||||
#
|
||||
|
||||
class plugin_purestorage_cinder::controller (
|
||||
$section,
|
||||
$glance_image_cache,
|
||||
$glance_image_count,
|
||||
$glance_image_size,
|
||||
$replication,
|
||||
$remote_array,
|
||||
$remote_ip,
|
||||
$remote_api,
|
||||
$replication_default,
|
||||
$replication_interval,
|
||||
$replication_short,
|
||||
$replication_long_day,
|
||||
$replication_long,
|
||||
$eradicate,
|
||||
$local_ip,
|
||||
$local_api,
|
||||
$local_chap,
|
||||
$local_multipath,
|
||||
$protocol,
|
||||
$consis_group,
|
||||
$fczm_config,
|
||||
$fc_vendor,
|
||||
$fabric_count,
|
||||
$fabric_name_1,
|
||||
$fabric_name_2,
|
||||
$fc_ip_1,
|
||||
$fc_ip_2,
|
||||
$fc_user_1,
|
||||
$fc_user_2,
|
||||
$fc_passwd_1,
|
||||
$fc_passwd_2,
|
||||
$fc_prefix_1,
|
||||
$fc_prefix_2,
|
||||
$fc_vsan_1,
|
||||
$fc_vsan_2
|
||||
) {
|
||||
|
||||
include plugin_purestorage_cinder::common
|
||||
include ::cinder::params
|
||||
include ::cinder::client
|
||||
include ::keystone::client
|
||||
|
||||
ini_subsetting { 'enable_cinder_pure_backend':
|
||||
ensure => present,
|
||||
section => 'DEFAULT',
|
||||
key_val_separator => '=',
|
||||
path => '/etc/cinder/cinder.conf',
|
||||
setting => 'enabled_backends',
|
||||
subsetting => $section,
|
||||
subsetting_separator => ',',
|
||||
}
|
||||
|
||||
package { 'purestorage':
|
||||
ensure => 'installed',
|
||||
provider => pip
|
||||
}
|
||||
|
||||
if $::cinder::params::volume_package {
|
||||
package { $::cinder::params::volume_package:
|
||||
ensure => present,
|
||||
}
|
||||
Package[$::cinder::params::volume_package] -> Cinder_config<||>
|
||||
}
|
||||
|
||||
# $section = $backend_name
|
||||
cinder_type { 'pure_vol':
|
||||
ensure => present,
|
||||
properties => ['volume_backend_name=pure'],
|
||||
}
|
||||
cinder_config {
|
||||
'DEFAULT/default_volume_type': value => 'pure_vol';
|
||||
# 'DEFAULT/enabled_backends': value => "${section}";
|
||||
}
|
||||
|
||||
if $glance_image_cache{
|
||||
cinder_config {
|
||||
# Force both cinter internal tenant and user to be a fixed values, keeping plugin idempotent
|
||||
'DEFAULT/cinder_internal_tenant_project_id': value => '123456789abcdef123456789abcdef12';
|
||||
'DEFAULT/cinder_internal_tenant_user_id': value => '123456789abcdef123456789abcdef13';
|
||||
"${section}/image_volume_cache_enabled": value => $glance_image_cache;
|
||||
"${section}/image_volume_cache_max_count": value => $glance_image_count;
|
||||
"${section}/image_volume_cache_max_size_gb": value => $glance_image_size;
|
||||
}
|
||||
}
|
||||
|
||||
if $replication == true {
|
||||
$repl_device = join(['backend_id:' ,$remote_array,',san_ip:',$remote_ip,',api_token:',$remote_api],'')
|
||||
cinder_config {
|
||||
"${section}/replication_device": value => $repl_device;
|
||||
}
|
||||
if $replication_default == 'false' {
|
||||
cinder_config {
|
||||
"${section}/pure_replica_interval_default": value => $replication_interval;
|
||||
"${section}/pure_replica_retention_short_term_default": value => $replication_short;
|
||||
"${section}/pure_replica_retention_long_term_per_day_default": value => $replication_long_day;
|
||||
"${section}/pure_replica_retention_long_term_default": value => $replication_long;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if $eradicate == true {
|
||||
cinder_config {
|
||||
"${section}/pure_eradicate_on_delete": value => $eradicate;
|
||||
}
|
||||
}
|
||||
|
||||
cinder::backend::pure { $section :
|
||||
san_ip => $local_ip,
|
||||
pure_api_token => $local_api,
|
||||
volume_backend_name => $section,
|
||||
use_chap_auth => $local_chap,
|
||||
use_multipath_for_image_xfer => $local_multipath,
|
||||
pure_storage_protocol => $protocol,
|
||||
extra_options => { "${section}/backend_host" => { value => $section }
|
||||
}
|
||||
}
|
||||
|
||||
# If consistency groups are selected then provide a modified pilocy.json that enables them
|
||||
if $consis_group == true {
|
||||
file { 'policy.json':
|
||||
path => '/etc/cinder/policy.json',
|
||||
mode => '0644',
|
||||
owner => cinder,
|
||||
group => cinder,
|
||||
source => 'puppet:///modules/plugin_purestorage_cinder/policy.json',
|
||||
}
|
||||
}
|
||||
|
||||
# If protocol is FC then meed to add zoning_mode. Put in $section as this has already been set by multibackend
|
||||
if ($protocol == 'FC') and ($fczm_config == 'automatic') {
|
||||
cinder_config {
|
||||
"${section}/zoning_mode": value => 'Fabric';
|
||||
}
|
||||
# Now add in the [fc-zone-manager] stanza
|
||||
case $fc_vendor {
|
||||
'Brocade': {
|
||||
cinder_config {
|
||||
'fc-zone-manager/brcd_sb_connector': value => 'cinder.zonemanager.drivers.brocade.brcd_fc_zone_client_cli.BrcdFCZoneClientCLI';
|
||||
'fc-zone-manager/fc_san_lookup_service': value => 'cinder.zonemanager.drivers.brocade.brcd_fc_san_lookup_service.BrcdFCSanLookupService';
|
||||
'fc-zone-manager/zone_driver': value => 'cinder.zonemanager.drivers.brocade.brcd_fc_zone_driver.BrcdFCZoneDriver';
|
||||
}
|
||||
}
|
||||
'Cisco': {
|
||||
cinder_config {
|
||||
'fc-zone-manager/cisco_sb_connector': value => 'cinder.zonemanager.drivers.cisco.cisco_fc_zone_client_cli.CiscoFCZoneClientCLI';
|
||||
'fc-zone-manager/fc_san_lookup_service': value => 'cinder.zonemanager.drivers.cisco.cisco_fc_san_lookup_service.CiscoFCSanLookupService';
|
||||
'fc-zone-manager/zone_driver': value => 'cinder.zonemanager.drivers.cisco.cisco_fc_zone_driver.CiscoFCZoneDriver';
|
||||
}
|
||||
}
|
||||
default: {
|
||||
fail("${fc_vendor} is not a supported FCZM Vendor.")
|
||||
}
|
||||
}
|
||||
case $fabric_count {
|
||||
'1': {
|
||||
cinder_config {
|
||||
'fc-zone-manager/fc_fabric_names': value => $fabric_name_1;
|
||||
}
|
||||
}
|
||||
'2': {
|
||||
cinder_config {
|
||||
'fc-zone-manager/fc_fabric_names': value => join([$fabric_name_1,', ',$fabric_name_2],'');
|
||||
}
|
||||
}
|
||||
default: {
|
||||
fail("Invalid value for fabric_count: ${fabric_count}.")
|
||||
}
|
||||
}
|
||||
|
||||
$fabric_zone_1 = $fabric_name_1
|
||||
$fabric_zone_2 = $fabric_name_2
|
||||
|
||||
# Now add in stanzas for each fabric zone depending on the switch vendor
|
||||
case $fc_vendor {
|
||||
'Brocade': {
|
||||
cinder_config {
|
||||
"${fabric_zone_1}/fc_fabric_address": value => $fc_ip_1;
|
||||
"${fabric_zone_1}/fc_fabric_user": value => $fc_user_1;
|
||||
"${fabric_zone_1}/fc_fabric_password": value => $fc_passwd_1;
|
||||
"${fabric_zone_1}/fc_fabric_port": value => '22';
|
||||
"${fabric_zone_1}/zoning_policy": value => 'initiator-target';
|
||||
"${fabric_zone_1}/zone_activate": value => true;
|
||||
"${fabric_zone_1}/zone_name_prefix": value => join([$fabric_name_1,'_'],'');
|
||||
}
|
||||
if $fabric_count == '2' {
|
||||
cinder_config {
|
||||
"${fabric_zone_2}/fc_fabric_address": value => $fc_ip_2;
|
||||
"${fabric_zone_2}/fc_fabric_user": value => $fc_user_2;
|
||||
"${fabric_zone_2}/fc_fabric_password": value => $fc_passwd_2;
|
||||
"${fabric_zone_2}/fc_fabric_port": value => '22';
|
||||
"${fabric_zone_2}/zoning_policy": value => 'initiator-target';
|
||||
"${fabric_zone_2}/zone_activate": value => true;
|
||||
"${fabric_zone_2}/zone_name_prefix": value => join([$fabric_name_2,'_'],'');
|
||||
}
|
||||
}
|
||||
}
|
||||
'Cisco': {
|
||||
cinder_config {
|
||||
"${fabric_zone_1}/cisco_fc_fabric_address": value => $fc_ip_1;
|
||||
"${fabric_zone_1}/cisco_fc_fabric_user": value => $fc_user_1;
|
||||
"${fabric_zone_1}/cisco_fc_fabric_password": value => $fc_passwd_1;
|
||||
"${fabric_zone_1}/cisco_fc_fabric_port": value => '22';
|
||||
"${fabric_zone_1}/cisco_zoning_vsan": value => $fc_vsan_1;
|
||||
"${fabric_zone_1}/cisco_zoning_policy": value => 'initiator-target';
|
||||
"${fabric_zone_1}/cisco_zone_activate": value => true;
|
||||
"${fabric_zone_1}/cisco_zone_name_prefix": value => join([$fabric_name_1,'_'],'');
|
||||
}
|
||||
if $fabric_count == '2' {
|
||||
cinder_config {
|
||||
"${fabric_zone_2}/cisco_fc_fabric_address": value => $fc_ip_2;
|
||||
"${fabric_zone_2}/cisco_fc_fabric_user": value => $fc_user_2;
|
||||
"${fabric_zone_2}/cisco_fc_fabric_password": value => $fc_passwd_2;
|
||||
"${fabric_zone_2}/cisco_fc_fabric_port": value => '22';
|
||||
"${fabric_zone_2}/cisco_zoning_vsan": value => $fc_vsan_2;
|
||||
"${fabric_zone_2}/cisco_zoning_policy": value => 'initiator-target';
|
||||
"${fabric_zone_2}/cisco_zone_activate": value => true;
|
||||
"${fabric_zone_2}/cisco_zone_name_prefix": value => join([$fabric_name_2,'_'],'');
|
||||
}
|
||||
}
|
||||
}
|
||||
default: {
|
||||
fail("${fc_vendor} is not a supported FCZM Vendor.")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Cinder_config<||> ~> Service['cinder_volume']
|
||||
|
||||
service { 'cinder_volume':
|
||||
ensure => running,
|
||||
name => $::cinder::params::volume_service,
|
||||
enable => true,
|
||||
hasstatus => true,
|
||||
hasrestart => true,
|
||||
}
|
||||
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
#
|
||||
# Copyright 2015 Pure Storage, 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.
|
||||
#
|
||||
class plugin_purestorage_cinder {}
|
|
@ -1,39 +0,0 @@
|
|||
#
|
||||
# Copyright 2015 Pure Storage, 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.
|
||||
#
|
||||
class plugin_purestorage_cinder::params {
|
||||
|
||||
case $::osfamily {
|
||||
'Debian': {
|
||||
$iscsi_package_name = 'open-iscsi'
|
||||
$iscsi_service_name = 'open-iscsi'
|
||||
$pip_package_name = 'python-pip'
|
||||
$pip_service_name = false
|
||||
$multipath_package_name = 'multipath-tools'
|
||||
$multipath_service_name = 'multipath-tools'
|
||||
}
|
||||
'RedHat': {
|
||||
$iscsi_package_name = 'iscsi-initiator-utils'
|
||||
$iscsi_service_name = false
|
||||
$pip_package_name = 'python-pip'
|
||||
$pip_service_name = false
|
||||
$multipath_package_name = 'device-mapper-multipath'
|
||||
$multipath_service_name = 'multipathd'
|
||||
}
|
||||
default: {
|
||||
fail("unsuported osfamily ${::osfamily}, currently Debian and Redhat are the only supported platforms")
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
# Deployment tasks
|
||||
- id: configure_purestorage_controller
|
||||
role: ['primary-controller', 'controller']
|
||||
required_for: [post_deployment_end]
|
||||
requires: [post_deployment_start]
|
||||
type: puppet
|
||||
version: 3.0.0
|
||||
parameters:
|
||||
puppet_manifest: puppet/manifests/controller.pp
|
||||
puppet_modules: "puppet/modules/:/etc/puppet/modules/"
|
||||
timeout: 360
|
||||
- id: configure_purestorage_compute
|
||||
role: ['compute']
|
||||
required_for: [post_deployment_end]
|
||||
requires: [post_deployment_start]
|
||||
type: puppet
|
||||
version: 3.0.0
|
||||
parameters:
|
||||
puppet_manifest: puppet/manifests/compute.pp
|
||||
puppet_modules: "puppet/modules/:/etc/puppet/modules/"
|
||||
timeout: 360
|
183
doc/Makefile
|
@ -1,183 +0,0 @@
|
|||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = build
|
||||
|
||||
# User-friendly check for sphinx-build
|
||||
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
|
||||
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
|
||||
endif
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
|
||||
# the i18n builder cannot share the environment and doctrees with the others
|
||||
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
|
||||
|
||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
@echo " dirhtml to make HTML files named index.html in directories"
|
||||
@echo " singlehtml to make a single large HTML file"
|
||||
@echo " pickle to make pickle files"
|
||||
@echo " json to make JSON files"
|
||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||
@echo " qthelp to make HTML files and a qthelp project"
|
||||
@echo " devhelp to make HTML files and a Devhelp project"
|
||||
@echo " epub to make an epub"
|
||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
|
||||
@echo " text to make text files"
|
||||
@echo " man to make manual pages"
|
||||
@echo " texinfo to make Texinfo files"
|
||||
@echo " info to make Texinfo files and run them through makeinfo"
|
||||
@echo " gettext to make PO message catalogs"
|
||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||
@echo " xml to make Docutils-native XML files"
|
||||
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||
@echo " pdf to make a PDF file"
|
||||
|
||||
clean:
|
||||
rm -rf $(BUILDDIR)/*
|
||||
|
||||
html:
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
|
||||
dirhtml:
|
||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||
|
||||
singlehtml:
|
||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||
|
||||
pickle:
|
||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||
@echo
|
||||
@echo "Build finished; now you can process the pickle files."
|
||||
|
||||
json:
|
||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||
@echo
|
||||
@echo "Build finished; now you can process the JSON files."
|
||||
|
||||
htmlhelp:
|
||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||
|
||||
qthelp:
|
||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Together-Message.qhcp"
|
||||
@echo "To view the help file:"
|
||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Together-Message.qhc"
|
||||
|
||||
devhelp:
|
||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||
@echo
|
||||
@echo "Build finished."
|
||||
@echo "To view the help file:"
|
||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/Together-Message"
|
||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Together-Message"
|
||||
@echo "# devhelp"
|
||||
|
||||
epub:
|
||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||
@echo
|
||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||
|
||||
latex:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo
|
||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||
"(use \`make latexpdf' here to do that automatically)."
|
||||
|
||||
latexpdf:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through pdflatex..."
|
||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
latexpdfja:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through platex and dvipdfmx..."
|
||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
text:
|
||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||
@echo
|
||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||
|
||||
man:
|
||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||
@echo
|
||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||
|
||||
texinfo:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo
|
||||
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
|
||||
@echo "Run \`make' in that directory to run these through makeinfo" \
|
||||
"(use \`make info' here to do that automatically)."
|
||||
|
||||
info:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo "Running Texinfo files through makeinfo..."
|
||||
make -C $(BUILDDIR)/texinfo info
|
||||
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
|
||||
|
||||
gettext:
|
||||
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
|
||||
@echo
|
||||
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
|
||||
|
||||
changes:
|
||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||
@echo
|
||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||
|
||||
linkcheck:
|
||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||
@echo
|
||||
@echo "Link check complete; look for any errors in the above output " \
|
||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||
|
||||
doctest:
|
||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||
@echo "Testing of doctests in the sources finished, look at the " \
|
||||
"results in $(BUILDDIR)/doctest/output.txt."
|
||||
|
||||
xml:
|
||||
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
|
||||
@echo
|
||||
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
|
||||
|
||||
pseudoxml:
|
||||
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
|
||||
@echo
|
||||
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
|
||||
|
||||
pdf:
|
||||
$(SPHINXBUILD) -b pdf $(ALLSPHINXOPTS) $(BUILDDIR)/pdf
|
||||
@echo
|
||||
@echo "Build finished. The PDF file is in $(BUILDDIR)/pdf."
|
Before Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 101 KiB |
Before Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 63 KiB |
|
@ -1,7 +0,0 @@
|
|||
.. _appendix:
|
||||
|
||||
Appendix
|
||||
========
|
||||
|
||||
- `OpenStack Cinder Driver for Pure Storage Flash Array <http://stackalytics.com/report/driverlog?project_id=openstack%2Fcinder&vendor=Pure%20iSCSI%2FFC%20Storage>`_
|
||||
- `Pure Storage Flash Array Volume Driver <http://docs.openstack.org/mitaka/config-reference/content/pure-storage-driver.html>`_
|
|
@ -1,380 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Pure Storage Cinder Plugin documentation build configuration file, created by
|
||||
# sphinx-quickstart on Tue Mar 29 17:38:58 2016.
|
||||
#
|
||||
# This file is execfile()d with the current directory set to its
|
||||
# containing dir.
|
||||
#
|
||||
# Note that not all possible configuration values are present in this
|
||||
# autogenerated file.
|
||||
#
|
||||
# All configuration values have a default; values that are commented out
|
||||
# serve to show the default.
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
#sys.path.insert(0, os.path.abspath('.'))
|
||||
|
||||
# -- General configuration ------------------------------------------------
|
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here.
|
||||
#needs_sphinx = '1.0'
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = [
|
||||
'sphinx.ext.autodoc',
|
||||
'sphinx.ext.doctest',
|
||||
'rst2pdf.pdfbuilder',
|
||||
]
|
||||
|
||||
pdf_documents = [
|
||||
('index', u'Pure Storage Cinder Plugin', u'Pure Storage Cinder Plugin Guide', u'Simon Dodsley')
|
||||
]
|
||||
|
||||
pdf_language = "en_US"
|
||||
|
||||
pdf_break_level = 1
|
||||
|
||||
# Show Table Of Contents at the beginning?
|
||||
pdf_use_toc = True
|
||||
|
||||
# How many levels deep should the table of contents be?
|
||||
pdf_toc_depth = 9999
|
||||
|
||||
# Add section number to section references
|
||||
pdf_use_numbered_links = False
|
||||
|
||||
# Background images fitting mode
|
||||
pdf_fit_background_mode = 'scale'
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
# The suffix(es) of source filenames.
|
||||
# You can specify multiple suffix as a list of string:
|
||||
# source_suffix = ['.rst', '.md']
|
||||
source_suffix = '.rst'
|
||||
|
||||
# The encoding of source files.
|
||||
#source_encoding = 'utf-8-sig'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = 'index'
|
||||
|
||||
# General information about the project.
|
||||
project = u'Pure Storage Cinder Plugin'
|
||||
copyright = u'2016, Simon Dodsley'
|
||||
author = u'Simon Dodsley'
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = u'3.0.0'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = u'3.0.0'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
#
|
||||
# This is also used if you do content translation via gettext catalogs.
|
||||
# Usually you set "language" from the command line for these cases.
|
||||
language = None
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
#today = ''
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
#today_fmt = '%B %d, %Y'
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
# This patterns also effect to html_static_path and html_extra_path
|
||||
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
|
||||
|
||||
# The reST default role (used for this markup: `text`) to use for all
|
||||
# documents.
|
||||
#default_role = None
|
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||
#add_function_parentheses = True
|
||||
|
||||
# If true, the current module name will be prepended to all description
|
||||
# unit titles (such as .. function::).
|
||||
#add_module_names = True
|
||||
|
||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||
# output. They are ignored by default.
|
||||
#show_authors = False
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = 'sphinx'
|
||||
|
||||
# A list of ignored prefixes for module index sorting.
|
||||
#modindex_common_prefix = []
|
||||
|
||||
# If true, keep warnings as "system message" paragraphs in the built documents.
|
||||
#keep_warnings = False
|
||||
|
||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||
todo_include_todos = False
|
||||
|
||||
|
||||
# -- Options for HTML output ----------------------------------------------
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
html_theme = 'alabaster'
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
#html_theme_options = {}
|
||||
|
||||
# Add any paths that contain custom themes here, relative to this directory.
|
||||
#html_theme_path = []
|
||||
|
||||
# The name for this set of Sphinx documents.
|
||||
# "<project> v<release> documentation" by default.
|
||||
#html_title = u'Pure Storage Cinder Plugin v3.0.0'
|
||||
|
||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||
#html_short_title = None
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top
|
||||
# of the sidebar.
|
||||
#html_logo = None
|
||||
|
||||
# The name of an image file (relative to this directory) to use as a favicon of
|
||||
# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||
# pixels large.
|
||||
#html_favicon = None
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ['_static']
|
||||
|
||||
# Add any extra paths that contain custom files (such as robots.txt or
|
||||
# .htaccess) here, relative to this directory. These files are copied
|
||||
# directly to the root of the documentation.
|
||||
#html_extra_path = []
|
||||
|
||||
# If not None, a 'Last updated on:' timestamp is inserted at every page
|
||||
# bottom, using the given strftime format.
|
||||
# The empty string is equivalent to '%b %d, %Y'.
|
||||
#html_last_updated_fmt = None
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
#html_use_smartypants = True
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
#html_sidebars = {}
|
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to
|
||||
# template names.
|
||||
#html_additional_pages = {}
|
||||
|
||||
# If false, no module index is generated.
|
||||
#html_domain_indices = True
|
||||
|
||||
# If false, no index is generated.
|
||||
#html_use_index = True
|
||||
|
||||
# If true, the index is split into individual pages for each letter.
|
||||
#html_split_index = False
|
||||
|
||||
# If true, links to the reST sources are added to the pages.
|
||||
#html_show_sourcelink = True
|
||||
|
||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||
#html_show_sphinx = True
|
||||
|
||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
||||
#html_show_copyright = True
|
||||
|
||||
# If true, an OpenSearch description file will be output, and all pages will
|
||||
# contain a <link> tag referring to it. The value of this option must be the
|
||||
# base URL from which the finished HTML is served.
|
||||
#html_use_opensearch = ''
|
||||
|
||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
||||
#html_file_suffix = None
|
||||
|
||||
# Language to be used for generating the HTML full-text search index.
|
||||
# Sphinx supports the following languages:
|
||||
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
|
||||
# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh'
|
||||
#html_search_language = 'en'
|
||||
|
||||
# A dictionary with options for the search language support, empty by default.
|
||||
# 'ja' uses this config value.
|
||||
# 'zh' user can custom change `jieba` dictionary path.
|
||||
#html_search_options = {'type': 'default'}
|
||||
|
||||
# The name of a javascript file (relative to the configuration directory) that
|
||||
# implements a search results scorer. If empty, the default will be used.
|
||||
#html_search_scorer = 'scorer.js'
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'PureStorageCinderPlugindoc'
|
||||
|
||||
# -- Options for LaTeX output ---------------------------------------------
|
||||
|
||||
latex_elements = {
|
||||
# The paper size ('letterpaper' or 'a4paper').
|
||||
#'papersize': 'letterpaper',
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#'pointsize': '10pt',
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#'preamble': '',
|
||||
|
||||
# Latex figure (float) alignment
|
||||
#'figure_align': 'htbp',
|
||||
}
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title,
|
||||
# author, documentclass [howto, manual, or own class]).
|
||||
latex_documents = [
|
||||
(master_doc, 'PureStorageCinderPlugin.tex', u'Pure Storage Cinder Plugin Documentation',
|
||||
u'Simon Dodsley', 'manual'),
|
||||
]
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top of
|
||||
# the title page.
|
||||
#latex_logo = None
|
||||
|
||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||
# not chapters.
|
||||
#latex_use_parts = False
|
||||
|
||||
# If true, show page references after internal links.
|
||||
#latex_show_pagerefs = False
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
#latex_show_urls = False
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
#latex_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
#latex_domain_indices = True
|
||||
|
||||
|
||||
# -- Options for manual page output ---------------------------------------
|
||||
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [
|
||||
(master_doc, 'purestoragecinderplugin', u'Pure Storage Cinder Plugin Documentation',
|
||||
[author], 1)
|
||||
]
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
#man_show_urls = False
|
||||
|
||||
|
||||
# -- Options for Texinfo output -------------------------------------------
|
||||
|
||||
# Grouping the document tree into Texinfo files. List of tuples
|
||||
# (source start file, target name, title, author,
|
||||
# dir menu entry, description, category)
|
||||
texinfo_documents = [
|
||||
(master_doc, 'PureStorageCinderPlugin', u'Pure Storage Cinder Plugin Documentation',
|
||||
author, 'PureStorageCinderPlugin', 'One line description of project.',
|
||||
'Miscellaneous'),
|
||||
]
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
#texinfo_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
#texinfo_domain_indices = True
|
||||
|
||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
||||
#texinfo_show_urls = 'footnote'
|
||||
|
||||
# If true, do not generate a @detailmenu in the "Top" node's menu.
|
||||
#texinfo_no_detailmenu = False
|
||||
|
||||
|
||||
# -- Options for Epub output ----------------------------------------------
|
||||
|
||||
# Bibliographic Dublin Core info.
|
||||
epub_title = project
|
||||
epub_author = author
|
||||
epub_publisher = author
|
||||
epub_copyright = copyright
|
||||
|
||||
# The basename for the epub file. It defaults to the project name.
|
||||
#epub_basename = project
|
||||
|
||||
# The HTML theme for the epub output. Since the default themes are not
|
||||
# optimized for small screen space, using the same theme for HTML and epub
|
||||
# output is usually not wise. This defaults to 'epub', a theme designed to save
|
||||
# visual space.
|
||||
#epub_theme = 'epub'
|
||||
|
||||
# The language of the text. It defaults to the language option
|
||||
# or 'en' if the language is not set.
|
||||
#epub_language = ''
|
||||
|
||||
# The scheme of the identifier. Typical schemes are ISBN or URL.
|
||||
#epub_scheme = ''
|
||||
|
||||
# The unique identifier of the text. This can be a ISBN number
|
||||
# or the project homepage.
|
||||
#epub_identifier = ''
|
||||
|
||||
# A unique identification for the text.
|
||||
#epub_uid = ''
|
||||
|
||||
# A tuple containing the cover image and cover page html template filenames.
|
||||
#epub_cover = ()
|
||||
|
||||
# A sequence of (type, uri, title) tuples for the guide element of content.opf.
|
||||
#epub_guide = ()
|
||||
|
||||
# HTML files that should be inserted before the pages created by sphinx.
|
||||
# The format is a list of tuples containing the path and title.
|
||||
#epub_pre_files = []
|
||||
|
||||
# HTML files that should be inserted after the pages created by sphinx.
|
||||
# The format is a list of tuples containing the path and title.
|
||||
#epub_post_files = []
|
||||
|
||||
# A list of files that should not be packed into the epub file.
|
||||
epub_exclude_files = ['search.html']
|
||||
|
||||
# The depth of the table of contents in toc.ncx.
|
||||
#epub_tocdepth = 3
|
||||
|
||||
# Allow duplicate toc entries.
|
||||
#epub_tocdup = True
|
||||
|
||||
# Choose between 'default' and 'includehidden'.
|
||||
#epub_tocscope = 'default'
|
||||
|
||||
# Fix unsupported image types using the Pillow.
|
||||
#epub_fix_images = False
|
||||
|
||||
# Scale large images.
|
||||
#epub_max_image_width = 0
|
||||
|
||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
||||
#epub_show_urls = 'inline'
|
||||
|
||||
# If false, no index is generated.
|
||||
#epub_use_index = True
|
|
@ -1,9 +0,0 @@
|
|||
.. raw:: pdf
|
||||
|
||||
PageBreak
|
||||
|
||||
Contact Support
|
||||
===============
|
||||
|
||||
| For reporting a problem, suggesting an enhancements or new features please contact
|
||||
Pure Storage support for help (support@purestorage.com).
|
|
@ -1,21 +0,0 @@
|
|||
.. Pure Storage Cinder Plugin documentation master file, created by
|
||||
sphinx-quickstart on Tue Mar 29 17:38:58 2016.
|
||||
You can adapt this file completely to your liking, but it should at least
|
||||
contain the root `toctree` directive.
|
||||
|
||||
====================================================
|
||||
Guide to the Pure Storage Cinder Plugin v3.0-3.0.0-1
|
||||
====================================================
|
||||
|
||||
User Documentation
|
||||
==================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
overview
|
||||
installation
|
||||
user_guide
|
||||
contact_support
|
||||
known_issues
|
||||
appendix
|
|
@ -1,81 +0,0 @@
|
|||
.. raw:: pdf
|
||||
|
||||
PageBreak
|
||||
|
||||
Installation Guide
|
||||
==================
|
||||
|
||||
Pure Storage Cinder Plugin installation
|
||||
---------------------------------------
|
||||
|
||||
1. Download the plugin from the `Fuel Plugins Catalog <https://www.mirantis.com/products/openstack-drivers-and-plugins/fuel-plugins/>`_.
|
||||
|
||||
2. Copy the plugin to an already installed Fuel Master node. If you do not
|
||||
have the Fuel Master node yet, please follow `the instructions <https://docs.mirantis.com/openstack/fuel/fuel-9.1/quickstart-guide/index.html>`_:
|
||||
|
||||
# scp fuel-plugin-purestorage-cinder-3.0-3.0.0-1.noarch.rpm root@:<the_Fuel_Master_node_IP>:/tmp``
|
||||
|
||||
3. Log into the Fuel Master node.
|
||||
|
||||
4. Install the plugin
|
||||
|
||||
# cd /tmp
|
||||
# fuel plugins --install fuel-plugin-purestorage-cinder-3.0-3.0.0-1.noarch.rpm
|
||||
|
||||
5. Check if the plugin was installed successfully
|
||||
|
||||
..
|
||||
|
||||
# fuel plugins
|
||||
id | name | version | package_version
|
||||
---|--------------------------------|---------|----------------
|
||||
1 | fuel-plugin-purestorage-cinder | 3.0.0 | 4.0.0
|
||||
|
||||
6. After the plugin is installed, `create a new OpenStack environment <http://docs.openstack.org/developer/fuel-docs/userdocs/fuel-user-guide/create-environment.html>`_ using the Fuel UI Wizard.
|
||||
|
||||
7. `Configure your environment <http://docs.openstack.org/developer/fuel-docs/userdocs/fuel-user-guide/configure-environment.html>`_.
|
||||
|
||||
8. Open the Settings tab of the Fuel Web UI and scroll down the page. Select the Storage section to enable Pure Storage driver in Cinder plugin checkbox.
|
||||
|
||||
.. image:: ./_static/cinder-purestorage-mitaka-plugin-1.png
|
||||
:width: 100%
|
||||
.. image:: ./_static/cinder-purestorage-mitaka-plugin-2.png
|
||||
:width: 100%
|
||||
.. image:: ./_static/cinder-purestorage-mitaka-plugin-3.png
|
||||
:width: 100%
|
||||
|
||||
9. Enter the Purity API Token and the IP address of the management VIP of the Pure Storage FlashArray.
|
||||
|
||||
* Obtain the Purity API token from the Pure Storage GUI
|
||||
|
||||
*System->Users->API Tokens: Select User, click gear icon by user and select 'Show API Token'*
|
||||
|
||||
.. image:: ./_static/api-Collection.png
|
||||
:width: 100%
|
||||
|
||||
or use the following Purity CLI command to obtain the API token:
|
||||
|
||||
# pureadmin list --api-token --expose <USER>
|
||||
|
||||
* Obtain the Pure Storage VIP from the Pure Storage GUI
|
||||
|
||||
*System->System->Configuration->Networking: Use the IP address associated with 'vir0'*
|
||||
|
||||
.. image:: ./_static/VIP-Collection.png
|
||||
:width: 100%
|
||||
|
||||
or use the following Purity CLI command to obtain the VIP address:
|
||||
|
||||
# purenetwork list vir0
|
||||
|
||||
10. Select the defaults for all other Pure Storage options. Each selectable option has a description in the Fuel GUI.
|
||||
|
||||
11. If using Fibre Channel as the storage protocol you need to select the zoning method to be used in your deployment. If you are configuring your own zones then select 'Manual' but you can select 'Automatic' if you wish to use the Openstack Fibre Channel Zone Manager. If 'Automatic' is selected you will need to provide the necessary information for the Zone Manager to communicate and configure your fibre channel switches.
|
||||
|
||||
.. image:: ./_static/fc-options.png
|
||||
:width: 100%
|
||||
|
||||
12. If configuring Cinder replication to a remote Pure Storage FlashArray then it is necessary to provide both the Management IP address of the target array and its API token. Replication of volumes will be performed using the default values provided by the driver, but these can be overriden in the plugin by selecting 'Manual' in the Replication Retention Configuration section of the plugin. On selecting this you will be presented with the default options that are adjustable.
|
||||
|
||||
.. image:: ./_static/replication-options.png
|
||||
:width: 100%
|
|
@ -1,12 +0,0 @@
|
|||
.. raw:: pdf
|
||||
|
||||
PageBreak
|
||||
|
||||
Known issues
|
||||
============
|
||||
|
||||
#. Ensure your controller nodes have access to the public internet to allow for correct Python module installation required by the Fuel plugin
|
||||
|
||||
#. If you environment is deployed with multiple controllers for HA, you cannot run all the Cinder Volume services at the same time in Active-Active mode
|
||||
|
||||
#. There are specific changes that need to be made to the local deb packages. More details can be found in the Pure Storage/Mirantis Reference Architecture
|
|
@ -1,28 +0,0 @@
|
|||
.. raw:: pdf
|
||||
|
||||
PageBreak
|
||||
|
||||
Pure Storage Cinder plugin
|
||||
==========================
|
||||
|
||||
| The Pure Storage Cinder Fuel plugin provides an automated method
|
||||
to insert the necessary lines into the ``cinder.conf`` file. The plugin
|
||||
extends the Fuel Web UI to provide the necessary entry locations for the
|
||||
information for the configuration file. Thus, the plugin incorporates
|
||||
`OpenStack Cinder Driver for Pure Storage Flash Array <http://stackalytics.com/report/driverlog?project_id=openstack%2Fcinder&vendor=Pure%20iSCSI%2FFC%20Storage>`_.
|
||||
| Thus, the plugin provides the ability to
|
||||
create a configuration file stanza so that when multi-backend support is selected, the stanza is correct.
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
+-----------------------------------+-----------------+
|
||||
| Requirement | Version/Comment |
|
||||
+===================================+=================+
|
||||
| Mirantis OpenStack compatibility | 9.1 |
|
||||
+-----------------------------------+-----------------+
|
||||
|
||||
Limitations
|
||||
-----------
|
||||
|
||||
| No limitations are present.
|
|
@ -1,18 +0,0 @@
|
|||
.. raw:: pdf
|
||||
|
||||
PageBreak
|
||||
|
||||
User Guide
|
||||
==========
|
||||
|
||||
| Once the OpenStack instance is deployed by Fuel the Pure Storage plugin provides no
|
||||
user configurable or maintainable options.
|
||||
|
||||
| Validation of the plugins correct operation can be performed by comparing the parameters selected in the Fuel GUI to those added into the
|
||||
``/etc/cinder/cinder.conf`` and ``/etc/nova/nova.conf`` files on the Controller and Compute nodes respectively.
|
||||
|
||||
| As part of this installation a new multipath.conf file is provided to all nodes. Ensure that other device entries required for your
|
||||
local environment are added to these files and multipath is restarted to accept any changes.
|
||||
|
||||
| The Pure Storage driver (Once configured by Fuel) will output all logs into the
|
||||
cinder-volume process log file with the 'Pure Storage' title.
|
|
@ -1,434 +0,0 @@
|
|||
attributes:
|
||||
metadata:
|
||||
group: 'storage'
|
||||
pure_cg:
|
||||
value: "false"
|
||||
values:
|
||||
- data: "true"
|
||||
label: "True"
|
||||
description: "Enables Cinder Consistency Groups for all users and all backends (where supported)"
|
||||
- data: "false"
|
||||
label: "False"
|
||||
description: "Disables Cinder Consistency Groups for all users and all backends"
|
||||
label: "Cinder Consistency Groups"
|
||||
description: 'Enable/Disable consistency groups for ALL tenants and users.'
|
||||
weight: 13
|
||||
type: "radio"
|
||||
pure_san_ip:
|
||||
value: ""
|
||||
label: 'Pure Storage Management IP (san_ip)'
|
||||
description: 'The hostname (or IP address) for the Pure Storage Management VIP.'
|
||||
weight: 15
|
||||
type: "text"
|
||||
regex:
|
||||
source: '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'
|
||||
error: "Error: Enter in regular IP address dot notation"
|
||||
pure_api:
|
||||
value: ""
|
||||
label: 'API Token for Pure Storage (pure_api_token)'
|
||||
description: 'Purity API token used to perform actions on the FlashArray.'
|
||||
weight: 20
|
||||
type: "text"
|
||||
regex:
|
||||
source: '^(?!\s*$).+'
|
||||
error: "Error: API token field cannot be empty"
|
||||
pure_multipath:
|
||||
value: "true"
|
||||
values:
|
||||
- data: "true"
|
||||
label: "True"
|
||||
description: "Enables multipathing for image transfers"
|
||||
- data: "false"
|
||||
label: "False"
|
||||
description: "Disables multipathing for image transfers"
|
||||
label: "Pure Storage Multipath for Image Transfers (use_multipath_for_image_xfer)"
|
||||
description: 'Enable/Disable multipathing for image transfers.'
|
||||
weight: 24
|
||||
type: "radio"
|
||||
pure_nova_multipath:
|
||||
value: "false"
|
||||
values:
|
||||
- data: "true"
|
||||
label: "True"
|
||||
description: "Enables multipathing for Nova compute servers - applies to both iSCSI and FC"
|
||||
- data: "false"
|
||||
label: "False"
|
||||
description: "Disables multipathing for Nova compute servers - applies to both iSCSI and FC"
|
||||
label: "Multipathing for iSCSI and FC in Nova Compute servers (iscsi_use_multipath)"
|
||||
description: 'Enable/Disable multipathing for Nova compute servers.'
|
||||
weight: 25
|
||||
type: "radio"
|
||||
pure_replication:
|
||||
value: "false"
|
||||
values:
|
||||
- data: "false"
|
||||
label: "False"
|
||||
description: 'Disable replicaton to remote Pure Storage array'
|
||||
- data: "true"
|
||||
label: "True"
|
||||
description: 'Enable replicaton to remote Pure Storage array'
|
||||
label: 'Replication to Remote Pure Storage array'
|
||||
description: 'Configure replication to a remote array - remote array connection must be created manually'
|
||||
weight: 26
|
||||
type: "radio"
|
||||
pure_replication_name:
|
||||
value: ''
|
||||
label: 'Name of array to replicate data to'
|
||||
description: 'Name of remote replication target array'
|
||||
weight: 27
|
||||
type: "text"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_replication.value != 'true'"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(?!\s*$).+'
|
||||
error: "Error: remote array name field cannot be empty"
|
||||
pure_replication_ip:
|
||||
value: ''
|
||||
label: 'IP address of remote array'
|
||||
description: 'IP address of remote Pure Storage array'
|
||||
weight: 28
|
||||
type: "text"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_replication.value != 'true'"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'
|
||||
error: "Error: Enter in regular IP address dot notation"
|
||||
pure_replication_api:
|
||||
value: ''
|
||||
label: 'API Token for remote Pure Storage'
|
||||
description: 'Purity API token used to perform actions on the remote array.'
|
||||
weight: 29
|
||||
type: "text"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_replication.value != 'true'"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(?!\s*$).+'
|
||||
error: "Error: API token field cannot be empty"
|
||||
pure_replication_default:
|
||||
value: "true"
|
||||
values:
|
||||
- data: "true"
|
||||
label: "Default"
|
||||
description: 'Use default replication retention vlaues (see documentation)'
|
||||
- data: "false"
|
||||
label: "Manual"
|
||||
description: 'Manually define replication retention settings'
|
||||
label: 'Replication Retention Configuration'
|
||||
description: 'Configure the remote replication retention parameters or leave as default'
|
||||
weight: 30
|
||||
type: "radio"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_replication.value != 'true'"
|
||||
action: "hide"
|
||||
pure_interval:
|
||||
value: "900"
|
||||
label: "Replication internal (in seconds)"
|
||||
description: "(pure_replica_interval_default)"
|
||||
weight: 31
|
||||
type: "text"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_replication.value != 'true' or (settings:fuel-plugin-purestorage-cinder.pure_replication.value == 'true' and settings:fuel-plugin-purestorage-cinder.pure_replication_default.value == 'true')"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(34560000|[1-3][0-4][0-5][0-5][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[3-9][0-9][0-9])$'
|
||||
error: "Error: Range for snapshot replication interval is 300 - 34560000 seconds"
|
||||
pure_retention_short:
|
||||
value: "14400"
|
||||
label: "Retention period for snapshots on target(in seconds)"
|
||||
description: "(pure_replica_retention_short_term_default)"
|
||||
weight: 32
|
||||
type: "text"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_replication.value != 'true' or (settings:fuel-plugin-purestorage-cinder.pure_replication.value == 'true' and settings:fuel-plugin-purestorage-cinder.pure_replication_default.value == 'true')"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(34560000|[1-3][0-4][0-5][0-5][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9]|[6-9][0-9])$'
|
||||
error: "Error: Range for maximum time all snapshots can be retained for is 60 - 34560000 seconds"
|
||||
pure_retention_long_day:
|
||||
value: "3"
|
||||
label: "Number of snapshots to keep per day"
|
||||
description: "(pure_replica_retention_long_term_per_day_default)"
|
||||
weight: 34
|
||||
type: "text"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_replication.value != 'true' or (settings:fuel-plugin-purestorage-cinder.pure_replication.value == 'true' and settings:fuel-plugin-purestorage-cinder.pure_replication_default.value == 'true')"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(1440|1[0-4][0-3][0-9]|[1-9][0-9][0-9]|[1-9][0-9]|[1-9])$'
|
||||
error: "Error: Maximum number of snapshots per day is 1440"
|
||||
pure_retention_long:
|
||||
value: "7"
|
||||
label: "Number of days to keep snapshots"
|
||||
description: "(pure_replica_retention_long_term_default)"
|
||||
weight: 33
|
||||
type: "text"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_replication.value != 'true' or (settings:fuel-plugin-purestorage-cinder.pure_replication.value == 'true' and settings:fuel-plugin-purestorage-cinder.pure_replication_default.value == 'true')"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(4000|[1-3][0-9][0-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9]|[1-9])$'
|
||||
error: "Error: Maximum number of days to keep snapshots is 4000"
|
||||
pure_glance_image_cache:
|
||||
value: "false"
|
||||
values:
|
||||
- data: "false"
|
||||
label: "False"
|
||||
description: 'Disable the Glance Image-Cache for Cinder backend'
|
||||
- data: "true"
|
||||
label: "True"
|
||||
description: 'Enable the Glance Image-Cache for Cinder backend'
|
||||
label: 'Glance Image-Cache (image_volume_cache_enabled)'
|
||||
description: 'Configure the Glance Image-Cache for Cinder'
|
||||
weight: 35
|
||||
type: "radio"
|
||||
pure_glance_cache_count:
|
||||
value: '0'
|
||||
label: 'Glance Image Cache Max Count (image_volume_cache_max_count)'
|
||||
description: 'Maximum number of images in Glance Image Cache (0 = no limit)'
|
||||
weight: 36
|
||||
type: "text"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_glance_image_cache.value != 'true'"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^[0-9]+$'
|
||||
error: "Error: Only numbers are permitted"
|
||||
pure_glance_cache_size:
|
||||
value: '0'
|
||||
label: 'Glance Image Cache Size (image_volume_cache_max_size_gb)'
|
||||
description: 'Maximum size for Glance Image Cache [GB] (0 = no limit)'
|
||||
weight: 37
|
||||
type: "text"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_glance_image_cache.value != 'true'"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^[0-9]+$'
|
||||
error: "Error: Only numbers are permitted"
|
||||
pure_eradicate:
|
||||
value: "false"
|
||||
values:
|
||||
- data: "false"
|
||||
label: "False"
|
||||
description: "Disables auto-eradication of deleted volumes"
|
||||
- data: "true"
|
||||
label: "True"
|
||||
description: "Enables auto-eradication of deleted volumes"
|
||||
label: "Auto-Eradication of Deleted Volumes"
|
||||
description: 'Select whether to auto-eradicate volumes on deletion or leave as default'
|
||||
weight: 38
|
||||
type: "radio"
|
||||
pure_protocol:
|
||||
value: "iSCSI"
|
||||
values:
|
||||
- data: "iSCSI"
|
||||
label: "iSCSI"
|
||||
description: "Enables iSCSI protocol for block storage volumes"
|
||||
- data: "FC"
|
||||
label: "Fibre Channel"
|
||||
description: "Enables Fibre Channel protocol for block storage volumes"
|
||||
label: "Protocol for Pure Storage block access"
|
||||
description: 'Select block storage protocol for FlashArray.'
|
||||
weight: 39
|
||||
type: "radio"
|
||||
pure_fczm_config:
|
||||
value: "manual"
|
||||
values:
|
||||
- data: "automatic"
|
||||
label: "Automatic"
|
||||
description: "Use automated Fibre Channel Zone Manager for zoning"
|
||||
- data: "manual"
|
||||
label: "Manual"
|
||||
description: "Use manual fibre channel zoning"
|
||||
label: "Fibre Channel Zoning Manager"
|
||||
description: "Method for configuring fibre channel zones"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_protocol.value != 'FC'"
|
||||
action: "hide"
|
||||
weight: 40
|
||||
type: "radio"
|
||||
pure_chap:
|
||||
value: "false"
|
||||
values:
|
||||
- data: "true"
|
||||
label: "True"
|
||||
description: "Enables CHAP on iSCSI connections to FlashArray"
|
||||
- data: "false"
|
||||
label: "False"
|
||||
description: "Disables CHAP on iSCSI connections to FlashArray"
|
||||
label: "Pure Storage iSCSI CHAP (use_chap_auth)"
|
||||
description: 'Enable/Disable CHAP on iSCSI connections to the FlashArray.'
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_protocol.value != 'iSCSI'"
|
||||
action: "hide"
|
||||
weight: 40
|
||||
type: "radio"
|
||||
pure_switch_vendor:
|
||||
value: "Brocade"
|
||||
values:
|
||||
- data: "Brocade"
|
||||
label: "Brocade"
|
||||
- data: "Cisco"
|
||||
label: "Cisco"
|
||||
label: "Fibre Channel SAN Switch Provider"
|
||||
description: "FC Vendor"
|
||||
weight: 40
|
||||
type: "select"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'automatic' or settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'iSCSI' or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value == 'manual')"
|
||||
action: "hide"
|
||||
pure_fabric_count:
|
||||
value: '2'
|
||||
type: "select"
|
||||
weight: 41
|
||||
values:
|
||||
- data: '1'
|
||||
label: "1"
|
||||
- data: '2'
|
||||
label: "2"
|
||||
label: "Number of SAN fabrics"
|
||||
description: "Number of SAN fabrics connected to compute and controller nodes"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'automatic' or settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'iSCSI' or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value == 'manual')"
|
||||
action: "hide"
|
||||
pure_fabric_name_1:
|
||||
value: ""
|
||||
label: "Name of Fabric 1"
|
||||
description: "Name of the active zone set for the zoning VSAN if your switch vendor is Cisco, or name of active zone configuration if Brocade. Used in definition of 'zone_name_prefix'."
|
||||
weight: 42
|
||||
type: "text"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'automatic' or settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'iSCSI' or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value == 'manual')"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(?!\s*$).+'
|
||||
error: "Error: Fabric name cannot be blank"
|
||||
pure_fabric_ip_1:
|
||||
value: ""
|
||||
type: "text"
|
||||
weight: 43
|
||||
label: "IP address of Fabric 1 switch"
|
||||
description: "Management IP address of SAN switch for fabric number 1"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'automatic' or settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'iSCSI' or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value == 'manual')"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'
|
||||
error: "Error: Enter in regular IP address dot notation"
|
||||
pure_username_1:
|
||||
value: ""
|
||||
type: "text"
|
||||
weight: 44
|
||||
label: "User ID for Fabric 1 switch"
|
||||
description: "Fabric switch username (with admin privilages)"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'automatic' or settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'iSCSI' or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value == 'manual')"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(?!\s*$).+'
|
||||
error: "Error: Username cannot be blank"
|
||||
pure_password_1:
|
||||
value: ""
|
||||
type: "password"
|
||||
weight: 45
|
||||
label: "Password for Fabric 1 switch"
|
||||
description: "Fabric switch password for username above"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'automatic' or settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'iSCSI' or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value == 'manual')"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(?!\s*$).+'
|
||||
error: "Error: Password cannot be blank"
|
||||
pure_vsan_1:
|
||||
value: ""
|
||||
label: "VSAN for Fabric 1"
|
||||
description: "Number of zoning VSAN with active zone set which is the same as the name of Fabric 1"
|
||||
weight: 46
|
||||
type: "text"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'automatic' or settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'iSCSI' or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value != 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'manual') or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'manual' and settings:fuel-plugin-purestorage-cinder.pure_switch_vendor.value != 'Cisco')"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(409[0-3]|40[1-8][0-9]|[1-3][0-9][0-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9]|[1-9])$'
|
||||
error: "Error: VSAN must be in range 1-4093"
|
||||
pure_zone_prefix_1:
|
||||
value: ""
|
||||
label: "Zoning prefix for Fabric 1"
|
||||
description: "Prefix for zone name created by FCZM (Blank field will use default of 'openstack')"
|
||||
weight: 47
|
||||
type: "text"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'automatic' or settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'iSCSI' or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value == 'manual')"
|
||||
action: "hide"
|
||||
pure_fabric_name_2:
|
||||
value: ""
|
||||
label: "Name of Fabric 2"
|
||||
description: "Name of the active zone set for the zoning VSAN if your switch vendor is Cisco, or name of active zone configuration if Brocade. Used in definition of 'zone_name_prefix'."
|
||||
weight: 51
|
||||
type: "text"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'automatic' or settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'iSCSI' or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value != 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'manual') or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'manual' and settings:fuel-plugin-purestorage-cinder.pure_fabric_count.value != '2')"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(?!\s*$).+'
|
||||
error: "Error: Fabric name cannot be blank"
|
||||
pure_fabric_ip_2:
|
||||
value: ""
|
||||
type: "text"
|
||||
weight: 52
|
||||
label: "IP address of Fabric 2 switch"
|
||||
description: "Management IP address of SAN switch for fabric number 2"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'automatic' or settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'iSCSI' or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value != 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'manual') or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'manual' and settings:fuel-plugin-purestorage-cinder.pure_fabric_count.value != '2')"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'
|
||||
error: "Error: Enter in regular IP address dot notation"
|
||||
pure_username_2:
|
||||
value: ""
|
||||
type: "text"
|
||||
weight: 53
|
||||
label: "User ID for Fabric 2 switch"
|
||||
description: "Fabric switch username (with admin privilages)"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'automatic' or settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'iSCSI' or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value != 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'manual') or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'manual' and settings:fuel-plugin-purestorage-cinder.pure_fabric_count.value != '2')"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(?!\s*$).+'
|
||||
error: "Error: Username cannot be blank"
|
||||
pure_password_2:
|
||||
value: ""
|
||||
type: "password"
|
||||
weight: 54
|
||||
label: "Password for fabric 2 switch"
|
||||
description: "Fabric switch password for username above"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'automatic' or settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'iSCSI' or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value != 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'manual') or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'manual' and settings:fuel-plugin-purestorage-cinder.pure_fabric_count.value != '2')"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(?!\s*$).+'
|
||||
error: "Error: Password cannot be blank"
|
||||
pure_vsan_2:
|
||||
value: ""
|
||||
label: "VSAN for Fabric 2"
|
||||
description: "Number of zoning VSAN with active zone set which is the same as the name of Fabric 2"
|
||||
weight: 56
|
||||
type: "text"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'automatic' or settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'iSCSI' or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value != 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'manual') or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'manual' and settings:fuel-plugin-purestorage-cinder.pure_fabric_count.value != '2' or (settings:fuel-plugin-purestorage-cinder.pure_fabric_count.value == '2' and settings:fuel-plugin-purestorage-cinder.pure_switch_vendor.value == 'Brocade'))"
|
||||
action: "hide"
|
||||
regex:
|
||||
source: '^(409[0-3]|40[1-8][0-9]|[1-3][0-9][0-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9]|[1-9])$'
|
||||
error: "Error: VSAN must be in range 1-4093"
|
||||
pure_zone_prefix_2:
|
||||
value: ""
|
||||
label: "Zoning prefix for Fabric 2"
|
||||
description: "Prefix for zone name created by FCZM (Blank field will use default of 'openstack')"
|
||||
weight: 57
|
||||
type: "text"
|
||||
restrictions:
|
||||
- condition: "settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'automatic' or settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'iSCSI' or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value != 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'manual') or (settings:fuel-plugin-purestorage-cinder.pure_protocol.value == 'FC' and settings:fuel-plugin-purestorage-cinder.pure_fczm_config.value != 'manual' and settings:fuel-plugin-purestorage-cinder.pure_fabric_count.value != '2')"
|
||||
action: "hide"
|
|
@ -1,20 +0,0 @@
|
|||
name: fuel-plugin-purestorage-cinder
|
||||
title: Pure Storage driver for Cinder
|
||||
version: '3.0.0'
|
||||
description: Enables the Pure Storage driver in Cinder
|
||||
fuel_version: ['9.0']
|
||||
licenses: ['Apache License Version 2.0']
|
||||
authors: ['Simon Dodsley <simon@purestorage.com>']
|
||||
homepage: 'https://github.com/openstack/fuel-plugin-purestorage-cinder'
|
||||
groups: ['storage::cinder']
|
||||
is_hotpluggable: true
|
||||
|
||||
releases:
|
||||
- os: ubuntu
|
||||
version: mitaka-9.0
|
||||
mode: ['ha']
|
||||
deployment_scripts_path: deployment_scripts/
|
||||
repository_path: repositories/ubuntu
|
||||
|
||||
# Version of plugin package
|
||||
package_version: '4.0.0'
|
|
@ -1,5 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Add here any the actions which are required before plugin build
|
||||
# like packages building, packages downloading from mirrors and so on.
|
||||
# The script should return 0 if there were no errors.
|
|
@ -1,132 +0,0 @@
|
|||
|
||||
This work is licensed under the Apache License, Version 2.0.
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
=========================================================
|
||||
Fuel plugin for Pure Storage clusters as a Cinder backend
|
||||
=========================================================
|
||||
|
||||
Pure Storage plugin for Fuel extends Mirantis OpenStack functionality by adding
|
||||
support for the Pure Storage FlashArray in Cinder.
|
||||
It replaces Cinder LVM driver which is the default volume backend that uses
|
||||
local volumes managed by LVM.
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
Currently, Fuel has no support for Pure Storage as block storage for
|
||||
OpenStack environments. The Pure Storage plugin aims to provide support for it.
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
Implement a Fuel plugin that will configure the Pure Storage driver for
|
||||
Cinder on all Controller nodes. Cinder volume service will be managed
|
||||
by Pacemaker/Corosync to provide HA. Having all Cinder services run
|
||||
on controllers no additional Cinder node is required in environment.
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
None
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
None
|
||||
|
||||
Upgrade impact
|
||||
--------------
|
||||
|
||||
None
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
None
|
||||
|
||||
Notifications impact
|
||||
--------------------
|
||||
|
||||
None
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
None
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
The Pure Storage FlashArray provide high performance block storage for
|
||||
OpenStack envirnments, and therefore enabling the Pure Storage driver in OpenStack
|
||||
will greatly improve performance of OpenStack.
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
The deployer should configure the IP addresses on the Pure Storage array before
|
||||
they deploy the Fuel Plugin to the controllers.
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
None
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
The plugin generates the approriate cinder.conf stanzas to enable the Pure Storage
|
||||
FlashArray within OpenStack. The purestorage.pypi module is installed as part of the plugin.
|
||||
plugin as this is a pre-requisite of the Pure Storage Cinder driver. The driver itself
|
||||
is included in the main OpenStack distribution.
|
||||
|
||||
Plugin has three tasks. Each task per role. They are run in the following order:
|
||||
|
||||
* The first task configures cinder-volume on Primary Controller.
|
||||
* The second task configures cinder-volume on Cinder nodes.
|
||||
* The third task configures nova-compute on Nova nodes.
|
||||
|
||||
Cinder-volume service is installed on all Controller nodes and is managed by
|
||||
Pacemaker. It runs in active/passive mode where only one instance is active.
|
||||
All instances of cinder-volume have the same “backend-host” parameter in cinder.conf
|
||||
file. This is required to achieve ability to manage all volumes in the
|
||||
environment by any cinder-volume instance.
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
| Simon Dodsley <simon@purestorage.com>
|
||||
| Patrick East <patrick.east@purestorage.com>
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
* Implement the Fuel plugin.
|
||||
* Implement the Puppet manifests.
|
||||
* Testing.
|
||||
* Write the documentation.
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
* Fuel 8.0 and higher.
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
* Prepare a test plan.
|
||||
* Test the plugin by deploying environments with all Fuel deployment modes.
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
* Deployment Guide (how to install the storage backends, how to prepare an
|
||||
environment for installation, how to install the plugin, how to deploy an
|
||||
OpenStack environment with the plugin).
|
||||
* User Guide (which features the plugin provides, how to use them in the
|
||||
deployed OpenStack environment).
|
||||
* Test Plan.
|
||||
* Test Report.
|
||||
|