From dfbe3ea4186b0594bc18b642b2b1defe5e49c890 Mon Sep 17 00:00:00 2001 From: Goutham Pacha Ravi Date: Mon, 16 May 2016 20:36:48 -0400 Subject: [PATCH] In-tree Install Guide The OpenStack install guide team has recommended that projects that are not part of the starter-kit:compute [1] (and a few other projects like Cinder and Horizon) maintain their install guide in-tree. [2] [1] http://governance.openstack.org/reference/tags/starter-kit_compute.html [2] http://git.openstack.org/cgit/openstack/docs-specs/tree/specs/newton/project-specific-installguides.rst Change-Id: I2b49fcfd99b3be40bb1ae7d7b8348abdb5b58b90 Co-Authored-By: Denis Cavalcante Implements: blueprint manila-in-tree-install-guide Partially-implements: blueprint projectspecificinstallguides --- .gitignore | 3 + .../controller-node-common-configuration.rst | 71 ++++ .../common/controller-node-prerequisites.rst | 208 ++++++++++++ .../common/dhss-false-mode-configuration.rst | 98 ++++++ .../source/common/dhss-false-mode-intro.rst | 7 + .../common/dhss-true-mode-configuration.rst | 84 +++++ .../source/common/dhss-true-mode-intro.rst | 15 + .../share-node-common-configuration.rst | 77 +++++ .../common/share-node-share-server-modes.rst | 36 +++ install-guide/source/conf.py | 306 ++++++++++++++++++ install-guide/source/figures/hwreqs.graffle | Bin 0 -> 4026 bytes install-guide/source/figures/hwreqs.png | Bin 0 -> 90834 bytes install-guide/source/figures/hwreqs.svg | 3 + .../get-started-with-shared-file-systems.rst | 39 +++ install-guide/source/index.rst | 46 +++ .../source/install-controller-debian.rst | 56 ++++ .../source/install-controller-node.rst | 22 ++ .../source/install-controller-obs.rst | 47 +++ .../source/install-controller-rdo.rst | 57 ++++ .../source/install-controller-ubuntu.rst | 64 ++++ install-guide/source/install-share-debian.rst | 91 ++++++ install-guide/source/install-share-node.rst | 21 ++ install-guide/source/install-share-obs.rst | 90 ++++++ install-guide/source/install-share-rdo.rst | 103 ++++++ install-guide/source/install-share-ubuntu.rst | 99 ++++++ install-guide/source/next-steps.rst | 14 + install-guide/source/post-install.rst | 196 +++++++++++ install-guide/source/verify.rst | 29 ++ tox.ini | 6 +- 29 files changed, 1887 insertions(+), 1 deletion(-) create mode 100644 install-guide/source/common/controller-node-common-configuration.rst create mode 100644 install-guide/source/common/controller-node-prerequisites.rst create mode 100644 install-guide/source/common/dhss-false-mode-configuration.rst create mode 100644 install-guide/source/common/dhss-false-mode-intro.rst create mode 100644 install-guide/source/common/dhss-true-mode-configuration.rst create mode 100644 install-guide/source/common/dhss-true-mode-intro.rst create mode 100644 install-guide/source/common/share-node-common-configuration.rst create mode 100644 install-guide/source/common/share-node-share-server-modes.rst create mode 100644 install-guide/source/conf.py create mode 100644 install-guide/source/figures/hwreqs.graffle create mode 100644 install-guide/source/figures/hwreqs.png create mode 100644 install-guide/source/figures/hwreqs.svg create mode 100644 install-guide/source/get-started-with-shared-file-systems.rst create mode 100644 install-guide/source/index.rst create mode 100644 install-guide/source/install-controller-debian.rst create mode 100644 install-guide/source/install-controller-node.rst create mode 100644 install-guide/source/install-controller-obs.rst create mode 100644 install-guide/source/install-controller-rdo.rst create mode 100644 install-guide/source/install-controller-ubuntu.rst create mode 100644 install-guide/source/install-share-debian.rst create mode 100644 install-guide/source/install-share-node.rst create mode 100644 install-guide/source/install-share-obs.rst create mode 100644 install-guide/source/install-share-rdo.rst create mode 100644 install-guide/source/install-share-ubuntu.rst create mode 100644 install-guide/source/next-steps.rst create mode 100644 install-guide/source/post-install.rst create mode 100644 install-guide/source/verify.rst diff --git a/.gitignore b/.gitignore index c5deeffcf3..7ccb8ba6cb 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,9 @@ api-ref/build # Files created by releasenotes build releasenotes/build +# Files created by install-guide builds +install-guide/build + # Development environment files .project .pydevproject diff --git a/install-guide/source/common/controller-node-common-configuration.rst b/install-guide/source/common/controller-node-common-configuration.rst new file mode 100644 index 0000000000..d4f257c6a7 --- /dev/null +++ b/install-guide/source/common/controller-node-common-configuration.rst @@ -0,0 +1,71 @@ +3. Complete the rest of the configuration in ``manila.conf``: + + * In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, configure + ``RabbitMQ`` message queue access: + + .. code-block:: ini + + [DEFAULT] + ... + rpc_backend = rabbit + + [oslo_messaging_rabbit] + ... + rabbit_host = controller + rabbit_userid = openstack + rabbit_password = RABBIT_PASS + + Replace ``RABBIT_PASS`` with the password you chose for the ``openstack`` + account in ``RabbitMQ``. + + * In the ``[DEFAULT]`` section, set the following config values: + + .. code-block:: ini + + [DEFAULT] + ... + default_share_type = default_share_type + share_name_template = share-%s + rootwrap_config = /etc/manila/rootwrap.conf + api_paste_config = /etc/manila/api-paste.ini + + * In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, configure + Identity service access: + + .. code-block:: ini + + [DEFAULT] + ... + auth_strategy = keystone + + [keystone_authtoken] + ... + memcached_servers = controller:11211 + auth_uri = http://controller:5000 + auth_url = http://controller:35357 + auth_type = password + project_domain_id = default + user_domain_id = default + project_name = service + username = manila + password = MANILA_PASS + + Replace ``MANILA_PASS`` with the password you chose for the ``manila`` + user in the Identity service. + + * In the ``[DEFAULT]`` section, configure the ``my_ip`` option to use the + management interface IP address of the controller node: + + .. code-block:: ini + + [DEFAULT] + ... + my_ip = 10.0.0.11 + + * In the ``[oslo_concurrency]`` section, configure the lock path: + + .. code-block:: ini + + [oslo_concurrency] + ... + lock_path = /var/lock/manila diff --git a/install-guide/source/common/controller-node-prerequisites.rst b/install-guide/source/common/controller-node-prerequisites.rst new file mode 100644 index 0000000000..f30838f138 --- /dev/null +++ b/install-guide/source/common/controller-node-prerequisites.rst @@ -0,0 +1,208 @@ +Prerequisites +------------- + +Before you install and configure the Shared File Systems service, you +must create a database, service credentials, and `API endpoints`. + +#. To create the database, complete these steps: + + * Use the database access client to connect to the database server as the + ``root`` user: + + .. code-block:: console + + $ mysql -u root -p + + * Create the `manila` database: + + .. code-block:: console + + CREATE DATABASE manila; + + * Grant proper access to the ``manila`` database: + + .. code-block:: console + + GRANT ALL PRIVILEGES ON manila.* TO 'manila'@'localhost' \ + IDENTIFIED BY 'MANILA_DBPASS'; + GRANT ALL PRIVILEGES ON manila.* TO 'manila'@'%' \ + IDENTIFIED BY 'MANILA_DBPASS'; + + Replace ``MANILA_DBPASS`` with a suitable password. + + * Exit the database access client. + +#. Source the ``admin`` credentials to gain access to admin CLI commands: + + .. code-block:: console + + $ . admin-openrc.sh + +#. To create the service credentials, complete these steps: + + * Create a ``manila`` user: + + .. code-block:: console + + $ openstack user create --domain default --password-prompt manila + User Password: + Repeat User Password: + +-----------+----------------------------------+ + | Field | Value | + +-----------+----------------------------------+ + | domain_id | e0353a670a9e496da891347c589539e9 | + | enabled | True | + | id | 83a3990fc2144100ba0e2e23886d8acc | + | name | manila | + +-----------+----------------------------------+ + + * Add the ``admin`` role to the ``manila`` user: + + .. code-block:: console + + $ openstack role add --project service --user manila admin + + .. note:: + + This command provides no output. + + * Create the ``manila`` and ``manilav2`` service entities: + + .. code-block:: console + + $ openstack service create --name manila \ + --description "OpenStack Shared File Systems" share + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | OpenStack Shared File Systems | + | enabled | True | + | id | 82378b5a16b340aa9cc790cdd46a03ba | + | name | manila | + | type | share | + +-------------+----------------------------------+ + + .. code-block:: console + + $ openstack service create --name manilav2 \ + --description "OpenStack Shared File Systems" sharev2 + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | OpenStack Shared File Systems | + | enabled | True | + | id | 30d92a97a81a4e5d8fd97a32bafd7b88 | + | name | manilav2 | + | type | sharev2 | + +-------------+----------------------------------+ + + .. note:: + + The Shared File Systems services require two service entities. + +#. Create the Shared File Systems service API endpoints: + + .. code-block:: console + + $ openstack endpoint create --region RegionOne \ + share public http://controller:8786/v1/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 0bd2bbf8d28b433aaea56a254c69f69d | + | interface | public | + | region | RegionOne | + | region_id | RegionOne | + | service_id | 82378b5a16b340aa9cc790cdd46a03ba | + | service_name | manila | + | service_type | share | + | url | http://controller:8786/v1/%(tenant_id)s | + +--------------+-----------------------------------------+ + + $ openstack endpoint create --region RegionOne \ + share internal http://controller:8786/v1/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | a2859b5732cc48b5b083dd36dafb6fd9 | + | interface | internal | + | region | RegionOne | + | region_id | RegionOne | + | service_id | 82378b5a16b340aa9cc790cdd46a03ba | + | service_name | manila | + | service_type | share | + | url | http://controller:8786/v1/%(tenant_id)s | + +--------------+-----------------------------------------+ + + $ openstack endpoint create --region RegionOne \ + share admin http://controller:8786/v1/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | f7f46df93a374cc49c0121bef41da03c | + | interface | admin | + | region | RegionOne | + | region_id | RegionOne | + | service_id | 82378b5a16b340aa9cc790cdd46a03ba | + | service_name | manila | + | service_type | share | + | url | http://controller:8786/v1/%(tenant_id)s | + +--------------+-----------------------------------------+ + + .. code-block:: console + + $ openstack endpoint create --region RegionOne \ + sharev2 public http://controller:8786/v2/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | d63cc0d358da4ea680178657291eddc1 | + | interface | public | + | region | RegionOne | + | region_id | RegionOne | + | service_id | 30d92a97a81a4e5d8fd97a32bafd7b88 | + | service_name | manilav2 | + | service_type | sharev2 | + | url | http://controller:8786/v2/%(tenant_id)s | + +--------------+-----------------------------------------+ + + $ openstack endpoint create --region RegionOne \ + sharev2 internal http://controller:8786/v2/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | afc86e5f50804008add349dba605da54 | + | interface | internal | + | region | RegionOne | + | region_id | RegionOne | + | service_id | 30d92a97a81a4e5d8fd97a32bafd7b88 | + | service_name | manilav2 | + | service_type | sharev2 | + | url | http://controller:8786/v2/%(tenant_id)s | + +--------------+-----------------------------------------+ + + $ openstack endpoint create --region RegionOne \ + sharev2 admin http://controller:8786/v2/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | e814a0cec40546e98cf0c25a82498483 | + | interface | admin | + | region | RegionOne | + | region_id | RegionOne | + | service_id | 30d92a97a81a4e5d8fd97a32bafd7b88 | + | service_name | manilav2 | + | service_type | sharev2 | + | url | http://controller:8786/v2/%(tenant_id)s | + +--------------+-----------------------------------------+ + + .. note:: + + The Shared File Systems services require endpoints for each service + entity. diff --git a/install-guide/source/common/dhss-false-mode-configuration.rst b/install-guide/source/common/dhss-false-mode-configuration.rst new file mode 100644 index 0000000000..b8d6e2cf6f --- /dev/null +++ b/install-guide/source/common/dhss-false-mode-configuration.rst @@ -0,0 +1,98 @@ +2. Create the LVM physical volume ``/dev/sdc``: + + .. code-block:: console + + # pvcreate /dev/sdc + Physical volume "/dev/sdc" successfully created + +#. Create the LVM volume group ``manila-volumes``: + + .. code-block:: console + + # vgcreate manila-volumes /dev/sdc + Volume group "manila-volumes" successfully created + + The Shared File Systems service creates logical volumes in this volume + group. + +#. Only instances can access Shared File Systems service volumes. However, + the underlying operating system manages the devices associated with + the volumes. By default, the LVM volume scanning tool scans the + ``/dev`` directory for block storage devices that + contain volumes. If projects use LVM on their volumes, the scanning + tool detects these volumes and attempts to cache them which can cause + a variety of problems with both the underlying operating system + and project volumes. You must reconfigure LVM to scan only the devices + that contain the ``cinder-volume`` and ``manila-volumes`` volume groups. + Edit the ``/etc/lvm/lvm.conf`` file and complete the following actions: + + * In the ``devices`` section, add a filter that accepts the + ``/dev/sdb`` and ``/dev/sdc`` devices and rejects all other devices: + + .. code-block:: ini + + devices { + ... + filter = [ "a/sdb/", "a/sdc", "r/.*/"] + + .. warning:: + + If your storage nodes use LVM on the operating system disk, you + must also add the associated device to the filter. For example, + if the ``/dev/sda`` device contains the operating system: + + .. code-block:: ini + + filter = [ "a/sda/", "a/sdb/", "a/sdc", "r/.*/"] + + Similarly, if your compute nodes use LVM on the operating + system disk, you must also modify the filter in the + ``/etc/lvm/lvm.conf`` file on those nodes to include only + the operating system disk. For example, if the ``/dev/sda`` + device contains the operating system: + + .. code-block:: ini + + filter = [ "a/sda/", "r/.*/"] + +Configure components +-------------------- + +#. Edit the ``/etc/manila/manila.conf`` file and complete the following + actions: + + * In the ``[DEFAULT]`` section, enable the LVM driver and the NFS/CIFS + protocols: + + .. code-block:: ini + + [DEFAULT] + ... + enabled_share_backends = lvm + enabled_share_protocols = NFS,CIFS + + .. note:: + + Back end names are arbitrary. As an example, this guide uses the name + of the driver. + + * In the ``[lvm]`` section, configure the LVM driver: + + .. code-block:: ini + + [lvm] + share_backend_name = LVM + share_driver = manila.share.drivers.lvm.LVMShareDriver + driver_handles_share_servers = False + lvm_share_volume_group = manila-volumes + lvm_share_export_ip = MANAGEMENT_INTERFACE_IP_ADDRESS + + Replace ``MANAGEMENT_INTERFACE_IP_ADDRESS`` with the IP address + of the management network interface on your storage node, + typically 10.0.0.41 for the first node in the the example architecture + shown below: + + .. figure:: figures/hwreqs.png + :alt: Hardware requirements + + **Hardware requirements**. diff --git a/install-guide/source/common/dhss-false-mode-intro.rst b/install-guide/source/common/dhss-false-mode-intro.rst new file mode 100644 index 0000000000..fa611163ec --- /dev/null +++ b/install-guide/source/common/dhss-false-mode-intro.rst @@ -0,0 +1,7 @@ +Shared File Systems Option 1: No driver support for share servers management +---------------------------------------------------------------------------- +For simplicity, this configuration references the same storage node +configuration for the Block Storage service. However, the LVM driver +requires a separate empty local block storage device to avoid conflict +with the Block Storage service. The instructions use ``/dev/sdc``, but +you can substitute a different value for your particular node. diff --git a/install-guide/source/common/dhss-true-mode-configuration.rst b/install-guide/source/common/dhss-true-mode-configuration.rst new file mode 100644 index 0000000000..e2318c53bf --- /dev/null +++ b/install-guide/source/common/dhss-true-mode-configuration.rst @@ -0,0 +1,84 @@ +Configure components +-------------------- + +#. Edit the ``/etc/manila/manila.conf`` file and complete the following + actions: + + * In the ``[DEFAULT]`` section, enable the generic driver and the NFS/CIFS + protocols: + + .. code-block:: ini + + [DEFAULT] + ... + enabled_share_backends = generic + enabled_share_protocols = NFS,CIFS + + .. note:: + + Back end names are arbitrary. As an example, this guide uses the name + of the driver. + + * In the ``[neutron]``, ``[nova]``, and ``[cinder]`` sections, enable + authentication for those services: + + .. code-block:: ini + + [neutron] + ... + url = http://controller:9696 + auth_uri = http://controller:5000 + auth_url = http://controller:35357 + memcached_servers = controller:11211 + auth_type = password + project_domain_name = default + user_domain_name = default + region_name = RegionOne + project_name = service + username = neutron + password = NEUTRON_PASS + + [nova] + ... + auth_uri = http://controller:5000 + auth_url = http://controller:35357 + memcached_servers = controller:11211 + auth_type = password + project_domain_name = default + user_domain_name = default + region_name = RegionOne + project_name = service + username = nova + password = NOVA_PASS + + [cinder] + ... + auth_uri = http://controller:5000 + auth_url = http://controller:35357 + memcached_servers = controller:11211 + auth_type = password + project_domain_name = default + user_domain_name = default + region_name = RegionOne + project_name = service + username = cinder + password = CINDER_PASS + + * In the ``[generic]`` section, configure the generic driver: + + .. code-block:: ini + + [generic] + share_backend_name = GENERIC + share_driver = manila.share.drivers.generic.GenericShareDriver + driver_handles_share_servers = True + service_instance_flavor_id = 100 + service_image_name = manila-service-image + service_instance_user = manila + service_instance_password = manila + interface_driver = manila.network.linux.interface.BridgeInterfaceDriver + + .. note:: + + You can also use SSH keys instead of password authentication for + service instance credentials. diff --git a/install-guide/source/common/dhss-true-mode-intro.rst b/install-guide/source/common/dhss-true-mode-intro.rst new file mode 100644 index 0000000000..fa775e5411 --- /dev/null +++ b/install-guide/source/common/dhss-true-mode-intro.rst @@ -0,0 +1,15 @@ +Shared File Systems Option 2: Driver support for share servers management +------------------------------------------------------------------------- + +For simplicity, this configuration references the same storage node +configuration for the Block Storage service. + +.. note:: + + This guide describes how to configure the Shared File Systems service to + use the ``generic`` driver with the driver handles share server mode + (DHSS) enabled. This mode requires Compute (nova), Networking (neutron) and + Block storage (cinder) services for managing share servers. The information + used for creating share servers is configured as share networks. Generic + driver with DHSS enabled also requires network to be attached to a public + router. \ No newline at end of file diff --git a/install-guide/source/common/share-node-common-configuration.rst b/install-guide/source/common/share-node-common-configuration.rst new file mode 100644 index 0000000000..1a6eeeedc6 --- /dev/null +++ b/install-guide/source/common/share-node-common-configuration.rst @@ -0,0 +1,77 @@ +4. Complete the rest of the configuration in ``manila.conf``. + + * In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, + configure ``RabbitMQ`` message queue access: + + .. code-block:: ini + + [DEFAULT] + ... + rpc_backend = rabbit + + [oslo_messaging_rabbit] + ... + rabbit_host = controller + rabbit_userid = openstack + rabbit_password = RABBIT_PASS + + Replace ``RABBIT_PASS`` with the password you chose for the + ``openstack`` account in ``RabbitMQ``. + + * In the ``[DEFAULT]`` section, set the following config values: + + .. code-block:: ini + + [DEFAULT] + ... + default_share_type = default_share_type + rootwrap_config = /etc/manila/rootwrap.conf + + * In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, configure + Identity service access: + + .. code-block:: ini + + [DEFAULT] + ... + auth_strategy = keystone + + [keystone_authtoken] + ... + memcached_servers = controller:11211 + auth_uri = http://controller:5000 + auth_url = http://controller:35357 + auth_type = password + project_domain_id = default + user_domain_id = default + project_name = service + username = manila + password = MANILA_PASS + + Replace ``MANILA_PASS`` with the password you chose for the ``manila`` + user in the Identity service. + + * In the ``[DEFAULT]`` section, configure the ``my_ip`` option: + + .. code-block:: ini + + [DEFAULT] + ... + my_ip = MANAGEMENT_INTERFACE_IP_ADDRESS + + Replace ``MANAGEMENT_INTERFACE_IP_ADDRESS`` with the IP address of the + management network interface on your share node, typically 10.0.0.41 for + the first node in the example architecture shown below: + + .. figure:: figures/hwreqs.png + :alt: Hardware requirements + + **Hardware requirements** + + * In the ``[oslo_concurrency]`` section, configure the lock path: + + .. code-block:: ini + + [oslo_concurrency] + ... + lock_path = /var/lib/manila/tmp diff --git a/install-guide/source/common/share-node-share-server-modes.rst b/install-guide/source/common/share-node-share-server-modes.rst new file mode 100644 index 0000000000..ed1a1d9beb --- /dev/null +++ b/install-guide/source/common/share-node-share-server-modes.rst @@ -0,0 +1,36 @@ +The share node can support two modes, with and without the handling of +share servers. The mode depends on driver support. + +Option 1 +-------- +Deploying the service without driver support for share management. +In this mode, the service does not do anything related to networking. The +operator must ensure network connectivity between instances and the NFS +server. This tutorial demonstrates setting up the LVM driver to support this +driver mode. It requires LVM and NFS packages as well as an additional disk +for the ``manila-share`` LVM volume group. This driver +mode may be referred to as ``driver_handles_share_servers = False`` mode, or +simply ``DHSS=False`` mode. + +Option 2 +-------- +Deploying the service with driver support for share management. In +this mode, the service runs with a back end driver that creates and manages +share servers. This tutorial demonstrates setting up the Generic driver. +This driver requires Compute (nova), Networking (neutron) and Block +storage (cinder) services for managing share servers. The information used for +creating share servers is configured with the help of share networks. This +option uses the generic driver with the handling of share servers capacity +and requires attaching the ``selfservice`` network to a router. This driver +mode may be referred to as ``driver_handles_share_servers = True`` mode, or +simply ``DHSS=True`` mode. + +.. warning:: + + When running the generic driver in ``DHSS=True`` driver mode, the share + service should be run on the same node as the networking service. + However, such a service may not be able to run the LVM driver that runs + in ``DHSS=False`` driver mode effectively, due to a bug in some + distributions of Linux. For more information, see LVM Driver section in the + `Configuration Reference Guide + `_. \ No newline at end of file diff --git a/install-guide/source/conf.py b/install-guide/source/conf.py new file mode 100644 index 0000000000..0a012b6df2 --- /dev/null +++ b/install-guide/source/conf.py @@ -0,0 +1,306 @@ +# 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. + +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import os + + +import openstackdocstheme + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +# TODO(ajaeger): enable PDF building, for example add 'rst2pdf.pdfbuilder' +# extensions = + +# Add any paths that contain templates here, relative to this directory. +# templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +# source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Installation Guide for Shared File Systems Service' +bug_tag = u'install-guide' +copyright = u'2016, OpenStack contributors' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.1' +# The full version, including alpha/beta/rc tags. +release = '0.1' + +# A few variables have to be set for the log-a-bug feature. +# giturl: The location of conf.py on Git. Must be set manually. +# gitsha: The SHA checksum of the bug description. Automatically +# extracted from git log. +# bug_tag: Tag for categorizing the bug. Must be set manually. +# These variables are passed to the logabug code via html_context. +giturl = u'http://git.openstack.org/cgit/openstack/manila/tree/install-guide/source' +git_cmd = "/usr/bin/git log | head -n1 | cut -f2 -d' '" +gitsha = os.popen(git_cmd).read().strip('\n') +# source tree +pwd = os.getcwd() +html_context = { + "pwd": pwd, + "gitsha": gitsha, + "bug_tag": bug_tag, + "giturl": giturl, + "bug_project": "manila", +} + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +# today = '' +# Else, today_fmt is used as the format for a strftime call. +# today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ["common/*.rst"] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +# default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +# add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +# add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +# show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +# modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +# keep_warnings = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'openstackdocs' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +html_theme_path = [openstackdocstheme.get_html_theme_path()] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +# html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +# html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +# html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +# html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +# html_static_path = [] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +# html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +# So that we can enable "log-a-bug" links from each output HTML page, this +# variable must be set to a format that includes year, month, day, hours and +# minutes. +html_last_updated_fmt = '%Y-%m-%d %H:%M' + + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +# html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +# html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +# html_additional_pages = {} + +# If false, no module index is generated. +# html_domain_indices = True + +# If false, no index is generated. +html_use_index = False + +# If true, the index is split into individual pages for each letter. +# html_split_index = False + +# If true, links to the reST sources are added to the pages. +html_show_sourcelink = False + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +# html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +# html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +# html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +# html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'install-guide' + +# If true, publish source files +html_copy_source = False + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # 'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + ('index', 'InstallGuide.tex', u'Install Guide', + u'OpenStack contributors', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +# latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +# latex_use_parts = False + +# If true, show page references after internal links. +# latex_show_pagerefs = False + +# If true, show URL addresses after external links. +# latex_show_urls = False + +# Documents to append as an appendix to all manuals. +# latex_appendices = [] + +# If false, no module index is generated. +# latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'installguide', u'Install Guide', + [u'OpenStack contributors'], 1) +] + +# If true, show URL addresses after external links. +# man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'InstallGuide', u'Install Guide', + u'OpenStack contributors', 'InstallGuide', + 'This guide shows OpenStack end users how to install ' + 'an OpenStack cloud.', 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +# texinfo_appendices = [] + +# If false, no module index is generated. +# texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +# texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +# texinfo_no_detailmenu = False + +# -- Options for Internationalization output ------------------------------ +locale_dirs = ['locale/'] + +# -- Options for PDF output -------------------------------------------------- + +pdf_documents = [ + ('index', u'InstallGuide', u'Install Guide', + u'OpenStack contributors') +] diff --git a/install-guide/source/figures/hwreqs.graffle b/install-guide/source/figures/hwreqs.graffle new file mode 100644 index 0000000000000000000000000000000000000000..522bb03cba53ee088f115455e14a8c9dded8a3c6 GIT binary patch literal 4026 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�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 literal 0 HcmV?d00001 diff --git a/install-guide/source/figures/hwreqs.svg b/install-guide/source/figures/hwreqs.svg new file mode 100644 index 0000000000..0b58db752f --- /dev/null +++ b/install-guide/source/figures/hwreqs.svg @@ -0,0 +1,3 @@ + + + Produced by OmniGraffle 6.5.2 2016-04-26 14:57:28 +0000Canvas 1Layer 1Controller NodeCompute Node 11-2CPUBlock Storage Node 1Object Storage Node 1Object Storage Node 2Hardware RequirementsCore componentOptional component8 GBRAM100 GBStorage2-4+CPU8+ GBRAM100+ GBStorage1-2CPU4 GBRAM2NIC2NIC1NIC1NIC4+ GBRAM1-2CPU1NIC100+ GBStorage100+ GBStorage/dev/sdb/dev/sdb/dev/sdc/dev/sdb/dev/sdc1-2CPU4+ GBRAM100+ GBStorage/dev/sdc diff --git a/install-guide/source/get-started-with-shared-file-systems.rst b/install-guide/source/get-started-with-shared-file-systems.rst new file mode 100644 index 0000000000..b5b8e49624 --- /dev/null +++ b/install-guide/source/get-started-with-shared-file-systems.rst @@ -0,0 +1,39 @@ +==================================== +Shared File Systems service overview +==================================== + +The OpenStack Shared File Systems service (manila) provides file storage to a +virtual machine. The Shared File Systems service provides an infrastructure +for managing and provisioning of file shares. The service also enables +management of share types as well as share snapshots if a driver supports +them. + +The Shared File Systems service consists of the following components: + +manila-api + A WSGI app that authenticates and routes requests throughout the Shared File + Systems service. It supports the OpenStack APIs. + +manila-data + A standalone service whose purpose is to receive requests, process data + operations such as copying, share migration or backup, and send back a + response after an operation has been completed. + +manila-scheduler + Schedules and routes requests to the appropriate share service. The + scheduler uses configurable filters and weighers to route requests. The + Filter Scheduler is the default and enables filters on things like Capacity, + Availability Zone, Share Types, and Capabilities as well as custom filters. + +manila-share + Manages back-end devices that provide shared file systems. A manila-share + process can run in one of two modes, with or without handling of share + servers. Share servers export file shares via share networks. When share + servers are not used, the networking requirements are handled outside of + Manila. + +Messaging queue + Routes information between the Shared File Systems processes. + +For more information, see `Configuration Reference Guide +`_. diff --git a/install-guide/source/index.rst b/install-guide/source/index.rst new file mode 100644 index 0000000000..8f8282070f --- /dev/null +++ b/install-guide/source/index.rst @@ -0,0 +1,46 @@ +========================================= +Shared File Systems Installation Tutorial +========================================= + +.. toctree:: + :maxdepth: 2 + + get-started-with-shared-file-systems.rst + install-controller-node.rst + install-share-node.rst + verify.rst + post-install.rst + next-steps.rst + + +The OpenStack Shared File Systems service (manila) provides coordinated +access to shared or distributed file systems. The method in which the share is +provisioned and consumed is determined by the Shared File Systems driver, or +drivers in the case of a multi-backend configuration. There are a variety of +drivers that support NFS, CIFS, HDFS, GlusterFS, CEPHFS and other protocols +as well. + +The Shared File Systems API and scheduler services typically run on the +controller nodes. Depending upon the drivers used, the share service can run +on controllers, compute nodes, or storage nodes. + +.. important:: + + For simplicity, this guide describes configuring the Shared File Systems + service to use the ``generic`` back end with the driver handles + share server mode (DHSS) enabled that uses the `Compute service` + (`nova`), `Networking service` (`neutron`) and `Block storage service` + (`cinder`). + + Networking service configuration requires the capability of networks being + attached to a public router in order to create share networks. + + Before you proceed, ensure that Compute, Networking and Block storage + services are properly working. For networking service, ensure that option + 2 is properly configured. + +For more information, see the `Configuration Reference +`_. + +This chapter assumes a working setup of OpenStack following the `OpenStack +Installation Tutorial `_ diff --git a/install-guide/source/install-controller-debian.rst b/install-guide/source/install-controller-debian.rst new file mode 100644 index 0000000000..3fb0a2cbaa --- /dev/null +++ b/install-guide/source/install-controller-debian.rst @@ -0,0 +1,56 @@ +.. _manila-controller-debian: + +Install and configure controller node on Debian +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section describes how to install and configure the Shared File Systems +service, code-named manila, on the controller node that runs a Debian +distribution. This service requires at least one additional share node that +manages file storage back ends. + +.. include:: common/controller-node-prerequisites.rst + +Install and configure components +-------------------------------- + +#. Install the packages: + + .. code-block:: console + + # apt-get install manila-api manila-scheduler python-manilaclient + +#. Edit the ``/etc/manila/manila.conf`` file and complete the following + actions: + + * In the ``[database]`` section, configure database access: + + .. code-block:: ini + + [database] + ... + connection = mysql+pymysql://manila:MANILA_DBPASS@controller/manila + + Replace ``MANILA_DBPASS`` with the password you chose for the Shared + File Systems database. + +.. include:: common/controller-node-common-configuration.rst + +#. Populate the Shared File Systems database: + + .. code-block:: console + + # su -s /bin/sh -c "manila-manage db sync" manila + + .. note:: + + Ignore any deprecation messages in this output. + +Finalize installation +--------------------- + +#. Restart the Shared File Systems services: + + .. code-block:: console + + # service manila-scheduler restart + # service manila-api restart diff --git a/install-guide/source/install-controller-node.rst b/install-guide/source/install-controller-node.rst new file mode 100644 index 0000000000..e68c20d355 --- /dev/null +++ b/install-guide/source/install-controller-node.rst @@ -0,0 +1,22 @@ +.. _manila-controller: + +Install and configure controller node +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section describes how to install and configure the Shared File Systems +service, code-named manila, on the controller node. This service requires at +least one additional share node that manages file storage back ends. + +This section assumes that you already have a working OpenStack +environment with at least the following components installed: +Compute, Image Service, Identity. + +Note that installation and configuration vary by distribution. + +.. toctree:: + :maxdepth: 1 + + install-controller-obs.rst + install-controller-rdo.rst + install-controller-ubuntu.rst + install-controller-debian.rst diff --git a/install-guide/source/install-controller-obs.rst b/install-guide/source/install-controller-obs.rst new file mode 100644 index 0000000000..d7750222d7 --- /dev/null +++ b/install-guide/source/install-controller-obs.rst @@ -0,0 +1,47 @@ +.. _manila-controller-obs: + +Install and configure controller node on openSUSE and SUSE Linux Enterprise +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section describes how to install and configure the Shared File Systems +service, code-named manila, on the controller node that runs openSUSE and SUSE +Linux Enterprise. This service requires at least one additional share node +that manages file storage back ends. + +.. include:: common/controller-node-prerequisites.rst + +Install and configure components +-------------------------------- + +#. Install the packages: + + .. code-block:: console + + # zypper install openstack-manila-api openstack-manila-scheduler python-manilaclient + +#. Edit the ``/etc/manila/manila.conf`` file and complete the + following actions: + + * In the ``[database]`` section, configure database access: + + .. code-block:: ini + + [database] + ... + connection = mysql+pymysql://manila:MANILA_DBPASS@controller/manila + + Replace ``MANILA_DBPASS`` with the password you chose for the Shared + File Systems database. + +.. include:: common/controller-node-common-configuration.rst + +Finalize installation +--------------------- + +#. Start the Shared File Systems services and configure them to start when + the system boots: + + .. code-block:: console + + # systemctl enable openstack-manila-api.service openstack-manila-scheduler.service + # systemctl start openstack-manila-api.service openstack-manila-scheduler.service diff --git a/install-guide/source/install-controller-rdo.rst b/install-guide/source/install-controller-rdo.rst new file mode 100644 index 0000000000..e783cad49a --- /dev/null +++ b/install-guide/source/install-controller-rdo.rst @@ -0,0 +1,57 @@ +.. _manila-controller-rdo: + +Install and configure controller node on Red Hat Enterprise Linux and CentOS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section describes how to install and configure the Shared File Systems +service, code-named manila, on the controller node that runs Red Hat +Enterprise Linux or CentOS. This service requires at least one additional +share node that manages file storage back ends. + +.. include:: common/controller-node-prerequisites.rst + +Install and configure components +-------------------------------- + +#. Install the packages: + + .. code-block:: console + + # yum install openstack-manila python-manilaclient + +#. Edit the ``/etc/manila/manila.conf`` file and complete the + following actions: + + * In the ``[database]`` section, configure database access: + + .. code-block:: ini + + [database] + ... + connection = mysql+pymysql://manila:MANILA_DBPASS@controller/manila + + Replace ``MANILA_DBPASS`` with the password you chose for the Shared + File Systems database. + +.. include:: common/controller-node-common-configuration.rst + +#. Populate the Shared File Systems database: + + .. code-block:: console + + # su -s /bin/sh -c "manila-manage db sync" manila + + .. note:: + + Ignore any deprecation messages in this output. + +Finalize installation +--------------------- + +#. Start the Shared File Systems services and configure them to start when + the system boots: + + .. code-block:: console + + # systemctl enable openstack-manila-api.service openstack-manila-scheduler.service + # systemctl start openstack-manila-api.service openstack-manila-scheduler.service diff --git a/install-guide/source/install-controller-ubuntu.rst b/install-guide/source/install-controller-ubuntu.rst new file mode 100644 index 0000000000..72f19505f2 --- /dev/null +++ b/install-guide/source/install-controller-ubuntu.rst @@ -0,0 +1,64 @@ +.. _manila-controller-ubuntu: + +Install and configure controller node on Ubuntu +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section describes how to install and configure the Shared File Systems +service, code-named manila, on the controller node that runs Ubuntu. This +service requires at least one additional share node that manages file +storage back ends. + +.. include:: common/controller-node-prerequisites.rst + +Install and configure components +-------------------------------- + +#. Install the packages: + + .. code-block:: console + + # apt-get install manila-api manila-scheduler python-manilaclient + +#. Edit the ``/etc/manila/manila.conf`` file and complete the + following actions: + + * In the ``[database]`` section, configure database access: + + .. code-block:: ini + + [database] + ... + connection = mysql+pymysql://manila:MANILA_DBPASS@controller/manila + + Replace ``MANILA_DBPASS`` with the password you chose for the Shared + File Systems database. + +.. include:: common/controller-node-common-configuration.rst + +#. Populate the Shared File Systems database: + + .. code-block:: console + + # su -s /bin/sh -c "manila-manage db sync" manila + + .. note:: + + Ignore any deprecation messages in this output. + +Finalize installation +--------------------- + +#. Restart the Shared File Systems services: + + .. code-block:: console + + # service manila-scheduler restart + # service manila-api restart + +#. By default, the Ubuntu packages create an SQLite database. Because this + configuration uses an SQL database server, you can remove the SQLite + database file: + + .. code-block:: console + + # rm -f /var/lib/manila/manila.sqlite diff --git a/install-guide/source/install-share-debian.rst b/install-guide/source/install-share-debian.rst new file mode 100644 index 0000000000..b9f979c031 --- /dev/null +++ b/install-guide/source/install-share-debian.rst @@ -0,0 +1,91 @@ +.. _share-node-install-debian: + +Install and configure a share node running Debian +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section describes how to install and configure a share node for the +Shared File Systems service. For simplicity, this configuration references one +storage node with the generic driver managing the share servers. The +generic backend manages share servers using compute, networking and block +services for provisioning shares. + +Note that installation and configuration vary by distribution. This section +describes the instructions for a share node running a Debian distribution. + +Install and configure components +-------------------------------- + +#. Install the packages: + + .. code-block:: console + + # apt-get install manila-share python-pymysql + +#. Edit the ``/etc/manila/manila.conf`` file and complete the following + actions: + + * In the ``[database]`` section, configure database access: + + .. code-block:: ini + + [database] + ... + connection = mysql+pymysql://manila:MANILA_DBPASS@controller/manila + + Replace ``MANILA_DBPASS`` with the password you chose for the Shared + File Systems database. + +.. include:: common/share-node-common-configuration.rst + +Two driver modes +---------------- + +.. include:: common/share-node-share-server-modes.rst + +Choose one of the following options to configure the share driver: + +.. include:: common/dhss-false-mode-intro.rst + +Prerequisites +------------- + +.. note:: + + Perform these steps on the storage node. + +#. Install the supporting utility packages: + + * Install LVM and NFS server packages: + + .. code-block:: console + + # apt-get install lvm2 nfs-kernel-server + +.. include:: common/dhss-false-mode-configuration.rst + +.. include:: common/dhss-true-mode-intro.rst + +Prerequisites +------------- + +Before you proceed, verify operation of the Compute, Networking, and Block +Storage services. This options requires implementation of Networking option 2 +and requires installation of some Networking service components on the storage +node. + +* Install the Networking service components: + + .. code-block:: console + + # apt-get install neutron-plugin-linuxbridge-agent + +.. include:: common/dhss-true-mode-configuration.rst + +Finalize installation +--------------------- +#. Prepare manila-share as start/stop service. Start the Shared File Systems + service including its dependencies: + + .. code-block:: console + + # service manila-share restart diff --git a/install-guide/source/install-share-node.rst b/install-guide/source/install-share-node.rst new file mode 100644 index 0000000000..0be037fdea --- /dev/null +++ b/install-guide/source/install-share-node.rst @@ -0,0 +1,21 @@ +.. _share-node-install: + +Install and configure a share node +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section describes how to install and configure a share node for the +Shared File Systems service. + +.. Note:: + The manila-share process can run in two modes, with and without handling of + share servers. In general it depends of the driver support. + +Note that installation and configuration vary by distribution. + +.. toctree:: + :maxdepth: 1 + + install-share-obs.rst + install-share-rdo.rst + install-share-ubuntu.rst + install-share-debian.rst diff --git a/install-guide/source/install-share-obs.rst b/install-guide/source/install-share-obs.rst new file mode 100644 index 0000000000..2b12dddc3e --- /dev/null +++ b/install-guide/source/install-share-obs.rst @@ -0,0 +1,90 @@ +.. _share-node-install-obs: + +Install and configure a share node running openSUSE and SUSE Linux Enterprise +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section describes how to install and configure a share node for the +Shared File Systems service. + +Note that installation and configuration vary by distribution. This section +describes the instructions for a share node running openSUSE and SUSE Linux +Enterprise. + +Install and configure components +-------------------------------- + +#. Install the packages: + + .. code-block:: console + + # zypper install openstack-manila-share python-PyMySQL + +#. Edit the ``/etc/manila/manila.conf`` file and complete the following + actions: + + * In the ``[database]`` section, configure database access: + + .. code-block:: ini + + [database] + ... + connection = mysql+pymysql://manila:MANILA_DBPASS@controller/manila + + Replace ``MANILA_DBPASS`` with the password you chose for + the Shared File Systems database. + +.. include:: common/share-node-common-configuration.rst + +Two driver modes +---------------- + +.. include:: common/share-node-share-server-modes.rst + +Choose one of the following options to configure the share driver: + +.. include:: common/dhss-false-mode-intro.rst + +Prerequisites +------------- + +.. note:: + Perform these steps on the storage node. + +#. Install the supporting utility packages: + + * Install LVM and NFS server packages: + + .. code-block:: console + + # zypper install lvm2 nfs-kernel-server + +.. include:: common/dhss-false-mode-configuration.rst + +.. include:: common/dhss-true-mode-intro.rst + +Prerequisites +------------- + +Before you proceed, verify operation of the Compute, Networking, and Block +Storage services. This options requires implementation of Networking option 2 +and requires installation of some Networking service components on the storage +node. + +* Install the Networking service components: + + .. code-block:: console + + # zypper install --no-recommends openstack-neutron-linuxbridge-agent + +.. include:: common/dhss-true-mode-configuration.rst + +Finalize installation +--------------------- +#. Prepare manila-share as start/stop service. Start the Shared File Systems + service including its dependencies and configure them to start when the + system boots: + + .. code-block:: console + + # systemctl enable openstack-manila-share.service tgtd.service + # systemctl start openstack-manila-share.service tgtd.service diff --git a/install-guide/source/install-share-rdo.rst b/install-guide/source/install-share-rdo.rst new file mode 100644 index 0000000000..70de997577 --- /dev/null +++ b/install-guide/source/install-share-rdo.rst @@ -0,0 +1,103 @@ +.. _share-node-install-rdo: + +Install and configure a share node running Red Hat Enterprise Linux and CentOS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section describes how to install and configure a share node for the +Shared File Systems service. For simplicity, this configuration references one +storage node with the generic driver managing the share servers. The +generic backend manages share servers using compute, networking and block +services for provisioning shares. + +Note that installation and configuration vary by distribution. This section +describes the instructions for a share node running Red Hat Enterprise Linux +or CentOS. + +Install and configure components +-------------------------------- + +#. Install the packages: + + .. code-block:: console + + # yum install openstack-manila-share python2-PyMySQL + +#. Edit the ``/etc/manila/manila.conf`` file and complete the following + actions: + + * In the ``[database]`` section, configure database access: + + .. code-block:: ini + + [database] + ... + connection = mysql://manila:MANILA_DBPASS@controller/manila + + + Replace ``MANILA_DBPASS`` with the password you chose for + the Shared File Systems database. + +.. include:: common/share-node-common-configuration.rst + +Two driver modes +---------------- + +.. include:: common/share-node-share-server-modes.rst + +Choose one of the following options to configure the share driver: + +.. include:: common/dhss-false-mode-intro.rst + +Prerequisites +------------- + +.. note:: + + Perform these steps on the storage node. + +#. Install the supporting utility packages: + + * Install LVM and NFS server packages: + + .. code-block:: console + + # yum install lvm2 nfs-utils nfs4-acl-tools portmap + + * Start the LVM metadata service and configure it to start when the + system boots: + + .. code-block:: console + + # systemctl enable lvm2-lvmetad.service + # systemctl start lvm2-lvmetad.service + +.. include:: common/dhss-false-mode-configuration.rst + +.. include:: common/dhss-true-mode-intro.rst + +Prerequisites +------------- + +Before you proceed, verify operation of the Compute, Networking, and Block +Storage services. This options requires implementation of Networking option 2 +and requires installation of some Networking service components on the storage +node. + +* Install the Networking service components: + + .. code-block:: console + + # yum install openstack-neutron openstack-neutron-linuxbridge ebtables + +.. include:: common/dhss-true-mode-configuration.rst + +Finalize installation +--------------------- +#. Prepare manila-share as start/stop service. Start the Shared File Systems + service including its dependencies and configure them to start when the + system boots: + + .. code-block:: console + + # systemctl enable openstack-manila-share.service target.service + # systemctl start openstack-manila-share.service target.service diff --git a/install-guide/source/install-share-ubuntu.rst b/install-guide/source/install-share-ubuntu.rst new file mode 100644 index 0000000000..3c8d1b42be --- /dev/null +++ b/install-guide/source/install-share-ubuntu.rst @@ -0,0 +1,99 @@ +.. _share-node-install-ubuntu: + +Install and configure a share node running Ubuntu +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section describes how to install and configure a share node for the +Shared File Systems service. For simplicity, this configuration references one +storage node with the generic driver managing the share servers. The +generic backend manages share servers using compute, networking and block +services for provisioning shares. + +Note that installation and configuration vary by distribution. This section +describes the instructions for a share node running Ubuntu. + +Install and configure components +-------------------------------- + +#. Install the packages: + + .. code-block:: console + + # apt-get install manila-share python-pymysql + +#. Edit the ``/etc/manila/manila.conf`` file and complete the following + actions: + + * In the ``[database]`` section, configure database access: + + .. code-block:: ini + + [database] + ... + connection = mysql+pymysql://manila:MANILA_DBPASS@controller/manila + + Replace ``MANILA_DBPASS`` with the password you chose for + the Shared File Systems database. + +.. include:: common/share-node-common-configuration.rst + +Two driver modes +---------------- + +.. include:: common/share-node-share-server-modes.rst + +Choose one of the following options to configure the share driver: + +.. include:: common/dhss-false-mode-intro.rst + +Prerequisites +------------- + +.. note:: + + Perform these steps on the storage node. + +#. Install the supporting utility packages: + + * Install LVM and NFS server packages: + + .. code-block:: console + + # apt-get install lvm2 nfs-kernel-server + +.. include:: common/dhss-false-mode-configuration.rst + +.. include:: common/dhss-true-mode-intro.rst + +Prerequisites +------------- + +Before you proceed, verify operation of the Compute, Networking, and Block +Storage services. This options requires implementation of Networking option 2 +and requires installation of some Networking service components on the storage +node. + +* Install the Networking service components: + + .. code-block:: console + + # apt-get install neutron-plugin-linuxbridge-agent + +.. include:: common/dhss-true-mode-configuration.rst + +Finalize installation +--------------------- +#. Prepare manila-share as start/stop service. Start the Shared File Systems + service including its dependencies: + + .. code-block:: console + + # service manila-share restart + +#. By default, the Ubuntu packages create an SQLite database. Because this + configuration uses an SQL database server, remove the SQLite database + file: + + .. code-block:: console + + # rm -f /var/lib/manila/manila.sqlite diff --git a/install-guide/source/next-steps.rst b/install-guide/source/next-steps.rst new file mode 100644 index 0000000000..21b282b2b8 --- /dev/null +++ b/install-guide/source/next-steps.rst @@ -0,0 +1,14 @@ +.. _next-steps: + +========== +Next steps +========== + +Your OpenStack environment now includes the Shared File Systems service. + +To add more services, see the `additional documentation on installing +OpenStack services `_ + +Continue to evaluate the Shared File Systems service by creating the service +image and running the service with the correct driver mode that you chose +while configuring the share node. diff --git a/install-guide/source/post-install.rst b/install-guide/source/post-install.rst new file mode 100644 index 0000000000..8a93f12690 --- /dev/null +++ b/install-guide/source/post-install.rst @@ -0,0 +1,196 @@ +.. _post-install: + +Creating shared file systems +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Before being able to create a share, manila with the generic driver and +the DHSS mode enabled requires the definition of at least an image, +a network and a share-network for being used to create a share server. +For that `back end` configuration, the share server is an instance where +NFS/CIFS shares are served. + +.. note:: + + This configuration automatically creates a cinder volume for every share. + The cinder volumes are attached to share servers according to the + definition of a share network. + +Determine the configuration of the share server +----------------------------------------------- + +#. Source the admin credentials to gain access to admin-only CLI commands: + + .. code-block:: console + + $ . admin-openrc.sh + +#. Create a default share type before running manila-share service: + + .. code-block:: console + + $ manila type-create default_share_type True + +--------------------------------------+--------------------+------------+------------+-------------------------------------+-------------------------+ + | ID | Name | Visibility | is_default | required_extra_specs | optional_extra_specs | + +--------------------------------------+--------------------+------------+------------+-------------------------------------+-------------------------+ + | 8a35da28-0f74-490d-afff-23664ecd4f01 | default_share_type | public | - | driver_handles_share_servers : True | snapshot_support : True | + +--------------------------------------+--------------------+------------+------------+-------------------------------------+-------------------------+ + +#. Create a manila share server image to the Image service: + + .. code-block:: console + + $ glance image-create \ + --copy-from http://tarballs.openstack.org/manila-image-elements/images/manila-service-image-master.qcow2 \ + --name "manila-service-image" \ + --disk-format qcow2 \ + --container-format bare \ + --visibility public --progress + [=============================>] 100% + +------------------+--------------------------------------+ + | Property | Value | + +------------------+--------------------------------------+ + | checksum | 48a08e746cf0986e2bc32040a9183445 | + | container_format | bare | + | created_at | 2016-01-26T19:52:24Z | + | disk_format | qcow2 | + | id | 1fc7f29e-8fe6-44ef-9c3c-15217e83997c | + | min_disk | 0 | + | min_ram | 0 | + | name | manila-service-image | + | owner | e2c965830ecc4162a002bf16ddc91ab7 | + | protected | False | + | size | 306577408 | + | status | active | + | tags | [] | + | updated_at | 2016-01-26T19:52:28Z | + | virtual_size | None | + | visibility | public | + +------------------+--------------------------------------+ + +#. List available networks in order to get id and subnets of the private + network: + + .. code-block:: console + + $ neutron net-list + +--------------------------------------+---------+----------------------------------------------------+ + | id | name | subnets | + +--------------------------------------+---------+----------------------------------------------------+ + | 0e62efcd-8cee-46c7-b163-d8df05c3c5ad | public | 5cc70da8-4ee7-4565-be53-b9c011fca011 10.3.31.0/24 | + | 7c6f9b37-76b4-463e-98d8-27e5686ed083 | private | 3482f524-8bff-4871-80d4-5774c2730728 172.16.1.0/24 | + +--------------------------------------+---------+----------------------------------------------------+ + +#. Source the ``demo`` credentials to perform + the following steps as a non-administrative project: + + .. code-block:: console + + $ . demo-openrc.sh + + .. code-block:: console + + $ manila share-network-create --name demo-share-network1 \ + --neutron-net-id PRIVATE_NETWORK_ID \ + --neutron-subnet-id PRIVATE_NETWORK_SUBNET_ID + +-------------------+--------------------------------------+ + | Property | Value | + +-------------------+--------------------------------------+ + | name | demo-share-network1 | + | segmentation_id | None | + | created_at | 2016-01-26T20:03:41.877838 | + | neutron_subnet_id | 3482f524-8bff-4871-80d4-5774c2730728 | + | updated_at | None | + | network_type | None | + | neutron_net_id | 7c6f9b37-76b4-463e-98d8-27e5686ed083 | + | ip_version | None | + | nova_net_id | None | + | cidr | None | + | project_id | e2c965830ecc4162a002bf16ddc91ab7 | + | id | 58b2f0e6-5509-4830-af9c-97f525a31b14 | + | description | None | + +-------------------+--------------------------------------+ + +Create a share +-------------- + +#. Create a NFS share using the share network: + + .. code-block:: console + + $ manila create NFS 1 --name demo-share1 --share-network demo-share-network1 + +-----------------------------+--------------------------------------+ + | Property | Value | + +-----------------------------+--------------------------------------+ + | status | None | + | share_type_name | None | + | description | None | + | availability_zone | None | + | share_network_id | None | + | export_locations | [] | + | host | None | + | snapshot_id | None | + | is_public | False | + | task_state | None | + | snapshot_support | True | + | id | 016ca18f-bdd5-48e1-88c0-782e4c1aa28c | + | size | 1 | + | name | demo-share1 | + | share_type | None | + | created_at | 2016-01-26T20:08:50.502877 | + | export_location | None | + | share_proto | NFS | + | consistency_group_id | None | + | source_cgsnapshot_member_id | None | + | project_id | 48e8c35b2ac6495d86d4be61658975e7 | + | metadata | {} | + +-----------------------------+--------------------------------------+ + +#. After some time, the share status should change from ``creating`` + to ``available``: + + .. code-block:: console + + $ manila list + +--------------------------------------+-------------+------+-------------+-----------+-----------+--------------------------------------+---------------------------------------------------------------+-----------------------------+-------------------+ + | ID | Name | Size | Share Proto | Status | Is Public | Share Type | Export location | Host | Availability Zone | + +--------------------------------------+-------------+------+-------------+-----------+-----------+--------------------------------------+---------------------------------------------------------------+-----------------------------+-------------------+ + | 5f8a0574-a95e-40ff-b898-09fd8d6a1fac | demo-share1 | 1 | NFS | available | False | 8a35da28-0f74-490d-afff-23664ecd4f01 | 10.254.0.6:/shares/share-0bfd69a1-27f0-4ef5-af17-7cd50bce6550 | storagenode@generic#GENERIC | nova | + +--------------------------------------+-------------+------+-------------+-----------+-----------+--------------------------------------+---------------------------------------------------------------+-----------------------------+-------------------+ + +#. Configure user access to the new share before attempting to mount it via + the network: + + .. important :: + + The image used for launching an instance and mounting a share must have + the NFS packages provided by the distro. Example: The cirros image + created at the image service section is not enough. + + .. important :: + + Use an instance that is connected to the private network used to create + the share-network. + + .. code-block:: console + + $ manila access-allow demo-share1 ip INSTANCE_PRIVATE_NETWORK_IP + +Mount the share from an instance +-------------------------------- + +#. Create a folder where the mount will be placed: + + .. code-block:: console + + $ mkdir ~/test_folder + +#. Mount the NFS share in the instance using the export location of the share: + + .. code-block:: console + + $ mount -v 10.254.0.6:/shares/share-0bfd69a1-27f0-4ef5-af17-7cd50bce6550 ~/test_folder + + +For more information about how to manage shares, see the +`OpenStack User Guide +`__. diff --git a/install-guide/source/verify.rst b/install-guide/source/verify.rst new file mode 100644 index 0000000000..2312a90395 --- /dev/null +++ b/install-guide/source/verify.rst @@ -0,0 +1,29 @@ +.. _verify: + +Verify operation +~~~~~~~~~~~~~~~~ + +Verify operation of the Shared File Systems service. + +.. note:: + + Perform these commands on the controller node. + +#. Source the ``admin`` credentials to gain access to + admin-only CLI commands: + + .. code-block:: console + + $ . admin-openrc.sh + +#. List service components to verify successful launch of each process: + + .. code-block:: console + + $ manila service-list + +------------------+----------------+------+---------+-------+----------------------------+-----------------+ + | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason | + +------------------+----------------+------+---------+-------+----------------------------+-----------------+ + | manila-scheduler | controller | nova | enabled | up | 2014-10-18T01:30:54.000000 | None | + | manila-share | share1@generic | nova | enabled | up | 2014-10-18T01:30:57.000000 | None | + +------------------+----------------+------+---------+-------+----------------------------+-----------------+ diff --git a/tox.ini b/tox.ini index a57ad4cec3..93967f2bdb 100644 --- a/tox.ini +++ b/tox.ini @@ -22,6 +22,10 @@ install_command = pip install -U --force-reinstall {opts} {packages} commands = sphinx-build -a -E -W -d releasenotes/build/doctrees \ -b html releasenotes/source releasenotes/build/html +[testenv:install-guide] +# builds to install-guide/build/html +commands = sphinx-build -a -E -W -d install-guide/build/doctrees -b html install-guide/source install-guide/build/html + [testenv:debug] commands = oslo_debug_helper {posargs} @@ -102,7 +106,7 @@ commands = alembic -c manila/db/migrations/alembic.ini revision -m ""{posargs} # Following checks are ignored on purpose: ignore = builtins = _ -exclude = .git,.tox,.testrepository,.venv,build,cover,dist,doc,*egg,api-ref/build +exclude = .git,.tox,.testrepository,.venv,build,cover,dist,doc,*egg,api-ref/build,*/source/conf.py [hacking] import_exceptions =