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: I2e07054b34bb2c7ea12c0ccea45611878875ce25
4
.gitignore
vendored
@ -1,4 +0,0 @@
|
|||||||
.build/
|
|
||||||
emc_vnx*.noarch.rpm
|
|
||||||
repositories/centos/*.rpm
|
|
||||||
repositories/ubuntu/*.deb
|
|
176
LICENSE
@ -1,176 +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.
|
|
||||||
|
|
88
README.md
@ -1,88 +0,0 @@
|
|||||||
EMC VNX Plugin for Fuel
|
|
||||||
=======================
|
|
||||||
|
|
||||||
EMC VNX plugin
|
|
||||||
--------------
|
|
||||||
|
|
||||||
EMC VNX plugin for Fuel extends Mirantis OpenStack functionality by adding
|
|
||||||
support for EMC VNX arrays in Cinder using iSCSI protocol. It replaces Cinder
|
|
||||||
LVM driver which is the default volume backend that uses local volumes
|
|
||||||
managed by LVM.
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
------------
|
|
||||||
|
|
||||||
| Requirement | Version/Comment |
|
|
||||||
|:---------------------------------|:----------------|
|
|
||||||
| Mirantis OpenStack compatibility | 9.0 |
|
|
||||||
|
|
||||||
Limitations
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Since only one storage network is available in Fuel 6.x on OpenStack nodes,
|
|
||||||
multipath will bind all storage paths from EMC on one network interface.
|
|
||||||
In case this NIC fails, the communication with storage is lost.
|
|
||||||
|
|
||||||
Installation Guide
|
|
||||||
==================
|
|
||||||
|
|
||||||
|
|
||||||
EMC VNX configuration
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
Before starting a deployment you have to preconfigure EMC VNX array and connect
|
|
||||||
it properly to the environment. Both EMC SP IPs and all iSCSI ports should be
|
|
||||||
available over storage interface from OpenStack nodes. To learn more about
|
|
||||||
EMC VNX configuration, see
|
|
||||||
[the official EMC VNX series documentation](https://mydocuments.emc.com/DynDispatcher?prod=VNX&page=ConfigGroups_VNX)
|
|
||||||
|
|
||||||
EMC VNX configuration checklist:
|
|
||||||
1. create username/password
|
|
||||||
2. create at least one storage pool
|
|
||||||
3. configure network for A and B Service Processors
|
|
||||||
4. configure network for all iSCSI ports
|
|
||||||
|
|
||||||
EMC VNX plugin installation
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
To install EMC VNX plugin, follow these steps:
|
|
||||||
|
|
||||||
1. Download the plugin from
|
|
||||||
[Fuel Plugins Catalog](https://software.mirantis.com/fuel-plugins)
|
|
||||||
|
|
||||||
2. Copy the plugin on already installed Fuel Master node; ssh can be used for
|
|
||||||
that. If you do not have the Fuel Master node yet, see
|
|
||||||
[Quick Start Guide](https://software.mirantis.com/quick-start/):
|
|
||||||
|
|
||||||
# scp emc_vnx-4.0-4.0.0-0.noarch.rpm root@<Fuel_master_ip>:/tmp
|
|
||||||
|
|
||||||
3. Log into the Fuel Master node. Install the plugin:
|
|
||||||
|
|
||||||
# cd /tmp
|
|
||||||
# fuel plugins --install emc_vnx-4.0-4.0.0-0.noarch.rpm
|
|
||||||
|
|
||||||
4. Check if the plugin was installed successfully:
|
|
||||||
|
|
||||||
# fuel plugins
|
|
||||||
id | name | version | package_version
|
|
||||||
---|---------|---------|----------------
|
|
||||||
1 | emc_vnx | 4.0.0 | 4.0.0
|
|
||||||
|
|
||||||
EMC VNX plugin configuration
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
1. Create an environment with the default backend for Cinder.
|
|
||||||
2. Enable the plugin on the Settings tab of the Fuel web UI and fill in form
|
|
||||||
fields:
|
|
||||||
* username/password - access credentials configured on EMC VNX
|
|
||||||
* SP A/B IP - IP addresses of the EMC VNX Service Processors
|
|
||||||
* pool name (optional) - a name of the EMC VNX storage pool on which all
|
|
||||||
Cinder volumes will be created. Provided storage pool must be available on
|
|
||||||
EMC VNX. If pool name is not provided then EMC VNX driver will use a random
|
|
||||||
storage pool available on EMC VNX. You can also use a Volume Type OpenStack
|
|
||||||
feature to create a volume on a specific storage pool.
|
|
||||||
For more information, see
|
|
||||||
[Multiple pools support](https://github.com/emc-openstack/vnx-direct-driver
|
|
||||||
/blob/master/README_ISCSI.md#multiple-pools-support)
|
|
||||||
3. Deploy the environment without a Cinder node. All required Cinder services
|
|
||||||
are run on Controller nodes.
|
|
10
README.rst
Normal 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.
|
@ -1,8 +0,0 @@
|
|||||||
- name: 'storage:block:emc'
|
|
||||||
label: 'EMC'
|
|
||||||
description: 'EMC Driver for Cinder'
|
|
||||||
compatible:
|
|
||||||
- name: 'hypervisor:libvirt:*'
|
|
||||||
incompatible:
|
|
||||||
- name: 'storage:block:ceph'
|
|
||||||
- name: 'storage:block:lvm'
|
|
@ -1,17 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright 2015 Mirantis, 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.
|
|
||||||
#
|
|
||||||
notice('MODULAR: emc/compute.pp')
|
|
||||||
include plugin_emc_vnx::compute
|
|
@ -1,17 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright 2015 Mirantis, 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.
|
|
||||||
#
|
|
||||||
notice('MODULAR: emc/controller.pp')
|
|
||||||
include plugin_emc_vnx::controller
|
|
@ -1,265 +0,0 @@
|
|||||||
#
|
|
||||||
# Open-iSCSI default configuration.
|
|
||||||
# Could be located at /etc/iscsi/iscsid.conf or ~/.iscsid.conf
|
|
||||||
#
|
|
||||||
# Note: To set any of these values for a specific node/session run
|
|
||||||
# the iscsiadm --mode node --op command for the value. See the README
|
|
||||||
# and man page for iscsiadm for details on the --op command.
|
|
||||||
#
|
|
||||||
|
|
||||||
################
|
|
||||||
# iSNS settings
|
|
||||||
################
|
|
||||||
# Address of iSNS server
|
|
||||||
#isns.address = 192.168.0.1
|
|
||||||
#isns.port = 3205
|
|
||||||
|
|
||||||
#############################
|
|
||||||
# NIC/HBA and driver settings
|
|
||||||
#############################
|
|
||||||
# open-iscsi can create a session and bind it to a NIC/HBA.
|
|
||||||
# To set this up see the example iface config file.
|
|
||||||
|
|
||||||
#*****************
|
|
||||||
# Startup settings
|
|
||||||
#*****************
|
|
||||||
|
|
||||||
# To request that the iscsi initd scripts startup a session set to "automatic".
|
|
||||||
# node.startup = automatic
|
|
||||||
#
|
|
||||||
# To manually startup the session set to "manual". The default is manual.
|
|
||||||
node.startup = manual
|
|
||||||
|
|
||||||
# *************
|
|
||||||
# CHAP Settings
|
|
||||||
# *************
|
|
||||||
|
|
||||||
# To enable CHAP authentication set node.session.auth.authmethod
|
|
||||||
# to CHAP. The default is None.
|
|
||||||
#node.session.auth.authmethod = CHAP
|
|
||||||
|
|
||||||
# To set a CHAP username and password for initiator
|
|
||||||
# authentication by the target(s), uncomment the following lines:
|
|
||||||
#node.session.auth.username = username
|
|
||||||
#node.session.auth.password = password
|
|
||||||
|
|
||||||
# To set a CHAP username and password for target(s)
|
|
||||||
# authentication by the initiator, uncomment the following lines:
|
|
||||||
#node.session.auth.username_in = username_in
|
|
||||||
#node.session.auth.password_in = password_in
|
|
||||||
|
|
||||||
# To enable CHAP authentication for a discovery session to the target
|
|
||||||
# set discovery.sendtargets.auth.authmethod to CHAP. The default is None.
|
|
||||||
#discovery.sendtargets.auth.authmethod = CHAP
|
|
||||||
|
|
||||||
# To set a discovery session CHAP username and password for the initiator
|
|
||||||
# authentication by the target(s), uncomment the following lines:
|
|
||||||
#discovery.sendtargets.auth.username = username
|
|
||||||
#discovery.sendtargets.auth.password = password
|
|
||||||
|
|
||||||
# To set a discovery session CHAP username and password for target(s)
|
|
||||||
# authentication by the initiator, uncomment the following lines:
|
|
||||||
#discovery.sendtargets.auth.username_in = username_in
|
|
||||||
#discovery.sendtargets.auth.password_in = password_in
|
|
||||||
|
|
||||||
# ********
|
|
||||||
# Timeouts
|
|
||||||
# ********
|
|
||||||
#
|
|
||||||
# See the iSCSI REAME's Advanced Configuration section for tips
|
|
||||||
# on setting timeouts when using multipath or doing root over iSCSI.
|
|
||||||
#
|
|
||||||
# To specify the length of time to wait for session re-establishment
|
|
||||||
# before failing SCSI commands back to the application when running
|
|
||||||
# the Linux SCSI Layer error handler, edit the line.
|
|
||||||
# The value is in seconds and the default is 120 seconds.
|
|
||||||
node.session.timeo.replacement_timeout = 5
|
|
||||||
|
|
||||||
# To specify the time to wait for login to complete, edit the line.
|
|
||||||
# The value is in seconds and the default is 15 seconds.
|
|
||||||
node.conn[0].timeo.login_timeout = 5
|
|
||||||
|
|
||||||
# To specify the time to wait for logout to complete, edit the line.
|
|
||||||
# The value is in seconds and the default is 15 seconds.
|
|
||||||
node.conn[0].timeo.logout_timeout = 5
|
|
||||||
|
|
||||||
# Time interval to wait for on connection before sending a ping.
|
|
||||||
node.conn[0].timeo.noop_out_interval = 3
|
|
||||||
|
|
||||||
# To specify the time to wait for a Nop-out response before failing
|
|
||||||
# the connection, edit this line. Failing the connection will
|
|
||||||
# cause IO to be failed back to the SCSI layer. If using dm-multipath
|
|
||||||
# this will cause the IO to be failed to the multipath layer.
|
|
||||||
node.conn[0].timeo.noop_out_timeout = 3
|
|
||||||
|
|
||||||
# To specify the time to wait for abort response before
|
|
||||||
# failing the operation and trying a logical unit reset edit the line.
|
|
||||||
# The value is in seconds and the default is 15 seconds.
|
|
||||||
node.session.err_timeo.abort_timeout = 15
|
|
||||||
|
|
||||||
# To specify the time to wait for a logical unit response
|
|
||||||
# before failing the operation and trying session re-establishment
|
|
||||||
# edit the line.
|
|
||||||
# The value is in seconds and the default is 30 seconds.
|
|
||||||
node.session.err_timeo.lu_reset_timeout = 20
|
|
||||||
|
|
||||||
#******
|
|
||||||
# Retry
|
|
||||||
#******
|
|
||||||
|
|
||||||
# To specify the number of times iscsid should retry a login
|
|
||||||
# if the login attempt fails due to the node.conn[0].timeo.login_timeout
|
|
||||||
# expiring modify the following line. Note that if the login fails
|
|
||||||
# quickly (before node.conn[0].timeo.login_timeout fires) because the network
|
|
||||||
# layer or the target returns an error, iscsid may retry the login more than
|
|
||||||
# node.session.initial_login_retry_max times.
|
|
||||||
#
|
|
||||||
# This retry count along with node.conn[0].timeo.login_timeout
|
|
||||||
# determines the maximum amount of time iscsid will try to
|
|
||||||
# establish the initial login. node.session.initial_login_retry_max is
|
|
||||||
# multiplied by the node.conn[0].timeo.login_timeout to determine the
|
|
||||||
# maximum amount.
|
|
||||||
#
|
|
||||||
# The default node.session.initial_login_retry_max is 8 and
|
|
||||||
# node.conn[0].timeo.login_timeout is 15 so we have:
|
|
||||||
#
|
|
||||||
# node.conn[0].timeo.login_timeout * node.session.initial_login_retry_max =
|
|
||||||
# 120 seconds
|
|
||||||
#
|
|
||||||
# Valid values are any integer value. This only
|
|
||||||
# affects the initial login. Setting it to a high value can slow
|
|
||||||
# down the iscsi service startup. Setting it to a low value can
|
|
||||||
# cause a session to not get logged into, if there are distuptions
|
|
||||||
# during startup or if the network is not ready at that time.
|
|
||||||
node.session.initial_login_retry_max = 8
|
|
||||||
|
|
||||||
################################
|
|
||||||
# session and device queue depth
|
|
||||||
################################
|
|
||||||
|
|
||||||
# To control how many commands the session will queue set
|
|
||||||
# node.session.cmds_max to an integer between 2 and 2048 that is also
|
|
||||||
# a power of 2. The default is 128.
|
|
||||||
node.session.cmds_max = 128
|
|
||||||
|
|
||||||
# To control the device's queue depth set node.session.queue_depth
|
|
||||||
# to a value between 1 and 1024. The default is 32.
|
|
||||||
node.session.queue_depth = 32
|
|
||||||
|
|
||||||
##################################
|
|
||||||
# MISC SYSTEM PERFORMANCE SETTINGS
|
|
||||||
##################################
|
|
||||||
|
|
||||||
# For software iscsi (iscsi_tcp) and iser (ib_iser) each session
|
|
||||||
# has a thread used to transmit or queue data to the hardware. For
|
|
||||||
# cxgb3i you will get a thread per host.
|
|
||||||
#
|
|
||||||
# Setting the thread's priority to a lower value can lead to higher throughput
|
|
||||||
# and lower latencies. The lowest value is -20. Setting the priority to
|
|
||||||
# a higher value, can lead to reduced IO performance, but if you are seeing
|
|
||||||
# the iscsi or scsi threads dominate the use of the CPU then you may want
|
|
||||||
# to set this value higher.
|
|
||||||
#
|
|
||||||
# Note: For cxgb3i you must set all sessions to the same value, or the
|
|
||||||
# behavior is not defined.
|
|
||||||
#
|
|
||||||
# The default value is -20. The setting must be between -20 and 20.
|
|
||||||
node.session.xmit_thread_priority = -20
|
|
||||||
|
|
||||||
|
|
||||||
#***************
|
|
||||||
# iSCSI settings
|
|
||||||
#***************
|
|
||||||
|
|
||||||
# To enable R2T flow control (i.e., the initiator must wait for an R2T
|
|
||||||
# command before sending any data), uncomment the following line:
|
|
||||||
#
|
|
||||||
#node.session.iscsi.InitialR2T = Yes
|
|
||||||
#
|
|
||||||
# To disable R2T flow control (i.e., the initiator has an implied
|
|
||||||
# initial R2T of "FirstBurstLength" at offset 0), uncomment the following line:
|
|
||||||
#
|
|
||||||
# The defaults is No.
|
|
||||||
node.session.iscsi.InitialR2T = No
|
|
||||||
|
|
||||||
#
|
|
||||||
# To disable immediate data (i.e., the initiator does not send
|
|
||||||
# unsolicited data with the iSCSI command PDU), uncomment the following line:
|
|
||||||
#
|
|
||||||
#node.session.iscsi.ImmediateData = No
|
|
||||||
#
|
|
||||||
# To enable immediate data (i.e., the initiator sends unsolicited data
|
|
||||||
# with the iSCSI command packet), uncomment the following line:
|
|
||||||
#
|
|
||||||
# The default is Yes
|
|
||||||
node.session.iscsi.ImmediateData = Yes
|
|
||||||
|
|
||||||
# To specify the maximum number of unsolicited data bytes the initiator
|
|
||||||
# can send in an iSCSI PDU to a target, edit the following line.
|
|
||||||
#
|
|
||||||
# The value is the number of bytes in the range of 512 to (2^24-1) and
|
|
||||||
# the default is 262144
|
|
||||||
node.session.iscsi.FirstBurstLength = 262144
|
|
||||||
|
|
||||||
# To specify the maximum SCSI payload that the initiator will negotiate
|
|
||||||
# with the target for, edit the following line.
|
|
||||||
#
|
|
||||||
# The value is the number of bytes in the range of 512 to (2^24-1) and
|
|
||||||
# the defauls it 16776192
|
|
||||||
node.session.iscsi.MaxBurstLength = 16776192
|
|
||||||
|
|
||||||
# To specify the maximum number of data bytes the initiator can receive
|
|
||||||
# in an iSCSI PDU from a target, edit the following line.
|
|
||||||
#
|
|
||||||
# The value is the number of bytes in the range of 512 to (2^24-1) and
|
|
||||||
# the default is 262144
|
|
||||||
node.conn[0].iscsi.MaxRecvDataSegmentLength = 262144
|
|
||||||
|
|
||||||
# To specify the maximum number of data bytes the initiator can receive
|
|
||||||
# in an iSCSI PDU from a target during a discovery session, edit the
|
|
||||||
# following line.
|
|
||||||
#
|
|
||||||
# The value is the number of bytes in the range of 512 to (2^24-1) and
|
|
||||||
# the default is 32768
|
|
||||||
discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 32768
|
|
||||||
|
|
||||||
# To allow the targets to control the setting of the digest checking,
|
|
||||||
# with the initiator requesting a preference of enabling the checking, uncomment# one or both of the following lines:
|
|
||||||
#node.conn[0].iscsi.HeaderDigest = CRC32C,None
|
|
||||||
#node.conn[0].iscsi.DataDigest = CRC32C,None
|
|
||||||
#
|
|
||||||
# To allow the targets to control the setting of the digest checking,
|
|
||||||
# with the initiator requesting a preference of disabling the checking,
|
|
||||||
# uncomment one or both of the following lines:
|
|
||||||
#node.conn[0].iscsi.HeaderDigest = None,CRC32C
|
|
||||||
#node.conn[0].iscsi.DataDigest = None,CRC32C
|
|
||||||
#
|
|
||||||
# To enable CRC32C digest checking for the header and/or data part of
|
|
||||||
# iSCSI PDUs, uncomment one or both of the following lines:
|
|
||||||
#node.conn[0].iscsi.HeaderDigest = CRC32C
|
|
||||||
#node.conn[0].iscsi.DataDigest = CRC32C
|
|
||||||
#
|
|
||||||
# To disable digest checking for the header and/or data part of
|
|
||||||
# iSCSI PDUs, uncomment one or both of the following lines:
|
|
||||||
#node.conn[0].iscsi.HeaderDigest = None
|
|
||||||
#node.conn[0].iscsi.DataDigest = None
|
|
||||||
#
|
|
||||||
# The default is to never use DataDigests or HeaderDigests.
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
#************
|
|
||||||
# Workarounds
|
|
||||||
#************
|
|
||||||
|
|
||||||
# Some targets like IET prefer after an initiator has sent a task
|
|
||||||
# management function like an ABORT TASK or LOGICAL UNIT RESET, that
|
|
||||||
# it does not respond to PDUs like R2Ts. To enable this behavior uncomment
|
|
||||||
# the following line (The default behavior is Yes):
|
|
||||||
node.session.iscsi.FastAbort = Yes
|
|
||||||
|
|
||||||
# Some targets like Equalogic prefer that after an initiator has sent
|
|
||||||
# a task management function like an ABORT TASK or LOGICAL UNIT RESET, that
|
|
||||||
# it continue to respond to R2Ts. To enable this uncomment this line
|
|
||||||
# node.session.iscsi.FastAbort = No
|
|
||||||
|
|
@ -1,302 +0,0 @@
|
|||||||
#
|
|
||||||
# Open-iSCSI default configuration.
|
|
||||||
# Could be located at /etc/iscsi/iscsid.conf or ~/.iscsid.conf
|
|
||||||
#
|
|
||||||
# Note: To set any of these values for a specific node/session run
|
|
||||||
# the iscsiadm --mode node --op command for the value. See the README
|
|
||||||
# and man page for iscsiadm for details on the --op command.
|
|
||||||
#
|
|
||||||
|
|
||||||
######################
|
|
||||||
# iscsid daemon config
|
|
||||||
######################
|
|
||||||
# If you want iscsid to start the first time a iscsi tool
|
|
||||||
# needs to access it, instead of starting it when the init
|
|
||||||
# scripts run, set the iscsid startup command here. This
|
|
||||||
# should normally only need to be done by distro package
|
|
||||||
# maintainers.
|
|
||||||
#
|
|
||||||
# Default for Fedora and RHEL. (uncomment to activate).
|
|
||||||
iscsid.startup = /etc/rc.d/init.d/iscsid force-start
|
|
||||||
|
|
||||||
# Default for upstream open-iscsi scripts (uncomment to activate).
|
|
||||||
# iscsid.startup = /sbin/iscsid
|
|
||||||
|
|
||||||
|
|
||||||
#############################
|
|
||||||
# NIC/HBA and driver settings
|
|
||||||
#############################
|
|
||||||
# open-iscsi can create a session and bind it to a NIC/HBA.
|
|
||||||
# To set this up see the example iface config file.
|
|
||||||
|
|
||||||
#*****************
|
|
||||||
# Startup settings
|
|
||||||
#*****************
|
|
||||||
|
|
||||||
# To request that the iscsi initd scripts startup a session set to "automatic".
|
|
||||||
# node.startup = automatic
|
|
||||||
#
|
|
||||||
# To manually startup the session set to "manual". The default is automatic.
|
|
||||||
node.startup = automatic
|
|
||||||
|
|
||||||
# For "automatic" startup nodes, setting this to "Yes" will try logins on each
|
|
||||||
# available iface until one succeeds, and then stop. The default "No" will try
|
|
||||||
# logins on all availble ifaces simultaneously.
|
|
||||||
node.leading_login = No
|
|
||||||
|
|
||||||
# *************
|
|
||||||
# CHAP Settings
|
|
||||||
# *************
|
|
||||||
|
|
||||||
# To enable CHAP authentication set node.session.auth.authmethod
|
|
||||||
# to CHAP. The default is None.
|
|
||||||
#node.session.auth.authmethod = CHAP
|
|
||||||
|
|
||||||
# To set a CHAP username and password for initiator
|
|
||||||
# authentication by the target(s), uncomment the following lines:
|
|
||||||
#node.session.auth.username = username
|
|
||||||
#node.session.auth.password = password
|
|
||||||
|
|
||||||
# To set a CHAP username and password for target(s)
|
|
||||||
# authentication by the initiator, uncomment the following lines:
|
|
||||||
#node.session.auth.username_in = username_in
|
|
||||||
#node.session.auth.password_in = password_in
|
|
||||||
|
|
||||||
# To enable CHAP authentication for a discovery session to the target
|
|
||||||
# set discovery.sendtargets.auth.authmethod to CHAP. The default is None.
|
|
||||||
#discovery.sendtargets.auth.authmethod = CHAP
|
|
||||||
|
|
||||||
# To set a discovery session CHAP username and password for the initiator
|
|
||||||
# authentication by the target(s), uncomment the following lines:
|
|
||||||
#discovery.sendtargets.auth.username = username
|
|
||||||
#discovery.sendtargets.auth.password = password
|
|
||||||
|
|
||||||
# To set a discovery session CHAP username and password for target(s)
|
|
||||||
# authentication by the initiator, uncomment the following lines:
|
|
||||||
#discovery.sendtargets.auth.username_in = username_in
|
|
||||||
#discovery.sendtargets.auth.password_in = password_in
|
|
||||||
|
|
||||||
# ********
|
|
||||||
# Timeouts
|
|
||||||
# ********
|
|
||||||
#
|
|
||||||
# See the iSCSI REAME's Advanced Configuration section for tips
|
|
||||||
# on setting timeouts when using multipath or doing root over iSCSI.
|
|
||||||
#
|
|
||||||
# To specify the length of time to wait for session re-establishment
|
|
||||||
# before failing SCSI commands back to the application when running
|
|
||||||
# the Linux SCSI Layer error handler, edit the line.
|
|
||||||
# The value is in seconds and the default is 120 seconds.
|
|
||||||
# Special values:
|
|
||||||
# - If the value is 0, IO will be failed immediately.
|
|
||||||
# - If the value is less than 0, IO will remain queued until the session
|
|
||||||
# is logged back in, or until the user runs the logout command.
|
|
||||||
node.session.timeo.replacement_timeout = 5
|
|
||||||
|
|
||||||
# To specify the time to wait for login to complete, edit the line.
|
|
||||||
# The value is in seconds and the default is 15 seconds.
|
|
||||||
node.conn[0].timeo.login_timeout = 5
|
|
||||||
|
|
||||||
# To specify the time to wait for logout to complete, edit the line.
|
|
||||||
# The value is in seconds and the default is 15 seconds.
|
|
||||||
node.conn[0].timeo.logout_timeout = 5
|
|
||||||
|
|
||||||
# Time interval to wait for on connection before sending a ping.
|
|
||||||
node.conn[0].timeo.noop_out_interval = 3
|
|
||||||
|
|
||||||
# To specify the time to wait for a Nop-out response before failing
|
|
||||||
# the connection, edit this line. Failing the connection will
|
|
||||||
# cause IO to be failed back to the SCSI layer. If using dm-multipath
|
|
||||||
# this will cause the IO to be failed to the multipath layer.
|
|
||||||
node.conn[0].timeo.noop_out_timeout = 3
|
|
||||||
|
|
||||||
# To specify the time to wait for abort response before
|
|
||||||
# failing the operation and trying a logical unit reset edit the line.
|
|
||||||
# The value is in seconds and the default is 15 seconds.
|
|
||||||
node.session.err_timeo.abort_timeout = 15
|
|
||||||
|
|
||||||
# To specify the time to wait for a logical unit response
|
|
||||||
# before failing the operation and trying session re-establishment
|
|
||||||
# edit the line.
|
|
||||||
# The value is in seconds and the default is 30 seconds.
|
|
||||||
node.session.err_timeo.lu_reset_timeout = 20
|
|
||||||
|
|
||||||
# To specify the time to wait for a target response
|
|
||||||
# before failing the operation and trying session re-establishment
|
|
||||||
# edit the line.
|
|
||||||
# The value is in seconds and the default is 30 seconds.
|
|
||||||
node.session.err_timeo.tgt_reset_timeout = 20
|
|
||||||
|
|
||||||
|
|
||||||
#******
|
|
||||||
# Retry
|
|
||||||
#******
|
|
||||||
|
|
||||||
# To specify the number of times iscsid should retry a login
|
|
||||||
# if the login attempt fails due to the node.conn[0].timeo.login_timeout
|
|
||||||
# expiring modify the following line. Note that if the login fails
|
|
||||||
# quickly (before node.conn[0].timeo.login_timeout fires) because the network
|
|
||||||
# layer or the target returns an error, iscsid may retry the login more than
|
|
||||||
# node.session.initial_login_retry_max times.
|
|
||||||
#
|
|
||||||
# This retry count along with node.conn[0].timeo.login_timeout
|
|
||||||
# determines the maximum amount of time iscsid will try to
|
|
||||||
# establish the initial login. node.session.initial_login_retry_max is
|
|
||||||
# multiplied by the node.conn[0].timeo.login_timeout to determine the
|
|
||||||
# maximum amount.
|
|
||||||
#
|
|
||||||
# The default node.session.initial_login_retry_max is 8 and
|
|
||||||
# node.conn[0].timeo.login_timeout is 15 so we have:
|
|
||||||
#
|
|
||||||
# node.conn[0].timeo.login_timeout * node.session.initial_login_retry_max =
|
|
||||||
# 120 seconds
|
|
||||||
#
|
|
||||||
# Valid values are any integer value. This only
|
|
||||||
# affects the initial login. Setting it to a high value can slow
|
|
||||||
# down the iscsi service startup. Setting it to a low value can
|
|
||||||
# cause a session to not get logged into, if there are distuptions
|
|
||||||
# during startup or if the network is not ready at that time.
|
|
||||||
node.session.initial_login_retry_max = 8
|
|
||||||
|
|
||||||
################################
|
|
||||||
# session and device queue depth
|
|
||||||
################################
|
|
||||||
|
|
||||||
# To control how many commands the session will queue set
|
|
||||||
# node.session.cmds_max to an integer between 2 and 2048 that is also
|
|
||||||
# a power of 2. The default is 128.
|
|
||||||
node.session.cmds_max = 128
|
|
||||||
|
|
||||||
# To control the device's queue depth set node.session.queue_depth
|
|
||||||
# to a value between 1 and 1024. The default is 32.
|
|
||||||
node.session.queue_depth = 32
|
|
||||||
|
|
||||||
##################################
|
|
||||||
# MISC SYSTEM PERFORMANCE SETTINGS
|
|
||||||
##################################
|
|
||||||
|
|
||||||
# For software iscsi (iscsi_tcp) and iser (ib_iser) each session
|
|
||||||
# has a thread used to transmit or queue data to the hardware. For
|
|
||||||
# cxgb3i you will get a thread per host.
|
|
||||||
#
|
|
||||||
# Setting the thread's priority to a lower value can lead to higher throughput
|
|
||||||
# and lower latencies. The lowest value is -20. Setting the priority to
|
|
||||||
# a higher value, can lead to reduced IO performance, but if you are seeing
|
|
||||||
# the iscsi or scsi threads dominate the use of the CPU then you may want
|
|
||||||
# to set this value higher.
|
|
||||||
#
|
|
||||||
# Note: For cxgb3i you must set all sessions to the same value, or the
|
|
||||||
# behavior is not defined.
|
|
||||||
#
|
|
||||||
# The default value is -20. The setting must be between -20 and 20.
|
|
||||||
node.session.xmit_thread_priority = -20
|
|
||||||
|
|
||||||
|
|
||||||
#***************
|
|
||||||
# iSCSI settings
|
|
||||||
#***************
|
|
||||||
|
|
||||||
# To enable R2T flow control (i.e., the initiator must wait for an R2T
|
|
||||||
# command before sending any data), uncomment the following line:
|
|
||||||
#
|
|
||||||
#node.session.iscsi.InitialR2T = Yes
|
|
||||||
#
|
|
||||||
# To disable R2T flow control (i.e., the initiator has an implied
|
|
||||||
# initial R2T of "FirstBurstLength" at offset 0), uncomment the following line:
|
|
||||||
#
|
|
||||||
# The defaults is No.
|
|
||||||
node.session.iscsi.InitialR2T = No
|
|
||||||
|
|
||||||
#
|
|
||||||
# To disable immediate data (i.e., the initiator does not send
|
|
||||||
# unsolicited data with the iSCSI command PDU), uncomment the following line:
|
|
||||||
#
|
|
||||||
#node.session.iscsi.ImmediateData = No
|
|
||||||
#
|
|
||||||
# To enable immediate data (i.e., the initiator sends unsolicited data
|
|
||||||
# with the iSCSI command packet), uncomment the following line:
|
|
||||||
#
|
|
||||||
# The default is Yes
|
|
||||||
node.session.iscsi.ImmediateData = Yes
|
|
||||||
|
|
||||||
# To specify the maximum number of unsolicited data bytes the initiator
|
|
||||||
# can send in an iSCSI PDU to a target, edit the following line.
|
|
||||||
#
|
|
||||||
# The value is the number of bytes in the range of 512 to (2^24-1) and
|
|
||||||
# the default is 262144
|
|
||||||
node.session.iscsi.FirstBurstLength = 262144
|
|
||||||
|
|
||||||
# To specify the maximum SCSI payload that the initiator will negotiate
|
|
||||||
# with the target for, edit the following line.
|
|
||||||
#
|
|
||||||
# The value is the number of bytes in the range of 512 to (2^24-1) and
|
|
||||||
# the defauls it 16776192
|
|
||||||
node.session.iscsi.MaxBurstLength = 16776192
|
|
||||||
|
|
||||||
# To specify the maximum number of data bytes the initiator can receive
|
|
||||||
# in an iSCSI PDU from a target, edit the following line.
|
|
||||||
#
|
|
||||||
# The value is the number of bytes in the range of 512 to (2^24-1) and
|
|
||||||
# the default is 262144
|
|
||||||
node.conn[0].iscsi.MaxRecvDataSegmentLength = 262144
|
|
||||||
|
|
||||||
# To specify the maximum number of data bytes the initiator will send
|
|
||||||
# in an iSCSI PDU to the target, edit the following line.
|
|
||||||
#
|
|
||||||
# The value is the number of bytes in the range of 512 to (2^24-1).
|
|
||||||
# Zero is a special case. If set to zero, the initiator will use
|
|
||||||
# the target's MaxRecvDataSegmentLength for the MaxXmitDataSegmentLength.
|
|
||||||
# The default is 0.
|
|
||||||
node.conn[0].iscsi.MaxXmitDataSegmentLength = 0
|
|
||||||
|
|
||||||
# To specify the maximum number of data bytes the initiator can receive
|
|
||||||
# in an iSCSI PDU from a target during a discovery session, edit the
|
|
||||||
# following line.
|
|
||||||
#
|
|
||||||
# The value is the number of bytes in the range of 512 to (2^24-1) and
|
|
||||||
# the default is 32768
|
|
||||||
discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 32768
|
|
||||||
|
|
||||||
# To allow the targets to control the setting of the digest checking,
|
|
||||||
# with the initiator requesting a preference of enabling the checking, uncomment
|
|
||||||
# the following lines (Data digests are not supported.):
|
|
||||||
#node.conn[0].iscsi.HeaderDigest = CRC32C,None
|
|
||||||
|
|
||||||
#
|
|
||||||
# To allow the targets to control the setting of the digest checking,
|
|
||||||
# with the initiator requesting a preference of disabling the checking,
|
|
||||||
# uncomment the following line:
|
|
||||||
#node.conn[0].iscsi.HeaderDigest = None,CRC32C
|
|
||||||
#
|
|
||||||
# To enable CRC32C digest checking for the header and/or data part of
|
|
||||||
# iSCSI PDUs, uncomment the following line:
|
|
||||||
#node.conn[0].iscsi.HeaderDigest = CRC32C
|
|
||||||
#
|
|
||||||
# To disable digest checking for the header and/or data part of
|
|
||||||
# iSCSI PDUs, uncomment the following line:
|
|
||||||
#node.conn[0].iscsi.HeaderDigest = None
|
|
||||||
#
|
|
||||||
# The default is to never use DataDigests or HeaderDigests.
|
|
||||||
#
|
|
||||||
node.conn[0].iscsi.HeaderDigest = None
|
|
||||||
|
|
||||||
# For multipath configurations, you may want more than one session to be
|
|
||||||
# created on each iface record. If node.session.nr_sessions is greater
|
|
||||||
# than 1, performing a 'login' for that node will ensure that the
|
|
||||||
# appropriate number of sessions is created.
|
|
||||||
node.session.nr_sessions = 1
|
|
||||||
|
|
||||||
#************
|
|
||||||
# Workarounds
|
|
||||||
#************
|
|
||||||
|
|
||||||
# Some targets like IET prefer after an initiator has sent a task
|
|
||||||
# management function like an ABORT TASK or LOGICAL UNIT RESET, that
|
|
||||||
# it does not respond to PDUs like R2Ts. To enable this behavior uncomment
|
|
||||||
# the following line (The default behavior is Yes):
|
|
||||||
node.session.iscsi.FastAbort = Yes
|
|
||||||
|
|
||||||
# Some targets like Equalogic prefer that after an initiator has sent
|
|
||||||
# a task management function like an ABORT TASK or LOGICAL UNIT RESET, that
|
|
||||||
# it continue to respond to R2Ts. To enable this uncomment this line
|
|
||||||
# node.session.iscsi.FastAbort = No
|
|
@ -1,49 +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]*]"
|
|
||||||
device {
|
|
||||||
vendor "DGC"
|
|
||||||
product "LUNZ"
|
|
||||||
}
|
|
||||||
device {
|
|
||||||
vendor "HP"
|
|
||||||
product "LOGICAL VOLUME"
|
|
||||||
}
|
|
||||||
device {
|
|
||||||
vendor "HP iLO"
|
|
||||||
product "Internal SD-CARD"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
defaults {
|
|
||||||
path_grouping_policy multibus
|
|
||||||
failback immediate
|
|
||||||
}
|
|
||||||
devices {
|
|
||||||
device {
|
|
||||||
vendor "HP"
|
|
||||||
product "LOGICAL VOLUME.*"
|
|
||||||
path_grouping_policy multibus
|
|
||||||
getuid_callout "/lib/udev/scsi_id --whitelisted --device=/dev/%n"
|
|
||||||
path_selector "round-robin 0"
|
|
||||||
path_checker directio
|
|
||||||
}
|
|
||||||
device {
|
|
||||||
vendor "HP iLO"
|
|
||||||
product "Internal SD-CARD"
|
|
||||||
# generate a fake path id for a SD-CARD because scsi_id does not work:
|
|
||||||
getuid_callout "/bin/echo 111111111111111111111111111111111"
|
|
||||||
}
|
|
||||||
device {
|
|
||||||
vendor "DGC"
|
|
||||||
product ".*"
|
|
||||||
path_grouping_policy group_by_prio
|
|
||||||
getuid_callout "/lib/udev/scsi_id --whitelisted --device=/dev/%n"
|
|
||||||
path_checker emc_clariion
|
|
||||||
path_selector "round-robin 0"
|
|
||||||
no_path_retry fail
|
|
||||||
hardware_handler "1 emc"
|
|
||||||
prio emc
|
|
||||||
failback immediate
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,351 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# OpenStack Cinder Volume (cinder-volume)
|
|
||||||
#
|
|
||||||
# Description: Manages an OpenStack Volumes (cinder-volume) process as an HA resource
|
|
||||||
#
|
|
||||||
# Authors: Sébastien Han
|
|
||||||
# Mainly inspired by the Glance API resource agent written by Martin Gerhard Loschwitz from Hastexo: http://goo.gl/whLpr
|
|
||||||
#
|
|
||||||
# Support: openstack@lists.launchpad.net
|
|
||||||
# License: Apache Software License (ASL) 2.0
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# See usage() function below for more details ...
|
|
||||||
#
|
|
||||||
# OCF instance parameters:
|
|
||||||
# OCF_RESKEY_binary
|
|
||||||
# OCF_RESKEY_config
|
|
||||||
# OCF_RESKEY_user
|
|
||||||
# OCF_RESKEY_pid
|
|
||||||
# OCF_RESKEY_amqp_server_port
|
|
||||||
# OCF_RESKEY_additional_parameters
|
|
||||||
#######################################################################
|
|
||||||
# Initialization:
|
|
||||||
|
|
||||||
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
|
|
||||||
. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
|
|
||||||
|
|
||||||
#######################################################################
|
|
||||||
|
|
||||||
# Fill in some defaults if no values are specified
|
|
||||||
|
|
||||||
OCF_RESKEY_binary_default="cinder-volume"
|
|
||||||
OCF_RESKEY_config_default="/etc/cinder/cinder.conf"
|
|
||||||
OCF_RESKEY_user_default="cinder"
|
|
||||||
OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid"
|
|
||||||
OCF_RESKEY_amqp_server_port_default="5672"
|
|
||||||
OCF_RESKEY_multibackend_default="false"
|
|
||||||
|
|
||||||
: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}}
|
|
||||||
: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}}
|
|
||||||
: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}}
|
|
||||||
: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}}
|
|
||||||
: ${OCF_RESKEY_amqp_server_port=${OCF_RESKEY_amqp_server_port_default}}
|
|
||||||
: ${OCF_RESKEY_multibackend=${OCF_RESKEY_multibackend_default}}
|
|
||||||
|
|
||||||
#######################################################################
|
|
||||||
|
|
||||||
usage() {
|
|
||||||
cat <<UEND
|
|
||||||
usage: $0 (start|stop|validate-all|meta-data|status|monitor)
|
|
||||||
|
|
||||||
$0 manages an OpenStack Cinder Volume (cinder-volume) process as an HA resource
|
|
||||||
|
|
||||||
The 'start' operation starts the volume service.
|
|
||||||
The 'stop' operation stops the volume service.
|
|
||||||
The 'validate-all' operation reports whether the parameters are valid
|
|
||||||
The 'meta-data' operation reports this RA's meta-data information
|
|
||||||
The 'status' operation reports whether the volume service is running
|
|
||||||
The 'monitor' operation reports whether the volume service seems to be working
|
|
||||||
|
|
||||||
UEND
|
|
||||||
}
|
|
||||||
|
|
||||||
meta_data() {
|
|
||||||
cat <<END
|
|
||||||
<?xml version="1.0"?>
|
|
||||||
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
|
|
||||||
<resource-agent name="cinder-volume">
|
|
||||||
<version>1.0</version>
|
|
||||||
|
|
||||||
<longdesc lang="en">
|
|
||||||
Resource agent for the OpenStack Cinder Volume (cinder-volume)
|
|
||||||
May manage a cinder-volume instance or a clone set that
|
|
||||||
creates a distributed cinder-volume cluster.
|
|
||||||
</longdesc>
|
|
||||||
<shortdesc lang="en">Manages the OpenStack Cinder Volume (cinder-volume)</shortdesc>
|
|
||||||
<parameters>
|
|
||||||
|
|
||||||
<parameter name="binary" unique="0" required="0">
|
|
||||||
<longdesc lang="en">
|
|
||||||
Location of the OpenStack Cinder Volume server binary (cinder-volume)
|
|
||||||
</longdesc>
|
|
||||||
<shortdesc lang="en">OpenStack Cinder Volume server binary (cinder-volume)</shortdesc>
|
|
||||||
<content type="string" default="${OCF_RESKEY_binary_default}" />
|
|
||||||
</parameter>
|
|
||||||
|
|
||||||
<parameter name="config" unique="0" required="0">
|
|
||||||
<longdesc lang="en">
|
|
||||||
Location of the OpenStack Cinder Volume (cinder-volume) configuration file
|
|
||||||
</longdesc>
|
|
||||||
<shortdesc lang="en">OpenStack Cinder Volume (cinder-volume) config file</shortdesc>
|
|
||||||
<content type="string" default="${OCF_RESKEY_config_default}" />
|
|
||||||
</parameter>
|
|
||||||
|
|
||||||
<parameter name="user" unique="0" required="0">
|
|
||||||
<longdesc lang="en">
|
|
||||||
User running OpenStack Cinder Volume (cinder-volume)
|
|
||||||
</longdesc>
|
|
||||||
<shortdesc lang="en">OpenStack Cinder Volume (cinder-volume) user</shortdesc>
|
|
||||||
<content type="string" default="${OCF_RESKEY_user_default}" />
|
|
||||||
</parameter>
|
|
||||||
|
|
||||||
<parameter name="pid" unique="0" required="0">
|
|
||||||
<longdesc lang="en">
|
|
||||||
The pid file to use for this OpenStack Cinder Volume (cinder-volume) instance
|
|
||||||
</longdesc>
|
|
||||||
<shortdesc lang="en">OpenStack Cinder Volume (cinder-volume) pid file</shortdesc>
|
|
||||||
<content type="string" default="${OCF_RESKEY_pid_default}" />
|
|
||||||
</parameter>
|
|
||||||
|
|
||||||
<parameter name="amqp_server_port" unique="0" required="0">
|
|
||||||
<longdesc lang="en">
|
|
||||||
The listening port number of the AMQP server. Mandatory to perform a monitor check
|
|
||||||
</longdesc>
|
|
||||||
<shortdesc lang="en">AMQP listening port</shortdesc>
|
|
||||||
<content type="integer" default="${OCF_RESKEY_amqp_server_port_default}" />
|
|
||||||
</parameter>
|
|
||||||
|
|
||||||
<parameter name="multibackend" unique="0" required="0">
|
|
||||||
<longdesc lang="en">
|
|
||||||
If the multi-backend is enabled, the monitor check is slightly different since cinder-volume spawns one thread for each backend.
|
|
||||||
</longdesc>
|
|
||||||
<shortdesc lang="en">Multi Backend usage</shortdesc>
|
|
||||||
<content type="boolean" default="${OCF_RESKEY_multibackend_default}" />
|
|
||||||
</parameter>
|
|
||||||
|
|
||||||
<parameter name="additional_parameters" unique="0" required="0">
|
|
||||||
<longdesc lang="en">
|
|
||||||
Additional parameters to pass on to the OpenStack Cinder Volume (cinder-volume)
|
|
||||||
</longdesc>
|
|
||||||
<shortdesc lang="en">Additional parameters for cinder-volume</shortdesc>
|
|
||||||
<content type="string" />
|
|
||||||
</parameter>
|
|
||||||
|
|
||||||
</parameters>
|
|
||||||
|
|
||||||
<actions>
|
|
||||||
<action name="start" timeout="10" />
|
|
||||||
<action name="stop" timeout="10" />
|
|
||||||
<action name="status" timeout="10" />
|
|
||||||
<action name="monitor" timeout="5" interval="10" />
|
|
||||||
<action name="validate-all" timeout="5" />
|
|
||||||
<action name="meta-data" timeout="5" />
|
|
||||||
</actions>
|
|
||||||
</resource-agent>
|
|
||||||
END
|
|
||||||
}
|
|
||||||
|
|
||||||
#######################################################################
|
|
||||||
# Functions invoked by resource manager actions
|
|
||||||
|
|
||||||
cinder_volume_validate() {
|
|
||||||
local rc
|
|
||||||
|
|
||||||
check_binary $OCF_RESKEY_binary
|
|
||||||
check_binary netstat
|
|
||||||
|
|
||||||
# A config file on shared storage that is not available
|
|
||||||
# during probes is OK.
|
|
||||||
if [ ! -f $OCF_RESKEY_config ]; then
|
|
||||||
if ! ocf_is_probe; then
|
|
||||||
ocf_log err "Config $OCF_RESKEY_config doesn't exist"
|
|
||||||
return $OCF_ERR_INSTALLED
|
|
||||||
fi
|
|
||||||
ocf_log_warn "Config $OCF_RESKEY_config not available during a probe"
|
|
||||||
fi
|
|
||||||
|
|
||||||
getent passwd $OCF_RESKEY_user >/dev/null 2>&1
|
|
||||||
rc=$?
|
|
||||||
if [ $rc -ne 0 ]; then
|
|
||||||
ocf_log err "User $OCF_RESKEY_user doesn't exist"
|
|
||||||
return $OCF_ERR_INSTALLED
|
|
||||||
fi
|
|
||||||
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
cinder_volume_status() {
|
|
||||||
local pid
|
|
||||||
local rc
|
|
||||||
|
|
||||||
if [ ! -f $OCF_RESKEY_pid ]; then
|
|
||||||
ocf_log info "OpenStack Cinder Volume (cinder-volume) is not running"
|
|
||||||
return $OCF_NOT_RUNNING
|
|
||||||
else
|
|
||||||
pid=`cat $OCF_RESKEY_pid`
|
|
||||||
fi
|
|
||||||
|
|
||||||
ocf_run -warn kill -s 0 $pid
|
|
||||||
rc=$?
|
|
||||||
if [ $rc -eq 0 ]; then
|
|
||||||
return $OCF_SUCCESS
|
|
||||||
else
|
|
||||||
ocf_log info "Old PID file found, but OpenStack Cinder Volume (cinder-volume) is not running"
|
|
||||||
return $OCF_NOT_RUNNING
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
cinder_volume_monitor() {
|
|
||||||
local rc
|
|
||||||
local pid
|
|
||||||
local volume_amqp_check
|
|
||||||
|
|
||||||
cinder_volume_status
|
|
||||||
rc=$?
|
|
||||||
|
|
||||||
# If status returned anything but success, return that immediately
|
|
||||||
if [ $rc -ne $OCF_SUCCESS ]; then
|
|
||||||
return $rc
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Grab cinder-volume PID
|
|
||||||
pid=`cat $OCF_RESKEY_pid`
|
|
||||||
|
|
||||||
if ocf_is_true "$OCF_RESKEY_multibackend"; then
|
|
||||||
# Grab the child's PIDs
|
|
||||||
for i in `ps -o pid --no-headers --ppid $pid`
|
|
||||||
do
|
|
||||||
volume_amqp_check=`netstat -punt | grep -s "$OCF_RESKEY_amqp_server_port" | grep -s "$i" | grep -qs "ESTABLISHED"`
|
|
||||||
rc=$?
|
|
||||||
if [ $rc -ne 0 ]; then
|
|
||||||
ocf_log err "This child process from Cinder Volume is not connected to the AMQP server: $rc"
|
|
||||||
return $OCF_NOT_RUNNING
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
else
|
|
||||||
# Check the connections according to the PID
|
|
||||||
# We are sure to hit the scheduler process and not other nova process with the same connection behavior (for example nova-cert)
|
|
||||||
# check the connections according to the PID
|
|
||||||
volume_amqp_check=`netstat -punt | grep -s "$OCF_RESKEY_amqp_server_port" | grep -s "$pid" | grep -qs "ESTABLISHED"`
|
|
||||||
rc=$?
|
|
||||||
if [ $rc -ne 0 ]; then
|
|
||||||
ocf_log err "Cinder Volume is not connected to the AMQP server: $rc"
|
|
||||||
return $OCF_NOT_RUNNING
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
ocf_log debug "OpenStack Cinder Volume (cinder-volume) monitor succeeded"
|
|
||||||
return $OCF_SUCCESS
|
|
||||||
}
|
|
||||||
|
|
||||||
cinder_volume_start() {
|
|
||||||
local rc
|
|
||||||
|
|
||||||
cinder_volume_status
|
|
||||||
rc=$?
|
|
||||||
if [ $rc -eq $OCF_SUCCESS ]; then
|
|
||||||
ocf_log info "OpenStack Cinder Volume (cinder-volume) already running"
|
|
||||||
return $OCF_SUCCESS
|
|
||||||
fi
|
|
||||||
|
|
||||||
# run the actual cinder-volume daemon. Don't use ocf_run as we're sending the tool's output
|
|
||||||
# straight to /dev/null anyway and using ocf_run would break stdout-redirection here.
|
|
||||||
su ${OCF_RESKEY_user} -s /bin/sh -c "${OCF_RESKEY_binary} --config-file=$OCF_RESKEY_config \
|
|
||||||
$OCF_RESKEY_additional_parameters"' >> /dev/null 2>&1 & echo $!' > $OCF_RESKEY_pid
|
|
||||||
|
|
||||||
# Spin waiting for the server to come up.
|
|
||||||
# Let the CRM/LRM time us out if required
|
|
||||||
while true; do
|
|
||||||
cinder_volume_monitor
|
|
||||||
rc=$?
|
|
||||||
[ $rc -eq $OCF_SUCCESS ] && break
|
|
||||||
if [ $rc -ne $OCF_NOT_RUNNING ]; then
|
|
||||||
ocf_log err "OpenStack Cinder Volume (cinder-volume) start failed"
|
|
||||||
exit $OCF_ERR_GENERIC
|
|
||||||
fi
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
|
|
||||||
ocf_log info "OpenStack Cinder Volume (cinder-volume) started"
|
|
||||||
return $OCF_SUCCESS
|
|
||||||
}
|
|
||||||
|
|
||||||
cinder_volume_stop() {
|
|
||||||
local rc
|
|
||||||
local pid
|
|
||||||
|
|
||||||
cinder_volume_status
|
|
||||||
rc=$?
|
|
||||||
if [ $rc -eq $OCF_NOT_RUNNING ]; then
|
|
||||||
ocf_log info "OpenStack Cinder Volume (cinder-volume) already stopped"
|
|
||||||
return $OCF_SUCCESS
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Try SIGTERM
|
|
||||||
pid=`cat $OCF_RESKEY_pid`
|
|
||||||
ocf_run kill -s TERM $pid
|
|
||||||
rc=$?
|
|
||||||
if [ $rc -ne 0 ]; then
|
|
||||||
ocf_log err "OpenStack Cinder Volume (cinder-volume) couldn't be stopped"
|
|
||||||
exit $OCF_ERR_GENERIC
|
|
||||||
fi
|
|
||||||
|
|
||||||
# stop waiting
|
|
||||||
shutdown_timeout=15
|
|
||||||
if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then
|
|
||||||
shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5))
|
|
||||||
fi
|
|
||||||
count=0
|
|
||||||
while [ $count -lt $shutdown_timeout ]; do
|
|
||||||
cinder_volume_status
|
|
||||||
rc=$?
|
|
||||||
if [ $rc -eq $OCF_NOT_RUNNING ]; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
count=`expr $count + 1`
|
|
||||||
sleep 1
|
|
||||||
ocf_log debug "OpenStack Cinder Volume (cinder-volume) still hasn't stopped yet. Waiting ..."
|
|
||||||
done
|
|
||||||
|
|
||||||
cinder_volume_status
|
|
||||||
rc=$?
|
|
||||||
if [ $rc -ne $OCF_NOT_RUNNING ]; then
|
|
||||||
# SIGTERM didn't help either, try SIGKILL
|
|
||||||
ocf_log info "OpenStack Cinder Volume (cinder-volume) failed to stop after ${shutdown_timeout}s \
|
|
||||||
using SIGTERM. Trying SIGKILL ..."
|
|
||||||
ocf_run kill -s KILL $pid
|
|
||||||
fi
|
|
||||||
|
|
||||||
ocf_log info "OpenStack Cinder Volume (cinder-volume) stopped"
|
|
||||||
|
|
||||||
rm -f $OCF_RESKEY_pid
|
|
||||||
|
|
||||||
return $OCF_SUCCESS
|
|
||||||
}
|
|
||||||
|
|
||||||
#######################################################################
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
meta-data) meta_data
|
|
||||||
exit $OCF_SUCCESS;;
|
|
||||||
usage|help) usage
|
|
||||||
exit $OCF_SUCCESS;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Anything except meta-data and help must pass validation
|
|
||||||
cinder_volume_validate || exit $?
|
|
||||||
|
|
||||||
# What kind of method was invoked?
|
|
||||||
case "$1" in
|
|
||||||
start) cinder_volume_start;;
|
|
||||||
stop) cinder_volume_stop;;
|
|
||||||
status) cinder_volume_status;;
|
|
||||||
monitor) cinder_volume_monitor;;
|
|
||||||
validate-all) ;;
|
|
||||||
*) usage
|
|
||||||
exit $OCF_ERR_UNIMPLEMENTED;;
|
|
||||||
esac
|
|
||||||
|
|
@ -1,76 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright 2015 Mirantis, 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_emc_vnx::common {
|
|
||||||
|
|
||||||
include plugin_emc_vnx::params
|
|
||||||
|
|
||||||
package {$plugin_emc_vnx::params::iscsi_package_name:
|
|
||||||
ensure => 'installed'
|
|
||||||
}
|
|
||||||
case $::osfamily {
|
|
||||||
'Debian': {
|
|
||||||
service {$plugin_emc_vnx::params::iscsi_service_name:
|
|
||||||
ensure => 'running',
|
|
||||||
enable => true,
|
|
||||||
hasrestart => true,
|
|
||||||
require => Package[$plugin_emc_vnx::params::iscsi_package_name],
|
|
||||||
}
|
|
||||||
file {'iscsid.conf':
|
|
||||||
path => '/etc/iscsi/iscsid.conf',
|
|
||||||
mode => '0644',
|
|
||||||
owner => root,
|
|
||||||
group => root,
|
|
||||||
source => 'puppet:///modules/plugin_emc_vnx/iscsid.conf',
|
|
||||||
require => Package[$plugin_emc_vnx::params::iscsi_package_name],
|
|
||||||
notify => Service[$plugin_emc_vnx::params::iscsi_service_name],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
'RedHat': {
|
|
||||||
file {'iscsid.conf':
|
|
||||||
path => '/etc/iscsi/iscsid.conf',
|
|
||||||
mode => '0644',
|
|
||||||
owner => root,
|
|
||||||
group => root,
|
|
||||||
source => 'puppet:///modules/plugin_emc_vnx/iscsid.conf-centos',
|
|
||||||
require => Package[$plugin_emc_vnx::params::iscsi_package_name],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
fail("unsuported osfamily ${::osfamily}, currently Debian and Redhat are the only supported platforms")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
package {$plugin_emc_vnx::params::multipath_package_name:
|
|
||||||
ensure => 'installed'
|
|
||||||
}
|
|
||||||
service {$plugin_emc_vnx::params::multipath_service_name:
|
|
||||||
ensure => 'running',
|
|
||||||
enable => true,
|
|
||||||
hasrestart => true,
|
|
||||||
hasstatus => false,
|
|
||||||
status => 'pgrep multipathd',
|
|
||||||
require => Package[$plugin_emc_vnx::params::multipath_package_name],
|
|
||||||
}
|
|
||||||
file {'multipath.conf':
|
|
||||||
path => '/etc/multipath.conf',
|
|
||||||
mode => '0644',
|
|
||||||
owner => root,
|
|
||||||
group => root,
|
|
||||||
source => 'puppet:///modules/plugin_emc_vnx/multipath.conf',
|
|
||||||
require => Package[$plugin_emc_vnx::params::multipath_package_name],
|
|
||||||
notify => Service[$plugin_emc_vnx::params::multipath_service_name],
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright 2015 Mirantis, 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_emc_vnx::compute {
|
|
||||||
|
|
||||||
include plugin_emc_vnx::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 => 'True' }
|
|
||||||
|
|
||||||
Nova_config<||> ~> Service['nova-compute']
|
|
||||||
|
|
||||||
}
|
|
@ -1,127 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright 2015 Mirantis, 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_emc_vnx::controller {
|
|
||||||
|
|
||||||
include plugin_emc_vnx::common
|
|
||||||
include ::cinder::params
|
|
||||||
|
|
||||||
$plugin_settings = hiera('emc_vnx')
|
|
||||||
$service_name = $::cinder::params::volume_service
|
|
||||||
|
|
||||||
$metadata = {
|
|
||||||
'resource-stickiness' => '100',
|
|
||||||
}
|
|
||||||
|
|
||||||
$operations = {
|
|
||||||
'monitor' => {
|
|
||||||
'interval' => '20',
|
|
||||||
'timeout' => '10',
|
|
||||||
},
|
|
||||||
'start' => {
|
|
||||||
'interval' => '0',
|
|
||||||
'timeout' => '60',
|
|
||||||
},
|
|
||||||
'stop' => {
|
|
||||||
'interval' => '0',
|
|
||||||
'timeout' => '60',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$primitive_type = 'cinder-volume'
|
|
||||||
|
|
||||||
$parameters = {
|
|
||||||
'amqp_server_port' => hiera('amqp_port'),
|
|
||||||
'multibackend' => true,
|
|
||||||
}
|
|
||||||
|
|
||||||
if $::cinder::params::volume_package {
|
|
||||||
package { $::cinder::params::volume_package:
|
|
||||||
ensure => present,
|
|
||||||
}
|
|
||||||
Package[$::cinder::params::volume_package] -> Cinder_config<||>
|
|
||||||
}
|
|
||||||
|
|
||||||
case $plugin_settings['emc_driver'] {
|
|
||||||
FC: { cinder_config {
|
|
||||||
'DEFAULT/volume_driver': value => 'cinder.volume.drivers.emc.emc_cli_fc.EMCCLIFCDriver';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ISCSI: { cinder_config {
|
|
||||||
'DEFAULT/volume_driver': value => 'cinder.volume.drivers.emc.emc_cli_iscsi.EMCCLIISCSIDriver';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default: { cinder_config {
|
|
||||||
'DEFAULT/volume_driver': value => 'cinder.volume.drivers.emc.emc_cli_iscsi.EMCCLIISCSIDriver';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cinder_config {
|
|
||||||
'DEFAULT/san_ip': value => $plugin_settings['emc_sp_a_ip'];
|
|
||||||
'DEFAULT/san_secondary_ip': value => $plugin_settings['emc_sp_b_ip'];
|
|
||||||
'DEFAULT/san_login': value => $plugin_settings['emc_username'];
|
|
||||||
'DEFAULT/san_password': value => $plugin_settings['emc_password'];
|
|
||||||
'DEFAULT/storage_vnx_authentication_type': value => 'global';
|
|
||||||
'DEFAULT/destroy_empty_storage_group': value => 'False';
|
|
||||||
'DEFAULT/attach_detach_batch_interval': value => '-1';
|
|
||||||
'DEFAULT/naviseccli_path': value => '/opt/Navisphere/bin/naviseccli';
|
|
||||||
'DEFAULT/initiator_auto_registration': value => 'True';
|
|
||||||
'DEFAULT/default_timeout': value => '10';
|
|
||||||
'DEFAULT/use_multipath_for_image_xfer': value => 'True';
|
|
||||||
'DEFAULT/host': value => 'cinder';
|
|
||||||
}
|
|
||||||
|
|
||||||
if $plugin_settings['emc_pool_name'] {
|
|
||||||
cinder_config {
|
|
||||||
'DEFAULT/storage_vnx_pool_name': value => $plugin_settings['emc_pool_name'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Cinder_config<||> ~> Service[$service_name]
|
|
||||||
|
|
||||||
package {$::plugin_emc_vnx::params::navicli_package_name:
|
|
||||||
ensure => present,
|
|
||||||
}
|
|
||||||
|
|
||||||
file {'cinder-volume-agent-ocf':
|
|
||||||
path =>'/usr/lib/ocf/resource.d/fuel/cinder-volume',
|
|
||||||
mode => '0755',
|
|
||||||
owner => root,
|
|
||||||
group => root,
|
|
||||||
source => 'puppet:///modules/plugin_emc_vnx/ocf/cinder-volume',
|
|
||||||
}
|
|
||||||
|
|
||||||
pacemaker::service { $service_name :
|
|
||||||
primitive_type => $primitive_type,
|
|
||||||
metadata => $metadata,
|
|
||||||
parameters => $parameters,
|
|
||||||
operations => $operations,
|
|
||||||
require => File['cinder-volume-agent-ocf'],
|
|
||||||
}
|
|
||||||
|
|
||||||
service { 'cinder-volume':
|
|
||||||
ensure => running,
|
|
||||||
name => $service_name,
|
|
||||||
enable => true,
|
|
||||||
hasstatus => true,
|
|
||||||
hasrestart => true,
|
|
||||||
require => Package[$::plugin_emc_vnx::params::navicli_package_name],
|
|
||||||
}
|
|
||||||
|
|
||||||
Pcmk_resource["p_${service_name}"] ->
|
|
||||||
Service[$service_name]
|
|
||||||
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright 2015 Mirantis, 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_emc_vnx {}
|
|
@ -1,37 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright 2015 Mirantis, 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_emc_vnx::params {
|
|
||||||
|
|
||||||
case $::osfamily {
|
|
||||||
'Debian': {
|
|
||||||
$navicli_package_name = 'navicli-linux-64-x86-en-us'
|
|
||||||
$iscsi_package_name = 'open-iscsi'
|
|
||||||
$iscsi_service_name = 'open-iscsi'
|
|
||||||
$multipath_package_name = 'multipath-tools'
|
|
||||||
$multipath_service_name = 'multipath-tools'
|
|
||||||
}
|
|
||||||
'RedHat': {
|
|
||||||
$navicli_package_name = 'NaviCLI-Linux-64-x86-en_US'
|
|
||||||
$iscsi_package_name = 'iscsi-initiator-utils'
|
|
||||||
$iscsi_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,27 +0,0 @@
|
|||||||
- id: emc-controller
|
|
||||||
groups: ['primary-controller','controller']
|
|
||||||
type: puppet
|
|
||||||
version: 2.0.0
|
|
||||||
parameters:
|
|
||||||
puppet_manifest: puppet/manifests/controller.pp
|
|
||||||
puppet_modules: puppet/modules:/etc/puppet/modules
|
|
||||||
timeout: 360
|
|
||||||
strategy:
|
|
||||||
type: parallel
|
|
||||||
amount: 1
|
|
||||||
required_for: [deploy_end]
|
|
||||||
requires: [controller_remaining_tasks]
|
|
||||||
|
|
||||||
- id: emc-compute
|
|
||||||
role: ['compute']
|
|
||||||
type: puppet
|
|
||||||
version: 2.0.0
|
|
||||||
parameters:
|
|
||||||
puppet_manifest: puppet/manifests/compute.pp
|
|
||||||
puppet_modules: puppet/modules:/etc/puppet/modules
|
|
||||||
timeout: 360
|
|
||||||
strategy:
|
|
||||||
type: parallel
|
|
||||||
amount: 10
|
|
||||||
requires: [top-role-compute, enable_nova_compute_service]
|
|
||||||
required_for: [deploy_end]
|
|
1
doc/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
build/
|
|
197
doc/Makefile
@ -1,197 +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
|
|
||||||
# SVG to PDF conversion
|
|
||||||
SVG2PDF = inkscape
|
|
||||||
SVG2PDF_FLAGS =
|
|
||||||
# Build a list of SVG files to convert to PDF
|
|
||||||
PDF_FILES := $(foreach dir, images, $(patsubst %.svg,%.pdf,$(wildcard $(dir)/*.svg)))
|
|
||||||
|
|
||||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage 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 " applehelp to make an Apple Help Book"
|
|
||||||
@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 " coverage to run coverage check of the documentation (if enabled)"
|
|
||||||
|
|
||||||
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/EMCpluginforFuel.qhcp"
|
|
||||||
@echo "To view the help file:"
|
|
||||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/EMCpluginforFuel.qhc"
|
|
||||||
|
|
||||||
applehelp:
|
|
||||||
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
|
|
||||||
@echo "N.B. You won't be able to view it unless you put it in" \
|
|
||||||
"~/Library/Documentation/Help or install it in your application" \
|
|
||||||
"bundle."
|
|
||||||
|
|
||||||
devhelp:
|
|
||||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
|
||||||
@echo
|
|
||||||
@echo "Build finished."
|
|
||||||
@echo "To view the help file:"
|
|
||||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/EMCpluginforFuel"
|
|
||||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/EMCpluginforFuel"
|
|
||||||
@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."
|
|
||||||
|
|
||||||
coverage:
|
|
||||||
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
|
|
||||||
@echo "Testing of coverage in the sources finished, look at the " \
|
|
||||||
"results in $(BUILDDIR)/coverage/python.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."
|
|
@ -1,35 +0,0 @@
|
|||||||
from distutils.version import LooseVersion
|
|
||||||
from sphinx import __version__ as sphinx_version
|
|
||||||
|
|
||||||
source_suffix = '.rst'
|
|
||||||
master_doc = 'index'
|
|
||||||
|
|
||||||
project = u'EMC VNX plugin for Fuel'
|
|
||||||
copyright = u'2016, Mirantis Inc.'
|
|
||||||
|
|
||||||
version = '4.0'
|
|
||||||
release = '4.0-4.0.0-1'
|
|
||||||
|
|
||||||
pygments_style = 'sphinx'
|
|
||||||
|
|
||||||
latex_documents = [
|
|
||||||
('index','fuel-plugin-external-emc-doc.tex',
|
|
||||||
u'Fuel EMC VNX plugin documentation',
|
|
||||||
u'Mirantis Inc.', 'manual')
|
|
||||||
]
|
|
||||||
|
|
||||||
# Configuration for the latex/pdf docs.
|
|
||||||
latex_elements = {
|
|
||||||
'papersize': 'a4paper',
|
|
||||||
'pointsize': '11pt',
|
|
||||||
# remove blank pages
|
|
||||||
'classoptions': ',openany,oneside',
|
|
||||||
'babel': '\\usepackage[english]{babel}',
|
|
||||||
}
|
|
||||||
|
|
||||||
if LooseVersion(sphinx_version) >= LooseVersion('1.3.1'):
|
|
||||||
html_theme = "sphinx_rtd_theme"
|
|
||||||
|
|
||||||
html_add_permalinks = ""
|
|
||||||
html_show_copyright = False
|
|
||||||
highlight_language = 'none'
|
|
@ -1,50 +0,0 @@
|
|||||||
.. _configure_env:
|
|
||||||
|
|
||||||
Configure EMC VNX plugin for an environment
|
|
||||||
===========================================
|
|
||||||
|
|
||||||
To configure the EMC VNX plugin during a Mirantis OpenStack environment
|
|
||||||
deployment:
|
|
||||||
|
|
||||||
#. Using the Fuel web UI,
|
|
||||||
`create a new environment <https://docs.mirantis.com/openstack/fuel/fuel-8.0/fuel-user-guide.html#create-a-new-openstack-environment>`_.
|
|
||||||
|
|
||||||
#. In the :guilabel:`Storage Backends` tab, leave the default
|
|
||||||
:guilabel:`LVM over iSCSI` back end for Cinder.
|
|
||||||
#. Do not add the :guilabel:`Cinder` role to any node, since all the Cinder
|
|
||||||
services will be run on controller nodes.
|
|
||||||
|
|
||||||
#. In the Fuel web UI, open your new environment and click
|
|
||||||
:menuselection:`Settings -> Other`.
|
|
||||||
|
|
||||||
#. Select the :guilabel:`EMX VNX driver for Cinder` check box:
|
|
||||||
|
|
||||||
.. image:: images/settings.png
|
|
||||||
:width: 90%
|
|
||||||
|
|
||||||
#. Fill in the :guilabel:`EMX VNX driver for Cinder` form fields:
|
|
||||||
|
|
||||||
.. list-table::
|
|
||||||
:header-rows: 1
|
|
||||||
|
|
||||||
* - Field
|
|
||||||
- Description/Comment
|
|
||||||
* - Username and password
|
|
||||||
- Access credentials configured on EMC VNX.
|
|
||||||
* - SP A and B IPs
|
|
||||||
- IP addresses of the EMC VNX Service Processors.
|
|
||||||
* - Pool name (optional)
|
|
||||||
- The name of the EMC VNX storage pool on which all Cinder volumes
|
|
||||||
will be created. The provided storage pool must be available on
|
|
||||||
EMC VNX. If pool name is not provided, then the EMC VNX driver will
|
|
||||||
use a random storage pool available on EMC VNX.
|
|
||||||
|
|
||||||
#. Make additional `configuration adjustments <https://docs.mirantis.com/openstack/fuel/fuel-8.0/fuel-user-guide.html#configure-your-environment>`_
|
|
||||||
as required.
|
|
||||||
|
|
||||||
#. Proceed to the `environment deployment <https://docs.mirantis.com/openstack/fuel/fuel-8.0/fuel-user-guide.html#deploy-an-openstack-environment>`_.
|
|
||||||
#. Complete the :ref:`environment verification steps <verify>`.
|
|
||||||
|
|
||||||
.. raw:: latex
|
|
||||||
|
|
||||||
\pagebreak
|
|
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 142 KiB |
Before Width: | Height: | Size: 118 KiB |
Before Width: | Height: | Size: 85 KiB |
Before Width: | Height: | Size: 110 KiB |
Before Width: | Height: | Size: 112 KiB |
Before Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 51 KiB |
@ -1,38 +0,0 @@
|
|||||||
.. _fuel-plugin-external-emc:
|
|
||||||
|
|
||||||
=================================================
|
|
||||||
Welcome to the Fuel EMC VNX plugin documentation!
|
|
||||||
=================================================
|
|
||||||
|
|
||||||
Overview
|
|
||||||
========
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 1
|
|
||||||
|
|
||||||
intro.rst
|
|
||||||
zabbix-versions.rst
|
|
||||||
limitations.rst
|
|
||||||
release-notes.rst
|
|
||||||
licenses.rst
|
|
||||||
references.rst
|
|
||||||
|
|
||||||
Installing and configuring Fuel EMC VNX plugin
|
|
||||||
==============================================
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 1
|
|
||||||
|
|
||||||
installation.rst
|
|
||||||
configuration.rst
|
|
||||||
verification.rst
|
|
||||||
removal.rst
|
|
||||||
|
|
||||||
Using Fuel EMC VNX plugin
|
|
||||||
=========================
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 1
|
|
||||||
|
|
||||||
user.rst
|
|
||||||
troubleshooting.rst
|
|
@ -1,106 +0,0 @@
|
|||||||
.. _install:
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
The EMC VNX plugin for Fuel has the following requirements:
|
|
||||||
|
|
||||||
.. list-table::
|
|
||||||
:widths: 10 25
|
|
||||||
:header-rows: 1
|
|
||||||
|
|
||||||
* - Requirement
|
|
||||||
- Version
|
|
||||||
* - Fuel
|
|
||||||
- 9.0
|
|
||||||
* - EMC VNX array
|
|
||||||
- VNX Operational Environment for Block 5.32 or higher
|
|
||||||
|
|
||||||
.. seealso::
|
|
||||||
* :ref:`limit`
|
|
||||||
* :ref:`zabbix`
|
|
||||||
|
|
||||||
.. _prereqs:
|
|
||||||
|
|
||||||
Prerequisites
|
|
||||||
=============
|
|
||||||
|
|
||||||
Before you install and start using the Fuel EMC VNX plugin, complete the
|
|
||||||
following steps:
|
|
||||||
|
|
||||||
#. Install and set up `Fuel 9.0 for Mitaka <https://www.mirantis.com/software/mirantis-openstack/releases/>`_.
|
|
||||||
For details, see `Fuel Installation Guide <http://docs.openstack.org/developer/fuel-docs/userdocs/fuel-install-guide.html>`_.
|
|
||||||
#. Activate the VNX Snapshot and Thin Provisioning license.
|
|
||||||
#. Configure and deploy the EMC VNX array.
|
|
||||||
#. Verify that the EMC VNX array is reachable through one of the Mirantis
|
|
||||||
OpenStack networks. Both EMC SP IPs and all iSCSI ports should be available
|
|
||||||
over the storage interface from OpenStack nodes.
|
|
||||||
#. Configure the EMC VNX back end. For details, see
|
|
||||||
`Openstack Configuration Reference <http://docs.openstack.org/mitaka/config-reference/block-storage/drivers/emc-vnx-driver.html>`_.
|
|
||||||
|
|
||||||
For details on EMC VNX configuration, see the
|
|
||||||
`official EMC VNX series documentation <https://mydocuments.emc.com/requestMyDoc.jsp>`_.
|
|
||||||
|
|
||||||
EMC VNX configuration checklist:
|
|
||||||
|
|
||||||
+------------------------------------+-------------------------+
|
|
||||||
|Item to confirm | Status (tick if done) |
|
|
||||||
+====================================+=========================+
|
|
||||||
|Create username/password. | |
|
|
||||||
+------------------------------------+-------------------------+
|
|
||||||
|Create at least one storage pool. | |
|
|
||||||
+------------------------------------+-------------------------+
|
|
||||||
|Configure network: | |
|
|
||||||
| - for A and B Service Processor | |
|
|
||||||
| - for all iSCSI ports | |
|
|
||||||
+------------------------------------+-------------------------+
|
|
||||||
| Configure the EMC VNX back end. | |
|
|
||||||
+------------------------------------+-------------------------+
|
|
||||||
|
|
||||||
Install the plugin
|
|
||||||
==================
|
|
||||||
|
|
||||||
Before you proceed with the Fuel EMC VNX plugin installation, verify that
|
|
||||||
you have completed the :ref:`prereqs` steps.
|
|
||||||
|
|
||||||
To install the Fuel EMC VNX plugin:
|
|
||||||
|
|
||||||
#. Go to the
|
|
||||||
`Fuel plugins' catalog <https://www.mirantis.com/validated-solution-integrations/fuel-plugins>`_.
|
|
||||||
|
|
||||||
#. From the :guilabel:`Filter` drop-down menu, select the Mirantis OpenStack
|
|
||||||
version 8.0 and the :guilabel:`STORAGE` category.
|
|
||||||
|
|
||||||
#. Find Fuel EMC VNX plugin in the plugins' list and download its ``.rpm``
|
|
||||||
file.
|
|
||||||
|
|
||||||
#. Copy the ``.rpm`` file to the Fuel Master node:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# scp emc_vnx-4.0-4.0.0-1.noarch.rpm root@<FUEL_MASTER_NODE_IP>:/tmp
|
|
||||||
|
|
||||||
#. Log into the Fuel Master node CLI as root.
|
|
||||||
|
|
||||||
#. Install the plugin:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# cd /tmp
|
|
||||||
# fuel plugins --install emc_vnx-4.0-4.0.0-1.noarch.rpm
|
|
||||||
|
|
||||||
#. Verify that the plugin was installed successfully:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# fuel plugins
|
|
||||||
|
|
||||||
id | name | version | package_version
|
|
||||||
---|---------|---------|----------------
|
|
||||||
1 | emc_vnx | 4.0.0 | 4.0.0
|
|
||||||
|
|
||||||
#. Proceed to :ref:`configure_env`.
|
|
||||||
|
|
||||||
.. raw:: latex
|
|
||||||
|
|
||||||
\pagebreak
|
|
@ -1,41 +0,0 @@
|
|||||||
Introduction
|
|
||||||
============
|
|
||||||
|
|
||||||
This documentation provides instructions for installing, configuring, and
|
|
||||||
using the Fuel EMC VNX plugin version 4.0.0.
|
|
||||||
|
|
||||||
The EMC VNX plugin for Fuel extends the Mirantis OpenStack functionality by
|
|
||||||
adding support for the EMC VNX arrays in Cinder using the iSCSI protocol. It
|
|
||||||
replaces Cinder LVM driver which is the default volume back end that uses
|
|
||||||
local volumes managed by LVM. Enabling EMC VNX plugin in Mirantis OpenStack
|
|
||||||
means that all the Cinder services are run on controller nodes.
|
|
||||||
|
|
||||||
Key terms and abbreviations
|
|
||||||
===========================
|
|
||||||
|
|
||||||
The table below lists the key terms and abbreviations that are used in this
|
|
||||||
document.
|
|
||||||
|
|
||||||
.. tabularcolumns:: |p{4cm}|p{12.5cm}|
|
|
||||||
|
|
||||||
====================== ================================================
|
|
||||||
**Term/abbreviation** **Definition**
|
|
||||||
====================== ================================================
|
|
||||||
EMC VNX Unified, hybrid-flash storage used for virtual
|
|
||||||
applications and cloud-environments.
|
|
||||||
Cinder OpenStack Block Storage
|
|
||||||
iSCSI Internet Small Computer System Interface. An
|
|
||||||
Internet Protocol (IP)-based storage networking
|
|
||||||
standard for linking data storage facilities.
|
|
||||||
By carrying SCSI commands over IP networks,
|
|
||||||
iSCSI is used to facilitate data transfers over
|
|
||||||
intranets and to manage storage over long
|
|
||||||
distances. iSCSI can be used to transmit data
|
|
||||||
over local area networks (LANs), wide area
|
|
||||||
networks (WANs), or the Internet and can enable
|
|
||||||
location-independent data storage and retrieval.
|
|
||||||
LVM A logical volume manager for the Linux kernel
|
|
||||||
that manages disk drives and similar
|
|
||||||
mass-storage devices.
|
|
||||||
LUN Logical unit number
|
|
||||||
====================== ================================================
|
|
@ -1,13 +0,0 @@
|
|||||||
Licenses
|
|
||||||
========
|
|
||||||
|
|
||||||
.. csv-table::
|
|
||||||
:header: Package, Component, License
|
|
||||||
:widths: 2, 4, 4
|
|
||||||
|
|
||||||
``.deb``, ``multipath-tools``, GPL-2.0
|
|
||||||
``.deb``, ``navicli-linux-64-x86-en-us``, EMC Freeware Software License
|
|
||||||
``.rpm``, ``kpartx``, GPL+
|
|
||||||
``.rpm``, ``device-mapper-multipath``, GPL+
|
|
||||||
``.rpm``, ``device-mapper-multipath-libs``, GPL+
|
|
||||||
``.rpm``, ``NaviCLI-Linux-64-x86-en_US``, EMC Freeware Software License
|
|
@ -1,16 +0,0 @@
|
|||||||
.. _limit:
|
|
||||||
|
|
||||||
Limitations
|
|
||||||
============
|
|
||||||
|
|
||||||
The EMC VNX plugin has the following limitations:
|
|
||||||
|
|
||||||
#. Since only one storage network is available in Fuel on OpenStack
|
|
||||||
nodes, multipath will bind all storage paths from EMC on one network
|
|
||||||
interface. In case this NIC fails, the communication with storage is
|
|
||||||
lost.
|
|
||||||
#. EMC VNX plugin cannot be used together with Cinder role and/or the
|
|
||||||
following OpenStack environment options:
|
|
||||||
:guilabel:`Cinder LVM over iSCSI for volumes`,
|
|
||||||
:guilabel:`Ceph RBD for volumes (Cinder)`.
|
|
||||||
#. Fibre Channel driver is not supported.
|
|
@ -1,9 +0,0 @@
|
|||||||
Useful links
|
|
||||||
============
|
|
||||||
|
|
||||||
- `GitHub project <https://github.com/openstack/fuel-plugin-external-emc/tree/master>`_
|
|
||||||
- `Launchpad project <https://launchpad.net/fuel-plugins>`_
|
|
||||||
- `EMC VNX official documentation <https://mydocuments.emc.com/requestMyDoc.jsp>`_
|
|
||||||
- `EMC VNX driver OpenStack documentation <http://docs.openstack.org/mitaka/config-reference/block-storage/drivers/emc-vnx-driver.html>`_
|
|
||||||
- `Fuel plugins management commands <http://docs.openstack.org/developer/fuel-docs/userdocs/fuel-user-guide/cli/cli_plugins.html>`_
|
|
||||||
- `OpenStack CLI Reference <http://docs.openstack.org/cli-reference/content/>`_
|
|
@ -1,10 +0,0 @@
|
|||||||
Release notes
|
|
||||||
=============
|
|
||||||
|
|
||||||
The EMC VNX plugin 4.0.0 contains the following updates:
|
|
||||||
|
|
||||||
* Added support for Fuel 9.0.
|
|
||||||
* Added FC driver support
|
|
||||||
* Added support for task-based deployment.
|
|
||||||
* Enhanced the EMC VNX plugin overall performance.
|
|
||||||
* Improved the EMC VNX plugin documentation.
|
|
@ -1,55 +0,0 @@
|
|||||||
Uninstall EMC VNX plugin
|
|
||||||
========================
|
|
||||||
|
|
||||||
To uninstall the EMC VNX plugin, complete the following steps:
|
|
||||||
|
|
||||||
#. Using the Fuel CLI, delete all the Mirantis OpenStack environments in
|
|
||||||
which the EMC VNX plugin has been enabled:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# fuel --env <ENV_ID> env delete
|
|
||||||
|
|
||||||
#. Uninstall the plugin:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# fuel plugins --remove emc_vnx==4.0.0
|
|
||||||
|
|
||||||
#. Verify whether the VMware DVS plugin was uninstalled successfully:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# fuel plugins
|
|
||||||
|
|
||||||
The EMC VNX plugin should not appear in the output list.
|
|
||||||
|
|
||||||
Uninstall Zabbix plugin
|
|
||||||
=======================
|
|
||||||
|
|
||||||
To uninstall the Zabbix plugin, complete the following steps:
|
|
||||||
|
|
||||||
#. Using the Fuel CLI, delete all the Mirantis OpenStack environments in
|
|
||||||
which the Zabbix plugin has been enabled:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# fuel --env <ENV_ID> env delete
|
|
||||||
|
|
||||||
#. Uninstall the plugin:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# fuel plugins --remove zabbix_monitoring==2.5.0
|
|
||||||
|
|
||||||
#. Verify whether the Zabbix plugin was uninstalled successfully:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# fuel plugins
|
|
||||||
|
|
||||||
The Zabbix plugin should not appear in the output list.
|
|
||||||
|
|
||||||
.. raw:: latex
|
|
||||||
|
|
||||||
\pagebreak
|
|
@ -1,32 +0,0 @@
|
|||||||
Troubleshooting
|
|
||||||
===============
|
|
||||||
|
|
||||||
Most Cinder errors are caused by incorrect volume configuration that
|
|
||||||
result in the volume creation failures. To resolve these failures, use the
|
|
||||||
Cinder logs.
|
|
||||||
|
|
||||||
**To review the Cinder logs**
|
|
||||||
|
|
||||||
If you have issues with Cinder, find and review the following Cinder logs on
|
|
||||||
controller nodes:
|
|
||||||
|
|
||||||
#. The ``cinder-api`` log located at ``/var/log/cinder/api.log``.
|
|
||||||
#. The ``cinder-volume`` log located at ``/var/log/cinder/volume.log``.
|
|
||||||
|
|
||||||
Check the ``cinder-api`` log to determine whether you have the endpoint or
|
|
||||||
connectivity issues. If, for example, the *create volume* request fails,
|
|
||||||
review the ``cinder-api`` log to check whether the request to
|
|
||||||
the Block Storage service succeeded. If the request is logged, and you see
|
|
||||||
no errors or tracebacks, check the ``cinder-volume`` log for errors or
|
|
||||||
tracebacks.
|
|
||||||
|
|
||||||
**To verify the status of Cinder services**
|
|
||||||
|
|
||||||
Cinder services are running as Pacemaker resources. To verify the status of
|
|
||||||
services, run the following command on one of controller nodes:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# pcs resource show
|
|
||||||
|
|
||||||
All Cinder services should be in the ``started`` mode.
|
|
@ -1,192 +0,0 @@
|
|||||||
.. _user:
|
|
||||||
|
|
||||||
Create a Cinder volume
|
|
||||||
======================
|
|
||||||
|
|
||||||
Once you deploy an OpenStack environment with the EMC VNX plugin, you can
|
|
||||||
start creating Cinder volumes. The following example shows how to create a
|
|
||||||
10 GB volume and attach it to a VM.
|
|
||||||
|
|
||||||
#. Login to a controller node.
|
|
||||||
#. Create a Cinder volume:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# cinder create <VOLUME_SIZE>
|
|
||||||
|
|
||||||
The output looks as follows:
|
|
||||||
|
|
||||||
.. image:: images/create.png
|
|
||||||
:width: 90%
|
|
||||||
|
|
||||||
#. Verify that the volume is created and is ready for use:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# cinder list
|
|
||||||
|
|
||||||
In the output, verify the ID and the ``available`` status of the volume
|
|
||||||
(see the screenshot above).
|
|
||||||
|
|
||||||
#. Verify the volume on EMC VNX:
|
|
||||||
|
|
||||||
#. Add the ``/opt/Navisphere/bin`` directory to the ``PATH`` environment
|
|
||||||
variable:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# export PATH=$PATH:/opt/Navisphere/bin
|
|
||||||
|
|
||||||
#. Save your EMC credentials to simplify syntax in succeeding the
|
|
||||||
:command:`naviseccli` commands:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# naviseccli -addusersecurity -password <password> -scope 0 \
|
|
||||||
-user <username>
|
|
||||||
|
|
||||||
#. List LUNs created on EMC:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# naviseccli -h <SP IP> lun -list
|
|
||||||
|
|
||||||
.. image:: images/lunid.png
|
|
||||||
:width: 90%
|
|
||||||
|
|
||||||
In the given example, there is one successfully created LUN with:
|
|
||||||
|
|
||||||
* ID: ``0``
|
|
||||||
* Name: ``volume-e1626d9e-82e8-4279-808e-5fcd18016720`` (naming schema is
|
|
||||||
``volume-<Cinder volume id>``)
|
|
||||||
* Current state: ``Ready``
|
|
||||||
|
|
||||||
The IP address of the EMC VNX SP: 192.168.200.30
|
|
||||||
|
|
||||||
.. raw:: latex
|
|
||||||
|
|
||||||
\pagebreak
|
|
||||||
|
|
||||||
5. Get the Glance image ID and the network ID:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# glance image-list
|
|
||||||
# nova net-list
|
|
||||||
|
|
||||||
.. image:: images/glance.png
|
|
||||||
:width: 90%
|
|
||||||
|
|
||||||
The VM ID in the given example is ``48e70690-2590-45c7-b01d-6d69322991c3``.
|
|
||||||
|
|
||||||
#. Create a new VM using the Glance image ID and the network ID:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# nova --flavor 2 --image <IMAGE_ID> -- nic net-id=<NIC_NET-ID> <VM_NAME>
|
|
||||||
|
|
||||||
.. raw:: latex
|
|
||||||
|
|
||||||
\pagebreak
|
|
||||||
|
|
||||||
7. Check the ``STATUS`` of the new VM and on which node it has been created:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# nova show <id>
|
|
||||||
|
|
||||||
In the example output, the VM is running on ``node-3`` and is active:
|
|
||||||
|
|
||||||
.. image:: images/novaShow.png
|
|
||||||
:width: 90%
|
|
||||||
|
|
||||||
#. Attach the Cinder volume to the VM and verify its state:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# nova volume-attach <VM id> <volume id>
|
|
||||||
# cinder list
|
|
||||||
|
|
||||||
The output looks as follows:
|
|
||||||
|
|
||||||
.. image:: images/volumeAttach.png
|
|
||||||
:width: 90%
|
|
||||||
|
|
||||||
.. raw:: latex
|
|
||||||
|
|
||||||
\pagebreak
|
|
||||||
|
|
||||||
9. List the storage groups configured on EMC VNX:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# naviseccli -h <SP IP> storagegroup -list
|
|
||||||
|
|
||||||
The output looks as follows:
|
|
||||||
|
|
||||||
.. image:: images/storagegroup.png
|
|
||||||
:width: 90%
|
|
||||||
|
|
||||||
In the example output, we have:
|
|
||||||
|
|
||||||
* One storage group: ``node-3`` with one LUN attached.
|
|
||||||
* Four iSCSI ``HBA/SP Pairs`` - one pair per the SP-Port.
|
|
||||||
* The LUN that has the local ID ``0`` (``ALU Number``) and that is
|
|
||||||
available as LUN ``133`` (``HLU Number``) for the ``node-3``.
|
|
||||||
|
|
||||||
.. raw:: latex
|
|
||||||
|
|
||||||
\pagebreak
|
|
||||||
|
|
||||||
10. You can also check whether the iSCSI sessions are active:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# naviseccli -h <SP IP> port -list -hba
|
|
||||||
|
|
||||||
The output looks as follows:
|
|
||||||
|
|
||||||
.. image:: images/hba.png
|
|
||||||
:width: 90%
|
|
||||||
|
|
||||||
Check the ``Logged In`` parameter of each port. In the example output,
|
|
||||||
all four sessions are active as they have ``Logged In: YES``.
|
|
||||||
|
|
||||||
.. raw:: latex
|
|
||||||
|
|
||||||
\pagebreak
|
|
||||||
|
|
||||||
11. When you log in to ``node-3``, you can verify that:
|
|
||||||
|
|
||||||
* The iSCSI sessions are active:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# iscsiadm -m session
|
|
||||||
|
|
||||||
* A multipath device has been created by the multipath daemon:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# multipath -ll
|
|
||||||
|
|
||||||
* The VM is using the multipath device:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
# lsof -n -p `pgrep -f <VM id>` | grep /dev/<DM device name>
|
|
||||||
|
|
||||||
.. image:: images/iscsiadmin.png
|
|
||||||
:width: 90%
|
|
||||||
|
|
||||||
In the example output, we have the following:
|
|
||||||
|
|
||||||
* There are four active sessions (the same as on the EMC).
|
|
||||||
* The multipath device ``dm-2`` has been created.
|
|
||||||
* The multipath device has four paths and all are running (one per iSCSI
|
|
||||||
session).
|
|
||||||
* QEMU is using the ``/dev/dm-2`` multipath device.
|
|
||||||
|
|
||||||
.. raw:: latex
|
|
||||||
|
|
||||||
\pagebreak
|
|
@ -1,14 +0,0 @@
|
|||||||
.. _verify:
|
|
||||||
|
|
||||||
Verify an environment deployed with EMC VNX plugin
|
|
||||||
--------------------------------------------------
|
|
||||||
|
|
||||||
After you deploy an environment with the EMC VNX plugin, complete the
|
|
||||||
following verification steps:
|
|
||||||
|
|
||||||
#. Log in to the Fuel web UI.
|
|
||||||
#. Click the :guilabel:`Health Check` tab.
|
|
||||||
#. Run necessary health tests. For details, see
|
|
||||||
`Post-deployment check <http://docs.openstack.org/developer/fuel-docs/userdocs/fuel-user-guide/verify-environment.html>`_.
|
|
||||||
#. Verify that EMC VNX plugin is properly configured by
|
|
||||||
:ref:`creating a Cinder volume <user>`.
|
|
@ -1,7 +0,0 @@
|
|||||||
.. _zabbix:
|
|
||||||
|
|
||||||
Compatible monitoring plugins
|
|
||||||
=============================
|
|
||||||
|
|
||||||
The following versions of Zabbix monitoring plugins are compatible with
|
|
||||||
the EMC VNX plugin:
|
|
@ -1,54 +0,0 @@
|
|||||||
attributes:
|
|
||||||
emc_driver:
|
|
||||||
type: "select"
|
|
||||||
weight: 65
|
|
||||||
value: "ISCSI"
|
|
||||||
label: "Cinder Volume Driver"
|
|
||||||
description: "Driver type"
|
|
||||||
values:
|
|
||||||
- data: "FC"
|
|
||||||
label: "Fiber Channel"
|
|
||||||
- data: "ISCSI"
|
|
||||||
label: "ISCSI"
|
|
||||||
emc_username:
|
|
||||||
value: "username"
|
|
||||||
label: "EMC VNX username"
|
|
||||||
description: "EMC VNX username."
|
|
||||||
weight: 75
|
|
||||||
type: "text"
|
|
||||||
regex:
|
|
||||||
source: '\S'
|
|
||||||
error: "Username field cannot be empty"
|
|
||||||
emc_password:
|
|
||||||
value: "password"
|
|
||||||
label: "EMC VNX password"
|
|
||||||
description: "EMC VNX password."
|
|
||||||
weight: 80
|
|
||||||
type: "password"
|
|
||||||
regex:
|
|
||||||
source: '\S'
|
|
||||||
error: "Password field cannot be empty"
|
|
||||||
emc_sp_a_ip:
|
|
||||||
value: ""
|
|
||||||
label: "EMC VNX SP A IP"
|
|
||||||
description: "EMC VNX Service Processor A IP address."
|
|
||||||
weight: 90
|
|
||||||
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: "Specify valid IPv4 address"
|
|
||||||
emc_sp_b_ip:
|
|
||||||
value: ""
|
|
||||||
label: "EMC VNX SP B IP"
|
|
||||||
description: "EMC VNX Service Processor B IP address."
|
|
||||||
weight: 90
|
|
||||||
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: "Specify valid IPv4 address"
|
|
||||||
emc_pool_name:
|
|
||||||
value: ""
|
|
||||||
label: "EMC VNX pool name"
|
|
||||||
description: "EMC VNX pool name (optional)"
|
|
||||||
weight: 95
|
|
||||||
type: "text"
|
|
@ -1,31 +0,0 @@
|
|||||||
# Plugin name
|
|
||||||
name: emc_vnx
|
|
||||||
title: EMC VNX driver for Cinder
|
|
||||||
# Plugin version
|
|
||||||
version: 4.0.0
|
|
||||||
# Description
|
|
||||||
description: Enables EMC VNX driver in Cinder
|
|
||||||
# Required fuel version
|
|
||||||
fuel_version: ['9.0']
|
|
||||||
# Groups
|
|
||||||
groups: ['storage::cinder']
|
|
||||||
# Licenses
|
|
||||||
licenses: ['Apache License, Version 2.0']
|
|
||||||
# Homepage
|
|
||||||
homepage: 'https://github.com/stackforge/fuel-plugin-external-emc'
|
|
||||||
# Authors
|
|
||||||
authors: ['Dmitry Klenov <dklenov@mirantis.com>', 'Piotr Misiak <pmisiak@mirantis.com>', 'Szymon Banka <sbanka@mirantis.com>', 'Dmitry Kalashnik <dkalashnik@mirantis.com>', 'Oleksandr Martsyniuk <omartsyniuk@mirantis.com']
|
|
||||||
# Change `false` to `true` if the plugin can be installed in the environment
|
|
||||||
# after the deployment.
|
|
||||||
is_hotpluggable: false
|
|
||||||
|
|
||||||
# The plugin is compatible with releases in the list
|
|
||||||
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,32 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -eux
|
|
||||||
|
|
||||||
ROOT="$(dirname `readlink -f $0`)"
|
|
||||||
RPM_REPO="${ROOT}"/repositories/centos/
|
|
||||||
DEB_REPO="${ROOT}"/repositories/ubuntu/
|
|
||||||
mkdir -p $RPM_REPO
|
|
||||||
mkdir -p $DEB_REPO
|
|
||||||
|
|
||||||
# Downloads needed RPM or DEB packages
|
|
||||||
function download {
|
|
||||||
case "$1" in
|
|
||||||
deb) REPO=$DEB_REPO;;
|
|
||||||
rpm) REPO=$RPM_REPO;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
|
|
||||||
while [ $# -gt 0 ]; do
|
|
||||||
FILE=$(basename "$1")
|
|
||||||
wget -qO - $1 > "$REPO/$FILE"
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
download deb http://archive.ubuntu.com/ubuntu/pool/main/m/multipath-tools/multipath-tools_0.4.9-3ubuntu5_amd64.deb \
|
|
||||||
http://fuel-repository.mirantis.com/fuel-plugins/emc/ubuntu/navicli-linux-64-x86-en-us_7.33.2.0.51-1_all.deb
|
|
||||||
|
|
||||||
download rpm http://vault.centos.org/6.7/os/x86_64/Packages/device-mapper-multipath-0.4.9-87.el6.x86_64.rpm \
|
|
||||||
http://vault.centos.org/6.7/os/x86_64/Packages/device-mapper-multipath-libs-0.4.9-87.el6.x86_64.rpm \
|
|
||||||
http://vault.centos.org/6.7/os/x86_64/Packages/kpartx-0.4.9-87.el6.x86_64.rpm \
|
|
||||||
http://fuel-repository.mirantis.com/fuel-plugins/emc/centos/NaviCLI-Linux-64-x86-en_US-7.33.3.0.72-1.x86_64.rpm
|
|
||||||
|
|
@ -1,147 +0,0 @@
|
|||||||
..
|
|
||||||
This work is licensed under the Apache License, Version 2.0.
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
==================================================
|
|
||||||
Fuel plugin for EMC VNX arrays as a Cinder backend
|
|
||||||
==================================================
|
|
||||||
|
|
||||||
EMC VNX plugin for Fuel extends Mirantis OpenStack functionality by adding
|
|
||||||
support for EMC VNX arrays in Cinder using iSCSI protocol.
|
|
||||||
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 EMC VNX arrays as block storage for
|
|
||||||
OpenStack environments. EMC VNX plugin aims to provide support for it.
|
|
||||||
|
|
||||||
Proposed change
|
|
||||||
===============
|
|
||||||
|
|
||||||
Implement a Fuel plugin that will install and configure the EMC VNX 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.
|
|
||||||
|
|
||||||
Alternatives
|
|
||||||
------------
|
|
||||||
|
|
||||||
It might have been implemented as part of Fuel core but we decided to make it
|
|
||||||
as a plugin for several reasons:
|
|
||||||
|
|
||||||
* This isn't something that all operators may want to deploy.
|
|
||||||
* Any new additional functionality makes the project's testing more difficult,
|
|
||||||
which is an additional risk for the Fuel release.
|
|
||||||
|
|
||||||
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 EMC VNX driver could be slow when it comes to EMC VNX array configuration.
|
|
||||||
All volume management commands (creating/deleting/attaching etc.) can take
|
|
||||||
longer than usual. For example, creation a volume from an image
|
|
||||||
(even very small like CirrOS) may take over 60 seconds.
|
|
||||||
|
|
||||||
Other deployer impact
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
The deployer has to preconfigure an EMC VNX array before it can be used with
|
|
||||||
the plugin.
|
|
||||||
|
|
||||||
Developer impact
|
|
||||||
----------------
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
Implementation
|
|
||||||
==============
|
|
||||||
|
|
||||||
Plugin delivers packages with multipath daemon and EMC NaviSecCli (command line
|
|
||||||
toolkit for EMC VNX arrays management) because they are not included in
|
|
||||||
Mirantis OpenStack.
|
|
||||||
Plugin has three tasks. Each task per role. They are run in the following order:
|
|
||||||
|
|
||||||
* The first task installs and configures cinder-volume on Primary Controller.
|
|
||||||
* The second task installs and configures cinder-volume on Controller nodes.
|
|
||||||
* THe third task configures Nova on Compute 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.
|
|
||||||
Plugin installs a dedicated resource manager file (OCF) for this.
|
|
||||||
All instances of cinder-volume have the same “host” parameter in cinder.conf
|
|
||||||
file. This is required to achieve ability to manage all volumes in the
|
|
||||||
environment by any cinder-volume instance.
|
|
||||||
Plugin also installs multipathd daemon and iscsid daemon on all Controller
|
|
||||||
and Compute nodes and puts customized configuration files for them.
|
|
||||||
Finally, plugin enables multipath in Cinder and Nova config files.
|
|
||||||
|
|
||||||
Assignee(s)
|
|
||||||
-----------
|
|
||||||
|
|
||||||
| Dmitry Klenov <dklenov@mirantis.com> (PM)
|
|
||||||
| Piotr Misiak <pmisiak@mirantis.com> (developer)
|
|
||||||
| Szymon Bańka <sbanka@mirantis.com> (developer)
|
|
||||||
| Dmitry Kalashnik <dkalashnik@mirantis.com> (QA engineer)
|
|
||||||
|
|
||||||
Work Items
|
|
||||||
----------
|
|
||||||
|
|
||||||
* Implement the Fuel plugin.
|
|
||||||
* Implement the Puppet manifests.
|
|
||||||
* Testing.
|
|
||||||
* Write the documentation.
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
============
|
|
||||||
|
|
||||||
* Fuel 6.1 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.
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
[]
|
|