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
This commit is contained in:
Andreas Jaeger 2019-12-18 19:44:29 +01:00
parent f7f8ea7651
commit cde3ba7d9f
38 changed files with 10 additions and 2238 deletions

2
.gitignore vendored
View File

@ -1,2 +0,0 @@
.build
*.rpm

202
LICENSE
View File

@ -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.

View File

@ -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

10
README.rst Normal file
View File

@ -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.

View File

@ -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'],
}

View File

@ -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"],
}

View File

@ -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'"

View File

@ -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
}
}

View File

@ -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"
}

View File

@ -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],
}
}

View File

@ -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']
}

View File

@ -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,
}
}

View File

@ -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 {}

View File

@ -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")
}
}
}

View File

@ -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

View File

@ -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."

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

View File

@ -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>`_

View File

@ -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

View File

@ -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).

View File

@ -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

View File

@ -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%

View File

@ -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

View File

@ -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.

View File

@ -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.

View File

@ -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"

View File

@ -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'

View File

@ -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.

View File

@ -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.