From f5238052483930b2de8e45ce3b739ff3db3974bc Mon Sep 17 00:00:00 2001 From: "Tullis, Michael L" Date: Mon, 2 Nov 2015 16:10:13 -0700 Subject: [PATCH 01/48] Fixed heading levels for consistency in these topics. These are already synced to the master branch: openstack_dashboard.rst openstack_environment-database.rst openstack_environment-messaging.rst openstack_identity-openrc.rst openstack_image.rst openstack_object_storage.rst --- source/openstack_dashboard.rst | 2 +- source/openstack_environment-database.rst | 4 ++-- source/openstack_environment-messaging.rst | 4 ++-- source/openstack_identity-openrc.rst | 2 +- source/openstack_image.rst | 8 ++++---- source/openstack_object_storage.rst | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/source/openstack_dashboard.rst b/source/openstack_dashboard.rst index 88e76b53..1195befb 100644 --- a/source/openstack_dashboard.rst +++ b/source/openstack_dashboard.rst @@ -7,7 +7,7 @@ services. This dashboard enables interaction with the OpenStack Compute cloud controller via OpenStack APIs. Installation and configuration -============================== +------------------------------ Please note that the dashboard relies on functional core services in `OpenStack MVP `__, diff --git a/source/openstack_environment-database.rst b/source/openstack_environment-database.rst index bc5a1e0d..7326e35a 100644 --- a/source/openstack_environment-database.rst +++ b/source/openstack_environment-database.rst @@ -1,5 +1,5 @@ Database -~~~~~~~~ +######## Most OpenStack services use an SQL database to store information. The database typically runs on the controller node. The procedures in this guide use MariaDB. @@ -36,7 +36,7 @@ Install and configure the database server character-set-server = utf8 Finalizing database installation -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-------------------------------- Complete the following steps to finalize database installation: diff --git a/source/openstack_environment-messaging.rst b/source/openstack_environment-messaging.rst index 415feede..fdd24359 100644 --- a/source/openstack_environment-messaging.rst +++ b/source/openstack_environment-messaging.rst @@ -1,5 +1,5 @@ Message queue -~~~~~~~~~~~~~ +############# OpenStack uses a `message queue` to coordinate operations and status information among services. The message queue service typically @@ -16,7 +16,7 @@ Install the message queue service # clr_bundle_add message-broker-rabbitmq Configuring the message broker service -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-------------------------------------- Complete the following steps to configure the message broker service: diff --git a/source/openstack_identity-openrc.rst b/source/openstack_identity-openrc.rst index 43cc539d..1982779c 100644 --- a/source/openstack_identity-openrc.rst +++ b/source/openstack_identity-openrc.rst @@ -1,5 +1,5 @@ Create OpenStack client environment scripts -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +########################################### The previous section used a combination of environment variables and command options to interact with the Identity service via the diff --git a/source/openstack_image.rst b/source/openstack_image.rst index d56f05d7..b508e235 100644 --- a/source/openstack_image.rst +++ b/source/openstack_image.rst @@ -24,15 +24,15 @@ systems to object-storage systems like OpenStack Object Storage. config-reference/content/ ch_configuring-openstack-image-service.html>`__. -Install and configure -~~~~~~~~~~~~~~~~~~~~~ +Install and configure the Image Service +--------------------------------------- This section describes how to install and configure the Image service, code-named glance, on the controller node. For simplicity, this configuration stores images on the local file system. Prerequisites -------------- +~~~~~~~~~~~~~ Before you install and configure the Image service, you must create a database, service credentials, and API endpoints. @@ -277,7 +277,7 @@ Finalize installation # systemctl start glance-api.service glance-registry.service Verify operation -~~~~~~~~~~~~~~~~ +---------------- Verify operation of the Image service using `CirrOS `__, a small diff --git a/source/openstack_object_storage.rst b/source/openstack_object_storage.rst index be6d7deb..3dd5d9e7 100644 --- a/source/openstack_object_storage.rst +++ b/source/openstack_object_storage.rst @@ -1,5 +1,5 @@ OpenStack* object storage -======================== +######################### Install and configure the controller node ----------------------------------------- From a551537306319422ab183c160a8cbbdc67f6a219 Mon Sep 17 00:00:00 2001 From: "Tullis, Michael L" Date: Mon, 2 Nov 2015 19:19:41 -0700 Subject: [PATCH 02/48] Updated nearly all RST files to: * Fix formatting issues. * Simplify coding for code blocks. * Fix typos. Also adding links from "openstack_installing_bundles" to next-step topics. --- source/gs_creating_bootable_usb.rst | 35 +-- source/openstack_block_storage.rst | 192 +++++-------- .../openstack_bundle_and_service_summary.rst | 2 +- source/openstack_compute.rst | 179 ++++-------- source/openstack_dashboard.rst | 14 +- source/openstack_environment-database.rst | 25 +- source/openstack_environment-messaging.rst | 26 +- source/openstack_identity-openrc.rst | 22 +- source/openstack_identity.rst | 264 +++++++----------- source/openstack_image.rst | 152 ++++------ source/openstack_installing_bundles.rst | 15 + source/openstack_networking.rst | 132 +++------ source/openstack_object_storage.rst | 97 ++++--- source/openstack_orchestration.rst | 151 ++++------ source/openstack_sys_req_and_pw_summary.rst | 8 +- source/openstack_telemetry.rst | 106 +++---- 16 files changed, 500 insertions(+), 920 deletions(-) diff --git a/source/gs_creating_bootable_usb.rst b/source/gs_creating_bootable_usb.rst index ba379d20..90f4bc74 100644 --- a/source/gs_creating_bootable_usb.rst +++ b/source/gs_creating_bootable_usb.rst @@ -1,9 +1,8 @@ -.. _bootable_usb: - Creating a bootable USB to install the OS ========================================= Here's how to create a USB drive that initiates the process for -:ref:`clr_as_host`. Alternatively, you can test the OS by :ref:`clr_in_virtual_env`. +`installing Clear Linux OS for Intel Architecture as host `_. +Alternatively, you can test the OS by `running in a virtualized environment `_. What you need @@ -13,6 +12,7 @@ What you need ``dd`` with caution. * A ClearLinux OS image; the most current version can be found here: `https://download.clearlinux.org/image `_ + .. tip:: For older versions, see our `downloads page `_. @@ -26,37 +26,29 @@ Download and checksum $ wget https://download.clearlinux.org/image/clear-[release_number]-installer.img.xz $ sha512sum clear-[release_number]-installer.img.xz` - - Confirm the mount point on the USB drive ---------------------------------------- -Using :command:`$ lsblk` is helpful to show the block-level devices; a USB drive +Using ``$ lsblk`` is helpful to show the block-level devices; a USB drive usually shows up under ``/sdb`` or ``/sdc`` (almost never ``/sda``), and should -indicate disk space approximately the size of the USB drive: +indicate disk space approximately the size of the USB drive:: -:: + $ lsblk /dev/sdb + NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT + ?? sdb 8:16 1 14.9G 0 + ?? sdb1 8:17 1 14.9G 0 part - $ lsblk /dev/sdb - NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT - ?? sdb 8:16 1 14.9G 0 - ?? sdb1 8:17 1 14.9G 0 part - -and make sure the drive isn't already mounted. The easiest way is with -:command:`# df`. +and make sure the drive isn't already mounted. The easiest way is with:: + # df Flash the image to the USB -------------------------- Flash the image with the following command, adding the ``-v`` option for verbose mode (recommended), as the image file may be large, and the process can take a while. This -may need to be done as root. - -:: +may need to be done as root:: $ xzcat -v clear-[release_number]-installer.img.xz | dd of=/dev/sdb bs=4M - - Wait for the final confirmation ------------------------------- This example shows ``clear-2190-installer.img.xz`` flashed to a 16GB USB drive @@ -66,6 +58,5 @@ mounted on ``/sdc``. :align: center :alt: confirmation - Success! Your USB stick is now ready to boot and initiate the process for -:ref:`clr_as_host`. \ No newline at end of file +`installing Clear Linux OS for Intel Architecture as host `_. \ No newline at end of file diff --git a/source/openstack_block_storage.rst b/source/openstack_block_storage.rst index 0efd01ea..d29dadea 100644 --- a/source/openstack_block_storage.rst +++ b/source/openstack_block_storage.rst @@ -1,4 +1,4 @@ -OpenStack block storage +OpenStack* Block Storage ############################################################ Clear Linux* OS for Intel® Architecture can be used with the @@ -27,22 +27,16 @@ database, complete these steps: **Create a database:** #. Use the database access client to connect to the database server as - the root user: - - .. code:: text + the root user:: $ mysql -u root -p -#. Create the cinder database. +#. Create the cinder database:: - .. code:: text - CREATE DATABASE cinder; #. Grant proper access to the cinder database. Replace ``CINDER_DBPASS`` - with a suitable password. - - .. code:: text + with a suitable password:: GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' \ IDENTIFIED BY 'CINDER_DBPASS'; @@ -54,18 +48,14 @@ database, complete these steps: **Create service credentials:** #. Now source the admin credentials to gain access to admin-only CLI - commands: - - .. code:: text + commands:: $ source admin-openrc.sh #. To create the service credentials, complete these steps: - #. Create a cinder user: + * Create a cinder user:: - .. code:: text - $ openstack user create --password-prompt cinder User Password: Repeat User Password: @@ -79,10 +69,8 @@ database, complete these steps: | username | cinder | +----------+----------------------------------+ - #. Add the admin role to the cinder user: + * Add the admin role to the cinder user:: - .. code:: text - $ openstack role add --project service --user cinder admin +-------+----------------------------------+ | Field | Value | @@ -91,11 +79,9 @@ database, complete these steps: | name | admin | +-------+----------------------------------+ - #. Now create the cinder service entities: + * Now create the cinder service entities:: - .. code:: text - - $ openstack service create --name cinder \ + $ openstack service create --name cinder \ --description "OpenStack Block Storage" volume | Field | Value | +-------------+----------------------------------+ @@ -119,9 +105,7 @@ database, complete these steps: **Create service endpoints:** -The last prerequisite is to create the Block Storage service API endpoints: - -.. code:: text +The last prerequisite is to create the Block Storage service API endpoints:: $ openstack endpoint create \ --publicurl http://controller:8776/v2/%\(tenant_id\)s \ @@ -166,46 +150,36 @@ Installing and configuring Block Storage controller components Once your prerequisites are finished, you can install and configure Block Storage controller components: -#. Install OpenStack Block Storage Controller bundle: +#. Install OpenStack Block Storage Controller bundle:: - .. code:: text - # clr_bundle_add openstack-block-storage-controller #. Custom configurations will be located at ``/etc/cinder``. - #. Create ``/etc/cinder`` directory. + * Create ``/etc/cinder`` directory:: - .. code:: text - mkdir /etc/cinder - #. Create empty cinder configuration file in - ``/etc/cinder/cinder.conf`` - - .. code:: text + * Create empty cinder configuration file in + ``/etc/cinder/cinder.conf``:: touch /etc/cinder/cinder.conf #. Edit the ``/etc/cinder/cinder.conf`` file and complete the following actions: - #. In the ``[database]`` section, configure database access. Replace - ``CINDER_DBPASS`` with the password you chose for the - database. - - .. code:: text + * In the ``[database]`` section, configure database access. Replace + ``CINDER_DBPASS`` with the password you chose for the + database:: [database] ... connection=mysql://cinder:CINDER_DBPASS@controller/cinder - #. In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` section, - configure RabbitMQ message queue access. Replace ``RABBIT_PASS`` - with the password you chose for the account in - RabbitMQ. - - .. code:: text + * In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` section, + configure RabbitMQ message queue access. Replace ``RABBIT_PASS`` + with the password you chose for the account in + RabbitMQ:: [DEFAULT] ... @@ -216,12 +190,10 @@ Block Storage controller components: rabbit_userid = openstack rabbit_password = RABBIT_PASS - #. In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, - configure Identity service access. Replace ``CINDER_PASS`` with the - password you chose for the cinder user in the Identity - service. - - .. code:: text + * In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, + configure Identity service access. Replace ``CINDER_PASS`` with the + password you chose for the cinder user in the Identity + service:: [DEFAULT] ... @@ -233,31 +205,23 @@ Block Storage controller components: admin_user = cinder admin_password = CINDER_PASS - #. In the ``[DEFAULT]`` section, configure the ``my_ip`` option to - use the management interface IP address of the controller node: + * In the ``[DEFAULT]`` section, configure the ``my_ip`` option to + use the management interface IP address of the controller node:: - .. code:: text + [DEFAULT] ... my_ip = 10.0.0.11 - [DEFAULT] ... my_ip = 10.0.0.11 - -#. Let ``systemd`` set the correct permissions for files in ``/etc/cinder``. +#. Let ``systemd`` set the correct permissions for files in ``/etc/cinder``:: - .. code:: text - # systemctl restart update-triggers.target -#. Populate the Block Storage database: +#. Populate the Block Storage database:: - .. code:: text - # su -s /bin/sh -c "cinder-manage db sync" cinder Finalizing installation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -To finalize installation, enable and start the Block Storage services: - -.. code:: text +To finalize installation, enable and start the Block Storage services:: # systemctl enable cinder-api cinder-scheduler # systemctl start cinder-api cinder-scheduler @@ -279,9 +243,7 @@ storage nodes. Install Block Storage volume components ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Install the packages: - -.. code:: text +Install the packages:: # clr_bundle_add openstack-block-storage @@ -294,24 +256,20 @@ storage node also needs an empty block storage device of suitable size for your environment. #. Create the LVM physical volume: ``/dev/sdb1`` If your system uses a - different device name, adjust these steps accordingly. - - .. code:: text + different device name, adjust these steps accordingly:: # pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created -#. Create the LVM volume group ``cinder-volumes``: +#. Create the LVM volume group ``cinder-volumes``:: - .. code:: text - # vgcreate cinder-volumes /dev/sdb1 Volume group "cinder-volumes" successfully created The Block Storage service creates logical volumes in this volume group. -#. Only instances can access Block Storage volumes. However, the + Only instances can access Block Storage 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 @@ -319,13 +277,13 @@ for your environment. 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`` volume group. Edit the ``/etc/lvm/lvm.conf`` file + ``cinder-volume`` volume group. + +#. Edit the ``/etc/lvm/lvm.conf`` file and complete the following action: - #. In the ``devices`` section, add a filter that accepts the - ``/dev/sdb`` device and rejects all other devices: - - .. code:: text + * In the ``devices`` section, add a filter that accepts the + ``/dev/sdb`` device and rejects all other devices:: devices { filter = [ "a/sdb/", "r/.*/"] @@ -336,22 +294,18 @@ for your environment. #. Edit the ``/etc/cinder/cinder.conf`` file and complete the following actions: - #. In the ``[database]`` section, configure database access. Replace - ``CINDER_DBPASS`` with the password you chose for the Block Storage - database. - - .. code:: text + * In the ``[database]`` section, configure database access. Replace + ``CINDER_DBPASS`` with the password you chose for the Block Storage + database:: [database] ... connection = mysql://cinder:CINDER_DBPASS@controller/cinder - #. In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, - configure *RabbitMQ* message queue access. Replace ``RABBIT_PASS`` - with the password you chose for the openstack account in - *RabbitMQ*. - - .. code:: text + * In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, + configure *RabbitMQ* message queue access. Replace ``RABBIT_PASS`` + with the password you chose for the openstack account in + *RabbitMQ*:: [DEFAULT] ... @@ -362,11 +316,9 @@ for your environment. rabbit_userid = openstack rabbit_password = RABBIT_PASS - #. In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, - configure Identity service access. Replace ``CINDER_PASS`` with the - password you chose for the cinder user in the Identity service. - - .. code:: text + * In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, + configure Identity service access. Replace ``CINDER_PASS`` with the + password you chose for the cinder user in the Identity service:: [DEFAULT] ... @@ -379,23 +331,19 @@ for your environment. admin_user = cinder admin_password = CINDER_PASS - #. In the ``[DEFAULT]`` section, configure the ``my_ip`` option. - 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 example - architecture. - - .. code:: text + * In the ``[DEFAULT]`` section, configure the ``my_ip`` option. + 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 example + architecture:: [DEFAULT] ... my_ip = MANAGEMENT_INTERFACE_IP_ADDRESS - #. In the ``[lvm]`` section, configure the LVM back end with the LVM - driver, ``cinder-volumes`` volume group, iSCSI protocol, and - appropriate iSCSI service. - - .. code:: text + * In the ``[lvm]`` section, configure the LVM back end with the LVM + driver, ``cinder-volumes`` volume group, iSCSI protocol, and + appropriate iSCSI service:: [lvm] ... @@ -404,35 +352,27 @@ for your environment. iscsi_protocol = iscsi iscsi_helper = tgtadm - #. In the ``[DEFAULT]`` section, enable the LVM back end: + * In the ``[DEFAULT]`` section, enable the LVM back end:: - .. code:: text - [DEFAULT] ... enabled_backends = lvm - #. In the ``[DEFAULT]`` section, configure the location of the Image - service: - - .. code:: text + * In the ``[DEFAULT]`` section, configure the location of the Image + service:: [DEFAULT] ... glance_host = controller -#. Let systemd set the correct permissions for files in /etc/cinder +#. Let systemd set the correct permissions for files in ``/etc/cinder``:: - .. code:: text - # systemctl restart update-triggers.target Finalizing installation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Restart the Block Storage volume service including its dependencies: - -.. code:: text +Restart the Block Storage volume service including its dependencies:: # systemctl enable iscsid tgtd cinder-volume # systemctl start iscsid tgtd cinder-volume @@ -440,10 +380,8 @@ Restart the Block Storage volume service including its dependencies: Configuring a compute node to use Block Storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Perform the following steps to enable a compute code to work with block -storage: - -.. code:: text +Perform the following steps to enable a compute node to work with block +storage:: # systemctl enable iscsid # systemctl start iscsi-gen-initiatorname diff --git a/source/openstack_bundle_and_service_summary.rst b/source/openstack_bundle_and_service_summary.rst index 9bac6bca..6ae67400 100644 --- a/source/openstack_bundle_and_service_summary.rst +++ b/source/openstack_bundle_and_service_summary.rst @@ -1,4 +1,4 @@ -OpenStack* Bundle and service summary +OpenStack* bundle and service summary ############################################################ OpenStack provides an Infrastructure-as-a-Service (IaaS) solution diff --git a/source/openstack_compute.rst b/source/openstack_compute.rst index bf83aa25..4e1273d2 100644 --- a/source/openstack_compute.rst +++ b/source/openstack_compute.rst @@ -1,13 +1,13 @@ -OpenStack Compute -################# +OpenStack* Compute +################## Use OpenStack Compute to host and manage cloud computing systems. OpenStack Compute interacts with OpenStack Identity for authentication, OpenStack Image Service for disk and server images, and OpenStack -dashboard for the user and administrative interface. Image access is +Dashboard for the user and administrative interface. Image access is limited by projects, and by users; quotas are limited per project (the number of instances, for example). OpenStack Compute can scale -horizontally on standard hardware, and download images to launch +horizontally on standard hardware and download images to launch instances. Install and configure controller node @@ -24,44 +24,34 @@ 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 + * Use the database access client to connect to the database server + as the root user:: $ mysql -u root -p - #. Create the ``nova`` database: - - .. code-block:: console + * Create the ``nova`` database:: CREATE DATABASE nova; - #. Grant proper access to the nova database. Replace ``NOVA_DBPASS`` - with a suitable password. - - .. code-block:: console + * Grant proper access to the nova database. Replace ``NOVA_DBPASS`` + with a suitable password:: GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \ IDENTIFIED BY 'NOVA_DBPASS'; GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \ IDENTIFIED BY 'NOVA_DBPASS'; - #. Exit the database access client. + * Exit the database access client. #. Source the admin credentials to gain access to admin-only CLI - commands: - - .. code-block:: console + commands:: $ source admin-openrc.sh #. To create the service credentials, complete these steps: * Create the ``nova`` user. Replace ``NOVA_PASS`` with a suitable - password. - - .. code-block:: console + password:: $ openstack user create --domain default --password NOVA_PASS nova +-----------+----------------------------------+ @@ -73,15 +63,11 @@ create a database, service credentials, and API endpoints. | name | nova | +-----------+----------------------------------+ - * Add the ``admin`` role to the ``nova`` user: - - .. code-block:: console + * Add the ``admin`` role to the ``nova`` user:: $ openstack role add --project service --user nova admin - #. Create the ``nova`` service entity: - - .. code-block:: console + * Create the ``nova`` service entity:: $ openstack service create --name nova \ --description "OpenStack Compute" compute @@ -95,9 +81,7 @@ create a database, service credentials, and API endpoints. | type | compute | +-------------+----------------------------------+ -#. Create the Compute service API endpoints: - - .. code-block:: console +#. Create the Compute service API endpoints:: $ openstack endpoint create --region RegionOne \ compute public http://controller:8774/v2/%\(tenant_id\)s @@ -152,23 +136,17 @@ Installing and configuring the Compute controller components To install and configure the Compute controller components: -#. Install OpenStack Compute Controller bundle: - - .. code-block:: console +#. Install OpenStack Compute Controller bundle:: # clr_bundle_add openstack-compute-controller #. Custom configurations will be located at ``/etc/nova``. - * Create ``/etc/nova directory``. - - .. code-block:: console + * Create ``/etc/nova directory``:: # mkdir /etc/nova - * Create empty nova configuration file ``/etc/nova/nova.conf``. - - .. code-block:: console + * Create empty nova configuration file ``/etc/nova/nova.conf``:: # touch /etc/nova/nova.conf @@ -176,27 +154,20 @@ To install and configure the Compute controller components: actions: * In the ``[database]`` section, configure database access. Replace - ``NOVA_DBPASS`` with the password you chose for the Compute - database. - - .. code-block:: ini + ``NOVA_DBPASS`` with the password you chose for the Compute database:: [database] ... connection=mysql://nova:NOVA_DBPASS@controller/nova * In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, - configure ``RabbitMQ`` message queue access. Replace ``RABBIT_PASS`` - with the password you chose for the guest account in RabbitMQ. - - .. code-block:: ini + configure ``RabbitMQ`` message queue access. Replace ``RABBIT_PASS`` + with the password you chose for the guest account in RabbitMQ:: [DEFAULT] ... rpc_backend = rabbit - .. code-block:: console - [oslo_messaging_rabbit] ... rabbit_host = controller @@ -204,10 +175,8 @@ To install and configure the Compute controller components: rabbit_password = RABBIT_PASS * In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, - configure Identity service access. Replace ``NOVA_PASS`` with the - password you chose for the nova user in the Identity service. - - .. code-block:: ini + configure Identity service access. Replace ``NOVA_PASS`` with the + password you chose for the nova user in the Identity service:: [DEFAULT] ... @@ -226,17 +195,13 @@ To install and configure the Compute controller components: * In the ``[DEFAULT]`` section, configure the ``my_ip`` option to - use the management interface IP address of the controller node: - - .. code-block:: ini + use the management interface IP address of the controller node:: [DEFAULT] ... my_ip = 10.0.0.11 - * In the ``[DEFAULT]`` section, enable support for the Networking service: - - .. code-block:: ini + * In the ``[DEFAULT]`` section, enable support for the Networking service:: [DEFAULT] ... @@ -246,9 +211,7 @@ To install and configure the Compute controller components: firewall_driver = nova.virt.firewall.NoopFirewallDriver * In the ``[vnc]`` section, configure the VNC proxy to use the - management interface IP address of the controller node: - - .. code-block:: ini + management interface IP address of the controller node:: [vnc] ... @@ -256,23 +219,17 @@ To install and configure the Compute controller components: vncserver_proxyclient_address = 10.0.0.11 * In the ``[glance]`` section, configure the location of the - Image Service: - - .. code-block:: ini + Image Service:: [glance] ... host = controller -#. Let systemd set the correct permissions for files in ``/etc/nova``. - - .. code-block:: console +#. Let systemd set the correct permissions for files in ``/etc/nova``:: # systemctl restart update-triggers.target -#. Populate the Compute database: - - .. code-block:: console +#. Populate the Compute database:: su -s /bin/sh -c "nova-manage db sync" nova @@ -282,9 +239,7 @@ Finalizing Compute installation Complete the following steps to finalize Compute installation: #. Start the Compute Service services and configure them to start - when the system boots: - - .. code-block:: console + when the system boots:: # systemctl enable uwsgi@nova-api.socket \ nova-cert.service nova-consoleauth.service \ @@ -306,23 +261,17 @@ virtual machines. Install and configure components -------------------------------- -#. Install OpenStack Compute bundle: - - .. code-block:: console +#. Install OpenStack Compute bundle:: # clr_bundle_add openstack-compute #. Custom configurations will be located at ``/etc/nova``. - * Create ``/etc/nova`` directory. - - .. code-block:: console + * Create ``/etc/nova`` directory:: # mkdir /etc/nova - * Create empty nova configuration file ``/etc/nova/nova.conf``. - - .. code-block:: console + * Create empty nova configuration file ``/etc/nova/nova.conf``:: # touch /etc/nova/nova.conf @@ -331,16 +280,12 @@ Install and configure components * In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, configure RabbitMQ message broker access. Replace ``RABBIT_PASS`` - with the password you chose for the ``openstack`` account in ``RabbitMQ``. - - .. code-block:: ini + with the password you chose for the ``openstack`` account in ``RabbitMQ``:: [DEFAULT] ... rpc_backend = rabbit - .. code-block:: ini - [oslo_messaging_rabbit] ... rabbit_host = controller @@ -349,9 +294,7 @@ Install and configure components * In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, configure Identity service access. Replace ``NOVA_PASS`` with the - password you chose for the nova user in the Identity service. - - .. code-block:: console + password you chose for the nova user in the Identity service:: [DEFAULT] ... @@ -371,17 +314,13 @@ Install and configure components * In the ``[DEFAULT]`` section, configure the ``my_ip`` option. Replace ``MANAGEMENT_INTERFACE_IP_ADDRESS`` with the IP address of the management network interface on your compute node, typically - ``10.0.0.31`` for the first node in the example architecture. - - .. code-block:: ini + ``10.0.0.31`` for the first node in the example architecture:: [DEFAULT] ... my_ip = MANAGEMENT_INTERFACE_IP_ADDRESS - * In the ``[DEFAULT]`` section, enable support for the Networking service: - - .. code-block:: ini + * In the ``[DEFAULT]`` section, enable support for the Networking service:: [DEFAULT] ... @@ -390,8 +329,7 @@ Install and configure components linuxnet_interface_driver = nova.network.linux_net.NeutronLinuxBridgeInterfaceDriver firewall_driver = nova.virt.firewall.NoopFirewallDriver - * In the ``[vnc]`` section, enable and configure remote console access: - .. code-block:: ini + * In the ``[vnc]`` section, enable and configure remote console access:: [vnc] ... @@ -407,9 +345,7 @@ Install and configure components this compute node. * In the ``[glance]`` section, configure the location of the - Image Service: - - .. code-block:: ini + Image Service:: [glance] ... @@ -419,9 +355,7 @@ Finalize compute node installation ---------------------------------- #. Determine whether your compute node supports hardware acceleration - for virtual machines: - - .. code-block:: console + for virtual machines:: $ egrep -c '(vmx|svm)' /proc/cpuinfo @@ -434,18 +368,14 @@ Finalize compute node installation to use QEMU instead of KVM. * Edit the ``[libvirt]`` section in the ``/etc/nova/nova.conf`` file - as follows: - - .. code-block:: ini + as follows:: [libvirt] ... virt_type = qemu #. Start the Compute service including its dependencies and configure - them to start automatically when the system boots: - - .. code-block:: console + them to start automatically when the system boots:: # systemctl enable libvirtd.service \ nova-compute.service @@ -456,21 +386,15 @@ Verify operation ~~~~~~~~~~~~~~~~ Verify operation of the Compute service. -.. note:: - - Perform these commands on the controller node. +*Note:* Perform these commands on the controller node. #. Source the ``admin`` credentials to gain access to - admin-only CLI commands: - - .. code-block:: console + admin-only CLI commands:: $ source admin-openrc.sh #. List service components to verify successful launch and - registration of each process: - - .. code-block:: console + registration of each process:: $ nova service-list +----+------------------+------------+----------+---------+-------+--------------+-----------------+ @@ -482,10 +406,9 @@ Verify operation of the Compute service. | 4 | nova-cert | controller | internal | enabled | up | 2014-09-16.. | - | | 5 | nova-compute | compute1 | nova | enabled | up | 2014-09-16.. | - | +----+------------------+------------+----------+---------+-------+--------------+-----------------+ -#. List API endpoints in the Identity service to verify connectivity - with the Identity service: - .. code-block:: console +#. List API endpoints in the Identity service to verify connectivity + with the Identity service:: $ nova endpoints +-----------+------------------------------------------------------------+ @@ -572,14 +495,10 @@ Verify operation of the Compute service. | url | http://controller:35357/v2.0 | +-----------+----------------------------------+ - .. note:: - - Ignore any warnings in this output. + *Note:* Ignore any warnings in this output. #. List images in the Image service catalog to verify connectivity - with the Image service: - - .. code-block:: console + with the Image service:: $ nova image-list +--------------------------------------+--------+--------+--------+ diff --git a/source/openstack_dashboard.rst b/source/openstack_dashboard.rst index 1195befb..dcdfcba9 100644 --- a/source/openstack_dashboard.rst +++ b/source/openstack_dashboard.rst @@ -1,7 +1,7 @@ -OpenStack* dashboard +OpenStack* Dashboard ############################################################ -The OpenStack dashboard, also known as Horizon, is a web-based interface +The OpenStack Dashboard, also known as Horizon, is a web-based interface for cloud administrators to manage various OpenStack resources and services. This dashboard enables interaction with the OpenStack Compute cloud controller via OpenStack APIs. @@ -17,17 +17,13 @@ including identity, image service, compute, and either networking Environments with stand-alone services, such as Object Storage, cannot use the dashboard. -To get started with OpenStack dashboard services: +To get started with OpenStack Dashboard services: -#. Install the OpenStack dashboard bundle: +#. Install the OpenStack Dashboard bundle:: - .. code:: text - # clr_bundle_add openstack-dashboard -#. Enable and start the memcached service and the httpd server: +#. Enable and start the memcached service and the httpd server:: - .. code:: text - # systemctl enable httpd memcached # systemctl restart httpd memcached diff --git a/source/openstack_environment-database.rst b/source/openstack_environment-database.rst index 7326e35a..84b9e017 100644 --- a/source/openstack_environment-database.rst +++ b/source/openstack_environment-database.rst @@ -1,21 +1,18 @@ Database ######## -Most OpenStack services use an SQL database to store information. The + +Most OpenStack* services use an SQL database to store information. The database typically runs on the controller node. The procedures in this guide use MariaDB. Install and configure the database server ----------------------------------------- -#. Install MariaDB bundle: - - .. code-block:: console +#. Install MariaDB bundle:: # clr_bundle_add database-mariadb -#. Create the ``/etc/mariadb/`` folder and the ``/etc/mariadb/openstack.cnf`` file. - - .. code-block:: console +#. Create the ``/etc/mariadb/`` folder and the ``/etc/mariadb/openstack.cnf`` file:: # mkdir /etc/mariadb # touch /etc/mariadb/openstack.cnf @@ -23,9 +20,7 @@ Install and configure the database server #. Add the ``[mysqld]`` section, set the bind-address key to the management IP address of the controller node to enable access by other nodes via the management network and enable useful options for - UTF-8 character set: - - .. code:: console + UTF-8 character set:: [mysqld] bind-address = 10.0.0.11 @@ -41,16 +36,12 @@ Finalizing database installation Complete the following steps to finalize database installation: #. Start the database service and configure it to start when the system - boots: - - .. code:: console + boots:: # systemctl enable mariadb.service # systemctl start mariadb.service -2. Secure the database service including choosing a suitable password - for the root account: - - .. code:: console +#. Secure the database service including choosing a suitable password + for the root account:: # mysql_secure_installation diff --git a/source/openstack_environment-messaging.rst b/source/openstack_environment-messaging.rst index fdd24359..9f78c556 100644 --- a/source/openstack_environment-messaging.rst +++ b/source/openstack_environment-messaging.rst @@ -1,7 +1,7 @@ Message queue ############# -OpenStack uses a `message queue` to coordinate operations and +OpenStack* uses a `message queue` to coordinate operations and status information among services. The message queue service typically runs on the controller node. OpenStack supports several message queue services. This guide implements the RabbitMQ message queue service. @@ -9,11 +9,9 @@ services. This guide implements the RabbitMQ message queue service. Install the message queue service --------------------------------- -#. Install the message queue bundle: +#. Install the message queue bundle:: - .. code-block:: console - - # clr_bundle_add message-broker-rabbitmq + # clr_bundle_add message-broker-rabbitmq Configuring the message broker service -------------------------------------- @@ -21,33 +19,25 @@ Configuring the message broker service Complete the following steps to configure the message broker service: #. Message broker service needs to be able to resolve to itself. Add the - following line to ``/etc/hosts`` - - .. code:: console + following line to ``/etc/hosts``:: 127.0.0.1 controller #. Start the message broker service and configure it to start when the - system boots: - - .. code:: console + system boots:: # systemctl enable rabbitmq-server.service # systemctl start rabbitmq-server.service -#. Add the OpenStack user: - - .. code:: console +#. Add the OpenStack user:: # rabbitmqctl add_user openstack RABBIT_PASS Creating user openstack ... ...done. - Replace ``RABBIT_PASS`` with a suitable password. + Replace ``RABBIT_PASS`` with a suitable password. -#. Permit configuration, write, and read access for the OpenStack user: - - .. code:: console +#. Permit configuration, write, and read access for the OpenStack user:: # rabbitmqctl set_permissions openstack ".*" ".*" ".*" Setting permissions for user "openstack" in vhost "/" ... diff --git a/source/openstack_identity-openrc.rst b/source/openstack_identity-openrc.rst index 1982779c..cea3d01e 100644 --- a/source/openstack_identity-openrc.rst +++ b/source/openstack_identity-openrc.rst @@ -1,12 +1,12 @@ -Create OpenStack client environment scripts -########################################### +Create OpenStack* client environment scripts +############################################ The previous section used a combination of environment variables and command options to interact with the Identity service via the ``openstack`` client. To increase efficiency of client operations, OpenStack supports simple client environment scripts also known as OpenRC files. These scripts typically contain common options for -all clients, but also support unique options. For more information, see the +all clients but also support unique options. For more information, see the `OpenStack User Guide `__. @@ -17,9 +17,7 @@ Create client environment scripts for the ``admin`` and ``demo`` projects and users. Future portions of this guide reference these scripts to load appropriate credentials for client operations. -#. Edit the ``admin-openrc.sh`` file and add the following content: - - .. code-block:: bash +#. Edit the ``admin-openrc.sh`` file and add the following content:: export OS_PROJECT_DOMAIN_ID=default export OS_USER_DOMAIN_ID=default @@ -33,9 +31,7 @@ scripts to load appropriate credentials for client operations. Replace ``ADMIN_PASS`` with the password you chose for the ``admin`` user in the Identity service. -#. Edit the ``demo-openrc.sh`` file and add the following content: - - .. code-block:: bash +#. Edit the ``demo-openrc.sh`` file and add the following content:: export OS_PROJECT_DOMAIN_ID=default export OS_USER_DOMAIN_ID=default @@ -58,15 +54,11 @@ For example: #. Load the ``admin-openrc.sh`` file to populate environment variables with the location of the Identity service - and the ``admin`` project and user credentials: - - .. code-block:: console + and the ``admin`` project and user credentials:: $ source admin-openrc.sh -#. Request an authentication token: - - .. code-block:: console +#. Request an authentication token:: $ openstack token issue +------------+----------------------------------+ diff --git a/source/openstack_identity.rst b/source/openstack_identity.rst index 36f38b71..e46d7770 100644 --- a/source/openstack_identity.rst +++ b/source/openstack_identity.rst @@ -1,5 +1,5 @@ -OpenStack Identity -############################################################ +OpenStack* Identity +################### The OpenStack Identity service provides a single point of integration for managing authentication, authorization, and service catalog @@ -31,12 +31,12 @@ The Identity service contains these components: component that is using the Identity service. These modules intercept service requests, extract user credentials, and send them to the centralized server for authorization. The integration between - the middleware modules and OpenStack components uses the Python Web + the middleware modules and OpenStack components uses the Python* Web Server Gateway Interface. When installing OpenStack Identity service, you must register each service in your OpenStack installation. Identity service can then track -which OpenStack services are installed, and where they are located on +which OpenStack services are installed and where they are located on the network. Install and configure @@ -44,7 +44,7 @@ Install and configure This section describes how to install and configure the OpenStack Identity service, code-named keystone, on the controller node. For -performance, this configuration deploys the Nginx HTTP server to handle +performance, this configuration deploys the Nginx* HTTP server to handle requests. Prerequisites @@ -56,21 +56,15 @@ database and an administration token. #. To create the database, complete the following actions: * Use the database access client to connect to the database server as the - ``root`` user: + ``root`` user:: - .. code-block:: console + $ mysql -u root -p - $ mysql -u root -p - - * Create the ``keystone`` database: - - .. code-block:: console + * Create the ``keystone`` database:: CREATE DATABASE keystone; - * Grant proper access to the ``keystone`` database: - - .. code-block:: console + * Grant proper access to the ``keystone`` database:: GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \ IDENTIFIED BY 'KEYSTONE_DBPASS'; @@ -82,34 +76,24 @@ database and an administration token. * Exit the database access client. #. Generate a random value to use as the administration token during - initial configuration: - - .. code-block:: console + initial configuration:: $ openssl rand -hex 10 - Install and configure components -------------------------------- - -#. Run the following command to install the packages: - - .. code-block:: console +#. Run the following command to install the packages:: # clr_bundle_add openstack-identity -#. Custom configurations will be located at /etc/keystone/ +#. Custom configurations will be located at ``/etc/keystone/``. - * Create the /etc/keystone directory: - - .. code-block:: console + * Create the ``/etc/keystone`` directory:: # mkdir /etc/keystone - * Create empty keystone configuration file /etc/keystone/keystone.conf: - - .. code-block:: console + * Create empty keystone configuration file ``/etc/keystone/keystone.conf``:: # touch /etc/keystone/keystone.conf @@ -117,9 +101,7 @@ Install and configure components actions: * In the ``[DEFAULT]`` section, define the value of the initial - administration token: - - .. code-block:: ini + administration token:: [DEFAULT] ... @@ -128,9 +110,7 @@ Install and configure components Replace ``ADMIN_TOKEN`` with the random value that you generated in a previous step. - * In the ``[database]`` section, configure database access: - - .. code-block:: ini + * In the ``[database]`` section, configure database access:: [database] ... @@ -138,15 +118,11 @@ Install and configure components Replace ``KEYSTONE_DBPASS`` with the password you chose for the database. -#. Enter the following command: - - .. code:: console +#. Enter the following command:: # systemctl restart update-triggers.target -#. Populate the Identity service database: - - .. code-block:: console +#. Populate the Identity service database:: # su -s /bin/sh -c "keystone-manage db_sync" keystone @@ -154,9 +130,7 @@ Finalize the installation ------------------------- #. Keystone is deployed as a uwsgi module. To start the Identity - service, you should enable and start the nginx service - - .. code-block:: console + service, you should enable and start the nginx service:: # systemctl enable nginx uwsgi@keystone-admin.socket \ uwsgi@keystone-public.socket @@ -182,61 +156,49 @@ Identity service URL to the `openstack` command with the ``--os-url`` parameter or set the OS_URL environment variable. This guide uses environment variables to reduce command length. -#. Configure the authentication token: - - .. code-block:: console +#. Configure the authentication token:: $ export OS_TOKEN=ADMIN_TOKEN - Replace ``ADMIN_TOKEN`` with the authentication token that you - generated before. For example: - - .. code-block:: console + Replace ``ADMIN_TOKEN`` with the authentication token that you + generated before. For example:: $ export OS_TOKEN=294a4c8a8a475f9b9836 -#. Configure the endpoint: - - .. code:: text +#. Configure the endpoint:: $ export OS_URL=http://controller:35357/v3 -#. Configure the Identity API version: - - .. code-block:: console +#. Configure the Identity API version:: $ export OS_IDENTITY_API_VERSION=3 -#. Install the OpenStack Python clients bundle: - - .. code-block:: console +#. Install the OpenStack Python clients bundle:: # clr_bundle_add openstack-python-clients Create the service entity and API endpoints ------------------------------------------- -#. The Identity service manages a catalog of services in your OpenStack - environment. Services use this catalog to determine the other services - available in your environment. +The Identity service manages a catalog of services in your OpenStack +environment. Services use this catalog to determine the other services +available in your environment. - Create the service entity for the Identity service: +#. Create the service entity for the Identity service:: - .. code-block:: console + $ openstack service create \ + --name keystone --description "OpenStack Identity" identity + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | OpenStack Identity | + | enabled | True | + | id | 4ddaae90388b4ebc9d252ec2252d8d10 | + | name | keystone | + | type | identity | + +-------------+----------------------------------+ - $ openstack service create \ - --name keystone --description "OpenStack Identity" identity - +-------------+----------------------------------+ - | Field | Value | - +-------------+----------------------------------+ - | description | OpenStack Identity | - | enabled | True | - | id | 4ddaae90388b4ebc9d252ec2252d8d10 | - | name | keystone | - | type | identity | - +-------------+----------------------------------+ - -#. The Identity service manages a catalog of API endpoints associated with + The Identity service manages a catalog of API endpoints associated with the services in your OpenStack environment. Services use this catalog to determine how to communicate with other services in your environment. @@ -254,57 +216,55 @@ Create the service entity and API endpoints management network for all endpoint variations and the default ``RegionOne`` region. - Create the Identity service API endpoints: +#. Create the Identity service API endpoints:: - .. code-block:: console + $ openstack endpoint create --region RegionOne \ + identity public http://controller:5000/v3 + +--------------+----------------------------------+ + | Field | Value | + +--------------+----------------------------------+ + | enabled | True | + | id | 30fff543e7dc4b7d9a0fb13791b78bf4 | + | interface | public | + | region | RegionOne | + | region_id | RegionOne | + | service_id | 8c8c0927262a45ad9066cfe70d46892c | + | service_name | keystone | + | service_type | identity | + | url | http://controller:5000/v3 | + +--------------+----------------------------------+ - $ openstack endpoint create --region RegionOne \ - identity public http://controller:5000/v3 - +--------------+----------------------------------+ - | Field | Value | - +--------------+----------------------------------+ - | enabled | True | - | id | 30fff543e7dc4b7d9a0fb13791b78bf4 | - | interface | public | - | region | RegionOne | - | region_id | RegionOne | - | service_id | 8c8c0927262a45ad9066cfe70d46892c | - | service_name | keystone | - | service_type | identity | - | url | http://controller:5000/v3 | - +--------------+----------------------------------+ + $ openstack endpoint create --region RegionOne \ + identity internal http://controller:5000/v3 + +--------------+----------------------------------+ + | Field | Value | + +--------------+----------------------------------+ + | enabled | True | + | id | 57cfa543e7dc4b712c0ab137911bc4fe | + | interface | internal | + | region | RegionOne | + | region_id | RegionOne | + | service_id | 6f8de927262ac12f6066cfe70d99ac51 | + | service_name | keystone | + | service_type | identity | + | url | http://controller:5000/v3 | + +--------------+----------------------------------+ - $ openstack endpoint create --region RegionOne \ - identity internal http://controller:5000/v3 - +--------------+----------------------------------+ - | Field | Value | - +--------------+----------------------------------+ - | enabled | True | - | id | 57cfa543e7dc4b712c0ab137911bc4fe | - | interface | internal | - | region | RegionOne | - | region_id | RegionOne | - | service_id | 6f8de927262ac12f6066cfe70d99ac51 | - | service_name | keystone | - | service_type | identity | - | url | http://controller:5000/v3 | - +--------------+----------------------------------+ - - $ openstack endpoint create --region RegionOne \ - identity admin http://controller:35357/v3 - +--------------+----------------------------------+ - | Field | Value | - +--------------+----------------------------------+ - | enabled | True | - | id | 78c3dfa3e7dc44c98ab1b1379122ecb1 | - | interface | admin | - | region | RegionOne | - | region_id | RegionOne | - | service_id | 34ab3d27262ac449cba6cfe704dbc11f | - | service_name | keystone | - | service_type | identity | - | url | http://controller:35357/v3 | - +--------------+----------------------------------+ + $ openstack endpoint create --region RegionOne \ + identity admin http://controller:35357/v3 + +--------------+----------------------------------+ + | Field | Value | + +--------------+----------------------------------+ + | enabled | True | + | id | 78c3dfa3e7dc44c98ab1b1379122ecb1 | + | interface | admin | + | region | RegionOne | + | region_id | RegionOne | + | service_id | 34ab3d27262ac449cba6cfe704dbc11f | + | service_name | keystone | + | service_type | identity | + | url | http://controller:35357/v3 | + +--------------+----------------------------------+ Creating projects, users and roles ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -314,9 +274,7 @@ Complete the following steps to create projects, users and roles: #. Create an administrative project, user, and role for administrative operations in your environment: - * Create the ``admin`` project: - - .. code-block:: console + * Create the ``admin`` project:: $ openstack project create --domain default \ --description "Admin Project" admin @@ -333,9 +291,7 @@ Complete the following steps to create projects, users and roles: +-------------+----------------------------------+ * Create the ``admin`` user. Replace ``ADMIN_PASS`` with a suitable - password and ``EMAIL_ADDRESS`` with a suitable e-mail address: - - .. code-block:: console + password and ``EMAIL_ADDRESS`` with a suitable e-mail address:: $ openstack user create --domain default \ --password ADMIN_PASS --email EMAIL_ADDRESS admin @@ -349,9 +305,7 @@ Complete the following steps to create projects, users and roles: | name | admin | +-----------+----------------------------------+ - * Create the ``admin`` role: - - .. code-block:: console + * Create the ``admin`` role:: $ openstack role create admin +-------+----------------------------------+ @@ -361,17 +315,13 @@ Complete the following steps to create projects, users and roles: | name | admin | +-------+----------------------------------+ - * Add the ``admin`` role to the ``admin`` project and user: - - .. code-block:: console + * Add the ``admin`` role to the ``admin`` project and user:: $ openstack role add --project admin --user admin admin #. This guide uses a service project that contains a unique user for each service that you add to your environment. Create the ``service`` - project: - - .. code-block:: console + project:: $ openstack project create --domain default \ --description "Service Project" service @@ -390,9 +340,7 @@ Complete the following steps to create projects, users and roles: #. Regular (non-admin) tasks should use an unprivileged project and user. As an example, this guide creates the ``demo`` project and user. - * Create the ``demo`` project: - - .. code-block:: console + * Create the ``demo`` project:: $ openstack project create --domain default \ --description "Demo Project" demo @@ -410,9 +358,7 @@ Complete the following steps to create projects, users and roles: * Create the ``demo`` user. Replace ``DEMO_PASS`` with a suitable password and ``EMAIL_ADDRESS`` with a suitable - e-mail address: - - .. code-block:: console + e-mail address:: $ openstack user create --domain default \ --password DEMO_PASS --email EMAIL_ADDRESS demo @@ -426,9 +372,7 @@ Complete the following steps to create projects, users and roles: | name | demo | +-----------+----------------------------------+ - * Create the ``user`` role: - - .. code-block:: console + * Create the ``user`` role:: $ openstack role create user +-------+----------------------------------+ @@ -438,9 +382,7 @@ Complete the following steps to create projects, users and roles: | name | user | +-------+----------------------------------+ - * Add the ``user`` role to the ``demo`` project and user: - - .. code-block:: console + * Add the ``user`` role to the ``demo`` project and user:: $ openstack role add --project demo --user demo user @@ -451,19 +393,15 @@ Verify operation of the Identity service before installing other services. #. For security reasons, remove the admin_token value in - /etc/keystone/keystone.conf: + ``/etc/keystone/keystone.conf``: Edit the ``[DEFAULT]`` section and remove ``admin_token``. -#. Unset the temporary ``OS_TOKEN`` and ``OS_URL`` environment variables: - - .. code-block:: console +#. Unset the temporary ``OS_TOKEN`` and ``OS_URL`` environment variables:: $ unset OS_TOKEN OS_URL -#. As the ``admin`` user, request an authentication token: - - .. code-block:: console +#. As the ``admin`` user, request an authentication token:: $ openstack --os-auth-url http://controller:35357/v3 \ --os-project-domain-id default --os-user-domain-id default \ @@ -479,9 +417,7 @@ services. | user_id | 4d411f2291f34941b30eef9bd797505a | +------------+----------------------------------+ -#. As the ``demo`` user, request an authentication token: - - .. code-block:: console +#. As the ``demo`` user, request an authentication token:: $ openstack --os-auth-url http://controller:5000/v3 \ --os-project-domain-id default --os-user-domain-id default \ diff --git a/source/openstack_image.rst b/source/openstack_image.rst index b508e235..62fdfd99 100644 --- a/source/openstack_image.rst +++ b/source/openstack_image.rst @@ -1,5 +1,5 @@ -OpenStack Image -############### +OpenStack* Image +################ The OpenStack Image service (glance) enables users to discover, register, and retrieve virtual machine images. It offers a @@ -9,20 +9,18 @@ You can store virtual machine images made available through the Image service in a variety of locations, from simple file systems to object-storage systems like OpenStack Object Storage. -.. important:: + **Important:** For simplicity, this guide describes configuring the Image service to + use the ``file`` back end, which uploads and stores in a + directory on the controller node hosting the Image service. By + default, this directory is ``/var/lib/glance/images/``. - For simplicity, this guide describes configuring the Image service to - use the ``file`` back end, which uploads and stores in a - directory on the controller node hosting the Image service. By - default, this directory is ``/var/lib/glance/images/``. + Before you proceed, ensure that the controller node has at least + several gigabytes of space available in this directory. - Before you proceed, ensure that the controller node has at least - several gigabytes of space available in this directory. - - For information on requirements for other back ends, see - `Configuration Reference `__. + For information on requirements for other back ends, see + `Configuration Reference `_. Install and configure the Image Service --------------------------------------- @@ -39,44 +37,34 @@ 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 + * Use the database access client to connect to the database + server as the ``root`` user:: $ mysql -u root -p - * Create the ``glance`` database: - - .. code-block:: console + * Create the ``glance`` database:: CREATE DATABASE glance; - * Grant proper access to the ``glance`` database: - - .. code-block:: console + * Grant proper access to the ``glance`` database:: GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' \ IDENTIFIED BY 'GLANCE_DBPASS'; GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' \ IDENTIFIED BY 'GLANCE_DBPASS'; - Replace ``GLANCE_DBPASS`` with a suitable password. + Replace ``GLANCE_DBPASS`` with a suitable password. - * Exit the database access client. + * Exit the database access client. #. Source the ``admin`` credentials to gain access to - admin-only CLI commands: - - .. code-block:: console + admin-only CLI commands:: $ source admin-openrc.sh #. To create the service credentials, complete these steps: - * Create the ``glance`` user. Replace ``GLANCE_PASS`` with a suitable - password. - - .. code-block:: console + * Create the ``glance`` user. Replace ``GLANCE_PASS`` with a suitable + password:: $ openstack user create --domain default --password GLANCE_PASS glance +-----------+----------------------------------+ @@ -88,16 +76,12 @@ create a database, service credentials, and API endpoints. | name | glance | +-----------+----------------------------------+ - * Add the ``admin`` role to the ``glance`` user and - ``service`` project: - - .. code-block:: console + * Add the ``admin`` role to the ``glance`` user and + ``service`` project:: $ openstack role add --project service --user glance admin - * Create the ``glance`` service entity: - - .. code-block:: console + * Create the ``glance`` service entity:: $ openstack service create --name glance \ --description "OpenStack Image service" image @@ -111,9 +95,7 @@ create a database, service credentials, and API endpoints. | type | image | +-------------+----------------------------------+ -#. Create the Image service API endpoints: - - .. code-block:: console +#. Create the Image service API endpoints:: $ openstack endpoint create --region RegionOne \ image public http://controller:9292 @@ -166,45 +148,35 @@ create a database, service credentials, and API endpoints. Install and configure components -------------------------------- -#. Install OpenStack Image bundle: - - .. code:: console +#. Install OpenStack Image bundle:: # clr_bundle_add openstack-image -#. configurations will be located at ``/etc/glance`` +#. configurations will be located at ``/etc/glance``. - * Create ``/etc/glance`` directory: - - .. code:: console + * Create ``/etc/glance`` directory:: # mkdir /etc/glance - * Create empty configuration files ``/etc/glance/glance-api.conf`` - and ``/etc/glance/glance-registry.conf``: - - .. code:: console + * Create empty configuration files ``/etc/glance/glance-api.conf`` + and ``/etc/glance/glance-registry.conf``:: # touch /etc/glance/glance-{api,registry}.conf #. Edit the ``/etc/glance/glance-api.conf`` file and complete the following actions: - * In the ``[database]`` section, configure database access: - - .. code-block:: ini + * In the ``[database]`` section, configure database access:: [database] ... connection = mysql://glance:GLANCE_DBPASS@controller/glance - Replace ``GLANCE_DBPASS`` with the password you chose for the - Image service database. + Replace ``GLANCE_DBPASS`` with the password you chose for the + Image service database. - * In the ``[keystone_authtoken]`` section, configure Identity - service access: - - .. code-block:: ini + * In the ``[keystone_authtoken]`` section, configure Identity + service access:: [keystone_authtoken] ... @@ -217,27 +189,23 @@ Install and configure components username = glance password = GLANCE_PASS - Replace ``GLANCE_PASS`` with the password you chose for the - ``glance`` user in the Identity service. + Replace ``GLANCE_PASS`` with the password you chose for the + ``glance`` user in the Identity service. #. Edit the ``/etc/glance/glance-registry.conf`` file and complete the following actions: - * In the ``[database]`` section, configure database access: - - .. code-block:: ini + * In the ``[database]`` section, configure database access:: [database] ... connection = mysql://glance:GLANCE_DBPASS@controller/glance - Replace ``GLANCE_DBPASS`` with the password you chose for the - Image service database. + Replace ``GLANCE_DBPASS`` with the password you chose for the + Image service database. - * In the ``[keystone_authtoken]`` section,configure Identity - service access: - - .. code-block:: ini + * In the ``[keystone_authtoken]`` section, configure Identity + service access:: [keystone_authtoken] ... @@ -250,18 +218,14 @@ Install and configure components username = glance password = GLANCE_PASS - Replace ``GLANCE_PASS`` with the password you chose for the - ``glance`` user in the Identity service. + Replace ``GLANCE_PASS`` with the password you chose for the + ``glance`` user in the Identity service. -#. Let systemd set the correct permissions for files in ``/etc/glance``. - - .. code:: console +#. Let systemd set the correct permissions for files in ``/etc/glance``:: # systemctl restart update-triggers.target -#. Populate the Image Service database: - - .. code:: console +#. Populate the Image Service database:: # su -s /bin/sh -c "glance-manage db_sync" glance @@ -269,9 +233,7 @@ Finalize installation --------------------- #. Start the Image Service services and configure them to start when the - system boots: - - .. code:: console + system boots:: # systemctl enable glance-api.service glance-registry.service # systemctl start glance-api.service glance-registry.service @@ -291,31 +253,23 @@ For information about how to manage images, see the `__. #. In each client environment script, configure the Image service - client to use API version 2.0: - - .. code-block:: console + client to use API version 2.0:: $ echo "export OS_IMAGE_API_VERSION=2" \ | tee -a admin-openrc.sh demo-openrc.sh #. Source the ``admin`` credentials to gain access to - admin-only CLI commands: - - .. code-block:: console + admin-only CLI commands:: $ source admin-openrc.sh -#. Download the source image: - - .. code-block:: console +#. Download the source image:: $ curl -Ok http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img #. Upload the image to the Image service using the `QCOW2` disk format, `bare` container format, and - public visibility so all projects can access it: - - .. code-block:: console + public visibility so all projects can access it:: $ openstack image create cirros --file cirros-0.3.4-x86_64-disk.img \ --disk-format qcow2 --container-format bare --public @@ -342,9 +296,7 @@ For information about how to manage images, see the | visibility | public | +------------------+------------------------------------------------------+ -#. Confirm upload of the image and validate attributes: - - .. code-block:: console +#. Confirm upload of the image and validate attributes:: $ openstack image list +--------------------------------------+--------+ diff --git a/source/openstack_installing_bundles.rst b/source/openstack_installing_bundles.rst index 79f15b6c..2201098f 100644 --- a/source/openstack_installing_bundles.rst +++ b/source/openstack_installing_bundles.rst @@ -5,3 +5,18 @@ Note: This article walks through an OpenStack MVP installation by using bundles available for Clear Linux* OS for Intel® Architecture. The sample configuration files that are included would likely require modification for your environment. + +To install, continue with the following topics: + +* `Database `_ +* `Message queue `_ +* `OpenStack Identity `_ +* `Create OpenStack client environment scripts `_ +* `OpenStack Image `_ +* `OpenStack Compute `_ +* `OpenStack Block Storage `_ +* `OpenStack Dashboard `_ +* `OpenStack Networking `_ +* `OpenStack Orchestration `_ +* `OpenStack Telemetry `_ +* `OpenStack Object Storage `_ \ No newline at end of file diff --git a/source/openstack_networking.rst b/source/openstack_networking.rst index 7546027b..c4c1fe97 100644 --- a/source/openstack_networking.rst +++ b/source/openstack_networking.rst @@ -1,4 +1,4 @@ -OpenStack networking +OpenStack* Networking ############################################################ OpenStack* Networking allows you to create and attach interface devices @@ -17,44 +17,34 @@ database, service credentials, and an API endpoint. #. Create the database: - #. Use the database access client to connect to the database server - as the ``root`` user: - - .. code:: text + * Use the database access client to connect to the database server + as the ``root`` user:: $ mysql -u root -p - #. Create the ``neutron`` database: + * Create the ``neutron`` database:: - .. code:: text - CREATE DATABASE neutron; - #. Grant proper access to the ``neutron`` database. Replace - *``NEUTRON_DBPASS``* with a suitable password. - - .. code:: text + * Grant proper access to the ``neutron`` database. Replace + *``NEUTRON_DBPASS``* with a suitable password:: GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' \ IDENTIFIED BY 'NEUTRON_DBPASS'; GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' \ IDENTIFIED BY 'NEUTRON_DBPASS'; - #. Exit the database access client. + * Exit the database access client. #. Source the ``admin`` credentials to gain access to admin-only CLI - commands: - - .. code:: text + commands:: $ source admin-openrc.sh #. To create the service credentials, complete these steps: - #. Create the ``neutron`` user: + * Create the ``neutron`` user:: - .. code:: text - $ openstack user create --password-prompt neutron User Password: Repeat User Password: @@ -68,10 +58,8 @@ database, service credentials, and an API endpoint. | username | neutron | +----------+----------------------------------+ - #. Add the ``admin`` role to the ``neutron`` user: + * Add the ``admin`` role to the ``neutron`` user:: - .. code:: text - +-------+----------------------------------+ | Field | Value | +-------+----------------------------------+ @@ -79,10 +67,8 @@ database, service credentials, and an API endpoint. | name | admin | +-------+----------------------------------+ - #. Create the ``neutron`` service entity: + * Create the ``neutron`` service entity:: - .. code:: text - $ openstack service create --name neutron \ --description "OpenStack Networking" network +-------------+----------------------------------+ @@ -95,10 +81,8 @@ database, service credentials, and an API endpoint. | type | network | +-------------+----------------------------------+ -#. Create the Networking service API endpoint: +#. Create the Networking service API endpoint:: - .. code:: text - --publicurl http://controller:9696 \ --adminurl http://controller:9696 \ --internalurl http://controller:9696 \ @@ -122,10 +106,8 @@ Installing the Networking components Complete the following step to install the Networking components: -- Install OpenStack networking bundle: +- Install OpenStack networking bundle:: - .. code:: text - # clr_bundle_add openstack-network Configuring the Networking server component @@ -137,27 +119,21 @@ The Networking server component configuration includes the database, authentication mechanism, message queue, topology change notifications, and plug-in. -Edit the ``/etc/neutron/neutron.conf ``file: +Edit the ``/etc/neutron/neutron.conf `` file: #. Custom configurations will be located at ``/etc/neutron``. - #. Create /etc/neutron directory: + * Create /etc/neutron directory:: - .. code:: text - $ mkdir /etc/neutron - #. Create empty neutron configuration - file: - - .. code:: text + * Create empty neutron configuration + file:: $ touch /etc/neutron/neutron.conf #. In the ``[database]`` section, configure database access. Replace - *``NEUTRON_DBPASS``* with the password you chose for the database. - - .. code:: text + *NEUTRON_DBPASS* with the password you chose for the database:: [database] ... @@ -166,9 +142,7 @@ Edit the ``/etc/neutron/neutron.conf ``file: #. In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, configure RabbitMQ message queue access. Replace *``RABBIT_PASS``* with the password you chose for the ``openstack`` account in - RabbitMQ. - - .. code:: text + RabbitMQ:: [DEFAULT] ... @@ -181,9 +155,7 @@ Edit the ``/etc/neutron/neutron.conf ``file: #. In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, configure Identity service access. Replace *``NEUTRON_PASS``* with the password - you chose for the ``neutron`` user in the Identity service. - - .. code:: text + you chose for the ``neutron`` user in the Identity service:: [DEFAULT] ... @@ -200,9 +172,7 @@ Edit the ``/etc/neutron/neutron.conf ``file: password = NEUTRON_PASS #. In the ``[DEFAULT]`` section, enable the Modular Layer 2 (ML2) - plug-in, router service, and overlapping IP addresses: - - .. code:: text + plug-in, router service, and overlapping IP addresses:: [DEFAULT] ... @@ -213,9 +183,7 @@ Edit the ``/etc/neutron/neutron.conf ``file: #. In the ``[DEFAULT]`` and ``[nova]`` sections, configure Networking to notify Compute of network topology changes. Replace ``NOVA_PASS`` with the password you chose for the ``nova`` user in the Identity - service. - - .. code:: text + service:: [DEFAULT] ... @@ -241,20 +209,16 @@ the virtual networking framework for instances. However, the controller node does not need the OVS components because it does not handle instance network traffic. -#. Custom configuration for ML2 plug-in will be stored in ``/etc/neutron/plugins/ml2``. +#. Custom configuration for ML2 plug-in will be stored in ``/etc/neutron/plugins/ml2``:: - .. code:: text - mkdir -p /etc/neutron/plugins/ml2 touch /etc/neutron.plugins/ml2/ml2_conf.ini #. Edit the ``/etc/neutron/plugins/ml2/ml2_conf.ini`` file as follows: - #. In the ``[ml2]`` section, enable the flat, VLAN, generic routing - encapsulation (GRE), and virtual extensible LAN (VXLAN) network - type drivers, GRE tenant networks, and the OVS mechanism driver: - - .. code:: text + * In the ``[ml2]`` section, enable the flat, VLAN, generic routing + encapsulation (GRE), and virtual extensible LAN (VXLAN) network + type drivers, GRE tenant networks, and the OVS mechanism driver:: [ml2] ... @@ -262,19 +226,15 @@ instance network traffic. tenant_network_types = gre mechanism_drivers = openvswitch - #. In the ``[ml2_type_gre]`` section, configure the tunnel identifier - (id) range: + * In the ``[ml2_type_gre]`` section, configure the tunnel identifier + (id) range:: - .. code:: text - [ml2_type_gre] ... tunnel_id_ranges = 1:1000 - #. In the ``[securitygroup]`` section, enable security groups, enable - ipset, and configure the OVS iptables firewall driver: - - .. code:: text + * In the ``[securitygroup]`` section, enable security groups, enable + ipset, and configure the OVS iptables firewall driver:: [securitygroup] ... @@ -292,10 +252,8 @@ Networking. #. Edit the ``/etc/nova/nova.conf`` file on the controller node as follows: - #. In the ``[DEFAULT]`` section, configure the APIs and drivers: + * In the ``[DEFAULT]`` section, configure the APIs and drivers:: - .. code:: text - [DEFAULT] ... network_api_class = nova.network.neutronv2.api.API @@ -303,11 +261,9 @@ Networking. linuxnet_interface_driver = nova.network.linux_net.LinuxOVSInterfaceDriver firewall_driver = nova.virt.firewall.NoopFirewallDriver - #. In the ``[neutron]`` section, configure access - parameters. Replace *NEUTRON_PASS* with the password you - chose for the ``neutron`` user in the Identity service. - - .. code:: text + * In the ``[neutron]`` section, configure access + parameters. Replace *NEUTRON_PASS* with the password you + chose for the ``neutron`` user in the Identity service:: [neutron] ... @@ -324,36 +280,26 @@ Finalizing installation #. The Networking service initialization scripts expect a symbolic link ``/etc/neutron/plugin.ini`` pointing to the ML2 plug-in configuration file, ``/etc/neutron/plugins/ml2/ml2_conf.ini``. If this symbolic - link does not exist, create it using the following command: - - .. code:: text + link does not exist, create it using the following command:: # ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini -2. Populate the database: +#. Populate the database:: - .. code:: text - # su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \ --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron -3. Let ``systemd`` set the correct permissions for files in ``/etc/neutron``. - - .. code:: text +#. Let ``systemd`` set the correct permissions for files in ``/etc/neutron``:: # systemctl restart update-triggers.target -#. Restart the Compute services: +#. Restart the Compute services:: - .. code:: text - # systemctl restart nova-api.service nova-scheduler.service \ nova-conductor.service #. Start the Networking service and configure it to start when the - system boots: - - .. code:: text + system boots:: # systemctl enable neutron-server.service # systemctl start neutron-server.service diff --git a/source/openstack_object_storage.rst b/source/openstack_object_storage.rst index 3dd5d9e7..0c7a8ea5 100644 --- a/source/openstack_object_storage.rst +++ b/source/openstack_object_storage.rst @@ -1,4 +1,4 @@ -OpenStack* object storage +OpenStack* Object Storage ######################### Install and configure the controller node @@ -30,7 +30,7 @@ credentials and an API endpoint. #. To create the Identity service credentials, complete these steps: - #. Create the swift user:: + * Create the swift user:: $ openstack user create --password-prompt swift User Password: @@ -45,7 +45,7 @@ credentials and an API endpoint. | username | swift                            |  +----------+----------------------------------+ - #. Add the admin role to the swift user:: + * Add the admin role to the swift user:: $ openstack role add --project service --user swift admin +-------+----------------------------------+ @@ -55,7 +55,7 @@ credentials and an API endpoint. | name  | admin                            | +-------+----------------------------------+ - #. Create the swift service entity:: + * Create the swift service entity:: $ openstack service create --name swift \ --description "OpenStack Object Storage" object-store @@ -109,30 +109,30 @@ To install and configure the controller node components #. Edit the ``/etc/swift/proxy-server.conf`` file and complete the following actions: - #. In the ``[pipeline:main]`` section, enable the appropriate - modules:: + * In the ``[pipeline:main]`` section, enable the appropriate + modules:: [pipeline:main] pipeline = catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk ratelimit authtoken keystoneauth container-quotas account-quotas slo dlo proxy-logging proxy-server - #. In the ``[app:proxy-server]`` section, enable automatic account - creation:: + * In the ``[app:proxy-server]`` section, enable automatic account + creation:: [app:proxy-server] ... account_autocreate = true - #. In the ``[filter:keystoneauth]`` section, configure the operator - roles:: + * In the ``[filter:keystoneauth]`` section, configure the operator + roles:: [filter:keystoneauth] use = egg:swift#keystoneauth ... operator_roles = admin,user - #. In the ``[filter:authtoken]`` section, configure Identity service - access. Replace SWIFT\_PASS with the password you chose for the - swift user in the Identity service:: + * In the ``[filter:authtoken]`` section, configure Identity service + access. Replace SWIFT\_PASS with the password you chose for the + swift user in the Identity service:: [filter:authtoken] paste.filter_factory = keystonemiddleware.auth_token:filter_factory @@ -147,8 +147,8 @@ To install and configure the controller node components password = SWIFT_PASS delay_auth_decision = true - #. In the ``[filter:cache]`` section, configure the memcached - location:: + * In the ``[filter:cache]`` section, configure the memcached + location:: [filter:cache] ... @@ -177,56 +177,56 @@ a separate network for replication. #. Configure unique items on the first storage node: - #. Configure the management interface:: + * Configure the management interface:: IP address: 10.0.0.51 Network mask: 255.255.255.0 (or /24) Default gateway: 10.0.0.1 - #. Set the hostname of the node to ``object1``. + * Set the hostname of the node to ``object1``. #. Configure unique items on the second storage node: - #. Configure the management interface:: + * Configure the management interface:: IP address: 10.0.0.52 Network mask: 255.255.255.0 (or /24) Default gateway: 10.0.0.1 - #. Set the hostname of the node to ``object2``. + * Set the hostname of the node to ``object2``. #. Configure shared items on both storage nodes: - #. Copy the contents of the ``/etc/hosts`` file from the controller - node and add the following to it:: + * Copy the contents of the ``/etc/hosts`` file from the controller + node and add the following to it:: # object1 10.0.0.51 object1 # object2 10.0.0.52 object2 - Also add this content to the ``/etc/hosts`` file on all other nodes in your environment. + Also add this content to the ``/etc/hosts`` file on all other nodes in your environment. - #. Install the OpenStack Object Storage bundle:: + * Install the OpenStack Object Storage bundle:: # clr\_bundle\_add openstack-object-storage - #. Format the ``/dev/sdb1`` and ``/dev/sdc1`` partitions as XFS:: + * Format the ``/dev/sdb1`` and ``/dev/sdc1`` partitions as XFS:: # mkfs.xfs /dev/sdb1 # mkfs.xfs /dev/sdc1 - #. Create the mount point directory structure:: + * Create the mount point directory structure:: # mkdir -p /srv/node/sdb1 # mkdir -p /srv/node/sdc1 - #. Edit the ``/etc/fstab`` file and add the following to it:: + * Edit the ``/etc/fstab`` file and add the following to it:: /dev/sdb1 /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 2 /dev/sdc1 /srv/node/sdc1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 2 - #. Mount the devices:: + * Mount the devices:: # mount /srv/node/sdb1 # mount /srv/node/sdc1 @@ -282,8 +282,8 @@ Install and configure storage node components #. Edit the ``/etc/swift/account-server.conf`` file and complete the following actions: - #. In the ``[DEFAULT]`` section, configure the bind IP address and - mount point directory:: + * In the ``[DEFAULT]`` section, configure the bind IP address and + mount point directory:: [DEFAULT] ... @@ -293,14 +293,14 @@ Install and configure storage node components Replace ``MANAGEMENT_INTERFACE_IP_ADDRESS`` with the IP address of the management network on the storage node. - #. In the ``[pipeline:main]`` section, enable the appropriate - modules:: + * In the ``[pipeline:main]`` section, enable the appropriate + modules:: [pipeline:main] pipeline = healthcheck recon account-server - #. In the ``[filter:recon]`` section, configure the recon (metrics) - cache directory:: + * In the ``[filter:recon]`` section, configure the recon (metrics) + cache directory:: [filter:recon] ... @@ -309,8 +309,8 @@ Install and configure storage node components #. Edit the ``/etc/swift/container-server.conf`` file and complete the following actions: - #. In the ``[DEFAULT]`` section, configure the bind IP address and - mount point directory:: + * In the ``[DEFAULT]`` section, configure the bind IP address and + mount point directory:: [DEFAULT] ... @@ -320,14 +320,13 @@ Install and configure storage node components Replace ``MANAGEMENT_INTERFACE_IP_ADDRESS`` with the IP address of the management network on the storage node. - #. In the ``[pipeline:main]`` section, enable the appropriate - modules:: + * modules:: [pipeline:main] pipeline = healthcheck recon container-server - #. In the ``[filter:recon]`` section, configure the recon (metrics) - cache directory:: + * In the ``[filter:recon]`` section, configure the recon (metrics) + cache directory:: [filter:recon] ... @@ -336,8 +335,8 @@ Install and configure storage node components #. Edit the ``/etc/swift/object-server.conf`` file and complete the following actions: - #. In the ``[DEFAULT]`` section, configure the bind IP address and - mount point directory:: + * In the ``[DEFAULT]`` section, configure the bind IP address and + mount point directory:: [DEFAULT] ... @@ -347,14 +346,14 @@ Install and configure storage node components Replace ``MANAGEMENT_INTERFACE_IP_ADDRESS`` with the IP address of the management network on the storage node. - #. In the ``[pipeline:main]`` section, enable the appropriate - modules:: + * In the ``[pipeline:main]`` section, enable the appropriate + modules:: [pipeline:main] pipeline = healthcheck recon object-server - #. In the ``[filter:recon]`` section, configure the recon (metrics) - cache and lock directories:: + * In the ``[filter:recon]`` section, configure the recon (metrics) + cache and lock directories:: [filter:recon] ... @@ -567,16 +566,16 @@ Configure hashes and default storage policy #. Edit the ``/etc/swift/swift.conf`` file and complete the following actions: - #. In the ``[swift-hash]`` section, configure the hash path prefix and - suffix for your environment:: + * In the ``[swift-hash]`` section, configure the hash path prefix and + suffix for your environment:: [swift-hash] ... swift_hash_path_suffix = HASH_PATH_PREFIX swift_hash_path_prefix = HASH_PATH_SUFFIX - #. In the ``[storage-policy:0]`` section, configure the default storage - policy:: + * In the ``[storage-policy:0]`` section, configure the default storage + policy:: [storage-policy:0] ... diff --git a/source/openstack_orchestration.rst b/source/openstack_orchestration.rst index 1052e666..dc0db916 100644 --- a/source/openstack_orchestration.rst +++ b/source/openstack_orchestration.rst @@ -1,4 +1,4 @@ -OpenStack orchestration +OpenStack* Orchestration ############################################################ The Orchestration module provides template-based OpenStack* API calls @@ -27,44 +27,34 @@ 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:: text + * Use the database access client to connect to the database server + as the ``root`` user:: $ mysql -u root -p - #. Create the ``heat`` database: + * Create the ``heat`` database:: - .. code:: text - CREATE DATABASE heat; - #. Grant proper access to the ``heat`` database. - Replace *HEAT_DBPASS*  with a suitable password. - - .. code:: text + * Grant proper access to the ``heat`` database. + Replace *HEAT_DBPASS*  with a suitable password:: GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'localhost' \ IDENTIFIED BY 'HEAT_DBPASS'; GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'%' \ IDENTIFIED BY 'HEAT_DBPASS'; - #. Exit the database access client. + * Exit the database access client. #. Source the ``admin`` credentials to gain access to admin-only CLI - commands: - - .. code:: text + commands:: $ source admin-openrc.sh #. To create the service credentials, complete these steps: - #. Create the ``heat`` user: + * Create the ``heat`` user:: - .. code:: text - $ openstack user create --password-prompt heat User Password: Repeat User Password: @@ -78,10 +68,8 @@ database, service credentials, and API endpoints. | username | heat | +----------+----------------------------------+ - #. Add the ``admin`` role to the ``heat`` user: + * Add the ``admin`` role to the ``heat`` user:: - .. code:: text - $ openstack role add --project service --user heat admin +-------+----------------------------------+ | Field | Value | @@ -90,10 +78,8 @@ database, service credentials, and API endpoints. | name | admin | +-------+----------------------------------+ - #. Create the ``heat_stack_owner`` role: + * Create the ``heat_stack_owner`` role:: - .. code:: text - $ openstack role create heat_stack_owner +-------+----------------------------------+ | Field | Value | @@ -102,13 +88,11 @@ database, service credentials, and API endpoints. | name | heat_stack_owner | +-------+----------------------------------+ - #. Add the ``heat_stack_owner`` role to the ``demo`` tenant and - user. + * Add the ``heat_stack_owner`` role to the ``demo`` tenant and + user. - Note: You must add the ``heat_stack_owner`` role to users that - manage stacks. - - .. code:: text + Note: You must add the ``heat_stack_owner`` role to users that + manage stacks:: $ openstack role add --project demo --user demo heat_stack_owner +-------+----------------------------------+ @@ -118,24 +102,23 @@ database, service credentials, and API endpoints. | name | heat_stack_owner | +-------+----------------------------------+ - #. Create the ``heat_stack_user`` role. + * Create the ``heat_stack_user`` role. - Note: The Orchestration service automatically assigns the ``heat_stack_user`` role to users that it creates during stack deployment. By default, this role restricts API operations. To avoid conflicts, do not add this role to users with the heat_stack_owner role. + Note: The Orchestration service automatically assigns the ``heat_stack_user`` role + to users that it creates during stack deployment. By default, this role restricts  + API operations. To avoid conflicts, do not add this role to users with the  + heat_stack_owner role:: - .. code:: text + $ openstack role create heat_stack_user + +-------+----------------------------------+ + | Field | Value | + +-------+----------------------------------+ + | id | e01546b1a81c4e32a6d14a9259e60154 | + | name | heat_stack_user | + +-------+----------------------------------+ - $ openstack role create heat_stack_user - +-------+----------------------------------+ - | Field | Value | - +-------+----------------------------------+ - | id | e01546b1a81c4e32a6d14a9259e60154 | - | name | heat_stack_user | - +-------+----------------------------------+ - - #. Create the ``heat`` and ``heat-cfn`` service entities: + * Create the ``heat`` and ``heat-cfn`` service entities:: - .. code:: text - +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ @@ -157,10 +140,8 @@ database, service credentials, and API endpoints. | type | cloudformation | +-------------+----------------------------------+ -#. Create the Orchestration service API endpoints: +#. Create the Orchestration service API endpoints:: - .. code:: text - $ openstack endpoint create \ --publicurl http://controller:8004/v1/%\(tenant_id\)s \ --internalurl http://controller:8004/v1/%\(tenant_id\)s \ @@ -203,37 +184,29 @@ Installing and configuring the Orchestration components To install and configure the Orchestration components: -#. Install OpenStack Orchestration bundle: +#. Install OpenStack Orchestration bundle:: - .. code:: text - # clr_bundle_add openstack-orchestration -#. Create the ``/etc/heat/heat.conf file``. +#. Create the ``/etc/heat/heat.conf file``:: - .. code:: text - # mkdir /etc/heat # touch /etc/heat/heat.conf #. Edit the ``/etc/heat/heat.conf`` file and complete the following actions: - #. In the ``[database]`` section, configure database access. - Replace *HEAT_DBPASS*  with the password you chose for the - Orchestration database. - - .. code:: text + * In the ``[database]`` section, configure database access. + Replace *HEAT_DBPASS*  with the password you chose for the + Orchestration database:: [database] ... connection = mysql://heat:HEAT_DBPASS@controller/heat - #. In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, - configure RabbitMQ message queue access. - Replace *``RABBIT_PASS``*  with the password you chose for - the ``openstack`` account in RabbitMQ. - - .. code:: text + * In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, + configure RabbitMQ message queue access. + Replace *``RABBIT_PASS``*  with the password you chose for + the ``openstack`` account in RabbitMQ:: [DEFAULT] ... @@ -244,12 +217,10 @@ To install and configure the Orchestration components: rabbit_userid = openstack rabbit_password = RABBIT_PASS - #. In the ``[keystone_authtoken]`` and ``[ec2authtoken]`` sections, - configure Identity service access. Replace *HEAT_PASS*  with - the password you chose for the ``heat`` user in the Identity - service. - - .. code:: text + * In the ``[keystone_authtoken]`` and ``[ec2authtoken]`` sections, + configure Identity service access. Replace *HEAT_PASS*  with + the password you chose for the ``heat`` user in the Identity + service:: [keystone_authtoken] ... @@ -262,22 +233,18 @@ To install and configure the Orchestration components: ... auth_uri = http://controller:5000/v2.0 - #. In the ``[DEFAULT]`` section, configure the metadata and wait - condition URLs: - - .. code:: text + * In the ``[DEFAULT]`` section, configure the metadata and wait + condition URLs:: [DEFAULT] ... heat_metadata_server_url = http://controller:8000 heat_waitcondition_server_url = http://controller:8000/v1/waitcondition - #. In the ``[DEFAULT]`` section, configure information about the - heat Identity service domain. Replace  *``HEAT_DOMAIN_PASS``* -  with the password you chose for the admin user of - the ``heat`` user domain in the Identity service. - - .. code:: text + * In the ``[DEFAULT]`` section, configure information about the + heat Identity service domain. Replace  *``HEAT_DOMAIN_PASS``* +  with the password you chose for the admin user of + the ``heat`` user domain in the Identity service:: [DEFAULT] ... @@ -286,33 +253,25 @@ To install and configure the Orchestration components: stack_user_domain_name = heat_user_domain #. Source the ``admin`` credentials to gain access to admin-only CLI - commands: - - .. code:: text + commands:: $ source admin-openrc.sh #. Create the heat domain in Identity service. Replace *``HEAT_DOMAIN_PASS``*  with a suitable - password. - - .. code:: text + password:: $ heat-keystone-setup-domain \ --stack-user-domain-name heat_user_domain \ --stack-domain-admin heat_domain_admin \ --stack-domain-admin-password HEAT_DOMAIN_PASS -#. Let systemd set the correct permissions for files in ``/etc/heat``. - - .. code:: text +#. Let systemd set the correct permissions for files in ``/etc/heat``:: # systemctl restart update-triggers.target -#. Populate the Orchestration database: +#. Populate the Orchestration database:: - .. code:: text - # su -s /bin/sh -c "heat-manage db_sync" heat`` Finalizing installation @@ -320,10 +279,8 @@ Finalizing installation Complete this step to finalize the installation: -- Start the Orchestration services and configure them to start when the - system boots: - - .. code:: text +* Start the Orchestration services and configure them to start when the + system boots:: # systemctl enable heat-api.service heat-api-cfn.service heat-engine.service # systemctl start heat-api.service heat-api-cfn.service heat-engine.service`` diff --git a/source/openstack_sys_req_and_pw_summary.rst b/source/openstack_sys_req_and_pw_summary.rst index cd28ecd6..37833b14 100644 --- a/source/openstack_sys_req_and_pw_summary.rst +++ b/source/openstack_sys_req_and_pw_summary.rst @@ -30,15 +30,11 @@ management interface on the controller node. To configure name resolution: -#. Set the hostname of the node to ``controller``: - - :: +#. Set the hostname of the node to ``controller``:: # hostnamectl set-hostname controller -#. Edit the ``/etc/hosts`` file to contain the following: - - :: +#. Edit the ``/etc/hosts`` file to contain the following:: # controller 10.0.0.11 controller # compute1 10.0.0.31 compute1 diff --git a/source/openstack_telemetry.rst b/source/openstack_telemetry.rst index 0fb68985..39e9cd1e 100644 --- a/source/openstack_telemetry.rst +++ b/source/openstack_telemetry.rst @@ -1,4 +1,4 @@ -OpenStack telemetry service +OpenStack* Telemetry ############################################################ Overview @@ -28,33 +28,25 @@ Before installing and configuring the ``telemetry`` module, install MongoDB* and create a MongoDB database, service credentials, and API endpoint. -#. Install the MongoDB bundle: +#. Install the MongoDB bundle:: - .. code:: text - # clr_bundle_add database-mongodb #. Create the ``/etc/mongodb/`` folder and the ``/etc/mongodb/openstack.cnf`` file. #. Configure the ``bind_ip`` key to use the management interface IP - address of the controller node. - - .. code:: text + address of the controller node:: bind_ip = 10.0.0.11 #. Start the database service and configure it to start when the system - boots with the following commands: - - .. code:: text + boots with the following commands:: # systemctl enable mongodb.service # systemctl start mongodb.service #. Create the ``ceilometer`` database. Replace *CEILOMETER_DBPASS* - with a suitable password. - - .. code:: text + with a suitable password:: # mongo --host controller --eval ' db = db.getSiblingDB("ceilometer"); @@ -67,18 +59,14 @@ endpoint. Successfully added user: { "user" : "ceilometer", "roles" : [ "readWrite", "dbAdmin" ] } #. Source the ``admin`` credentials to gain access to admin-only CLI - commands: - - .. code:: text + commands:: $ source admin-openrc.sh #. To create the service credentials, complete these steps: - #. Create the ``ceilometer`` user: + * Create the ``ceilometer`` user:: - .. code:: text - $ openstack user create --password-prompt ceilometer User Password: Repeat User Password: @@ -92,10 +80,8 @@ endpoint. | username | ceilometer | +----------+----------------------------------+ - #. Add the ``admin`` role to the ``ceilometer`` user. + * Add the ``admin`` role to the ``ceilometer`` user:: - .. code:: text - $ openstack role add --project service --user ceilometer admin +-------+----------------------------------+ | Field | Value | @@ -104,10 +90,8 @@ endpoint. | name | admin | +-------+----------------------------------+ - #. Create the ``ceilometer`` service entity: + * Create the ``ceilometer`` service entity:: - .. code:: text - $ openstack service create --name ceilometer \ --description "Telemetry" metering +-------------+----------------------------------+ @@ -120,10 +104,8 @@ endpoint. | type | metering | +-------------+----------------------------------+ -#. Create the Telemetry module API endpoint: +#. Create the Telemetry module API endpoint:: - .. code:: text - $ openstack endpoint create \ --publicurl http://controller:8777 \ --internalurl http://controller:8777 \ @@ -146,54 +128,42 @@ endpoint. Installing and configuring the Telemetry module components ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -#. Install the OpenStack Telemetry Controller bundle: +#. Install the OpenStack Telemetry Controller bundle:: - .. code:: text - # clr_bundle_add openstack-telemetry-controller -#. Generate a random value to use as the telemetry secret: +#. Generate a random value to use as the telemetry secret:: - .. code:: text - $ openssl rand -hex 10 #. Custom configurations will be located at ``/etc/ceilometer``. - #. Create ``/etc/ceilometer`` directory. + * Create ``/etc/ceilometer`` directory:: - .. code:: text - mkdir /etc/ceilometer - #. Create the empty ceilometer configuration file + * Create the empty ceilometer configuration file:: - .. code:: text - /etc/ceilometer/ceilometer.conf touch /etc/ceilometer/ceilometer.conf #. Edit the following file:\ ``/etc/ceilometer/ceilometer.conf``\ Then complete the following actions: - #. In the ``[database]`` section, configure database access. Replace - *``CEILOMETER_DBPASS``* with the password you chose for the - Telemetry module database. You must escape special characters such - as ':', '/', '+', and '@' in the connection string in accordance - with RFC2396. - - .. code:: text + * In the ``[database]`` section, configure database access. Replace + *``CEILOMETER_DBPASS``* with the password you chose for the + Telemetry module database. You must escape special characters such + as ':', '/', '+', and '@' in the connection string in accordance + with RFC2396:: [database] ... connection = mongodb://ceilometer:CEILOMETER_DBPASS@controller:27017/ceilometer - #. In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, - configure RabbitMQ message queue access. Replace *``RABBIT_PASS``* - with the password you chose for the ``openstack`` account in - RabbitMQ. - - .. code:: text + * In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, + configure RabbitMQ message queue access. Replace *``RABBIT_PASS``* + with the password you chose for the ``openstack`` account in + RabbitMQ:: [DEFAULT] ... @@ -203,12 +173,10 @@ Installing and configuring the Telemetry module components rabbit_userid = openstack rabbit_password = RABBIT_PASS - #. In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, - configure Identity service access. Replace *``CEILOMETER_PASS``* - with the password you chose for the ``celiometer`` user in the - Identity service. - - .. code:: text + * In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, + configure Identity service access. Replace *``CEILOMETER_PASS``* + with the password you chose for the ``celiometer`` user in the + Identity service:: [DEFAULT] ... @@ -220,11 +188,9 @@ Installing and configuring the Telemetry module components admin_user = ceilometer admin_password = CEILOMETER_PASS - #. In the ``[service_credentials]`` section, configure service - credentials. Replace *``CEILOMETER_PASS``* with the password you - chose for the ``ceilometer`` user in the Identity service. - - .. code:: text + * In the ``[service_credentials]`` section, configure service + credentials. Replace *``CEILOMETER_PASS``* with the password you + chose for the ``ceilometer`` user in the Identity service:: [service_credentials] ... @@ -235,11 +201,9 @@ Installing and configuring the Telemetry module components os_endpoint_type = internalURL os_region_name = RegionOne - #. In the ``[publisher]`` section, configure the telemetry secret. - Replace *``TELEMETRY_SECRET``* with the telemetry secret that you - generated in a previous step. - - .. code:: text + * In the ``[publisher]`` section, configure the telemetry secret. + Replace *``TELEMETRY_SECRET``* with the telemetry secret that you + generated in a previous step:: [publisher] ... @@ -248,10 +212,8 @@ Installing and configuring the Telemetry module components Finalizing installation ~~~~~~~~~~~~~~~~~~~~~~~~ -* Start the Telemetry services and configure them to start when the system boots: +* Start the Telemetry services and configure them to start when the system boots:: - .. code:: text - # systemctl enable ceilometer-api.service ceilometer-agent-notification.service ceilometer-agent-central.service ceilometer-collector.service \ ceilometer-alarm-evaluator.service ceilometer-alarm-notifier.service # systemctl start ceilometer-api.service ceilometer-agent-notification.service ceilometer-agent-central.service ceilometer-collector.service \ From 4edd6b004542f210efe6f8e40f6fbc8c5d9a6a2b Mon Sep 17 00:00:00 2001 From: "Tullis, Michael L" Date: Tue, 3 Nov 2015 12:10:33 -0700 Subject: [PATCH 03/48] Updated internal cross references in all getting started topics to use the RST :ref: syntax rather than HTML code. Also made topic headings consistent. --- .../gs-clear-containers-gettting-started.rst | 21 +++++++----- source/gs_creating_bootable_usb.rst | 25 +++++++++----- source/gs_getting_started.rst | 9 +++-- source/gs_installing_clr_as_host.rst | 33 ++++++++++++------- source/gs_running_clr_virtual.rst | 33 ++++++------------- source/gs_supported_hardware.rst | 2 ++ 6 files changed, 68 insertions(+), 55 deletions(-) diff --git a/source/gs-clear-containers-gettting-started.rst b/source/gs-clear-containers-gettting-started.rst index 04f1d1a1..b5b418ce 100644 --- a/source/gs-clear-containers-gettting-started.rst +++ b/source/gs-clear-containers-gettting-started.rst @@ -1,14 +1,17 @@ +.. _gs-clear-containers-gettting-started.rst: + Clear Containers getting started guide -====================================== +###################################### Clear Containers for Docker* Engine is now available on multiple operating systems. This enables executing existing Docker applications in the secure and fast Clear Containers environment. Binary packages ---------------- +=============== -The primary host platform is Clear Linux* Project for Intel® Architecture, version 4000 or better. However, binaries for a range of operating systems are available from: +The primary host platform is Clear Linux* Project for Intel® Architecture, version 4000 +or better. However, binaries for a range of operating systems are available from: - https://software.opensuse.org/download.html?project=home%3Aclearlinux%3Apreview&package=clear-containers-docker @@ -21,14 +24,14 @@ Currently experimental builds are available for: - Debian* 8.0 - Ubuntu* 15.04 -If you have any feedback, please mail it to the dev@lists.clearlinux.org mailing list. Subscription to this list is -available at: https://lists.clearlinux.org/mailman/listinfo/dev. +If you have any feedback, please mail it to the dev@lists.clearlinux.org mailing list. +Subscription to this list is available at: https://lists.clearlinux.org/mailman/listinfo/dev. Installation instructions -------------------------- +========================= Using hosts other than Clear Linux OS for Intel Architecture -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------------------ If you are *not* using Clear Linux OS for Intel Architecture, follow the instructions below: @@ -46,7 +49,7 @@ If you are *not* using Clear Linux OS for Intel Architecture, follow the instruc $ systemctl restart docker Using Clear Linux OS for Intel Architecture as Host -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +--------------------------------------------------- If you are running Clear Linux OS for Intel Architecture on your host system, follow the instructions below: @@ -64,7 +67,7 @@ instructions below: $ systemctl restart docker Source Code ------------ +=========== The experimental source code is based on the Docker version 1.8.1 upstream release and is available at: diff --git a/source/gs_creating_bootable_usb.rst b/source/gs_creating_bootable_usb.rst index 90f4bc74..de9c961d 100644 --- a/source/gs_creating_bootable_usb.rst +++ b/source/gs_creating_bootable_usb.rst @@ -1,12 +1,16 @@ +.. _gs_creating_bootable_usb: + Creating a bootable USB to install the OS -========================================= +########################################## + Here's how to create a USB drive that initiates the process for -`installing Clear Linux OS for Intel Architecture as host `_. -Alternatively, you can test the OS by `running in a virtualized environment `_. +:ref:`gs_installing_clr_as_host`. Alternatively, you can test the +OS by :ref:`gs_running_clr_virtual`. What you need -------------- +============= + * A USB stick, formatted as ``ext4``. Remember that the process of flashing data to a USB completely deletes the contents of the drive; as always, run ``dd`` with caution. @@ -19,7 +23,7 @@ What you need Download and checksum ---------------------- +===================== :: @@ -27,7 +31,8 @@ $ wget https://download.clearlinux.org/image/clear-[release_number]-installer.im $ sha512sum clear-[release_number]-installer.img.xz` Confirm the mount point on the USB drive ----------------------------------------- +======================================== + Using ``$ lsblk`` is helpful to show the block-level devices; a USB drive usually shows up under ``/sdb`` or ``/sdc`` (almost never ``/sda``), and should indicate disk space approximately the size of the USB drive:: @@ -42,7 +47,8 @@ and make sure the drive isn't already mounted. The easiest way is with:: # df Flash the image to the USB --------------------------- +========================== + Flash the image with the following command, adding the ``-v`` option for verbose mode (recommended), as the image file may be large, and the process can take a while. This may need to be done as root:: @@ -50,7 +56,8 @@ may need to be done as root:: $ xzcat -v clear-[release_number]-installer.img.xz | dd of=/dev/sdb bs=4M Wait for the final confirmation -------------------------------- +=============================== + This example shows ``clear-2190-installer.img.xz`` flashed to a 16GB USB drive mounted on ``/sdc``. @@ -59,4 +66,4 @@ mounted on ``/sdc``. :alt: confirmation Success! Your USB stick is now ready to boot and initiate the process for -`installing Clear Linux OS for Intel Architecture as host `_. \ No newline at end of file +:ref:`gs_installing_clr_as_host`. \ No newline at end of file diff --git a/source/gs_getting_started.rst b/source/gs_getting_started.rst index 7430fe41..28aed9bd 100644 --- a/source/gs_getting_started.rst +++ b/source/gs_getting_started.rst @@ -1,6 +1,11 @@ +.. _gs_getting_started: + Getting started with Clear Linux* OS for Intel® Architecture ############################################################ -The easiest way to give Clear Linux OS for Intel Architecture a spin is to download a recent KVM image from the `image directory `_ on our download page. This directory contains a current image, the UEFI firmware helper and the KVM start helper script. See `running in a virtualized environment `_ for details. +The easiest way to give Clear Linux OS for Intel Architecture a spin is to download a +recent KVM image from the `image directory `_ +on our download page. This directory contains a current image, the UEFI firmware +helper and the KVM start helper script. See :ref:`gs_running_clr_virtual` for details. -You can also `install Clear Linux OS for Intel Architecture as host `_ on a target computer. \ No newline at end of file +You can also :ref:`gs_installing_clr_as_host` on a target computer. \ No newline at end of file diff --git a/source/gs_installing_clr_as_host.rst b/source/gs_installing_clr_as_host.rst index e2c225ee..637735de 100644 --- a/source/gs_installing_clr_as_host.rst +++ b/source/gs_installing_clr_as_host.rst @@ -1,29 +1,38 @@ +.. _gs_installing_clr_as_host.rst: + Installing the OS as host ########################################################## -Running Clear Linux* OS for Intel® Architecture natively on a system is easy with the simple installer image. To get started you'll need the following: +Running Clear Linux* OS for Intel® Architecture natively on a system is easy +with the simple installer image. To get started you'll need the following: -* A USB stick flashed with the `installer image `_. Instructions for how to do this are `here `_. -* Host machine running `supported hardware `_. +* A USB stick flashed with the `installer image `_. + For instructions on how to do this, see :ref:`gs_creating_bootable_usb`. +* Host machine running :ref:`gs_supported_hardware`. * Network access via DHCP. Installing Clear Linux OS for Intel Architecture to a target system -++++++++++++++++++++++++++++++++++++++++++++ +=================================================================== -1. Configure the BIOS; this may involve changing the boot device order to boot first from the USB device. -2. Insert the USB device that is flashed with the `installer image `_ into the target system, then reboot. As the system boots, you'll see:: +1. Configure the BIOS; this may involve changing the boot device order + to boot first from the USB device. +2. Insert the USB device that is flashed with the + `installer image `_ into the + target system, then reboot. As the system boots, you'll see:: - Clear Linux OS for Intel Architecture installation in progress... Your computer will power off once installation completes successfully. + Clear Linux OS for Intel Architecture installation in progress... Your + computer will power off once installation completes successfully. -The entire installation should take no more than a few minutes. If you run into any trouble, log in as root during the installation phase and check the status of the install with - -.. code:: text +The entire installation should take no more than a few minutes. If you run into +any trouble, log in as root during the installation phase and check the status +of the install with:: $ systemctl status ister You might need to switch to another TTY. -For feedback on installation or other topics, please feel free to write in to our `mailing list `_. +For feedback on installation or other topics, please feel free to write in to our +`mailing list `_. -Note: You can also `run Clear Linux OS for Intel Architecture in a virtual environment `_. +Note: You can also :ref:`gs_running_clr_virtual`. diff --git a/source/gs_running_clr_virtual.rst b/source/gs_running_clr_virtual.rst index 5fa6a97c..67ca6114 100644 --- a/source/gs_running_clr_virtual.rst +++ b/source/gs_running_clr_virtual.rst @@ -1,3 +1,5 @@ +.. _gs_running_clr_virtual: + Running in a virtualized environment ########################################################################## @@ -8,16 +10,13 @@ contains an image file, the UEFI firmware helper and the KVM start helper script. Starter script -~~~~~~~~~~~~~~ +============== To start the image, run the ``start_qemu.sh`` script from `here `_, or modify the following script for your needs and run it from the command line -with ``$ script clr_image``. +with ``$ script clr_image``:: -:: - - #!/bin/bash if [ $# -eq 0 ] ; then echo "Please provide an image to emulate as first argument" @@ -40,41 +39,29 @@ with ``$ script clr_image``. To run this script, connect from host via SSH. Take note that SSH is not enabled by default. To enable it, log in through serial console with the username ``root``. After setting the password, enable root login via SSH -by configuring ``/etc/ssh/sshd_config`` with this content: - -:: +by configuring ``/etc/ssh/sshd_config`` with this content:: PermitRootLogin yes -Now you may connect from host via SSH through 2223: - -:: +Now you may connect from host via SSH through 2223:: $ ssh -p 2223 root@localhost Alternately, there are a few other ways to approach this. -- To run the script without modifying its permissions: - - :: +- To run the script without modifying its permissions:: $ bash start_qemu.sh clr_image -- To run it as a background process: - - :: +- To run it as a background process:: $ `bash start_qemu.sh clr_image` & -- If you'd like to run the script with execute permission: - - :: +- If you'd like to run the script with execute permission:: $ chmod +x start_qemu.sh $ ./start_qemu.sh clr_image -- And to run it as a background process: - - :: +- And to run it as a background process:: $ `./start_qemu.sh clr_image` & diff --git a/source/gs_supported_hardware.rst b/source/gs_supported_hardware.rst index 0adcb7a8..a61e6e42 100644 --- a/source/gs_supported_hardware.rst +++ b/source/gs_supported_hardware.rst @@ -1,3 +1,5 @@ +.. _gs_supported_hardware: + Supported hardware ################## From 38f2c695614e1d2982ef95ef0e967cac7a1f2a56 Mon Sep 17 00:00:00 2001 From: "Tullis, Michael L" Date: Tue, 3 Nov 2015 12:22:36 -0700 Subject: [PATCH 04/48] Fixed namespace references in two GS topics. --- source/gs-clear-containers-gettting-started.rst | 2 +- source/gs_installing_clr_as_host.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/gs-clear-containers-gettting-started.rst b/source/gs-clear-containers-gettting-started.rst index b5b418ce..b698937c 100644 --- a/source/gs-clear-containers-gettting-started.rst +++ b/source/gs-clear-containers-gettting-started.rst @@ -1,4 +1,4 @@ -.. _gs-clear-containers-gettting-started.rst: +.. _gs-clear-containers-gettting-started: Clear Containers getting started guide ###################################### diff --git a/source/gs_installing_clr_as_host.rst b/source/gs_installing_clr_as_host.rst index 637735de..b4e28de8 100644 --- a/source/gs_installing_clr_as_host.rst +++ b/source/gs_installing_clr_as_host.rst @@ -1,4 +1,4 @@ -.. _gs_installing_clr_as_host.rst: +.. _gs_installing_clr_as_host: Installing the OS as host ########################################################## From 7ee4f071933745a66e159b92c866388e9cdf6beb Mon Sep 17 00:00:00 2001 From: "Tullis, Michael L" Date: Tue, 3 Nov 2015 13:54:43 -0700 Subject: [PATCH 05/48] Updated bundles_in_clr_html.rst with the latest auto-generated bundle data. --- source/bundles_in_clr_html.rst | 767 ++++++++++++++++++++++++++++++++- 1 file changed, 766 insertions(+), 1 deletion(-) diff --git a/source/bundles_in_clr_html.rst b/source/bundles_in_clr_html.rst index 55a9f6c2..1c171b3f 100644 --- a/source/bundles_in_clr_html.rst +++ b/source/bundles_in_clr_html.rst @@ -1,3 +1,768 @@ .. raw:: html -Insert generated bundle table here as raw HTML. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bundle NameStatusDescription
bat ACTIVE +

Provides the neccesary bundles to perform BAT succesfully

+
  • Includes (devtools-basic) bundle.

    +
  • Includes (openstack-test-suite) bundle.

    +
  • Includes (os-testsuite) bundle.

    +
  • Includes (pnp-tools-basic) bundle.

    +
  • Includes (openstack-all-in-one) bundle.

    +
  • Includes (storage-utils) bundle.

    +
  • bootloader ACTIVE +

    UEFI bootloaders

    +
    clr-devops ACTIVE +

    Provides build/release tools for Clear devops team

    +
    containers-basic WIP +

    Installs rkt base for Clear Containers

    +
  • Includes (storage-utils) bundle.

    +
  • Includes (network-basic) bundle.

    +
  • Includes (kernel-container) bundle.

    +
  • cryptography ACTIVE +

    Cryptographic tools

    +
    database-mariadb ACTIVE +

    Provides components needed to run MariaDB

    +
    database-mongodb WIP +

    Provides components needed to run mongodb

    +
    devtools-basic ACTIVE +

    Provides basic set of languages and tools for development

    +
  • Includes (R-basic) bundle.

    +
  • Includes (go-basic) bundle.

    +
  • Includes (hpc-basic) bundle.

    +
  • Includes (os-core-dev) bundle.

    +
  • Includes (perl-basic) bundle.

    +
  • Includes (python-basic) bundle.

    +
  • Includes (ruby-basic) bundle.

    +
  • devtools-extras ACTIVE +

    Provides extra set of languages and tools for development

    +
  • Includes (R-extras) bundle.

    +
  • Includes (devtools-basic) bundle.

    +
  • Includes (go-extras) bundle.

    +
  • Includes (perl-extras) bundle.

    +
  • Includes (python-extras) bundle.

    +
  • Includes (ruby-extras) bundle.

    +
  • dev-utils ACTIVE +

    Provides a limited set of development utilities

    +
    dpdk-dev ACTIVE +

    All headers and libraries necessary to develop with the Data Plane Development Kit.

    +
  • Includes (os-core-dev) bundle.

    +
  • editors ACTIVE +

    Provides popular text editors

    +
    file-utils ACTIVE +

    Provides basic set of file manipulation utilities

    +
    go-basic ACTIVE +

    Provides basic Go language development

    +
    go-extras ACTIVE +

    Most popular Golang libraries

    +
  • Includes (go-basic) bundle.

    +
  • hpc-basic ACTIVE +

    Provides basic suite of MPI/HPC development tools

    +
  • Includes (os-core-dev) bundle.

    +
  • iot WIP +

    The IoT (Internet of Things) base bundle

    +
    kernel-container WIP +

    Provides a Linux kernel appropriate for a Clear Container

    +
    kernel-kvm ACTIVE +

    Provides a Linux kernel appropriate for running under KVM

    +
  • Includes (bootloader) bundle.

    +
  • kernel-native ACTIVE +

    Provides a Linux kernel appropriate for physical machines

    +
  • Includes (bootloader) bundle.

    +
  • kernel-pxe ACTIVE +

    Provides a Linux kernel linking an initramfs as root

    +
    koji WIP +

    Sets up a koji build service (builder-only, for now) based on NFS mounts.

    +
    kvm-host WIP +

    Provides necessary tools to run usable virtual machines with QEMU-KVM (independently of OpenStack).

    +
  • Includes (kernel-kvm) bundle.

    +
  • lamp-basic ACTIVE +

    Basic LAMP Server (apache2, mariadb, php5)

    +
    mail-utils WIP +

    Provides utilities for reading and sending email

    +
    message-broker-rabbitmq ACTIVE +

    Provides the RabbitMQ messaging service

    +
    net-utils ACTIVE +

    Provides an essential suite of core networking configuration and debug tools

    +
    network-advanced WIP +

    More utilities for advanced host-level networking; bridge, switch, netfilter, vpn etc.

    +
    network-basic ACTIVE +

    Provides a basic suite of networking utilities

    +
    network-proxy-client WIP +

    Tools for dealing with client-side network proxy settings.

    +
    openssh-server ACTIVE +

    Provides an SSH server (and client)

    +
    openstack-all-in-one WIP +

    Provides an All-in-one OpenStack deployment

    +
  • Includes (database-mariadb) bundle.

    +
  • Includes (database-mongodb) bundle.

    +
  • Includes (message-broker-rabbitmq) bundle.

    +
  • Includes (openstack-block-storage) bundle.

    +
  • Includes (openstack-block-storage-controller) bundle.

    +
  • Includes (openstack-compute) bundle.

    +
  • Includes (openstack-compute-controller) bundle.

    +
  • Includes (openstack-dashboard) bundle.

    +
  • Includes (openstack-database) bundle.

    +
  • Includes (openstack-identity) bundle.

    +
  • Includes (openstack-image) bundle.

    +
  • Includes (openstack-lbaas) bundle.

    +
  • Includes (openstack-network) bundle.

    +
  • Includes (openstack-object-storage) bundle.

    +
  • Includes (openstack-orchestration) bundle.

    +
  • Includes (openstack-python-clients) bundle.

    +
  • Includes (openstack-telemetry-controller) bundle.

    +
  • openstack-block-storage WIP +

    Provides an OpenStack Cinder service

    +
    openstack-block-storage-controller WIP +

    Provides an OpenStack Cinder controller service

    +
    openstack-compute WIP +

    Provides an OpenStack nova-compute node

    +
    openstack-compute-controller WIP +

    Provides an OpenStack Nova control server

    +
    openstack-configure WIP +

    Provides a suggested default configuration for OpenStack on Clear Linux.

    +
    openstack-controller WIP +

    Provides an OpenStack multi-service control server

    +
  • Includes (database-mariadb) bundle.

    +
  • Includes (message-broker-rabbitmq) bundle.

    +
  • Includes (openstack-identity) bundle.

    +
  • Includes (openstack-image) bundle.

    +
  • Includes (openstack-compute-controller) bundle.

    +
  • Includes (openstack-dashboard) bundle.

    +
  • Includes (openstack-python-clients) bundle.

    +
  • openstack-dashboard WIP +

    Provides an OpenStack Horizon server

    +
    openstack-database WIP +

    Provides a Database as a Service server

    +
    openstack-identity WIP +

    Provides an OpenStack Keystone server

    +
    openstack-image WIP +

    Provides an OpenStack Glance server

    +
    openstack-lbaas WIP +

    Provides Load Balancing as a Service

    +
    openstack-network WIP +

    Provides an OpenStack Neutron server

    +
    openstack-object-storage WIP +

    Provides an OpenStack Swift service

    +
    openstack-orchestration WIP +

    Provides an OpenStack Heat service

    +
    openstack-python-clients WIP +

    Provides OpenStack command-line utilities

    +
    openstack-telemetry-controller WIP +

    Provides an OpenStack Telemetry server

    +
    openstack-test-suite WIP +

    Provides an OpenStack Tempest/test suite

    +
    os-cloudguest WIP +

    Provides cloud-init cloud guest configuration utilities

    +
  • Includes (openssh-server) bundle.

    +
  • Includes (telemetrics) bundle.

    +
  • os-clr-on-clr WIP +

    content for development of the Clear Linux OS on the Clear Linux OS

    +
  • Includes (storage-utils) bundle.

    +
  • Includes (mail-utils) bundle.

    +
  • os-core ACTIVE +

    The basic core OS components of Clear Linux for iA

    +
    os-core-dev ACTIVE +

    Basic development tools

    +
    os-core-update ACTIVE +

    Provides basic suite for running the Clear Linux for iA Updater

    +
    os-installer ACTIVE +

    Provides an installer for Clear Linux for iA

    +
  • Includes (telemetrics) bundle.

    +
  • Includes (network-proxy-client) bundle.

    +
  • os-testsuite WIP +

    Provides basic test suite for Clear Linux for iA

    +
    os-testsuite-phoronix ACTIVE +

    All the required pieces for running the Phoronix Test Suite

    +
  • Includes (os-utils) bundle.

    +
  • Includes (devtools-basic) bundle.

    +
  • os-utils ACTIVE +

    Provides a core set of OS utilities

    +
  • Includes (editors) bundle.

    +
  • Includes (dev-utils) bundle.

    +
  • Includes (sysadmin) bundle.

    +
  • Includes (network-basic) bundle.

    +
  • Includes (file-utils) bundle.

    +
  • Includes (network-proxy-client) bundle.

    +
  • os-utils-gui ACTIVE +

    Provides a graphical desktop environment

    +
    perl-basic ACTIVE +

    Provides essential Perl language and dev tools

    +
    perl-extras ACTIVE +

    Provides extra libraries for Perl

    +
  • Includes (perl-basic) bundle.

    +
  • pnp-tools-advanced WIP +

    Provides advanced Power and Performance measurement tools

    +
    pnp-tools-basic WIP +

    Provides basic Power and Performance testing tools

    +
    pnp-tools-intermediate WIP +

    Provides a deeper-level suite of Power and Performance testing tools

    +
    python-basic ACTIVE +

    Provides core Python language and libraries

    +
    python-extras ACTIVE +

    Provides extra libraries for Python

    +
  • Includes (python-basic) bundle.

    +
  • R-basic ACTIVE +

    Provides core R language and libraries

    +
    R-extras ACTIVE +

    Provides deeper functionality R language libraries

    +
  • Includes (R-basic) bundle.

    +
  • ruby-basic ACTIVE +

    Top 3 basic Ruby Libraries

    +
    ruby-extras ACTIVE +

    Top 3 to 6 basic Ruby Libraries

    +
  • Includes (ruby-basic) bundle.

    +
  • shells ACTIVE +

    All available shell programs for Clear, along with ancillary files

    +
    storage-utils ACTIVE +

    Provides basic storage-related utilities

    +
    sysadmin ACTIVE +

    Provides a basic set of system administration utilities.

    +
    telemetrics ACTIVE +

    Provides the Telemetrics client for Clear Linux for iA

    +
    virtualbox-guest ACTIVE +

    Include the modules and binaries meant to be used as a VirtualBox instance

    +
    From 0a48ff6fca4ee7e10f36ac97d25013543cac6c2c Mon Sep 17 00:00:00 2001 From: "Tullis, Michael L" Date: Tue, 3 Nov 2015 14:13:18 -0700 Subject: [PATCH 06/48] Updating copyright info on index.rst file. --- source/index.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/source/index.rst b/source/index.rst index 1cb28266..0e7457fd 100644 --- a/source/index.rst +++ b/source/index.rst @@ -1,10 +1,6 @@ .. Clear Linux Project documentation master file - -.. include:: documentation_license.rst - - Getting started ############### @@ -65,3 +61,6 @@ Index and search * :ref:`genindex` * :ref:`search` + +.. include:: documentation_license.rst + From df905e8c3a14711495d04c6e60d64c3b98132cd1 Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Wed, 4 Nov 2015 15:18:31 -0600 Subject: [PATCH 07/48] Update openstack dashboard (Horizon) documentation for Liberty --- source/openstack_dashboard.rst | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/source/openstack_dashboard.rst b/source/openstack_dashboard.rst index dcdfcba9..c3fd849a 100644 --- a/source/openstack_dashboard.rst +++ b/source/openstack_dashboard.rst @@ -1,29 +1,29 @@ OpenStack* Dashboard -############################################################ +#################### The OpenStack Dashboard, also known as Horizon, is a web-based interface -for cloud administrators to manage various OpenStack resources and -services. This dashboard enables interaction with the OpenStack Compute -cloud controller via OpenStack APIs. +for cloud administrators and users to manage various OpenStack resources +and services. + +The Dashboard enables web-based interactions with the +OpenStack Compute cloud controller through the OpenStack APIs. Installation and configuration ------------------------------ -Please note that the dashboard relies on functional core services in -`OpenStack MVP `__, -including identity, image service, compute, and either networking -(``neutron``) or legacy networking (``nova-network``). - -Environments with stand-alone services, such as Object Storage, cannot -use the dashboard. +The dashboard relies on functional core services including +Identity, Image service, Compute, and either Networking (neutron) +or legacy networking (nova-network). Environments with +stand-alone services such as Object Storage cannot use the +dashboard. To get started with OpenStack Dashboard services: #. Install the OpenStack Dashboard bundle:: - # clr_bundle_add openstack-dashboard + # clr_bundle_add openstack-dashboard -#. Enable and start the memcached service and the httpd server:: +#. Enable and start the dashboard socket and the Nginx server:: - # systemctl enable httpd memcached - # systemctl restart httpd memcached + # systemctl enable nginx uwsgi@horizon.socket + # systemctl restart nginx uwsgi@horizon.service From 57009416cc25eb958ead1988cf1bd62f6c6b66c9 Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Wed, 4 Nov 2015 15:38:14 -0600 Subject: [PATCH 08/48] Address minor details in openstack identity (keystone) documentation --- source/openstack_identity.rst | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/source/openstack_identity.rst b/source/openstack_identity.rst index e46d7770..9ea01007 100644 --- a/source/openstack_identity.rst +++ b/source/openstack_identity.rst @@ -118,7 +118,7 @@ Install and configure components Replace ``KEYSTONE_DBPASS`` with the password you chose for the database. -#. Enter the following command:: +#. Ensure files have proper ownership by running the following command:: # systemctl restart update-triggers.target @@ -165,7 +165,7 @@ environment variables to reduce command length. $ export OS_TOKEN=294a4c8a8a475f9b9836 -#. Configure the endpoint:: +#. Configure the endpoint URL:: $ export OS_URL=http://controller:35357/v3 @@ -180,11 +180,12 @@ environment variables to reduce command length. Create the service entity and API endpoints ------------------------------------------- -The Identity service manages a catalog of services in your OpenStack -environment. Services use this catalog to determine the other services -available in your environment. -#. Create the service entity for the Identity service:: +#. The Identity service manages a catalog of services in your OpenStack + environment. Services use this catalog to determine the other services + available in your environment. + + Create the service entity for the Identity service:: $ openstack service create \ --name keystone --description "OpenStack Identity" identity @@ -198,7 +199,7 @@ available in your environment. | type | identity | +-------------+----------------------------------+ - The Identity service manages a catalog of API endpoints associated with +#. The Identity service manages a catalog of API endpoints associated with the services in your OpenStack environment. Services use this catalog to determine how to communicate with other services in your environment. @@ -216,7 +217,7 @@ available in your environment. management network for all endpoint variations and the default ``RegionOne`` region. -#. Create the Identity service API endpoints:: + Create the Identity service API endpoints:: $ openstack endpoint create --region RegionOne \ identity public http://controller:5000/v3 @@ -291,10 +292,12 @@ Complete the following steps to create projects, users and roles: +-------------+----------------------------------+ * Create the ``admin`` user. Replace ``ADMIN_PASS`` with a suitable - password and ``EMAIL_ADDRESS`` with a suitable e-mail address:: + password:: $ openstack user create --domain default \ - --password ADMIN_PASS --email EMAIL_ADDRESS admin + --password-prompt admin + User Password: + Repeat User Password: +-----------+----------------------------------+ | Field | Value | +-----------+----------------------------------+ @@ -357,11 +360,12 @@ Complete the following steps to create projects, users and roles: +-------------+----------------------------------+ * Create the ``demo`` user. Replace ``DEMO_PASS`` - with a suitable password and ``EMAIL_ADDRESS`` with a suitable - e-mail address:: + with a suitable password:: $ openstack user create --domain default \ - --password DEMO_PASS --email EMAIL_ADDRESS demo + --password-prompt demo + User Password: + Repeat User Password: +-----------+----------------------------------+ | Field | Value | +-----------+----------------------------------+ From 6e6ed026956d4028d706d170011c5276ac276d6b Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Wed, 4 Nov 2015 16:10:07 -0600 Subject: [PATCH 09/48] Add the nginx instructions to start the nova-api for Compute service (nova) --- source/openstack_compute.rst | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/source/openstack_compute.rst b/source/openstack_compute.rst index 4e1273d2..62d51de2 100644 --- a/source/openstack_compute.rst +++ b/source/openstack_compute.rst @@ -53,7 +53,9 @@ create a database, service credentials, and API endpoints. * Create the ``nova`` user. Replace ``NOVA_PASS`` with a suitable password:: - $ openstack user create --domain default --password NOVA_PASS nova + $ openstack user create --domain default --password-prompt nova + User Password: + Repeat User Password: +-----------+----------------------------------+ | Field | Value | +-----------+----------------------------------+ @@ -238,6 +240,12 @@ Finalizing Compute installation Complete the following steps to finalize Compute installation: +#. Create the ``/etc/nginx`` directory if doesn't exists and setup the + nova-api to start with the Nginx http server:: + + # mkdir -p /etc/nginx + # cp /usr/share/nginx/conf.d/nova-api.template /etc/nginx/nova-api.conf + #. Start the Compute Service services and configure them to start when the system boots:: From 6e431bb51d6c8bfacb6f55b34dee01040c994454 Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Wed, 4 Nov 2015 16:35:30 -0600 Subject: [PATCH 10/48] Add minor fixes for the compute service (Nova) --- source/openstack_compute.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/openstack_compute.rst b/source/openstack_compute.rst index 62d51de2..5d436110 100644 --- a/source/openstack_compute.rst +++ b/source/openstack_compute.rst @@ -382,6 +382,10 @@ Finalize compute node installation ... virt_type = qemu +#. Let systemd set the correct permissions for files in ``/etc/nova``:: + + # systemctl restart update-triggers.target + #. Start the Compute service including its dependencies and configure them to start automatically when the system boots:: From d04353be96af4e157030bea4f0a6aa715a04e960 Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Thu, 5 Nov 2015 14:48:44 -0600 Subject: [PATCH 11/48] Fix minor documentation details in compute, identity and compute. --- source/openstack_compute.rst | 5 ++--- source/openstack_identity-openrc.rst | 4 ++-- source/openstack_identity.rst | 6 ++---- source/openstack_image.rst | 2 +- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/source/openstack_compute.rst b/source/openstack_compute.rst index 5d436110..f826e4de 100644 --- a/source/openstack_compute.rst +++ b/source/openstack_compute.rst @@ -50,8 +50,7 @@ create a database, service credentials, and API endpoints. #. To create the service credentials, complete these steps: - * Create the ``nova`` user. Replace ``NOVA_PASS`` with a suitable - password:: + * Create the ``nova`` user:: $ openstack user create --domain default --password-prompt nova User Password: @@ -227,7 +226,7 @@ To install and configure the Compute controller components: ... host = controller -#. Let systemd set the correct permissions for files in ``/etc/nova``:: +#. Ensure files have proper ownership by running the following command:: # systemctl restart update-triggers.target diff --git a/source/openstack_identity-openrc.rst b/source/openstack_identity-openrc.rst index cea3d01e..2c56608d 100644 --- a/source/openstack_identity-openrc.rst +++ b/source/openstack_identity-openrc.rst @@ -17,7 +17,7 @@ Create client environment scripts for the ``admin`` and ``demo`` projects and users. Future portions of this guide reference these scripts to load appropriate credentials for client operations. -#. Edit the ``admin-openrc.sh`` file and add the following content:: +#. Create the ``admin-openrc.sh`` file and add the following content:: export OS_PROJECT_DOMAIN_ID=default export OS_USER_DOMAIN_ID=default @@ -31,7 +31,7 @@ scripts to load appropriate credentials for client operations. Replace ``ADMIN_PASS`` with the password you chose for the ``admin`` user in the Identity service. -#. Edit the ``demo-openrc.sh`` file and add the following content:: +#. Create the ``demo-openrc.sh`` file and add the following content:: export OS_PROJECT_DOMAIN_ID=default export OS_USER_DOMAIN_ID=default diff --git a/source/openstack_identity.rst b/source/openstack_identity.rst index 9ea01007..cb5b312c 100644 --- a/source/openstack_identity.rst +++ b/source/openstack_identity.rst @@ -291,8 +291,7 @@ Complete the following steps to create projects, users and roles: | parent_id | None | +-------------+----------------------------------+ - * Create the ``admin`` user. Replace ``ADMIN_PASS`` with a suitable - password:: + * Create the ``admin`` user:: $ openstack user create --domain default \ --password-prompt admin @@ -359,8 +358,7 @@ Complete the following steps to create projects, users and roles: | parent_id | None | +-------------+----------------------------------+ - * Create the ``demo`` user. Replace ``DEMO_PASS`` - with a suitable password:: + * Create the ``demo`` user:: $ openstack user create --domain default \ --password-prompt demo diff --git a/source/openstack_image.rst b/source/openstack_image.rst index 62fdfd99..f0b878b2 100644 --- a/source/openstack_image.rst +++ b/source/openstack_image.rst @@ -221,7 +221,7 @@ Install and configure components Replace ``GLANCE_PASS`` with the password you chose for the ``glance`` user in the Identity service. -#. Let systemd set the correct permissions for files in ``/etc/glance``:: +#. Ensure files have proper ownership by running the following command:: # systemctl restart update-triggers.target From 8ee1b5635e45cff911bce293720157136a02b08b Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Mon, 9 Nov 2015 11:49:25 -0600 Subject: [PATCH 12/48] Change for password-prompt in openstack image. --- source/openstack_image.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/openstack_image.rst b/source/openstack_image.rst index f0b878b2..4d338add 100644 --- a/source/openstack_image.rst +++ b/source/openstack_image.rst @@ -63,10 +63,11 @@ create a database, service credentials, and API endpoints. $ source admin-openrc.sh #. To create the service credentials, complete these steps: - * Create the ``glance`` user. Replace ``GLANCE_PASS`` with a suitable - password:: + * Create the ``glance`` user:: - $ openstack user create --domain default --password GLANCE_PASS glance + $ openstack user create --domain default --password-prompt glance + User Password: + Repeat User Password: +-----------+----------------------------------+ | Field | Value | +-----------+----------------------------------+ From 23258417050aea412d99bbfcd3b1a2915ddb0c46 Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Mon, 9 Nov 2015 12:26:57 -0600 Subject: [PATCH 13/48] Add instruction to restart the keystone-admin service in identity (keystone) --- source/openstack_identity.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/openstack_identity.rst b/source/openstack_identity.rst index cb5b312c..0d02a5ef 100644 --- a/source/openstack_identity.rst +++ b/source/openstack_identity.rst @@ -403,6 +403,10 @@ services. $ unset OS_TOKEN OS_URL +#. Restart the keystone-admin service to reload the changes:: + + # systemctl restart uwsgi@keystone-admin.service + #. As the ``admin`` user, request an authentication token:: $ openstack --os-auth-url http://controller:35357/v3 \ From 2d549a996645ecd34e2988bc5b124ccff8e5d6f3 Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Mon, 9 Nov 2015 12:29:33 -0600 Subject: [PATCH 14/48] Restart the socket instead of the service unit for Openstack dashboard (Horizon) --- source/openstack_dashboard.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/openstack_dashboard.rst b/source/openstack_dashboard.rst index c3fd849a..c54a58d6 100644 --- a/source/openstack_dashboard.rst +++ b/source/openstack_dashboard.rst @@ -26,4 +26,4 @@ To get started with OpenStack Dashboard services: #. Enable and start the dashboard socket and the Nginx server:: # systemctl enable nginx uwsgi@horizon.socket - # systemctl restart nginx uwsgi@horizon.service + # systemctl restart nginx uwsgi@horizon.socket From 7ab57a60118efef3911c6a492c538bc23b4c58a0 Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Mon, 9 Nov 2015 15:14:37 -0600 Subject: [PATCH 15/48] Use consistent instructions when reloading triggers in openstack compute (nova) --- source/openstack_compute.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/openstack_compute.rst b/source/openstack_compute.rst index f826e4de..0c2f5326 100644 --- a/source/openstack_compute.rst +++ b/source/openstack_compute.rst @@ -381,7 +381,7 @@ Finalize compute node installation ... virt_type = qemu -#. Let systemd set the correct permissions for files in ``/etc/nova``:: +#. Ensure files have proper ownership by running the following command:: # systemctl restart update-triggers.target From 23a90c13d0ce245983c6a8d0f88680c2e6d3442f Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Mon, 9 Nov 2015 15:15:57 -0600 Subject: [PATCH 16/48] rearrange instructions in ``verify operation`` openstack identity (keystone) --- source/openstack_identity.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/openstack_identity.rst b/source/openstack_identity.rst index 0d02a5ef..258195b0 100644 --- a/source/openstack_identity.rst +++ b/source/openstack_identity.rst @@ -394,19 +394,19 @@ Verify operation Verify operation of the Identity service before installing other services. -#. For security reasons, remove the admin_token value in +#. For security reasons, remove admin_token from ``/etc/keystone/keystone.conf``: Edit the ``[DEFAULT]`` section and remove ``admin_token``. -#. Unset the temporary ``OS_TOKEN`` and ``OS_URL`` environment variables:: - - $ unset OS_TOKEN OS_URL - #. Restart the keystone-admin service to reload the changes:: # systemctl restart uwsgi@keystone-admin.service +#. Unset the temporary ``OS_TOKEN`` and ``OS_URL`` environment variables:: + + $ unset OS_TOKEN OS_URL + #. As the ``admin`` user, request an authentication token:: $ openstack --os-auth-url http://controller:35357/v3 \ From 2835826e08f4da319ffd9e4941024042aa78679e Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Tue, 10 Nov 2015 10:38:36 -0600 Subject: [PATCH 17/48] Add missing instruction in openstack compute (nova) --- source/openstack_compute.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/openstack_compute.rst b/source/openstack_compute.rst index 0c2f5326..49160b8f 100644 --- a/source/openstack_compute.rst +++ b/source/openstack_compute.rst @@ -243,7 +243,11 @@ Complete the following steps to finalize Compute installation: nova-api to start with the Nginx http server:: # mkdir -p /etc/nginx - # cp /usr/share/nginx/conf.d/nova-api.template /etc/nginx/nova-api.conf + # ln -s /usr/share/nginx/conf.d/nova-api.template /etc/nginx/nova-api.conf + +#. Restart the Nginx server to reload new configurations:: + + # systemctl restart nginx #. Start the Compute Service services and configure them to start when the system boots:: From 77aa446bc74b30cf95bf7fe8bed44ef7a55c0341 Mon Sep 17 00:00:00 2001 From: Victor Morales Date: Tue, 10 Nov 2015 12:18:26 -0600 Subject: [PATCH 18/48] Rename OpenStack Supporting service files It was renamed those files which correspond to supporting services. Moreover, it was included the instruction to verify fix for installing the binaries of the bundles. Signed-off-by: Victor Morales --- source/index.rst | 4 ++-- source/openstack_installing_bundles.rst | 6 +++--- ...abase.rst => openstack_supporting-database.rst} | 4 +++- ...ging.rst => openstack_supporting-messaging.rst} | 14 +++++++------- 4 files changed, 15 insertions(+), 13 deletions(-) rename source/{openstack_environment-database.rst => openstack_supporting-database.rst} (96%) rename source/{openstack_environment-messaging.rst => openstack_supporting-messaging.rst} (81%) diff --git a/source/index.rst b/source/index.rst index 0e7457fd..20a06979 100644 --- a/source/index.rst +++ b/source/index.rst @@ -42,8 +42,8 @@ OpenStack* implementation openstack_bundle_and_service_summary openstack_sys_req_and_pw_summary openstack_installing_bundles - openstack_environment-database - openstack_environment-messaging + openstack_supporting-database + openstack_supporting-messaging openstack_identity openstack_identity-openrc openstack_image diff --git a/source/openstack_installing_bundles.rst b/source/openstack_installing_bundles.rst index 2201098f..0261105b 100644 --- a/source/openstack_installing_bundles.rst +++ b/source/openstack_installing_bundles.rst @@ -8,8 +8,8 @@ for your environment. To install, continue with the following topics: -* `Database `_ -* `Message queue `_ +* `Database `_ +* `Message queue `_ * `OpenStack Identity `_ * `Create OpenStack client environment scripts `_ * `OpenStack Image `_ @@ -19,4 +19,4 @@ To install, continue with the following topics: * `OpenStack Networking `_ * `OpenStack Orchestration `_ * `OpenStack Telemetry `_ -* `OpenStack Object Storage `_ \ No newline at end of file +* `OpenStack Object Storage `_ diff --git a/source/openstack_environment-database.rst b/source/openstack_supporting-database.rst similarity index 96% rename from source/openstack_environment-database.rst rename to source/openstack_supporting-database.rst index 84b9e017..e58ee1a4 100644 --- a/source/openstack_environment-database.rst +++ b/source/openstack_supporting-database.rst @@ -11,8 +11,10 @@ Install and configure the database server #. Install MariaDB bundle:: # clr_bundle_add database-mariadb + # swupd_verify --fix -#. Create the ``/etc/mariadb/`` folder and the ``/etc/mariadb/openstack.cnf`` file:: +#. Create the ``/etc/mariadb/`` folder and the ``/etc/mariadb/openstack.cnf`` + file:: # mkdir /etc/mariadb # touch /etc/mariadb/openstack.cnf diff --git a/source/openstack_environment-messaging.rst b/source/openstack_supporting-messaging.rst similarity index 81% rename from source/openstack_environment-messaging.rst rename to source/openstack_supporting-messaging.rst index 9f78c556..38109a87 100644 --- a/source/openstack_environment-messaging.rst +++ b/source/openstack_supporting-messaging.rst @@ -9,9 +9,10 @@ services. This guide implements the RabbitMQ message queue service. Install the message queue service --------------------------------- -#. Install the message queue bundle:: +#. Install the message queue bundle.:: - # clr_bundle_add message-broker-rabbitmq + # clr_bundle_add message-broker-rabbitmq + # swupd_verify --fix Configuring the message broker service -------------------------------------- @@ -19,25 +20,24 @@ Configuring the message broker service Complete the following steps to configure the message broker service: #. Message broker service needs to be able to resolve to itself. Add the - following line to ``/etc/hosts``:: + following line to ``/etc/hosts``.:: 127.0.0.1 controller #. Start the message broker service and configure it to start when the - system boots:: + system boots.:: # systemctl enable rabbitmq-server.service # systemctl start rabbitmq-server.service -#. Add the OpenStack user:: +#. Add the OpenStack user. Replace ``RABBIT_PASS`` with a suitable password.:: # rabbitmqctl add_user openstack RABBIT_PASS Creating user openstack ... ...done. - Replace ``RABBIT_PASS`` with a suitable password. -#. Permit configuration, write, and read access for the OpenStack user:: +#. Permit configuration, write, and read access for the OpenStack user.:: # rabbitmqctl set_permissions openstack ".*" ".*" ".*" Setting permissions for user "openstack" in vhost "/" ... From 9d6a3a9775668915ff728ee094231495be69dc7e Mon Sep 17 00:00:00 2001 From: Victor Morales Date: Tue, 10 Nov 2015 13:19:04 -0600 Subject: [PATCH 19/48] Reduce information about OpenStack Identity It was removed several paragraphs in order to reduce the amount of information available for users. The main idea is to provide only the informaration required for setting up a functional OpenStack deployment. Signed-off-by: Victor Morales --- source/openstack_identity.rst | 66 +++++++++++------------------------ 1 file changed, 20 insertions(+), 46 deletions(-) diff --git a/source/openstack_identity.rst b/source/openstack_identity.rst index 258195b0..95d0938b 100644 --- a/source/openstack_identity.rst +++ b/source/openstack_identity.rst @@ -1,38 +1,11 @@ OpenStack* Identity ################### -The OpenStack Identity service provides a single point of -integration for managing authentication, authorization, and service catalog -services. Other OpenStack services use the Identity service as a common -unified API. Additionally, services that provide information about users -but that are not included in OpenStack (such as LDAP services) can be -integrated into a pre-existing infrastructure. - -In order to benefit from the Identity service, other OpenStack services need to -collaborate with it. When an OpenStack service receives a request from a user, -it checks with the Identity service whether the user is authorized to make the -request. - -The Identity service contains these components: - -**Server** - A centralized server provides authentication and authorization - services using a RESTful interface. - -**Drivers** - Drivers or a service back end are integrated to the centralized - server. They are used for accessing identity information in - repositories external to OpenStack, and may already exist in - the infrastructure where OpenStack is deployed (for example, SQL - databases or LDAP servers). - -**Modules** - Middleware modules run in the address space of the OpenStack - component that is using the Identity service. These modules - intercept service requests, extract user credentials, and send them - to the centralized server for authorization. The integration between - the middleware modules and OpenStack components uses the Python* Web - Server Gateway Interface. +The OpenStack Identity service provides a single point of integration for +managing authentication, authorization, and service catalog services. +Additionally, it provides information about users but that are not included in +OpenStack (such as LDAP services) can be integrated into a pre-existing +infrastructure. When installing OpenStack Identity service, you must register each service in your OpenStack installation. Identity service can then track @@ -56,22 +29,22 @@ database and an administration token. #. To create the database, complete the following actions: * Use the database access client to connect to the database server as the - ``root`` user:: + ``root`` user.:: $ mysql -u root -p - * Create the ``keystone`` database:: + * Create the ``keystone`` database.:: CREATE DATABASE keystone; - * Grant proper access to the ``keystone`` database:: + * Grant proper access to the ``keystone`` databaseReplace ``KEYSTONE_DBPASS`` + with a suitable password.:: GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \ IDENTIFIED BY 'KEYSTONE_DBPASS'; GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \ IDENTIFIED BY 'KEYSTONE_DBPASS'; - Replace ``KEYSTONE_DBPASS`` with a suitable password. * Exit the database access client. @@ -83,17 +56,18 @@ database and an administration token. Install and configure components -------------------------------- -#. Run the following command to install the packages:: +#. Run the following command to install the packages.:: # clr_bundle_add openstack-identity + # swupd_verify --fix #. Custom configurations will be located at ``/etc/keystone/``. - * Create the ``/etc/keystone`` directory:: + * Create the ``/etc/keystone`` directory.:: # mkdir /etc/keystone - * Create empty keystone configuration file ``/etc/keystone/keystone.conf``:: + * Create keystone configuration file ``/etc/keystone/keystone.conf``.:: # touch /etc/keystone/keystone.conf @@ -101,22 +75,20 @@ Install and configure components actions: * In the ``[DEFAULT]`` section, define the value of the initial - administration token:: + administration token. Replace ``ADMIN_TOKEN`` with the random value that + you generated in a previous step.:: [DEFAULT] ... admin_token = ADMIN_TOKEN - Replace ``ADMIN_TOKEN`` with the random value that you generated in a - previous step. - - * In the ``[database]`` section, configure database access:: + * In the ``[database]`` section, configure database access. Replace + ``KEYSTONE_DBPASS`` with the password you chose for the database.:: [database] ... connection = mysql://keystone:KEYSTONE_DBPASS@controller/keystone - Replace ``KEYSTONE_DBPASS`` with the password you chose for the database. #. Ensure files have proper ownership by running the following command:: @@ -130,7 +102,7 @@ Finalize the installation ------------------------- #. Keystone is deployed as a uwsgi module. To start the Identity - service, you should enable and start the nginx service:: + service, you should enable and start the nginx service.:: # systemctl enable nginx uwsgi@keystone-admin.socket \ uwsgi@keystone-public.socket @@ -176,6 +148,8 @@ environment variables to reduce command length. #. Install the OpenStack Python clients bundle:: # clr_bundle_add openstack-python-clients + # swupd_verify --fix + Create the service entity and API endpoints ------------------------------------------- From 6c621540c88c011dc2cf55813ecdea568a4a532f Mon Sep 17 00:00:00 2001 From: Victor Morales Date: Tue, 10 Nov 2015 13:31:42 -0600 Subject: [PATCH 20/48] Initial draft for README file Signed-off-by: Victor Morales --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..12caf8b3 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +Summary +======= + +`project-docs` is the project that hosts documentation about Clear Linux for +Intel Architecture project. This source code was written in MarkDown format +for its simplicity and converted/published in HTML. + +**Getting Started** + +These are the steps to generate html files for output validation. From 60c59b7b56fd3e4e91722f6743deac805c2bee3b Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Tue, 10 Nov 2015 11:46:34 -0600 Subject: [PATCH 21/48] Add nova-metadata instructions to start in openstack compute (nova) --- source/openstack_compute.rst | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/source/openstack_compute.rst b/source/openstack_compute.rst index 49160b8f..00c2965a 100644 --- a/source/openstack_compute.rst +++ b/source/openstack_compute.rst @@ -239,11 +239,12 @@ Finalizing Compute installation Complete the following steps to finalize Compute installation: -#. Create the ``/etc/nginx`` directory if doesn't exists and setup the - nova-api to start with the Nginx http server:: +#. Create the ``/etc/nginx`` directory if doesn't exists and setup nova-api + and nova-metadata to start with the Nginx http server:: # mkdir -p /etc/nginx # ln -s /usr/share/nginx/conf.d/nova-api.template /etc/nginx/nova-api.conf + # ln -s /usr/share/nginx/conf.d/nova-metadata.template /etc/nginx/nova-metadata.conf #. Restart the Nginx server to reload new configurations:: @@ -253,13 +254,13 @@ Complete the following steps to finalize Compute installation: when the system boots:: # systemctl enable uwsgi@nova-api.socket \ - nova-cert.service nova-consoleauth.service \ - nova-scheduler.service nova-conductor.service \ - nova-novncproxy.service + uwsgi@nova-metadata.socket nova-cert.service \ + nova-consoleauth.service nova-scheduler.service \ + nova-conductor.service nova-novncproxy.service # systemctl start uwsgi@nova-api.socket \ - nova-cert.service nova-consoleauth.service \ - nova-scheduler.service nova-conductor.service \ - nova-novncproxy.service + uwsgi@nova-metadata.socket nova-cert.service \ + nova-consoleauth.service nova-scheduler.service \ + nova-conductor.service nova-novncproxy.service Install and configure a compute note ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From c5331edcb7e21b8f5645f0825afa662ee10e6ad3 Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Tue, 10 Nov 2015 16:30:52 -0600 Subject: [PATCH 22/48] Update openstack block storage (Cinder) documentation for Liberty --- source/openstack_block_storage.rst | 595 +++++++++++++++++------------ 1 file changed, 344 insertions(+), 251 deletions(-) diff --git a/source/openstack_block_storage.rst b/source/openstack_block_storage.rst index d29dadea..a5a60009 100644 --- a/source/openstack_block_storage.rst +++ b/source/openstack_block_storage.rst @@ -1,169 +1,222 @@ OpenStack* Block Storage -############################################################ +######################## -Clear Linux* OS for Intel® Architecture can be used with the -OpenStack Block Storage service (cinder) to add persistent storage -options to a virtual machine. Block Storage provides an infrastructure -for managing volumes and interacting with OpenStack Compute (nova) to -provide volumes for specific instances. These volumes can be easily -managed (types and snapshots) under Block Storage. Here's how to get -OpenStack Block Storage working with Clear Linux OS for Intel -Architecture: +The OpenStack Block Storage service (cinder) adds persistent storage to +a virtual machine. Block Storage provides an infrastructure for managing +volumes, and interacts with OpenStack Compute to provide volumes for +instances. The service also enables management of volume snapshots, and +volume types. -Installing and configuring the controller node ----------------------------------------------------- +Install and configure controller node +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The first step is to install and configure the Block Storage service, -code-named cinder, on the controller node. This service requires at -least one additional storage node that provides volumes to instances. +This section describes how to install and configure the Block +Storage service, code-named cinder, on the controller node. This +service requires at least one additional storage node that provides +volumes to instances. Prerequisites: -~~~~~~~~~~~~~~~~~~ +-------------- -Before installing and configuring the Block Storage service, create a -database, service credentials, and an API endpoint. To create the -database, complete these steps: +Before you install and configure the Block Storage service, you -**Create a database:** +#. To create the database, complete these steps: -#. Use the database access client to connect to the database server as - the root user:: + * Use the database access client to connect to the database + server as the ``root`` user:: - $ mysql -u root -p + $ mysql -u root -p -#. Create the cinder database:: - - CREATE DATABASE cinder; + * Create the ``cinder`` database:: -#. Grant proper access to the cinder database. Replace ``CINDER_DBPASS`` - with a suitable password:: + CREATE DATABASE cinder; - GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' \ - IDENTIFIED BY 'CINDER_DBPASS'; - GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' \ - IDENTIFIED BY 'CINDER_DBPASS'; + * Grant proper access to the ``cinder`` database:: -#. Exit the database access client. + GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' \ + IDENTIFIED BY 'CINDER_DBPASS'; + GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' \ + IDENTIFIED BY 'CINDER_DBPASS'; -**Create service credentials:** + Replace ``CINDER_DBPASS`` with a suitable password. -#. Now source the admin credentials to gain access to admin-only CLI - commands:: + * Exit the database access client. - $ source admin-openrc.sh +#. Source the ``admin`` credentials to gain access to admin-only + CLI commands:: + + $ source admin-openrc.sh #. To create the service credentials, complete these steps: - * Create a cinder user:: - - $ openstack user create --password-prompt cinder - User Password: - Repeat User Password: - +----------+----------------------------------+ - | Field | Value | - +----------+----------------------------------+ - | email | None | - | enabled | True | - | id | 881ab2de4f7941e79504a759a83308be | - | name | cinder | - | username | cinder | - +----------+----------------------------------+ + * Create a ``cinder`` user:: - * Add the admin role to the cinder user:: - - $ openstack role add --project service --user cinder admin - +-------+----------------------------------+ - | Field | Value | - +-------+----------------------------------+ - | id | cd2cb9a39e874ea69e5d4b896eb16128 | - | name | admin | - +-------+----------------------------------+ + $ openstack user create --domain default --password-prompt cinder + User Password: + Repeat User Password: + +-----------+----------------------------------+ + | Field | Value | + +-----------+----------------------------------+ + | domain_id | default | + | enabled | True | + | id | bb279f8ffc444637af38811a5e1f0562 | + | name | cinder | + +-----------+----------------------------------+ - * Now create the cinder service entities:: - - $ openstack service create --name cinder \ - --description "OpenStack Block Storage" volume - | Field | Value | - +-------------+----------------------------------+ - | description | OpenStack Block Storage | - | enabled | True | - | id | 1e494c3e22a24baaafcaf777d4d467eb | - | name | cinder | - | type | volume | - +-------------+----------------------------------+ - $ openstack service create --name cinderv2 - --description "OpenStack Block Storage" volumev2 - +-------------+----------------------------------+ - | Field | Value | - +-------------+----------------------------------+ - | description | OpenStack Block Storage | - | enabled | True | - | id | 16e038e449c94b40868277f1d801edb5 | - | name | cinderv2 | - | type | volumev2 | - +-------------+----------------------------------+ + * Add the ``admin`` role to the ``cinder`` user:: -**Create service endpoints:** + $ openstack role add --project service --user cinder admin -The last prerequisite is to create the Block Storage service API endpoints:: + * Create the ``cinder`` and ``cinderv2`` service entities:: - $ openstack endpoint create \ - --publicurl http://controller:8776/v2/%\(tenant_id\)s \ - --internalurl http://controller:8776/v2/%\(tenant_id\)s \ - --adminurl http://controller:8776/v2/%\(tenant_id\)s \ - --region RegionOne \ - volume - +--------------+-----------------------------------------+ - |Field | Value + - |--------------+-----------------------------------------+ - | adminurl | http://controller:8776/v2/%(tenant_id)s | - | id | d1b7291a2d794e26963b322c7f2a55a4 | - | internalurl | http://controller:8776/v2/%(tenant_id)s | - | publicurl | http://controller:8776/v2/%(tenant_id)s | - | region | RegionOne | - | service_id | 1e494c3e22a24baaafcaf777d4d467eb | - | service_name | cinder | - | service_type | volume | - +--------------+-----------------------------------------+ - $ openstack endpoint create \ - --publicurl http://controller:8776/v2/%\(tenant_id\)s \ - --internalurl http://controller:8776/v2/%\(tenant_id\)s \ - --adminurl http://controller:8776/v2/%\(tenant_id\)s \ - --region RegionOne \ - volumev2 - +--------------+-----------------------------------------+ - | Field | Value | - +--------------+-----------------------------------------+ - | adminurl | http://controller:8776/v2/%(tenant_id)s | - | id | 097b4a6fc8ba44b4b10d4822d2d9e076 | - | internalurl | http://controller:8776/v2/%(tenant_id)s | - | publicurl | http://controller:8776/v2/%(tenant_id)s | - | region | RegionOne | - | service_id | 16e038e449c94b40868277f1d801edb5 | - | service_name | cinderv2 | - | service_type | volumev2 | - +--------------+-----------------------------------------+ + $ openstack service create --name cinder \ + --description "OpenStack Block Storage" volume + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | OpenStack Block Storage | + | enabled | True | + | id | ab3bbbef780845a1a283490d281e7fda | + | name | cinder | + | type | volume | + +-------------+----------------------------------+ -Installing and configuring Block Storage controller components -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + $ openstack service create --name cinderv2 \ + --description "OpenStack Block Storage" volumev2 + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | OpenStack Block Storage | + | enabled | True | + | id | eb9fd245bdbc414695952e93f29fe3ac | + | name | cinderv2 | + | type | volumev2 | + +-------------+----------------------------------+ -Once your prerequisites are finished, you can install and configure -Block Storage controller components: + .. note:: + + The Block Storage services requires two service entities. + +#. Create the Block Storage service API endpoints:: + + $ openstack endpoint create --region RegionOne \ + volume public http://controller:8776/v1/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 03fa2c90153546c295bf30ca86b1344b | + | interface | public | + | region | RegionOne | + | region_id | RegionOne | + | service_id | ab3bbbef780845a1a283490d281e7fda | + | service_name | cinder | + | service_type | volume | + | url | http://controller:8776/v1/%(tenant_id)s | + +--------------+-----------------------------------------+ + + $ openstack endpoint create --region RegionOne \ + volume internal http://controller:8776/v1/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 94f684395d1b41068c70e4ecb11364b2 | + | interface | internal | + | region | RegionOne | + | region_id | RegionOne | + | service_id | ab3bbbef780845a1a283490d281e7fda | + | service_name | cinder | + | service_type | volume | + | url | http://controller:8776/v1/%(tenant_id)s | + +--------------+-----------------------------------------+ + + $ openstack endpoint create --region RegionOne \ + volume admin http://controller:8776/v1/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 4511c28a0f9840c78bacb25f10f62c98 | + | interface | admin | + | region | RegionOne | + | region_id | RegionOne | + | service_id | ab3bbbef780845a1a283490d281e7fda | + | service_name | cinder | + | service_type | volume | + | url | http://controller:8776/v1/%(tenant_id)s | + +--------------+-----------------------------------------+ + + $ openstack endpoint create --region RegionOne \ + volumev2 public http://controller:8776/v2/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 513e73819e14460fb904163f41ef3759 | + | interface | public | + | region | RegionOne | + | region_id | RegionOne | + | service_id | eb9fd245bdbc414695952e93f29fe3ac | + | service_name | cinderv2 | + | service_type | volumev2 | + | url | http://controller:8776/v2/%(tenant_id)s | + +--------------+-----------------------------------------+ + + $ openstack endpoint create --region RegionOne \ + volumev2 internal http://controller:8776/v2/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 6436a8a23d014cfdb69c586eff146a32 | + | interface | internal | + | region | RegionOne | + | region_id | RegionOne | + | service_id | eb9fd245bdbc414695952e93f29fe3ac | + | service_name | cinderv2 | + | service_type | volumev2 | + | url | http://controller:8776/v2/%(tenant_id)s | + +--------------+-----------------------------------------+ + + $ openstack endpoint create --region RegionOne \ + volumev2 admin http://controller:8776/v2/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | e652cf84dd334f359ae9b045a2c91d96 | + | interface | admin | + | region | RegionOne | + | region_id | RegionOne | + | service_id | eb9fd245bdbc414695952e93f29fe3ac | + | service_name | cinderv2 | + | service_type | volumev2 | + | url | http://controller:8776/v2/%(tenant_id)s | + +--------------+-----------------------------------------+ + + .. note:: + + The Block Storage services requires endpoints for each service + entity. + +Install and configure components +-------------------------------- #. Install OpenStack Block Storage Controller bundle:: - - # clr_bundle_add openstack-block-storage-controller + + # clr_bundle_add openstack-block-storage-controller #. Custom configurations will be located at ``/etc/cinder``. * Create ``/etc/cinder`` directory:: - - mkdir /etc/cinder + + mkdir /etc/cinder * Create empty cinder configuration file in ``/etc/cinder/cinder.conf``:: - touch /etc/cinder/cinder.conf + touch /etc/cinder/cinder.conf #. Edit the ``/etc/cinder/cinder.conf`` file and complete the following actions: @@ -172,104 +225,119 @@ Block Storage controller components: ``CINDER_DBPASS`` with the password you chose for the database:: - [database] - ... - connection=mysql://cinder:CINDER_DBPASS@controller/cinder + [database] + ... + connection=mysql://cinder:CINDER_DBPASS@controller/cinder * In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` section, configure RabbitMQ message queue access. Replace ``RABBIT_PASS`` with the password you chose for the account in RabbitMQ:: - [DEFAULT] - ... - rpc_backend = rabbit - ... - [oslo_messaging_rabbit] - rabbit_host = controller - rabbit_userid = openstack - rabbit_password = RABBIT_PASS + [DEFAULT] + ... + rpc_backend = rabbit + + [oslo_messaging_rabbit] + ... + rabbit_host = controller + rabbit_userid = openstack + rabbit_password = RABBIT_PASS * In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, - configure Identity service access. Replace ``CINDER_PASS`` with the - password you chose for the cinder user in the Identity - service:: + configure Identity service access: - [DEFAULT] - ... - auth_strategy = keystone - ... - [keystone_authtoken] - auth_uri = http://controller:5000/v2.0 - admin_tenant_name = service - admin_user = cinder - admin_password = CINDER_PASS + .. code-block:: ini + + [DEFAULT] + ... + auth_strategy = keystone + + [keystone_authtoken] + ... + auth_uri = http://controller:5000 + auth_url = http://controller:35357 + auth_plugin = password + project_domain_id = default + user_domain_id = default + project_name = service + username = cinder + password = CINDER_PASS + + Replace ``CINDER_PASS`` with the password you chose for + the ``cinder`` 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:: + use the management interface IP address of the controller node: - [DEFAULT] ... my_ip = 10.0.0.11 + .. code-block:: ini -#. Let ``systemd`` set the correct permissions for files in ``/etc/cinder``:: - - # systemctl restart update-triggers.target + [DEFAULT] + ... + my_ip = 10.0.0.11 #. Populate the Block Storage database:: - - # su -s /bin/sh -c "cinder-manage db sync" cinder -Finalizing installation -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # su -s /bin/sh -c "cinder-manage db sync" cinder -To finalize installation, enable and start the Block Storage services:: +Configure Compute to use Block Storage +-------------------------------------- - # systemctl enable cinder-api cinder-scheduler - # systemctl start cinder-api cinder-scheduler +* Edit the ``/etc/nova/nova.conf`` file and add the following + to it:: -Installing and configuring a storage node ----------------------------------------------- + [cinder] + os_region_name = RegionOne -This section describes how to install and configure storage nodes for -the Block Storage service. For simplicity, this configuration references -one storage node with an empty local block storage device ``/dev/sdb`` -(for physical device) or ``/dev/vda`` (for virtual machine) that -contains a suitable partition table with one partition ``/dev/sdb1`` -occupying the entire device. The service provisions logical volumes on -this device using the LVM driver and provides them to instances via -iSCSI transport. You can follow these instructions with minor -modifications to horizontally scale your environment with additional -storage nodes. +Finalize installation +--------------------- -Install Block Storage volume components -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#. Restart the Compute API service:: -Install the packages:: + # systemctl restart uwsgi@nova-api.service - # clr_bundle_add openstack-block-storage +#. Start the Block Storage services and configure them to start when + the system boots:: -**Prerequisites:** + # systemctl enable cinder-api cinder-scheduler + # systemctl start cinder-api cinder-scheduler -You must configure the storage node before installing and configuring -the volume service on it. Similar to the controller node, the storage -node contains one network interface on the management network. The -storage node also needs an empty block storage device of suitable size -for your environment. +Install and configure a storage node +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section describes how to install and configure storage nodes +for the Block Storage service. For simplicity, this configuration +references one storage node with an empty local block storage device. +The instructions use ``/dev/sdb``, but you can substitute a different +value for your particular node. + +The service provisions logical volumes on this device using the +LVM driver and provides them to instances via iSCSI transport. +You can follow these instructions with minor modifications to +horizontally scale your environment with additional storage nodes. + +Prerequisites +------------- + +#. Install the openstack block storage bundle:: + + # clr_bundle_add openstack-block-storage #. Create the LVM physical volume: ``/dev/sdb1`` If your system uses a different device name, adjust these steps accordingly:: - # pvcreate /dev/sdb1 - Physical volume "/dev/sdb1" successfully created + # pvcreate /dev/sdb1 + Physical volume "/dev/sdb1" successfully created #. Create the LVM volume group ``cinder-volumes``:: - - # vgcreate cinder-volumes /dev/sdb1 - Volume group "cinder-volumes" successfully created + + # vgcreate cinder-volumes /dev/sdb1 + Volume group "cinder-volumes" successfully created The Block Storage service creates logical volumes in this volume group. - Only instances can access Block Storage volumes. However, the +#. Only instances can access Block Storage 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 @@ -277,19 +345,18 @@ for your environment. 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`` volume group. - -#. Edit the ``/etc/lvm/lvm.conf`` file + ``cinder-volume`` volume group. Edit the ``/etc/lvm/lvm.conf`` file and complete the following action: * In the ``devices`` section, add a filter that accepts the ``/dev/sdb`` device and rejects all other devices:: - devices { - filter = [ "a/sdb/", "r/.*/"] - } + devices { + filter = [ "a/sdb/", "r/.*/"] + } -**Configure Block Storage volume components:** +Install and configure components +-------------------------------- #. Edit the ``/etc/cinder/cinder.conf`` file and complete the following actions: @@ -298,93 +365,119 @@ for your environment. ``CINDER_DBPASS`` with the password you chose for the Block Storage database:: - [database] - ... + [database] + ... connection = mysql://cinder:CINDER_DBPASS@controller/cinder * In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, - configure *RabbitMQ* message queue access. Replace ``RABBIT_PASS`` + configure ``RabbitMQ`` message queue access. Replace ``RABBIT_PASS`` with the password you chose for the openstack account in - *RabbitMQ*:: + ``RabbitMQ``:: - [DEFAULT] - ... - rpc_backend = rabbit - [oslo_messaging_rabbit] - ... - rabbit_host = controller - rabbit_userid = openstack - rabbit_password = RABBIT_PASS + [DEFAULT] + ... + rpc_backend = rabbit + + [oslo_messaging_rabbit] + ... + rabbit_host = controller + rabbit_userid = openstack + rabbit_password = RABBIT_PASS * In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, configure Identity service access. Replace ``CINDER_PASS`` with the password you chose for the cinder user in the Identity service:: - [DEFAULT] - ... - auth_strategy = keystone - [keystone_authtoken] - ... - auth_uri = http://controller:5000 - identity_uri = http://controller:35357 - admin_tenant_name = service - admin_user = cinder - admin_password = CINDER_PASS + [DEFAULT] + ... + auth_strategy = keystone + + [keystone_authtoken] + ... + auth_uri = http://controller:5000 + auth_url = http://controller:35357 + auth_plugin = password + project_domain_id = default + user_domain_id = default + project_name = service + username = cinder + password = CINDER_PASS * In the ``[DEFAULT]`` section, configure the ``my_ip`` option. - Replace *MANAGEMENT_INTERFACE_IP_ADDRESS* with the 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 example architecture:: - [DEFAULT] - ... - my_ip = MANAGEMENT_INTERFACE_IP_ADDRESS + [DEFAULT] + ... + my_ip = MANAGEMENT_INTERFACE_IP_ADDRESS * In the ``[lvm]`` section, configure the LVM back end with the LVM driver, ``cinder-volumes`` volume group, iSCSI protocol, and appropriate iSCSI service:: - [lvm] - ... - volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver - volume_group = cinder-volumes - iscsi_protocol = iscsi - iscsi_helper = tgtadm + [lvm] + ... + volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver + volume_group = cinder-volumes + iscsi_protocol = iscsi + iscsi_helper = tgtadm * In the ``[DEFAULT]`` section, enable the LVM back end:: - - [DEFAULT] - ... - enabled_backends = lvm + + [DEFAULT] + ... + enabled_backends = lvm * In the ``[DEFAULT]`` section, configure the location of the Image service:: - [DEFAULT] - ... - glance_host = controller + [DEFAULT] + ... + glance_host = controller #. Let systemd set the correct permissions for files in ``/etc/cinder``:: - - # systemctl restart update-triggers.target -Finalizing installation -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # systemctl restart update-triggers.target -Restart the Block Storage volume service including its dependencies:: +Finalize installation +--------------------- - # systemctl enable iscsid tgtd cinder-volume - # systemctl start iscsid tgtd cinder-volume +#. Start the Block Storage volume service including its dependencies + and configure them to start when the system boots:: + + # systemctl enable iscsid tgtd cinder-volume + # systemctl start iscsid tgtd cinder-volume Configuring a compute node to use Block Storage -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +----------------------------------------------- -Perform the following steps to enable a compute node to work with block -storage:: +#. Perform the following steps to enable a compute node to work with + block storage:: - # systemctl enable iscsid - # systemctl start iscsi-gen-initiatorname - # systemctl start iscsid + # systemctl enable iscsid + # systemctl start iscsi-gen-initiatorname iscsid +Verify operation +~~~~~~~~~~~~~~~~ +Verify operation of the Block Storage service. +.. note:: + + Perform these commands on the controller node. + +#. Source the ``admin`` credentials to gain access to + admin-only CLI commands:: + + $ source admin-openrc.sh + +#. List service components to verify successful launch of each process:: + + $ cinder service-list + +------------------+------------+------+---------+-------+----------------------------+-----------------+ + | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason | + +------------------+------------+------+---------+-------+----------------------------+-----------------+ + | cinder-scheduler | controller | nova | enabled | up | 2014-10-18T01:30:54.000000 | None | + | cinder-volume | block1@lvm | nova | enabled | up | 2014-10-18T01:30:57.000000 | None | + +------------------+------------+------+---------+-------+----------------------------+-----------------+ From b01b4a5e615ed6521ecf552efd1912ab49ebd374 Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Tue, 10 Nov 2015 16:35:16 -0600 Subject: [PATCH 23/48] remove unnecessary note from openstack block storage (Cinder) --- source/openstack_block_storage.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/openstack_block_storage.rst b/source/openstack_block_storage.rst index a5a60009..7d92a8c8 100644 --- a/source/openstack_block_storage.rst +++ b/source/openstack_block_storage.rst @@ -463,10 +463,6 @@ Verify operation ~~~~~~~~~~~~~~~~ Verify operation of the Block Storage service. -.. note:: - - Perform these commands on the controller node. - #. Source the ``admin`` credentials to gain access to admin-only CLI commands:: From ef959e42d8ab6c737ae91820a246864ee09cb6d8 Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Tue, 10 Nov 2015 16:57:17 -0600 Subject: [PATCH 24/48] Fix explanation to say we're using rst instead of md --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 12caf8b3..657896c6 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,9 @@ -Summary -======= +#Summary `project-docs` is the project that hosts documentation about Clear Linux for -Intel Architecture project. This source code was written in MarkDown format -for its simplicity and converted/published in HTML. +Intel Architecture project. This source code was written in reStructuredText +format (`*.rst`) for its simplicity and converted/published in HTML. -**Getting Started** +##Getting Started These are the steps to generate html files for output validation. From 346d0129b73364832761eeabf69abaf9f9db1d55 Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Tue, 10 Nov 2015 17:00:18 -0600 Subject: [PATCH 25/48] fix headers --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 657896c6..0c4cc881 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ -#Summary +Summary +======= `project-docs` is the project that hosts documentation about Clear Linux for Intel Architecture project. This source code was written in reStructuredText format (`*.rst`) for its simplicity and converted/published in HTML. -##Getting Started +Getting Started +--------------- These are the steps to generate html files for output validation. From 20263d6eb412034b2b2424d0f80a843c8253984f Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Tue, 10 Nov 2015 17:06:29 -0600 Subject: [PATCH 26/48] change file from MarkDown to rst to keep consistency. --- README.md | 11 ----------- README.rst | 12 ++++++++++++ 2 files changed, 12 insertions(+), 11 deletions(-) delete mode 100644 README.md create mode 100644 README.rst diff --git a/README.md b/README.md deleted file mode 100644 index 0c4cc881..00000000 --- a/README.md +++ /dev/null @@ -1,11 +0,0 @@ -Summary -======= - -`project-docs` is the project that hosts documentation about Clear Linux for -Intel Architecture project. This source code was written in reStructuredText -format (`*.rst`) for its simplicity and converted/published in HTML. - -Getting Started ---------------- - -These are the steps to generate html files for output validation. diff --git a/README.rst b/README.rst new file mode 100644 index 00000000..fb4507ad --- /dev/null +++ b/README.rst @@ -0,0 +1,12 @@ +Summary +======= + +``project-docs`` is the project that hosts the documentation for the **Clear +Linux\* project for Intel® Architecture.** This source code was written in +reStructuredText format (``*.rst``) for its simplicity and then +converted/published in HTML. + +Getting Started +--------------- + +These are the steps to generate html files for output validation. From 292871597d7520defd01cfbea7339dfae92e1a04 Mon Sep 17 00:00:00 2001 From: Victor Morales Date: Tue, 10 Nov 2015 17:41:38 -0600 Subject: [PATCH 27/48] Reduce the information about OpenStack Image It was reduced the amount of information provided to the user. The idea is to only offer minimal information to setup a functional service in order to highlight those differences that Clear Linux offers. Signed-off-by: Victor Morales --- source/openstack_image.rst | 170 +++++++++---------------------------- 1 file changed, 39 insertions(+), 131 deletions(-) diff --git a/source/openstack_image.rst b/source/openstack_image.rst index 4d338add..249fd593 100644 --- a/source/openstack_image.rst +++ b/source/openstack_image.rst @@ -1,44 +1,27 @@ OpenStack* Image ################ -The OpenStack Image service (glance) enables users to discover, -register, and retrieve virtual machine images. It offers a -`REST` API that enables you to query virtual -machine image metadata and retrieve an actual image. -You can store virtual machine images made available through -the Image service in a variety of locations, from simple file -systems to object-storage systems like OpenStack Object Storage. - - **Important:** For simplicity, this guide describes configuring the Image service to - use the ``file`` back end, which uploads and stores in a - directory on the controller node hosting the Image service. By - default, this directory is ``/var/lib/glance/images/``. - - Before you proceed, ensure that the controller node has at least - several gigabytes of space available in this directory. - - For information on requirements for other back ends, see - `Configuration Reference `_. +The OpenStack Image service (glance) enables users to discover, register, and +retrieve virtual machine images. Install and configure the Image Service --------------------------------------- -This section describes how to install and configure the Image service, -code-named glance, on the controller node. For simplicity, this -configuration stores images on the local file system. +This section describes how to install and configure the Image service, +code-named glance, on the controller node. For simplicity, this configuration +stores images on the local file system. By default, this directory is +``/var/lib/glance/images/``. Prerequisites ~~~~~~~~~~~~~ -Before you install and configure the Image service, you must -create a database, service credentials, and API endpoints. +Before you install and configure the Image 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:: + server as the ``root`` user.:: $ mysql -u root -p @@ -46,21 +29,20 @@ create a database, service credentials, and API endpoints. CREATE DATABASE glance; - * Grant proper access to the ``glance`` database:: + * Grant proper access to the ``glance`` database. Replace ``GLANCE_DBPASS`` + with a suitable password.:: GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' \ IDENTIFIED BY 'GLANCE_DBPASS'; GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' \ IDENTIFIED BY 'GLANCE_DBPASS'; - Replace ``GLANCE_DBPASS`` with a suitable password. - * Exit the database access client. -#. Source the ``admin`` credentials to gain access to - admin-only CLI commands:: +#. Source the ``admin`` credentials to gain access to admin-only CLI commands.:: + + $ source admin-openrc.sh - $ source admin-openrc.sh #. To create the service credentials, complete these steps: * Create the ``glance`` user:: @@ -77,12 +59,11 @@ create a database, service credentials, and API endpoints. | name | glance | +-----------+----------------------------------+ - * Add the ``admin`` role to the ``glance`` user and - ``service`` project:: + * Add the ``admin`` role to the ``glance`` user and ``service`` project.:: $ openstack role add --project service --user glance admin - * Create the ``glance`` service entity:: + * Create the ``glance`` service entity.:: $ openstack service create --name glance \ --description "OpenStack Image service" image @@ -96,7 +77,7 @@ create a database, service credentials, and API endpoints. | type | image | +-------------+----------------------------------+ -#. Create the Image service API endpoints:: +#. Create the Image service API endpoints.:: $ openstack endpoint create --region RegionOne \ image public http://controller:9292 @@ -149,35 +130,36 @@ create a database, service credentials, and API endpoints. Install and configure components -------------------------------- -#. Install OpenStack Image bundle:: +#. Install OpenStack Image bundle.:: # clr_bundle_add openstack-image + # swupd_verify --fix -#. configurations will be located at ``/etc/glance``. +#. Configurations will be located at ``/etc/glance``. - * Create ``/etc/glance`` directory:: + * Create ``/etc/glance`` directory.:: # mkdir /etc/glance - * Create empty configuration files ``/etc/glance/glance-api.conf`` - and ``/etc/glance/glance-registry.conf``:: + * Create ``/etc/glance/glance-api.conf`` and + ``/etc/glance/glance-registry.conf`` configuration files.:: # touch /etc/glance/glance-{api,registry}.conf -#. Edit the ``/etc/glance/glance-api.conf`` file and complete - the following actions: +#. Edit the ``/etc/glance/glance-api.conf`` file and complete the following + actions: - * In the ``[database]`` section, configure database access:: + * In the ``[database]`` section, configure database access. Replace + ``GLANCE_DBPASS`` with the password you chose for the Image service + database.:: [database] ... connection = mysql://glance:GLANCE_DBPASS@controller/glance - Replace ``GLANCE_DBPASS`` with the password you chose for the - Image service database. - - * In the ``[keystone_authtoken]`` section, configure Identity - service access:: + * In the ``[keystone_authtoken]`` section, configure Identity service access. + Replace ``GLANCE_PASS`` with the password you chose for the ``glance`` user + in the Identity service.:: [keystone_authtoken] ... @@ -190,23 +172,20 @@ Install and configure components username = glance password = GLANCE_PASS - Replace ``GLANCE_PASS`` with the password you chose for the - ``glance`` user in the Identity service. +#. Edit the ``/etc/glance/glance-registry.conf`` file and complete the following + actions: -#. Edit the ``/etc/glance/glance-registry.conf`` file and - complete the following actions: - - * In the ``[database]`` section, configure database access:: + * In the ``[database]`` section, configure database access. Replace + ``GLANCE_DBPASS`` with the password you chose for the Image service + database.:: [database] ... connection = mysql://glance:GLANCE_DBPASS@controller/glance - Replace ``GLANCE_DBPASS`` with the password you chose for the - Image service database. - - * In the ``[keystone_authtoken]`` section, configure Identity - service access:: + * In the ``[keystone_authtoken]`` section, configure Identity service + access. Replace ``GLANCE_PASS`` with the password you chose for the + ``glance`` user in the Identity service.:: [keystone_authtoken] ... @@ -219,9 +198,6 @@ Install and configure components username = glance password = GLANCE_PASS - Replace ``GLANCE_PASS`` with the password you chose for the - ``glance`` user in the Identity service. - #. Ensure files have proper ownership by running the following command:: # systemctl restart update-triggers.target @@ -238,71 +214,3 @@ Finalize installation # systemctl enable glance-api.service glance-registry.service # systemctl start glance-api.service glance-registry.service - -Verify operation ----------------- - -Verify operation of the Image service using -`CirrOS `__, a small -Linux image that helps you test your OpenStack deployment. - -For more information about how to download and build images, see -`OpenStack Virtual Machine Image Guide -`__. -For information about how to manage images, see the -`OpenStack User Guide -`__. - -#. In each client environment script, configure the Image service - client to use API version 2.0:: - - $ echo "export OS_IMAGE_API_VERSION=2" \ - | tee -a admin-openrc.sh demo-openrc.sh - -#. Source the ``admin`` credentials to gain access to - admin-only CLI commands:: - - $ source admin-openrc.sh - -#. Download the source image:: - - $ curl -Ok http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img - -#. Upload the image to the Image service using the - `QCOW2` disk format, `bare` container format, and - public visibility so all projects can access it:: - - $ openstack image create cirros --file cirros-0.3.4-x86_64-disk.img \ - --disk-format qcow2 --container-format bare --public - +------------------+------------------------------------------------------+ - | Field | Value | - +------------------+------------------------------------------------------+ - | checksum | ee1eca47dc88f4879d8a229cc70a07c6 | - | container_format | bare | - | created_at | 2015-10-26T23:40:03Z | - | disk_format | qcow2 | - | file | /v2/images/fcf6fa55-56e9-4402-8137-3e9315c84905/file | - | id | fcf6fa55-56e9-4402-8137-3e9315c84905 | - | min_disk | 0 | - | min_ram | 0 | - | name | cirros | - | owner | 2e3093872ebf4143a122e2cc01a50d13 | - | protected | False | - | schema | /v2/schemas/image | - | size | 13287936 | - | status | active | - | tags | | - | updated_at | 2015-10-26T23:40:03Z | - | virtual_size | None | - | visibility | public | - +------------------+------------------------------------------------------+ - -#. Confirm upload of the image and validate attributes:: - - $ openstack image list - +--------------------------------------+--------+ - | ID | Name | - +--------------------------------------+--------+ - | 38047887-61a7-41ea-9b49-27987d5e8bb9 | cirros | - +--------------------------------------+--------+ - From 5afdd69bd98df9708e4500b39cef9f1fea3f8159 Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Wed, 11 Nov 2015 16:34:22 -0600 Subject: [PATCH 28/48] Add verify section to openstack image service (Glance) --- source/openstack_image.rst | 62 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/source/openstack_image.rst b/source/openstack_image.rst index 249fd593..59e4fdd4 100644 --- a/source/openstack_image.rst +++ b/source/openstack_image.rst @@ -7,7 +7,7 @@ retrieve virtual machine images. Install and configure the Image Service --------------------------------------- -This section describes how to install and configure the Image service, +This section describes how to install and configure the Image service, code-named glance, on the controller node. For simplicity, this configuration stores images on the local file system. By default, this directory is ``/var/lib/glance/images/``. @@ -141,7 +141,7 @@ Install and configure components # mkdir /etc/glance - * Create ``/etc/glance/glance-api.conf`` and + * Create ``/etc/glance/glance-api.conf`` and ``/etc/glance/glance-registry.conf`` configuration files.:: # touch /etc/glance/glance-{api,registry}.conf @@ -214,3 +214,61 @@ Finalize installation # systemctl enable glance-api.service glance-registry.service # systemctl start glance-api.service glance-registry.service + +Verify operation +---------------- + +Verify operation of the Image service using +`CirrOS `__, a small +Linux image that helps you test your OpenStack deployment. + +#. In each client environment script, configure the Image service + client to use API version 2.0:: + + $ echo "export OS_IMAGE_API_VERSION=2" \ + | tee -a admin-openrc.sh demo-openrc.sh + +#. Source the ``admin`` credentials to gain access to admin-only CLI commands:: + + $ source admin-openrc.sh + +#. Download the source image:: + + $ curl -Ok http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img + +#. Upload the image to the Image service using the `QCOW2` disk format, `bare` + container format, and public visibility so all projects can access it:: + + $ openstack image create cirros --file cirros-0.3.4-x86_64-disk.img \ + --disk-format qcow2 --container-format bare --public + +------------------+------------------------------------------------------+ + | Field | Value | + +------------------+------------------------------------------------------+ + | checksum | ee1eca47dc88f4879d8a229cc70a07c6 | + | container_format | bare | + | created_at | 2015-10-26T23:40:03Z | + | disk_format | qcow2 | + | file | /v2/images/fcf6fa55-56e9-4402-8137-3e9315c84905/file | + | id | fcf6fa55-56e9-4402-8137-3e9315c84905 | + | min_disk | 0 | + | min_ram | 0 | + | name | cirros | + | owner | 2e3093872ebf4143a122e2cc01a50d13 | + | protected | False | + | schema | /v2/schemas/image | + | size | 13287936 | + | status | active | + | tags | | + | updated_at | 2015-10-26T23:40:03Z | + | virtual_size | None | + | visibility | public | + +------------------+------------------------------------------------------+ + +#. Confirm upload of the image and validate attributes:: + + $ openstack image list + +--------------------------------------+--------+ + | ID | Name | + +--------------------------------------+--------+ + | 38047887-61a7-41ea-9b49-27987d5e8bb9 | cirros | + +--------------------------------------+--------+ From 780dff411357a88da34bb271a838636a5b991e60 Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Wed, 11 Nov 2015 16:59:21 -0600 Subject: [PATCH 29/48] Use the new swupd syntax for the identity, image, compute services From CLR release 5050 swupd syntax for adding bundles update and verify has changed to the following: clr_bundle_add -> swupd bundle-add swupd_update -> swupd swupd_verify -> swupd verify --- source/openstack_compute.rst | 3 ++- source/openstack_identity.rst | 8 ++++---- source/openstack_image.rst | 6 +++--- source/openstack_supporting-database.rst | 4 ++-- source/openstack_supporting-messaging.rst | 4 ++-- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/source/openstack_compute.rst b/source/openstack_compute.rst index 00c2965a..3d6743ce 100644 --- a/source/openstack_compute.rst +++ b/source/openstack_compute.rst @@ -139,7 +139,8 @@ To install and configure the Compute controller components: #. Install OpenStack Compute Controller bundle:: - # clr_bundle_add openstack-compute-controller + # swupd bundle-add openstack-compute-controller + # swupd verify --fix #. Custom configurations will be located at ``/etc/nova``. diff --git a/source/openstack_identity.rst b/source/openstack_identity.rst index 95d0938b..587596cc 100644 --- a/source/openstack_identity.rst +++ b/source/openstack_identity.rst @@ -58,8 +58,8 @@ Install and configure components #. Run the following command to install the packages.:: - # clr_bundle_add openstack-identity - # swupd_verify --fix + # swupd bundle-add openstack-identity + # swupd verify --fix #. Custom configurations will be located at ``/etc/keystone/``. @@ -147,8 +147,8 @@ environment variables to reduce command length. #. Install the OpenStack Python clients bundle:: - # clr_bundle_add openstack-python-clients - # swupd_verify --fix + # swupd bundle-add openstack-python-clients + # swupd verify --fix Create the service entity and API endpoints diff --git a/source/openstack_image.rst b/source/openstack_image.rst index 59e4fdd4..9c0b2832 100644 --- a/source/openstack_image.rst +++ b/source/openstack_image.rst @@ -132,8 +132,8 @@ Install and configure components #. Install OpenStack Image bundle.:: - # clr_bundle_add openstack-image - # swupd_verify --fix + # swupd bundle-add openstack-image + # swupd verify --fix #. Configurations will be located at ``/etc/glance``. @@ -216,7 +216,7 @@ Finalize installation # systemctl start glance-api.service glance-registry.service Verify operation ----------------- +~~~~~~~~~~~~~~~~ Verify operation of the Image service using `CirrOS `__, a small diff --git a/source/openstack_supporting-database.rst b/source/openstack_supporting-database.rst index e58ee1a4..fccadc79 100644 --- a/source/openstack_supporting-database.rst +++ b/source/openstack_supporting-database.rst @@ -10,8 +10,8 @@ Install and configure the database server #. Install MariaDB bundle:: - # clr_bundle_add database-mariadb - # swupd_verify --fix + # swupd bundle-add database-mariadb + # swupd verify --fix #. Create the ``/etc/mariadb/`` folder and the ``/etc/mariadb/openstack.cnf`` file:: diff --git a/source/openstack_supporting-messaging.rst b/source/openstack_supporting-messaging.rst index 38109a87..be80167a 100644 --- a/source/openstack_supporting-messaging.rst +++ b/source/openstack_supporting-messaging.rst @@ -11,8 +11,8 @@ Install the message queue service #. Install the message queue bundle.:: - # clr_bundle_add message-broker-rabbitmq - # swupd_verify --fix + # swupd bundle-add message-broker-rabbitmq + # swupd verify --fix Configuring the message broker service -------------------------------------- From dd1caf9fc0d60c3ea6f7de4461bacdd7be6bc289 Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Wed, 11 Nov 2015 17:10:08 -0600 Subject: [PATCH 30/48] Use the new swupd syntax for the block storage (cinder) service --- source/openstack_block_storage.rst | 187 +++++++++++++++-------------- 1 file changed, 94 insertions(+), 93 deletions(-) diff --git a/source/openstack_block_storage.rst b/source/openstack_block_storage.rst index 7d92a8c8..3d88c893 100644 --- a/source/openstack_block_storage.rst +++ b/source/openstack_block_storage.rst @@ -45,7 +45,7 @@ Before you install and configure the Block Storage service, you #. Source the ``admin`` credentials to gain access to admin-only CLI commands:: - $ source admin-openrc.sh + $ source admin-openrc.sh #. To create the service credentials, complete these steps: @@ -99,101 +99,101 @@ Before you install and configure the Block Storage service, you #. Create the Block Storage service API endpoints:: - $ openstack endpoint create --region RegionOne \ - volume public http://controller:8776/v1/%\(tenant_id\)s - +--------------+-----------------------------------------+ - | Field | Value | - +--------------+-----------------------------------------+ - | enabled | True | - | id | 03fa2c90153546c295bf30ca86b1344b | - | interface | public | - | region | RegionOne | - | region_id | RegionOne | - | service_id | ab3bbbef780845a1a283490d281e7fda | - | service_name | cinder | - | service_type | volume | - | url | http://controller:8776/v1/%(tenant_id)s | - +--------------+-----------------------------------------+ + $ openstack endpoint create --region RegionOne \ + volume public http://controller:8776/v1/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 03fa2c90153546c295bf30ca86b1344b | + | interface | public | + | region | RegionOne | + | region_id | RegionOne | + | service_id | ab3bbbef780845a1a283490d281e7fda | + | service_name | cinder | + | service_type | volume | + | url | http://controller:8776/v1/%(tenant_id)s | + +--------------+-----------------------------------------+ - $ openstack endpoint create --region RegionOne \ - volume internal http://controller:8776/v1/%\(tenant_id\)s - +--------------+-----------------------------------------+ - | Field | Value | - +--------------+-----------------------------------------+ - | enabled | True | - | id | 94f684395d1b41068c70e4ecb11364b2 | - | interface | internal | - | region | RegionOne | - | region_id | RegionOne | - | service_id | ab3bbbef780845a1a283490d281e7fda | - | service_name | cinder | - | service_type | volume | - | url | http://controller:8776/v1/%(tenant_id)s | - +--------------+-----------------------------------------+ + $ openstack endpoint create --region RegionOne \ + volume internal http://controller:8776/v1/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 94f684395d1b41068c70e4ecb11364b2 | + | interface | internal | + | region | RegionOne | + | region_id | RegionOne | + | service_id | ab3bbbef780845a1a283490d281e7fda | + | service_name | cinder | + | service_type | volume | + | url | http://controller:8776/v1/%(tenant_id)s | + +--------------+-----------------------------------------+ - $ openstack endpoint create --region RegionOne \ - volume admin http://controller:8776/v1/%\(tenant_id\)s - +--------------+-----------------------------------------+ - | Field | Value | - +--------------+-----------------------------------------+ - | enabled | True | - | id | 4511c28a0f9840c78bacb25f10f62c98 | - | interface | admin | - | region | RegionOne | - | region_id | RegionOne | - | service_id | ab3bbbef780845a1a283490d281e7fda | - | service_name | cinder | - | service_type | volume | - | url | http://controller:8776/v1/%(tenant_id)s | - +--------------+-----------------------------------------+ + $ openstack endpoint create --region RegionOne \ + volume admin http://controller:8776/v1/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 4511c28a0f9840c78bacb25f10f62c98 | + | interface | admin | + | region | RegionOne | + | region_id | RegionOne | + | service_id | ab3bbbef780845a1a283490d281e7fda | + | service_name | cinder | + | service_type | volume | + | url | http://controller:8776/v1/%(tenant_id)s | + +--------------+-----------------------------------------+ - $ openstack endpoint create --region RegionOne \ - volumev2 public http://controller:8776/v2/%\(tenant_id\)s - +--------------+-----------------------------------------+ - | Field | Value | - +--------------+-----------------------------------------+ - | enabled | True | - | id | 513e73819e14460fb904163f41ef3759 | - | interface | public | - | region | RegionOne | - | region_id | RegionOne | - | service_id | eb9fd245bdbc414695952e93f29fe3ac | - | service_name | cinderv2 | - | service_type | volumev2 | - | url | http://controller:8776/v2/%(tenant_id)s | - +--------------+-----------------------------------------+ + $ openstack endpoint create --region RegionOne \ + volumev2 public http://controller:8776/v2/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 513e73819e14460fb904163f41ef3759 | + | interface | public | + | region | RegionOne | + | region_id | RegionOne | + | service_id | eb9fd245bdbc414695952e93f29fe3ac | + | service_name | cinderv2 | + | service_type | volumev2 | + | url | http://controller:8776/v2/%(tenant_id)s | + +--------------+-----------------------------------------+ - $ openstack endpoint create --region RegionOne \ - volumev2 internal http://controller:8776/v2/%\(tenant_id\)s - +--------------+-----------------------------------------+ - | Field | Value | - +--------------+-----------------------------------------+ - | enabled | True | - | id | 6436a8a23d014cfdb69c586eff146a32 | - | interface | internal | - | region | RegionOne | - | region_id | RegionOne | - | service_id | eb9fd245bdbc414695952e93f29fe3ac | - | service_name | cinderv2 | - | service_type | volumev2 | - | url | http://controller:8776/v2/%(tenant_id)s | - +--------------+-----------------------------------------+ + $ openstack endpoint create --region RegionOne \ + volumev2 internal http://controller:8776/v2/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 6436a8a23d014cfdb69c586eff146a32 | + | interface | internal | + | region | RegionOne | + | region_id | RegionOne | + | service_id | eb9fd245bdbc414695952e93f29fe3ac | + | service_name | cinderv2 | + | service_type | volumev2 | + | url | http://controller:8776/v2/%(tenant_id)s | + +--------------+-----------------------------------------+ - $ openstack endpoint create --region RegionOne \ - volumev2 admin http://controller:8776/v2/%\(tenant_id\)s - +--------------+-----------------------------------------+ - | Field | Value | - +--------------+-----------------------------------------+ - | enabled | True | - | id | e652cf84dd334f359ae9b045a2c91d96 | - | interface | admin | - | region | RegionOne | - | region_id | RegionOne | - | service_id | eb9fd245bdbc414695952e93f29fe3ac | - | service_name | cinderv2 | - | service_type | volumev2 | - | url | http://controller:8776/v2/%(tenant_id)s | - +--------------+-----------------------------------------+ + $ openstack endpoint create --region RegionOne \ + volumev2 admin http://controller:8776/v2/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | e652cf84dd334f359ae9b045a2c91d96 | + | interface | admin | + | region | RegionOne | + | region_id | RegionOne | + | service_id | eb9fd245bdbc414695952e93f29fe3ac | + | service_name | cinderv2 | + | service_type | volumev2 | + | url | http://controller:8776/v2/%(tenant_id)s | + +--------------+-----------------------------------------+ .. note:: @@ -205,7 +205,8 @@ Install and configure components #. Install OpenStack Block Storage Controller bundle:: - # clr_bundle_add openstack-block-storage-controller + # swupd bundle-add openstack-block-storage-controller + # swupd verify --fix #. Custom configurations will be located at ``/etc/cinder``. @@ -278,7 +279,7 @@ Install and configure components #. Populate the Block Storage database:: - # su -s /bin/sh -c "cinder-manage db sync" cinder + # su -s /bin/sh -c "cinder-manage db sync" cinder Configure Compute to use Block Storage -------------------------------------- From d27cbbccc063e085f7084935ad74351332b7227b Mon Sep 17 00:00:00 2001 From: "Simental Magana, Marcos" Date: Thu, 12 Nov 2015 10:32:32 -0600 Subject: [PATCH 31/48] Remove unnecessary link instruction in nova compute (Nova) service --- source/openstack_compute.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/source/openstack_compute.rst b/source/openstack_compute.rst index 3d6743ce..6a56775a 100644 --- a/source/openstack_compute.rst +++ b/source/openstack_compute.rst @@ -245,7 +245,6 @@ Complete the following steps to finalize Compute installation: # mkdir -p /etc/nginx # ln -s /usr/share/nginx/conf.d/nova-api.template /etc/nginx/nova-api.conf - # ln -s /usr/share/nginx/conf.d/nova-metadata.template /etc/nginx/nova-metadata.conf #. Restart the Nginx server to reload new configurations:: From d29f1ae5192b44e6b62d6bf2756a9443dbae205f Mon Sep 17 00:00:00 2001 From: "Tullis, Michael L" Date: Thu, 12 Nov 2015 10:02:05 -0700 Subject: [PATCH 32/48] Added namespace (bookmark) at the top of each OpenStack topic to enable linking between them. --- source/openstack_block_storage.rst | 2 ++ source/openstack_bundle_and_service_summary.rst | 2 ++ source/openstack_compute.rst | 2 ++ source/openstack_dashboard.rst | 2 ++ source/openstack_identity-openrc.rst | 2 ++ source/openstack_identity.rst | 2 ++ source/openstack_image.rst | 2 ++ source/openstack_installing_bundles.rst | 2 ++ source/openstack_networking.rst | 2 ++ source/openstack_object_storage.rst | 2 ++ source/openstack_orchestration.rst | 2 ++ source/openstack_supporting-database.rst | 2 ++ source/openstack_supporting-messaging.rst | 2 ++ source/openstack_sys_req_and_pw_summary.rst | 2 ++ source/openstack_telemetry.rst | 2 ++ source/openstack_use_cases.rst | 2 ++ 16 files changed, 32 insertions(+) diff --git a/source/openstack_block_storage.rst b/source/openstack_block_storage.rst index 3d88c893..9c85d9ba 100644 --- a/source/openstack_block_storage.rst +++ b/source/openstack_block_storage.rst @@ -1,3 +1,5 @@ +.. _openstack_block_storage: + OpenStack* Block Storage ######################## diff --git a/source/openstack_bundle_and_service_summary.rst b/source/openstack_bundle_and_service_summary.rst index 6ae67400..156e0446 100644 --- a/source/openstack_bundle_and_service_summary.rst +++ b/source/openstack_bundle_and_service_summary.rst @@ -1,3 +1,5 @@ +.. _openstack_bundle_and_service_summary: + OpenStack* bundle and service summary ############################################################ diff --git a/source/openstack_compute.rst b/source/openstack_compute.rst index 6a56775a..ec500a2c 100644 --- a/source/openstack_compute.rst +++ b/source/openstack_compute.rst @@ -1,3 +1,5 @@ +.. _openstack_compute: + OpenStack* Compute ################## diff --git a/source/openstack_dashboard.rst b/source/openstack_dashboard.rst index c54a58d6..35994a42 100644 --- a/source/openstack_dashboard.rst +++ b/source/openstack_dashboard.rst @@ -1,3 +1,5 @@ +.. _openstack_dashboard: + OpenStack* Dashboard #################### diff --git a/source/openstack_identity-openrc.rst b/source/openstack_identity-openrc.rst index 2c56608d..2aae04ee 100644 --- a/source/openstack_identity-openrc.rst +++ b/source/openstack_identity-openrc.rst @@ -1,3 +1,5 @@ +.. _openstack_identity-openrc: + Create OpenStack* client environment scripts ############################################ diff --git a/source/openstack_identity.rst b/source/openstack_identity.rst index 587596cc..0a4da857 100644 --- a/source/openstack_identity.rst +++ b/source/openstack_identity.rst @@ -1,3 +1,5 @@ +.. _openstack_identity: + OpenStack* Identity ################### diff --git a/source/openstack_image.rst b/source/openstack_image.rst index 9c0b2832..48648d82 100644 --- a/source/openstack_image.rst +++ b/source/openstack_image.rst @@ -1,3 +1,5 @@ +.. _openstack_image: + OpenStack* Image ################ diff --git a/source/openstack_installing_bundles.rst b/source/openstack_installing_bundles.rst index 0261105b..c2cead3c 100644 --- a/source/openstack_installing_bundles.rst +++ b/source/openstack_installing_bundles.rst @@ -1,3 +1,5 @@ +.. _openstack_installing_bundles: + Installing OpenStack* MVP bundles ############################################################ diff --git a/source/openstack_networking.rst b/source/openstack_networking.rst index c4c1fe97..01d3c7aa 100644 --- a/source/openstack_networking.rst +++ b/source/openstack_networking.rst @@ -1,3 +1,5 @@ +.. _openstack_networking: + OpenStack* Networking ############################################################ diff --git a/source/openstack_object_storage.rst b/source/openstack_object_storage.rst index 0c7a8ea5..b5dd3a7b 100644 --- a/source/openstack_object_storage.rst +++ b/source/openstack_object_storage.rst @@ -1,3 +1,5 @@ +.. _openstack_object_storage: + OpenStack* Object Storage ######################### diff --git a/source/openstack_orchestration.rst b/source/openstack_orchestration.rst index dc0db916..6ba23773 100644 --- a/source/openstack_orchestration.rst +++ b/source/openstack_orchestration.rst @@ -1,3 +1,5 @@ +.. _openstack_orchestration: + OpenStack* Orchestration ############################################################ diff --git a/source/openstack_supporting-database.rst b/source/openstack_supporting-database.rst index fccadc79..813d7021 100644 --- a/source/openstack_supporting-database.rst +++ b/source/openstack_supporting-database.rst @@ -1,3 +1,5 @@ +.. _openstack_supporting-database: + Database ######## diff --git a/source/openstack_supporting-messaging.rst b/source/openstack_supporting-messaging.rst index be80167a..095c0b39 100644 --- a/source/openstack_supporting-messaging.rst +++ b/source/openstack_supporting-messaging.rst @@ -1,3 +1,5 @@ +.. _openstack_supporting-messaging: + Message queue ############# diff --git a/source/openstack_sys_req_and_pw_summary.rst b/source/openstack_sys_req_and_pw_summary.rst index 37833b14..66a24ea5 100644 --- a/source/openstack_sys_req_and_pw_summary.rst +++ b/source/openstack_sys_req_and_pw_summary.rst @@ -1,3 +1,5 @@ +.. _openstack_sys_req_and_pw_summary: + System requirements and password summary ############################################################ diff --git a/source/openstack_telemetry.rst b/source/openstack_telemetry.rst index 39e9cd1e..d5c6f09b 100644 --- a/source/openstack_telemetry.rst +++ b/source/openstack_telemetry.rst @@ -1,3 +1,5 @@ +.. _openstack_telemetry: + OpenStack* Telemetry ############################################################ diff --git a/source/openstack_use_cases.rst b/source/openstack_use_cases.rst index ded000b2..9d519c84 100644 --- a/source/openstack_use_cases.rst +++ b/source/openstack_use_cases.rst @@ -1,3 +1,5 @@ +.. _openstack_use_cases: + OpenStack* use cases with Clear Linux* OS for Intel® Architecture ################################################################### From ed749d6dd6fc698203ce19e02824a04c8cce2af4 Mon Sep 17 00:00:00 2001 From: "Tullis, Michael L" Date: Thu, 12 Nov 2015 10:24:25 -0700 Subject: [PATCH 33/48] Added links at the bottom of OpenStack topics to the next topic in the sequence to enhance navigation. --- source/openstack_block_storage.rst | 2 ++ source/openstack_bundle_and_service_summary.rst | 2 ++ source/openstack_compute.rst | 2 ++ source/openstack_dashboard.rst | 2 ++ source/openstack_identity-openrc.rst | 1 + source/openstack_image.rst | 2 ++ source/openstack_installing_bundles.rst | 2 ++ source/openstack_networking.rst | 2 ++ source/openstack_orchestration.rst | 2 ++ source/openstack_supporting-database.rst | 2 ++ source/openstack_supporting-messaging.rst | 2 ++ source/openstack_sys_req_and_pw_summary.rst | 2 ++ source/openstack_telemetry.rst | 1 + source/openstack_use_cases.rst | 4 +++- 14 files changed, 27 insertions(+), 1 deletion(-) diff --git a/source/openstack_block_storage.rst b/source/openstack_block_storage.rst index 9c85d9ba..46ce81e5 100644 --- a/source/openstack_block_storage.rst +++ b/source/openstack_block_storage.rst @@ -480,3 +480,5 @@ Verify operation of the Block Storage service. | cinder-scheduler | controller | nova | enabled | up | 2014-10-18T01:30:54.000000 | None | | cinder-volume | block1@lvm | nova | enabled | up | 2014-10-18T01:30:57.000000 | None | +------------------+------------+------+---------+-------+----------------------------+-----------------+ + +Next topic: :ref:`openstack_dashboard`. \ No newline at end of file diff --git a/source/openstack_bundle_and_service_summary.rst b/source/openstack_bundle_and_service_summary.rst index 156e0446..1ae888de 100644 --- a/source/openstack_bundle_and_service_summary.rst +++ b/source/openstack_bundle_and_service_summary.rst @@ -47,3 +47,5 @@ uses two-node architecture with legacy networking (Nova-network). with layer-3 (routing) services that enable self-service networks using overlay segmentation methods. Additionally, this option provides the foundation for advanced services such as LBaaS and FWaaS. + +Next topic: :ref:`openstack_sys_req_and_pw_summary`. \ No newline at end of file diff --git a/source/openstack_compute.rst b/source/openstack_compute.rst index ec500a2c..8b2aa1a2 100644 --- a/source/openstack_compute.rst +++ b/source/openstack_compute.rst @@ -524,3 +524,5 @@ Verify operation of the Compute service. +--------------------------------------+--------+--------+--------+ | 38047887-61a7-41ea-9b49-27987d5e8bb9 | cirros | ACTIVE | | +--------------------------------------+--------+--------+--------+ + +Next topic: :ref:`openstack_block_storage`. \ No newline at end of file diff --git a/source/openstack_dashboard.rst b/source/openstack_dashboard.rst index 35994a42..bdb08d39 100644 --- a/source/openstack_dashboard.rst +++ b/source/openstack_dashboard.rst @@ -29,3 +29,5 @@ To get started with OpenStack Dashboard services: # systemctl enable nginx uwsgi@horizon.socket # systemctl restart nginx uwsgi@horizon.socket + +Next topic: :ref:`openstack_networking`. \ No newline at end of file diff --git a/source/openstack_identity-openrc.rst b/source/openstack_identity-openrc.rst index 2aae04ee..724333db 100644 --- a/source/openstack_identity-openrc.rst +++ b/source/openstack_identity-openrc.rst @@ -72,3 +72,4 @@ For example: | user_id | 4d411f2291f34941b30eef9bd797505a | +------------+----------------------------------+ +Next topic: :ref:`openstack_image`. \ No newline at end of file diff --git a/source/openstack_image.rst b/source/openstack_image.rst index 48648d82..f1af16d0 100644 --- a/source/openstack_image.rst +++ b/source/openstack_image.rst @@ -274,3 +274,5 @@ Linux image that helps you test your OpenStack deployment. +--------------------------------------+--------+ | 38047887-61a7-41ea-9b49-27987d5e8bb9 | cirros | +--------------------------------------+--------+ + +Next topic: :ref:`openstack_compute`. \ No newline at end of file diff --git a/source/openstack_installing_bundles.rst b/source/openstack_installing_bundles.rst index c2cead3c..b19a1296 100644 --- a/source/openstack_installing_bundles.rst +++ b/source/openstack_installing_bundles.rst @@ -22,3 +22,5 @@ To install, continue with the following topics: * `OpenStack Orchestration `_ * `OpenStack Telemetry `_ * `OpenStack Object Storage `_ + +Next topic: :ref:`openstack_supporting-database`. \ No newline at end of file diff --git a/source/openstack_networking.rst b/source/openstack_networking.rst index 01d3c7aa..eff953c5 100644 --- a/source/openstack_networking.rst +++ b/source/openstack_networking.rst @@ -305,3 +305,5 @@ Finalizing installation # systemctl enable neutron-server.service # systemctl start neutron-server.service + +Next topic: :ref:`openstack_orchestration`. \ No newline at end of file diff --git a/source/openstack_orchestration.rst b/source/openstack_orchestration.rst index 6ba23773..3ce687ab 100644 --- a/source/openstack_orchestration.rst +++ b/source/openstack_orchestration.rst @@ -286,3 +286,5 @@ Complete this step to finalize the installation: # systemctl enable heat-api.service heat-api-cfn.service heat-engine.service # systemctl start heat-api.service heat-api-cfn.service heat-engine.service`` + +Next topic: :ref:`openstack_telemetry`. \ No newline at end of file diff --git a/source/openstack_supporting-database.rst b/source/openstack_supporting-database.rst index 813d7021..62eac990 100644 --- a/source/openstack_supporting-database.rst +++ b/source/openstack_supporting-database.rst @@ -49,3 +49,5 @@ Complete the following steps to finalize database installation: for the root account:: # mysql_secure_installation + +Next topic: :ref:`openstack_supporting-messaging`. \ No newline at end of file diff --git a/source/openstack_supporting-messaging.rst b/source/openstack_supporting-messaging.rst index 095c0b39..be9c167d 100644 --- a/source/openstack_supporting-messaging.rst +++ b/source/openstack_supporting-messaging.rst @@ -44,3 +44,5 @@ Complete the following steps to configure the message broker service: # rabbitmqctl set_permissions openstack ".*" ".*" ".*" Setting permissions for user "openstack" in vhost "/" ... ...done. + +Next topic: :ref:`openstack_identity`. \ No newline at end of file diff --git a/source/openstack_sys_req_and_pw_summary.rst b/source/openstack_sys_req_and_pw_summary.rst index 66a24ea5..c67ae79b 100644 --- a/source/openstack_sys_req_and_pw_summary.rst +++ b/source/openstack_sys_req_and_pw_summary.rst @@ -74,3 +74,5 @@ and their associated references in the guide: +----------------------------------------+--------------------------------------------------+ | CINDER_PASS | Password of Block Storage service user cinder | +----------------------------------------+--------------------------------------------------+ + +Next topic: :ref:`openstack_installing_bundles`. \ No newline at end of file diff --git a/source/openstack_telemetry.rst b/source/openstack_telemetry.rst index d5c6f09b..0a99335d 100644 --- a/source/openstack_telemetry.rst +++ b/source/openstack_telemetry.rst @@ -221,3 +221,4 @@ Finalizing installation # systemctl start ceilometer-api.service ceilometer-agent-notification.service ceilometer-agent-central.service ceilometer-collector.service \ ceilometer-alarm-evaluator.service ceilometer-alarm-notifier.service +Next topic: :ref:`openstack_object_storage`. \ No newline at end of file diff --git a/source/openstack_use_cases.rst b/source/openstack_use_cases.rst index 9d519c84..fe69751f 100644 --- a/source/openstack_use_cases.rst +++ b/source/openstack_use_cases.rst @@ -22,4 +22,6 @@ OpenStack supports the following use cases: Clear Linux OS for Intel Architecture is designed with all of these use cases in mind, but the initial target is to enable only those services -required for Cloud. \ No newline at end of file +required for Cloud. + +Next topic: :ref:`openstack_bundle_and_service_summary`. \ No newline at end of file From d1aaa822194440e14aaf9d6eea6e686267503d62 Mon Sep 17 00:00:00 2001 From: "Tullis, Michael L" Date: Thu, 12 Nov 2015 10:41:00 -0700 Subject: [PATCH 34/48] Added link at bottom of OpenStack Identity topic to next in sequence for navigation. --- source/openstack_identity.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/openstack_identity.rst b/source/openstack_identity.rst index 0a4da857..605583cb 100644 --- a/source/openstack_identity.rst +++ b/source/openstack_identity.rst @@ -414,3 +414,5 @@ services. | project_id | 4aa51bb942be4dd0ac0555d7591f80a6 | | user_id | 7004dfa0dda84d63aef81cf7f100af01 | +------------+----------------------------------+ + +Next topic: :ref:`openstack_identity-openrc`. \ No newline at end of file From 1466f0f56a8342f983fbf5d576015bcc197decbc Mon Sep 17 00:00:00 2001 From: "Tullis, Michael L" Date: Fri, 13 Nov 2015 09:10:15 -0700 Subject: [PATCH 35/48] Updated title strings in OpenStack topics for consistency in left-pane navigation links. --- source/openstack_block_storage.rst | 2 +- source/openstack_compute.rst | 2 +- source/openstack_dashboard.rst | 2 +- source/openstack_identity.rst | 2 +- source/openstack_image.rst | 2 +- source/openstack_networking.rst | 2 +- source/openstack_object_storage.rst | 2 +- source/openstack_orchestration.rst | 2 +- source/openstack_telemetry.rst | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/source/openstack_block_storage.rst b/source/openstack_block_storage.rst index 46ce81e5..dfeac88f 100644 --- a/source/openstack_block_storage.rst +++ b/source/openstack_block_storage.rst @@ -1,6 +1,6 @@ .. _openstack_block_storage: -OpenStack* Block Storage +Block Storage ######################## The OpenStack Block Storage service (cinder) adds persistent storage to diff --git a/source/openstack_compute.rst b/source/openstack_compute.rst index 8b2aa1a2..8f8e5d68 100644 --- a/source/openstack_compute.rst +++ b/source/openstack_compute.rst @@ -1,6 +1,6 @@ .. _openstack_compute: -OpenStack* Compute +Compute ################## Use OpenStack Compute to host and manage cloud computing systems. diff --git a/source/openstack_dashboard.rst b/source/openstack_dashboard.rst index bdb08d39..8c086109 100644 --- a/source/openstack_dashboard.rst +++ b/source/openstack_dashboard.rst @@ -1,6 +1,6 @@ .. _openstack_dashboard: -OpenStack* Dashboard +Dashboard #################### The OpenStack Dashboard, also known as Horizon, is a web-based interface diff --git a/source/openstack_identity.rst b/source/openstack_identity.rst index 605583cb..7ef71f0e 100644 --- a/source/openstack_identity.rst +++ b/source/openstack_identity.rst @@ -1,6 +1,6 @@ .. _openstack_identity: -OpenStack* Identity +Identity Service ################### The OpenStack Identity service provides a single point of integration for diff --git a/source/openstack_image.rst b/source/openstack_image.rst index f1af16d0..d31d7f1f 100644 --- a/source/openstack_image.rst +++ b/source/openstack_image.rst @@ -1,6 +1,6 @@ .. _openstack_image: -OpenStack* Image +Image Service ################ The OpenStack Image service (glance) enables users to discover, register, and diff --git a/source/openstack_networking.rst b/source/openstack_networking.rst index eff953c5..673001fa 100644 --- a/source/openstack_networking.rst +++ b/source/openstack_networking.rst @@ -1,6 +1,6 @@ .. _openstack_networking: -OpenStack* Networking +Networking ############################################################ OpenStack* Networking allows you to create and attach interface devices diff --git a/source/openstack_object_storage.rst b/source/openstack_object_storage.rst index b5dd3a7b..b01654b6 100644 --- a/source/openstack_object_storage.rst +++ b/source/openstack_object_storage.rst @@ -1,6 +1,6 @@ .. _openstack_object_storage: -OpenStack* Object Storage +Object Storage ######################### Install and configure the controller node diff --git a/source/openstack_orchestration.rst b/source/openstack_orchestration.rst index 3ce687ab..b3af8090 100644 --- a/source/openstack_orchestration.rst +++ b/source/openstack_orchestration.rst @@ -1,6 +1,6 @@ .. _openstack_orchestration: -OpenStack* Orchestration +Orchestration ############################################################ The Orchestration module provides template-based OpenStack* API calls diff --git a/source/openstack_telemetry.rst b/source/openstack_telemetry.rst index 0a99335d..51b6e257 100644 --- a/source/openstack_telemetry.rst +++ b/source/openstack_telemetry.rst @@ -1,6 +1,6 @@ .. _openstack_telemetry: -OpenStack* Telemetry +Telemetry ############################################################ Overview From 5e151b0217f31ea4c0db9e47bad1deabf58d5585 Mon Sep 17 00:00:00 2001 From: Victor Morales Date: Fri, 13 Nov 2015 14:16:12 -0600 Subject: [PATCH 36/48] Add software verify fix command Signed-off-by: Victor Morales --- source/openstack_dashboard.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/openstack_dashboard.rst b/source/openstack_dashboard.rst index 8c086109..6af074e6 100644 --- a/source/openstack_dashboard.rst +++ b/source/openstack_dashboard.rst @@ -24,10 +24,11 @@ To get started with OpenStack Dashboard services: #. Install the OpenStack Dashboard bundle:: # clr_bundle_add openstack-dashboard + # swupd verify --fix #. Enable and start the dashboard socket and the Nginx server:: # systemctl enable nginx uwsgi@horizon.socket # systemctl restart nginx uwsgi@horizon.socket -Next topic: :ref:`openstack_networking`. \ No newline at end of file +Next topic: :ref:`openstack_networking`. From 30d01d45415bfd4db62d36234a294576699fe1c4 Mon Sep 17 00:00:00 2001 From: Victor Morales Date: Fri, 13 Nov 2015 14:21:13 -0600 Subject: [PATCH 37/48] Fix some syntax errors on openstack_block_stoge Signed-off-by: Victor Morales --- source/openstack_block_storage.rst | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/source/openstack_block_storage.rst b/source/openstack_block_storage.rst index dfeac88f..97808623 100644 --- a/source/openstack_block_storage.rst +++ b/source/openstack_block_storage.rst @@ -247,10 +247,9 @@ Install and configure components rabbit_userid = openstack rabbit_password = RABBIT_PASS - * In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, - configure Identity service access: - - .. code-block:: ini + * In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, configure + Identity service access. Replace ``CINDER_PASS`` with the password you + chose for the ``cinder`` user in the Identity service.:: [DEFAULT] ... @@ -267,13 +266,8 @@ Install and configure components username = cinder password = CINDER_PASS - Replace ``CINDER_PASS`` with the password you chose for - the ``cinder`` 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 + use the management interface IP address of the controller node:: [DEFAULT] ... @@ -481,4 +475,4 @@ Verify operation of the Block Storage service. | cinder-volume | block1@lvm | nova | enabled | up | 2014-10-18T01:30:57.000000 | None | +------------------+------------+------+---------+-------+----------------------------+-----------------+ -Next topic: :ref:`openstack_dashboard`. \ No newline at end of file +Next topic: :ref:`openstack_dashboard`. From 8edf3ebfa3e8cfc5e45727c0d5fd12a0488bea51 Mon Sep 17 00:00:00 2001 From: Leona Date: Fri, 13 Nov 2015 12:32:01 -0800 Subject: [PATCH 38/48] adding updated README --- README.rst | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 167 insertions(+), 9 deletions(-) diff --git a/README.rst b/README.rst index fb4507ad..114e23b9 100644 --- a/README.rst +++ b/README.rst @@ -1,12 +1,170 @@ -Summary -======= +Documentation Build Instructions +================================ -``project-docs`` is the project that hosts the documentation for the **Clear -Linux\* project for Intel® Architecture.** This source code was written in -reStructuredText format (``*.rst``) for its simplicity and then -converted/published in HTML. +ClearLinux Docs are written in :abbr:`ReStructuredText (ReST)` which makes for +easily-parsable, command-line readable, indexed and search-friendly documentation +and APIs. -Getting Started ---------------- +Building with `Sphinx`_, however, requires a few prerequisites: -These are the steps to generate html files for output validation. +* `GNU make`_ +* `Python`_ +* `PIP`_ + +The instructions for installing these varies according to OS. You can On a basic +out-of-the-box Ubuntu-like install, you might need something like: + +.. + + $ sudo apt-get install python-pip + $ sudo pip install -U sphinx sphinx-autobuild + +.. codeblock:: python + + $ python -c 'print __import__("sphinx").__version__' + 1.3.1 + +Dependencies fulfilled, let's now clone that gitlab repo: + +.. codeblock:: git + + $ git clone git@clrgitlab.intel.com:clr-documentation/project-docs.git + Cloning into 'project-docs'... + remote: Counting objects: 631, done. + remote: Compressing objects: 100% (583/583), done. + remote: Total 631 (delta 349), reused 108 (delta 35) + Receiving objects: 100% (631/631), 2.10 MiB | 0 bytes/s, done. + Resolving deltas: 100% (349/349), done. + Checking connectivity... done. + +Before running Sphinx, we need to correct some of the problems in the Gitlab repo. +Running :command:`make` straightaway from our clone won't work. We need to delete the +existing conf.py file and also the existing index file generated. These are remnants +of a build on a Windows box, and they don't quite work on Linux. These should be removed +from ``master`` eventually. + +.. codeblock:: shell-session + + $ cd project-docs/ + $ ls + make.bat Makefile source/ + $ rm -rf Makefile make.bat + $ rm -rf source/conf.py + $ mv source/index.rst source/oldindex.rst + + +In the cloned source directory, we have all the .rst files we need to build the docs. We +run a native instance of :command:`sphinx-quickstart`. The program will run you through +a series of questons. The main things to be conscious of here: + +* Tell it to use the existing :file:`source/` directory as the Root path for + the documentation; this is what it looks in, in order to generate the HTML +* It's better to tell it to **not** separate the source and build directories; the Sphinx + will generate *another* :file:`source/` directory, which can be confusing. + +What follows here is a log from a successful :command:`sphinx-quickstart` build started from +within the :file:`project-docs/` directory. + +.. codeblock:: shell-session + + $ sphinx-quickstart + Welcome to the Sphinx 1.3.1 quickstart utility. + + Please enter values for the following settings (just press Enter to + accept a default value, if one is given in brackets). + + Enter the root path for documentation. + > Root path for the documentation [.]: source/ + + You have two options for placing the build directory for Sphinx output. + Either, you use a directory "_build" within the root path, or you separate + "source" and "build" directories within the root path. + > Separate source and build directories (y/n) [n]: n + + Inside the root directory, two more directories will be created; "_templates" + for custom HTML templates and "_static" for custom stylesheets and other static + files. You can enter another prefix (such as ".") to replace the underscore. + > Name prefix for templates and static dir [_]: + + The project name will occur in several places in the built documentation. + > Project name: ClearLinux Docs + > Author name(s): Intel OTC + + Sphinx has the notion of a "version" and a "release" for the + software. Each version can have multiple releases. For example, for + Python the version is something like 2.5 or 3.0, while the release is + something like 2.5.1 or 3.0a1. If you don't need this dual structure, + just set both to the same value. + > Project version: 1.0.0 + > Project release [1.0.0]: 1.0.0 + + If the documents are to be written in a language other than English, + you can select a language here by its language code. Sphinx will then + translate text that it generates into that language. + + For a list of supported codes, see + http://sphinx-doc.org/config.html#confval-language. + > Project language [en]: en + + The file name suffix for source files. Commonly, this is either ".txt" + or ".rst". Only files with this suffix are considered documents. + > Source file suffix [.rst]: .rst + + One document is special in that it is considered the top node of the + "contents tree", that is, it is the root of the hierarchical structure + of the documents. Normally, this is "index", but if your "index" + document is a custom template, you can also set this to another filename. + > Name of your master document (without suffix) [index]: + + Sphinx can also add configuration for epub output: + > Do you want to use the epub builder (y/n) [n]: n + + Please indicate if you want to use one of the following Sphinx extensions: + > autodoc: automatically insert docstrings from modules (y/n) [n]: n + > doctest: automatically test code snippets in doctest blocks (y/n) [n]: n + > intersphinx: link between Sphinx documentation of different projects (y/n) [n]: n + > todo: write "todo" entries that can be shown or hidden on build (y/n) [n]: n + > coverage: checks for documentation coverage (y/n) [n]: n + > pngmath: include math, rendered as PNG images (y/n) [n]: n + > mathjax: include math, rendered in the browser by MathJax (y/n) [n]: y + > ifconfig: conditional inclusion of content based on config values (y/n) [n]: y + > viewcode: include links to the source code of documented Python objects (y/n) [n]: y + + A Makefile and a Windows command file can be generated for you so that you + only have to run e.g. `make html' instead of invoking sphinx-build + directly. + > Create Makefile? (y/n) [y]: y + > Create Windows command file? (y/n) [n]: n + + Creating file source/conf.py. + Creating file source/index.rst. + Creating file source/Makefile. + + Finished: An initial directory structure has been created. + + You should now populate your master file source/index.rst and create other documentation + source files. Use the Makefile to build the docs, like so: + make builder + where "builder" is one of the supported builders, e.g. html, latex or linkcheck. + +Finally are we ready to run :command:`make`. Be sure to :command:`cd` to the :file:`source/` +directory before running :command:`make` . + +.. codeblock:: make + + $ make html + sphinx-build -b html -d _build/doctrees . _build/html + Running Sphinx v1.3.1 + making output directory... + . + . + . + build succeeded, 9 warnings. + + Build finished. The HTML pages are in _build/html. + +Open a page in a web browser to view the rendered documentation. + +.. _GNU make: https://www.gnu.org/software/make/ +.. _Python: https://www.python.org/ +.. _PIP: https://pypi.python.org/pypi/pip/ \ No newline at end of file From 6506a3f099f83f27eea29203fe3580f713ac0c19 Mon Sep 17 00:00:00 2001 From: Leona Date: Fri, 13 Nov 2015 12:37:26 -0800 Subject: [PATCH 39/48] fix typo, add link to Sphinx --- README.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 114e23b9..00995a0c 100644 --- a/README.rst +++ b/README.rst @@ -11,7 +11,7 @@ Building with `Sphinx`_, however, requires a few prerequisites: * `Python`_ * `PIP`_ -The instructions for installing these varies according to OS. You can On a basic +The instructions for installing these varies according to OS. On a basic out-of-the-box Ubuntu-like install, you might need something like: .. @@ -167,4 +167,5 @@ Open a page in a web browser to view the rendered documentation. .. _GNU make: https://www.gnu.org/software/make/ .. _Python: https://www.python.org/ -.. _PIP: https://pypi.python.org/pypi/pip/ \ No newline at end of file +.. _PIP: https://pypi.python.org/pypi/pip/ +.. _Sphinx: http://sphinx-doc.org/ \ No newline at end of file From e16fe932a2b01dc50582f48af07935866e880446 Mon Sep 17 00:00:00 2001 From: Leona Date: Fri, 13 Nov 2015 12:39:35 -0800 Subject: [PATCH 40/48] fix typo and add external link to Sphinx doc. --- README.rst | 341 +++++++++++++++++++++++++++-------------------------- 1 file changed, 171 insertions(+), 170 deletions(-) diff --git a/README.rst b/README.rst index 114e23b9..d837d73d 100644 --- a/README.rst +++ b/README.rst @@ -1,170 +1,171 @@ -Documentation Build Instructions -================================ - -ClearLinux Docs are written in :abbr:`ReStructuredText (ReST)` which makes for -easily-parsable, command-line readable, indexed and search-friendly documentation -and APIs. - -Building with `Sphinx`_, however, requires a few prerequisites: - -* `GNU make`_ -* `Python`_ -* `PIP`_ - -The instructions for installing these varies according to OS. You can On a basic -out-of-the-box Ubuntu-like install, you might need something like: - -.. - - $ sudo apt-get install python-pip - $ sudo pip install -U sphinx sphinx-autobuild - -.. codeblock:: python - - $ python -c 'print __import__("sphinx").__version__' - 1.3.1 - -Dependencies fulfilled, let's now clone that gitlab repo: - -.. codeblock:: git - - $ git clone git@clrgitlab.intel.com:clr-documentation/project-docs.git - Cloning into 'project-docs'... - remote: Counting objects: 631, done. - remote: Compressing objects: 100% (583/583), done. - remote: Total 631 (delta 349), reused 108 (delta 35) - Receiving objects: 100% (631/631), 2.10 MiB | 0 bytes/s, done. - Resolving deltas: 100% (349/349), done. - Checking connectivity... done. - -Before running Sphinx, we need to correct some of the problems in the Gitlab repo. -Running :command:`make` straightaway from our clone won't work. We need to delete the -existing conf.py file and also the existing index file generated. These are remnants -of a build on a Windows box, and they don't quite work on Linux. These should be removed -from ``master`` eventually. - -.. codeblock:: shell-session - - $ cd project-docs/ - $ ls - make.bat Makefile source/ - $ rm -rf Makefile make.bat - $ rm -rf source/conf.py - $ mv source/index.rst source/oldindex.rst - - -In the cloned source directory, we have all the .rst files we need to build the docs. We -run a native instance of :command:`sphinx-quickstart`. The program will run you through -a series of questons. The main things to be conscious of here: - -* Tell it to use the existing :file:`source/` directory as the Root path for - the documentation; this is what it looks in, in order to generate the HTML -* It's better to tell it to **not** separate the source and build directories; the Sphinx - will generate *another* :file:`source/` directory, which can be confusing. - -What follows here is a log from a successful :command:`sphinx-quickstart` build started from -within the :file:`project-docs/` directory. - -.. codeblock:: shell-session - - $ sphinx-quickstart - Welcome to the Sphinx 1.3.1 quickstart utility. - - Please enter values for the following settings (just press Enter to - accept a default value, if one is given in brackets). - - Enter the root path for documentation. - > Root path for the documentation [.]: source/ - - You have two options for placing the build directory for Sphinx output. - Either, you use a directory "_build" within the root path, or you separate - "source" and "build" directories within the root path. - > Separate source and build directories (y/n) [n]: n - - Inside the root directory, two more directories will be created; "_templates" - for custom HTML templates and "_static" for custom stylesheets and other static - files. You can enter another prefix (such as ".") to replace the underscore. - > Name prefix for templates and static dir [_]: - - The project name will occur in several places in the built documentation. - > Project name: ClearLinux Docs - > Author name(s): Intel OTC - - Sphinx has the notion of a "version" and a "release" for the - software. Each version can have multiple releases. For example, for - Python the version is something like 2.5 or 3.0, while the release is - something like 2.5.1 or 3.0a1. If you don't need this dual structure, - just set both to the same value. - > Project version: 1.0.0 - > Project release [1.0.0]: 1.0.0 - - If the documents are to be written in a language other than English, - you can select a language here by its language code. Sphinx will then - translate text that it generates into that language. - - For a list of supported codes, see - http://sphinx-doc.org/config.html#confval-language. - > Project language [en]: en - - The file name suffix for source files. Commonly, this is either ".txt" - or ".rst". Only files with this suffix are considered documents. - > Source file suffix [.rst]: .rst - - One document is special in that it is considered the top node of the - "contents tree", that is, it is the root of the hierarchical structure - of the documents. Normally, this is "index", but if your "index" - document is a custom template, you can also set this to another filename. - > Name of your master document (without suffix) [index]: - - Sphinx can also add configuration for epub output: - > Do you want to use the epub builder (y/n) [n]: n - - Please indicate if you want to use one of the following Sphinx extensions: - > autodoc: automatically insert docstrings from modules (y/n) [n]: n - > doctest: automatically test code snippets in doctest blocks (y/n) [n]: n - > intersphinx: link between Sphinx documentation of different projects (y/n) [n]: n - > todo: write "todo" entries that can be shown or hidden on build (y/n) [n]: n - > coverage: checks for documentation coverage (y/n) [n]: n - > pngmath: include math, rendered as PNG images (y/n) [n]: n - > mathjax: include math, rendered in the browser by MathJax (y/n) [n]: y - > ifconfig: conditional inclusion of content based on config values (y/n) [n]: y - > viewcode: include links to the source code of documented Python objects (y/n) [n]: y - - A Makefile and a Windows command file can be generated for you so that you - only have to run e.g. `make html' instead of invoking sphinx-build - directly. - > Create Makefile? (y/n) [y]: y - > Create Windows command file? (y/n) [n]: n - - Creating file source/conf.py. - Creating file source/index.rst. - Creating file source/Makefile. - - Finished: An initial directory structure has been created. - - You should now populate your master file source/index.rst and create other documentation - source files. Use the Makefile to build the docs, like so: - make builder - where "builder" is one of the supported builders, e.g. html, latex or linkcheck. - -Finally are we ready to run :command:`make`. Be sure to :command:`cd` to the :file:`source/` -directory before running :command:`make` . - -.. codeblock:: make - - $ make html - sphinx-build -b html -d _build/doctrees . _build/html - Running Sphinx v1.3.1 - making output directory... - . - . - . - build succeeded, 9 warnings. - - Build finished. The HTML pages are in _build/html. - -Open a page in a web browser to view the rendered documentation. - -.. _GNU make: https://www.gnu.org/software/make/ -.. _Python: https://www.python.org/ -.. _PIP: https://pypi.python.org/pypi/pip/ \ No newline at end of file +Documentation Build Instructions +================================ + +ClearLinux Docs are written in :abbr:`ReStructuredText (ReST)` which makes for +easily-parsable, command-line readable, indexed and search-friendly documentation +and APIs. + +Building with `Sphinx`_, however, requires a few prerequisites: + +* `GNU make`_ +* `Python`_ +* `PIP`_ + +The instructions for installing these varies according to OS. On a basic +out-of-the-box Ubuntu-like install, you might need something like: + +.. + + $ sudo apt-get install python-pip + $ sudo pip install -U sphinx sphinx-autobuild + +.. codeblock:: python + + $ python -c 'print __import__("sphinx").__version__' + 1.3.1 + +Dependencies fulfilled, let's now clone that gitlab repo: + +.. codeblock:: git + + $ git clone git@clrgitlab.intel.com:clr-documentation/project-docs.git + Cloning into 'project-docs'... + remote: Counting objects: 631, done. + remote: Compressing objects: 100% (583/583), done. + remote: Total 631 (delta 349), reused 108 (delta 35) + Receiving objects: 100% (631/631), 2.10 MiB | 0 bytes/s, done. + Resolving deltas: 100% (349/349), done. + Checking connectivity... done. + +Before running Sphinx, we need to correct some of the problems in the Gitlab repo. +Running :command:`make` straightaway from our clone won't work. We need to delete the +existing conf.py file and also the existing index file generated. These are remnants +of a build on a Windows box, and they don't quite work on Linux. These should be removed +from ``master`` eventually. + +.. codeblock:: shell-session + + $ cd project-docs/ + $ ls + make.bat Makefile source/ + $ rm -rf Makefile make.bat + $ rm -rf source/conf.py + $ mv source/index.rst source/oldindex.rst + + +In the cloned source directory, we have all the .rst files we need to build the docs. We +run a native instance of :command:`sphinx-quickstart`. The program will run you through +a series of questons. The main things to be conscious of here: + +* Tell it to use the existing :file:`source/` directory as the Root path for + the documentation; this is what it looks in, in order to generate the HTML +* It's better to tell it to **not** separate the source and build directories; the Sphinx + will generate *another* :file:`source/` directory, which can be confusing. + +What follows here is a log from a successful :command:`sphinx-quickstart` build started from +within the :file:`project-docs/` directory. + +.. codeblock:: shell-session + + $ sphinx-quickstart + Welcome to the Sphinx 1.3.1 quickstart utility. + + Please enter values for the following settings (just press Enter to + accept a default value, if one is given in brackets). + + Enter the root path for documentation. + > Root path for the documentation [.]: source/ + + You have two options for placing the build directory for Sphinx output. + Either, you use a directory "_build" within the root path, or you separate + "source" and "build" directories within the root path. + > Separate source and build directories (y/n) [n]: n + + Inside the root directory, two more directories will be created; "_templates" + for custom HTML templates and "_static" for custom stylesheets and other static + files. You can enter another prefix (such as ".") to replace the underscore. + > Name prefix for templates and static dir [_]: + + The project name will occur in several places in the built documentation. + > Project name: ClearLinux Docs + > Author name(s): Intel OTC + + Sphinx has the notion of a "version" and a "release" for the + software. Each version can have multiple releases. For example, for + Python the version is something like 2.5 or 3.0, while the release is + something like 2.5.1 or 3.0a1. If you don't need this dual structure, + just set both to the same value. + > Project version: 1.0.0 + > Project release [1.0.0]: 1.0.0 + + If the documents are to be written in a language other than English, + you can select a language here by its language code. Sphinx will then + translate text that it generates into that language. + + For a list of supported codes, see + http://sphinx-doc.org/config.html#confval-language. + > Project language [en]: en + + The file name suffix for source files. Commonly, this is either ".txt" + or ".rst". Only files with this suffix are considered documents. + > Source file suffix [.rst]: .rst + + One document is special in that it is considered the top node of the + "contents tree", that is, it is the root of the hierarchical structure + of the documents. Normally, this is "index", but if your "index" + document is a custom template, you can also set this to another filename. + > Name of your master document (without suffix) [index]: + + Sphinx can also add configuration for epub output: + > Do you want to use the epub builder (y/n) [n]: n + + Please indicate if you want to use one of the following Sphinx extensions: + > autodoc: automatically insert docstrings from modules (y/n) [n]: n + > doctest: automatically test code snippets in doctest blocks (y/n) [n]: n + > intersphinx: link between Sphinx documentation of different projects (y/n) [n]: n + > todo: write "todo" entries that can be shown or hidden on build (y/n) [n]: n + > coverage: checks for documentation coverage (y/n) [n]: n + > pngmath: include math, rendered as PNG images (y/n) [n]: n + > mathjax: include math, rendered in the browser by MathJax (y/n) [n]: y + > ifconfig: conditional inclusion of content based on config values (y/n) [n]: y + > viewcode: include links to the source code of documented Python objects (y/n) [n]: y + + A Makefile and a Windows command file can be generated for you so that you + only have to run e.g. `make html' instead of invoking sphinx-build + directly. + > Create Makefile? (y/n) [y]: y + > Create Windows command file? (y/n) [n]: n + + Creating file source/conf.py. + Creating file source/index.rst. + Creating file source/Makefile. + + Finished: An initial directory structure has been created. + + You should now populate your master file source/index.rst and create other documentation + source files. Use the Makefile to build the docs, like so: + make builder + where "builder" is one of the supported builders, e.g. html, latex or linkcheck. + +Finally are we ready to run :command:`make`. Be sure to :command:`cd` to the :file:`source/` +directory before running :command:`make` . + +.. codeblock:: make + + $ make html + sphinx-build -b html -d _build/doctrees . _build/html + Running Sphinx v1.3.1 + making output directory... + . + . + . + build succeeded, 9 warnings. + + Build finished. The HTML pages are in _build/html. + +Open a page in a web browser to view the rendered documentation. + +.. _GNU make: https://www.gnu.org/software/make/ +.. _Python: https://www.python.org/ +.. _PIP: https://pypi.python.org/pypi/pip/ +.. _Sphinx: http://sphinx-doc.org/ \ No newline at end of file From 95fa254486e606369086b851c158a6060d63df8a Mon Sep 17 00:00:00 2001 From: "Munoz, Obed N" Date: Fri, 13 Nov 2015 15:55:04 -0600 Subject: [PATCH 41/48] Change to new swupd command format Signed-off-by: Munoz, Obed N --- source/openstack_dashboard.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/openstack_dashboard.rst b/source/openstack_dashboard.rst index 6af074e6..ce585372 100644 --- a/source/openstack_dashboard.rst +++ b/source/openstack_dashboard.rst @@ -23,7 +23,7 @@ To get started with OpenStack Dashboard services: #. Install the OpenStack Dashboard bundle:: - # clr_bundle_add openstack-dashboard + # swupd bundle-add openstack-dashboard # swupd verify --fix #. Enable and start the dashboard socket and the Nginx server:: From be0f1b67cba071e24552f97a758c722dbb2b6825 Mon Sep 17 00:00:00 2001 From: "Munoz, Obed N" Date: Fri, 13 Nov 2015 16:49:25 -0600 Subject: [PATCH 42/48] Change to new swupd command format Signed-off-by: Munoz, Obed N --- source/openstack_block_storage.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/openstack_block_storage.rst b/source/openstack_block_storage.rst index 97808623..75f66027 100644 --- a/source/openstack_block_storage.rst +++ b/source/openstack_block_storage.rst @@ -318,7 +318,8 @@ Prerequisites #. Install the openstack block storage bundle:: - # clr_bundle_add openstack-block-storage + # swupd bundle-add openstack-block-storage + # swupd verify --fix #. Create the LVM physical volume: ``/dev/sdb1`` If your system uses a different device name, adjust these steps accordingly:: From 158bc2f163969a0f8e3d1c7d4f659c79b9d99b5c Mon Sep 17 00:00:00 2001 From: Leona Date: Mon, 16 Nov 2015 07:14:06 -0800 Subject: [PATCH 43/48] adding instructions for how to correct index --- README.rst | 198 ++++------------------------------------------------- 1 file changed, 14 insertions(+), 184 deletions(-) diff --git a/README.rst b/README.rst index c8db983f..75a678c8 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,3 @@ -<<<<<<< HEAD Documentation Build Instructions ================================ @@ -12,8 +11,9 @@ Building with `Sphinx`_, however, requires a few prerequisites: * `Python`_ * `PIP`_ -The instructions for installing these varies according to OS. On a basic -out-of-the-box Ubuntu-like install, you might need something like: +The instructions for installing these varies according to OS. On a basic +out-of-the-box Ubuntu-like (which usually has Python installed by default), +you might need something like: .. @@ -27,7 +27,7 @@ out-of-the-box Ubuntu-like install, you might need something like: Dependencies fulfilled, let's now clone that gitlab repo: -.. codeblock:: git +.. codeblock:: shell-session $ git clone git@clrgitlab.intel.com:clr-documentation/project-docs.git Cloning into 'project-docs'... @@ -40,9 +40,9 @@ Dependencies fulfilled, let's now clone that gitlab repo: Before running Sphinx, we need to correct some of the problems in the Gitlab repo. Running :command:`make` straightaway from our clone won't work. We need to delete the -existing conf.py file and also the existing index file generated. These are remnants -of a build on a Windows box, and they don't quite work on Linux. These should be removed -from ``master`` eventually. +existing conf.py file and also rename the existing index file so it can generate a new one +with the correct parameters. These files in the Gitlab repo are remnant of a build on a Windows +box, and they don't quite work on Linux. These should be removed from ``master`` eventually. .. codeblock:: shell-session @@ -157,187 +157,17 @@ directory before running :command:`make` . sphinx-build -b html -d _build/doctrees . _build/html Running Sphinx v1.3.1 making output directory... - . - . - . + . + . + . build succeeded, 9 warnings. Build finished. The HTML pages are in _build/html. -Open a page in a web browser to view the rendered documentation. +Open one of these pages in a web browser to view the rendered documentation. You can copy the +contents of the oldindex.rst into the generated index file, re-run :command:`make`, to generate +the new HTML, and your local Table of Contents should index and update accordingly. .. _GNU make: https://www.gnu.org/software/make/ .. _Python: https://www.python.org/ -.. _PIP: https://pypi.python.org/pypi/pip/ -======= -Documentation Build Instructions -================================ - -ClearLinux Docs are written in :abbr:`ReStructuredText (ReST)` which makes for -easily-parsable, command-line readable, indexed and search-friendly documentation -and APIs. - -Building with `Sphinx`_, however, requires a few prerequisites: - -* `GNU make`_ -* `Python`_ -* `PIP`_ - -The instructions for installing these varies according to OS. On a basic -out-of-the-box Ubuntu-like install, you might need something like: - -.. - - $ sudo apt-get install python-pip - $ sudo pip install -U sphinx sphinx-autobuild - -.. codeblock:: python - - $ python -c 'print __import__("sphinx").__version__' - 1.3.1 - -Dependencies fulfilled, let's now clone that gitlab repo: - -.. codeblock:: raw - - $ git clone git@clrgitlab.intel.com:clr-documentation/project-docs.git - Cloning into 'project-docs'... - remote: Counting objects: 631, done. - remote: Compressing objects: 100% (583/583), done. - remote: Total 631 (delta 349), reused 108 (delta 35) - Receiving objects: 100% (631/631), 2.10 MiB | 0 bytes/s, done. - Resolving deltas: 100% (349/349), done. - Checking connectivity... done. - -Before running Sphinx, we need to correct some of the problems in the Gitlab repo. -Running :command:`make` straightaway from our clone won't work. We need to delete the -existing conf.py file and also the existing index file generated. These are remnants -of a build on a Windows box, and they don't quite work on Linux. These should be removed -from ``master`` eventually. - -.. codeblock:: raw - - $ cd project-docs/ - $ ls - make.bat Makefile source/ - $ rm -rf Makefile make.bat - $ rm -rf source/conf.py - $ mv source/index.rst source/oldindex.rst - - -In the cloned source directory, we have all the .rst files we need to build the docs. We -run a native instance of :command:`sphinx-quickstart`. The program will run you through -a series of questons. The main things to be conscious of here: - -* Tell it to use the existing :file:`source/` directory as the Root path for - the documentation; this is what it looks in, in order to generate the HTML -* It's better to tell it to **not** separate the source and build directories; the Sphinx - will generate *another* :file:`source/` directory, which can be confusing. - -What follows here is a log from a successful :command:`sphinx-quickstart` build started from -within the :file:`project-docs/` directory. - -.. codeblock:: raw - - $ sphinx-quickstart - Welcome to the Sphinx 1.3.1 quickstart utility. - - Please enter values for the following settings (just press Enter to - accept a default value, if one is given in brackets). - - Enter the root path for documentation. - > Root path for the documentation [.]: source/ - - You have two options for placing the build directory for Sphinx output. - Either, you use a directory "_build" within the root path, or you separate - "source" and "build" directories within the root path. - > Separate source and build directories (y/n) [n]: n - - Inside the root directory, two more directories will be created; "_templates" - for custom HTML templates and "_static" for custom stylesheets and other static - files. You can enter another prefix (such as ".") to replace the underscore. - > Name prefix for templates and static dir [_]: - - The project name will occur in several places in the built documentation. - > Project name: ClearLinux Docs - > Author name(s): Intel OTC - - Sphinx has the notion of a "version" and a "release" for the - software. Each version can have multiple releases. For example, for - Python the version is something like 2.5 or 3.0, while the release is - something like 2.5.1 or 3.0a1. If you don't need this dual structure, - just set both to the same value. - > Project version: 1.0.0 - > Project release [1.0.0]: 1.0.0 - - If the documents are to be written in a language other than English, - you can select a language here by its language code. Sphinx will then - translate text that it generates into that language. - - For a list of supported codes, see - http://sphinx-doc.org/config.html#confval-language. - > Project language [en]: en - - The file name suffix for source files. Commonly, this is either ".txt" - or ".rst". Only files with this suffix are considered documents. - > Source file suffix [.rst]: .rst - - One document is special in that it is considered the top node of the - "contents tree", that is, it is the root of the hierarchical structure - of the documents. Normally, this is "index", but if your "index" - document is a custom template, you can also set this to another filename. - > Name of your master document (without suffix) [index]: - - Sphinx can also add configuration for epub output: - > Do you want to use the epub builder (y/n) [n]: n - - Please indicate if you want to use one of the following Sphinx extensions: - > autodoc: automatically insert docstrings from modules (y/n) [n]: n - > doctest: automatically test code snippets in doctest blocks (y/n) [n]: n - > intersphinx: link between Sphinx documentation of different projects (y/n) [n]: n - > todo: write "todo" entries that can be shown or hidden on build (y/n) [n]: n - > coverage: checks for documentation coverage (y/n) [n]: n - > pngmath: include math, rendered as PNG images (y/n) [n]: n - > mathjax: include math, rendered in the browser by MathJax (y/n) [n]: y - > ifconfig: conditional inclusion of content based on config values (y/n) [n]: y - > viewcode: include links to the source code of documented Python objects (y/n) [n]: y - - A Makefile and a Windows command file can be generated for you so that you - only have to run e.g. `make html' instead of invoking sphinx-build - directly. - > Create Makefile? (y/n) [y]: y - > Create Windows command file? (y/n) [n]: n - - Creating file source/conf.py. - Creating file source/index.rst. - Creating file source/Makefile. - - Finished: An initial directory structure has been created. - - You should now populate your master file source/index.rst and create other documentation - source files. Use the Makefile to build the docs, like so: - make builder - where "builder" is one of the supported builders, e.g. html, latex or linkcheck. - -Finally are we ready to run :command:`make`. Be sure to :command:`cd` to the :file:`source/` -directory before running :command:`make` . - -.. codeblock:: raw - - $ make html - sphinx-build -b html -d _build/doctrees . _build/html - Running Sphinx v1.3.1 - making output directory... - . - . - . - build succeeded, 9 warnings. - - Build finished. The HTML pages are in _build/html. - -Open a page in a web browser to view the rendered documentation. - -.. _GNU make: https://www.gnu.org/software/make/ -.. _Python: https://www.python.org/ -.. _PIP: https://pypi.python.org/pypi/pip/ -.. _Sphinx: http://sphinx-doc.org/ \ No newline at end of file +.. _PIP: https://pypi.python.org/pypi/pip/ \ No newline at end of file From be89cea6d9f8f06805a9d8e04e1535366868d138 Mon Sep 17 00:00:00 2001 From: Leona Date: Mon, 16 Nov 2015 07:24:06 -0800 Subject: [PATCH 44/48] adding reference detail and link to tips for formatting in .rst docs --- README.rst | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/README.rst b/README.rst index 75a678c8..c8c4026f 100644 --- a/README.rst +++ b/README.rst @@ -1,9 +1,9 @@ Documentation Build Instructions ================================ -ClearLinux Docs are written in :abbr:`ReStructuredText (ReST)` which makes for -easily-parsable, command-line readable, indexed and search-friendly documentation -and APIs. +ClearLinux Docs are written in :abbr:`ReStructuredText (ReST)` AKA ``.rst``, which +makes for easily-parsable, command-line readable, indexed and search-friendly +documentation and APIs. Building with `Sphinx`_, however, requires a few prerequisites: @@ -15,12 +15,12 @@ The instructions for installing these varies according to OS. On a basic out-of-the-box Ubuntu-like (which usually has Python installed by default), you might need something like: -.. +.. codeblock:: shell-session $ sudo apt-get install python-pip $ sudo pip install -U sphinx sphinx-autobuild -.. codeblock:: python +.. codeblock:: shell-session $ python -c 'print __import__("sphinx").__version__' 1.3.1 @@ -56,7 +56,7 @@ box, and they don't quite work on Linux. These should be removed from ``master`` In the cloned source directory, we have all the .rst files we need to build the docs. We run a native instance of :command:`sphinx-quickstart`. The program will run you through -a series of questons. The main things to be conscious of here: +a series of questions. The main things to be conscious of here: * Tell it to use the existing :file:`source/` directory as the Root path for the documentation; this is what it looks in, in order to generate the HTML @@ -168,6 +168,10 @@ Open one of these pages in a web browser to view the rendered documentation. Yo contents of the oldindex.rst into the generated index file, re-run :command:`make`, to generate the new HTML, and your local Table of Contents should index and update accordingly. +For extra help and tips for contributing documentation which will render beautifully on websites, +despite being written in .rst see: `Theming_Sphinx`_. + .. _GNU make: https://www.gnu.org/software/make/ .. _Python: https://www.python.org/ -.. _PIP: https://pypi.python.org/pypi/pip/ \ No newline at end of file +.. _PIP: https://pypi.python.org/pypi/pip/ +.. _Theming Sphinx: https://github.com/otcshare/tcs-hub/blob/master/theming-sphinx.rst \ No newline at end of file From 5f15301376e94b191b75ff967943cdb3e3c6fe1e Mon Sep 17 00:00:00 2001 From: Leona Date: Mon, 16 Nov 2015 08:34:26 -0800 Subject: [PATCH 45/48] images need to be in _static folder for linkage, updating index with files, syntax editing on message broker service --- source/Makefile | 192 + source/_build/doctrees/bundles_in_clr.doctree | Bin 0 -> 34294 bytes .../doctrees/bundles_in_clr_html.doctree | Bin 0 -> 33728 bytes .../_build/doctrees/bundles_overview.doctree | Bin 0 -> 5200 bytes source/_build/doctrees/disclaimers.doctree | Bin 0 -> 3641 bytes .../doctrees/documentation_license.doctree | Bin 0 -> 2811 bytes source/_build/doctrees/environment.pickle | Bin 0 -> 72402 bytes ...-clear-containers-gettting-started.doctree | Bin 0 -> 15976 bytes .../doctrees/gs_creating_bootable_usb.doctree | Bin 0 -> 15401 bytes .../doctrees/gs_getting_started.doctree | Bin 0 -> 5664 bytes .../gs_installing_clr_as_host.doctree | Bin 0 -> 12060 bytes .../doctrees/gs_running_clr_virtual.doctree | Bin 0 -> 11897 bytes .../doctrees/gs_supported_hardware.doctree | Bin 0 -> 4222 bytes source/_build/doctrees/index.doctree | Bin 0 -> 12307 bytes .../doctrees/openstack_block_storage.doctree | Bin 0 -> 88220 bytes ...enstack_bundle_and_service_summary.doctree | Bin 0 -> 19944 bytes .../_build/doctrees/openstack_compute.doctree | Bin 0 -> 96682 bytes .../doctrees/openstack_dashboard.doctree | Bin 0 -> 7268 bytes .../openstack_environment-database.doctree | Bin 0 -> 11047 bytes .../openstack_environment-messaging.doctree | Bin 0 -> 10243 bytes .../openstack_identity-openrc.doctree | Bin 0 -> 15855 bytes .../doctrees/openstack_identity.doctree | Bin 0 -> 77327 bytes .../_build/doctrees/openstack_image.doctree | Bin 0 -> 54499 bytes .../openstack_installing_bundles.doctree | Bin 0 -> 11967 bytes .../doctrees/openstack_networking.doctree | Bin 0 -> 57647 bytes .../doctrees/openstack_object_storage.doctree | Bin 0 -> 122303 bytes .../doctrees/openstack_orchestration.doctree | Bin 0 -> 57967 bytes .../openstack_supporting-database.doctree | Bin 0 -> 10563 bytes .../openstack_supporting-messaging.doctree | Bin 0 -> 10570 bytes .../openstack_sys_req_and_pw_summary.doctree | Bin 0 -> 19100 bytes .../doctrees/openstack_telemetry.doctree | Bin 0 -> 45808 bytes .../doctrees/openstack_use_cases.doctree | Bin 0 -> 8109 bytes source/_build/doctrees/substitutions.doctree | Bin 0 -> 2760 bytes .../doctrees/swupdate_about_sw_update.doctree | Bin 0 -> 15871 bytes .../swupdate_how_to_run_the_updater.doctree | Bin 0 -> 8856 bytes source/_build/html/.buildinfo | 4 + .../html/_images}/bundles_overview.png | Bin .../html/_images}/gs_confirmation_screen.png | Bin .../_build/html/_sources/bundles_in_clr.txt | 7 + .../html/_sources/bundles_in_clr_html.txt | 773 ++ .../_build/html/_sources/bundles_overview.txt | 25 + source/_build/html/_sources/disclaimers.txt | 10 + .../html/_sources/documentation_license.txt | 12 + .../gs-clear-containers-gettting-started.txt | 75 + .../_sources/gs_creating_bootable_usb.txt | 69 + .../html/_sources/gs_getting_started.txt | 11 + .../_sources/gs_installing_clr_as_host.txt | 38 + .../html/_sources/gs_running_clr_virtual.txt | 67 + .../html/_sources/gs_supported_hardware.txt | 11 + source/_build/html/_sources/index.txt | 100 + .../html/_sources/openstack_block_storage.txt | 479 + .../openstack_bundle_and_service_summary.txt | 51 + .../html/_sources/openstack_compute.txt | 528 + .../html/_sources/openstack_dashboard.txt | 34 + .../openstack_environment-database.txt | 58 + .../openstack_environment-messaging.txt | 59 + .../_sources/openstack_identity-openrc.txt | 75 + .../html/_sources/openstack_identity.txt | 418 + .../_build/html/_sources/openstack_image.txt | 278 + .../_sources/openstack_installing_bundles.txt | 26 + .../html/_sources/openstack_networking.txt | 309 + .../_sources/openstack_object_storage.txt | 626 + .../html/_sources/openstack_orchestration.txt | 290 + .../openstack_supporting-database.txt | 53 + .../openstack_supporting-messaging.txt | 48 + .../openstack_sys_req_and_pw_summary.txt | 78 + .../html/_sources/openstack_telemetry.txt | 224 + .../html/_sources/openstack_use_cases.txt | 27 + source/_build/html/_sources/substitutions.txt | 5 + .../_sources/swupdate_about_sw_update.txt | 105 + .../swupdate_how_to_run_the_updater.txt | 39 + source/_build/html/_static/ajax-loader.gif | Bin 0 -> 673 bytes source/_build/html/_static/alabaster.css | 585 + source/_build/html/_static/basic.css | 599 + source/_build/html/_static/comment-bright.png | Bin 0 -> 3500 bytes source/_build/html/_static/comment-close.png | Bin 0 -> 3578 bytes source/_build/html/_static/comment.png | Bin 0 -> 3445 bytes source/_build/html/_static/doctools.js | 263 + source/_build/html/_static/down-pressed.png | Bin 0 -> 347 bytes source/_build/html/_static/down.png | Bin 0 -> 347 bytes source/_build/html/_static/file.png | Bin 0 -> 358 bytes .../html/_static/images/bundles_overview.png | Bin 0 -> 115841 bytes .../_static/images/gs_confirmation_screen.png | Bin 0 -> 42586 bytes .../images/openstack_example_architecture.jpg | Bin source/_build/html/_static/jquery-1.11.1.js | 10308 ++++++++++++++++ source/_build/html/_static/jquery.js | 4 + source/_build/html/_static/minus.png | Bin 0 -> 173 bytes source/_build/html/_static/plus.png | Bin 0 -> 173 bytes source/_build/html/_static/pygments.css | 63 + source/_build/html/_static/searchtools.js | 622 + .../_build/html/_static/underscore-1.3.1.js | 999 ++ source/_build/html/_static/underscore.js | 31 + source/_build/html/_static/up-pressed.png | Bin 0 -> 345 bytes source/_build/html/_static/up.png | Bin 0 -> 345 bytes source/_build/html/_static/websupport.js | 808 ++ source/_build/html/bundles_in_clr.html | 874 ++ source/_build/html/bundles_in_clr_html.html | 864 ++ source/_build/html/bundles_overview.html | 116 + source/_build/html/disclaimers.html | 100 + source/_build/html/documentation_license.html | 99 + source/_build/html/genindex.html | 92 + .../gs-clear-containers-gettting-started.html | 184 + .../_build/html/gs_creating_bootable_usb.html | 172 + source/_build/html/gs_getting_started.html | 100 + .../html/gs_installing_clr_as_host.html | 137 + .../_build/html/gs_running_clr_virtual.html | 170 + source/_build/html/gs_supported_hardware.html | 102 + source/_build/html/index.html | 205 + source/_build/html/objects.inv | Bin 0 -> 944 bytes .../_build/html/openstack_block_storage.html | 649 + .../openstack_bundle_and_service_summary.html | 178 + source/_build/html/openstack_compute.html | 691 ++ source/_build/html/openstack_dashboard.html | 132 + .../html/openstack_environment-database.html | 171 + .../html/openstack_environment-messaging.html | 165 + .../html/openstack_identity-openrc.html | 176 + source/_build/html/openstack_identity.html | 566 + source/_build/html/openstack_image.html | 421 + .../html/openstack_installing_bundles.html | 115 + source/_build/html/openstack_networking.html | 456 + .../_build/html/openstack_object_storage.html | 830 ++ .../_build/html/openstack_orchestration.html | 422 + .../html/openstack_supporting-database.html | 159 + .../html/openstack_supporting-messaging.html | 153 + .../openstack_sys_req_and_pw_summary.html | 195 + source/_build/html/openstack_telemetry.html | 358 + source/_build/html/openstack_use_cases.html | 112 + source/_build/html/search.html | 99 + source/_build/html/searchindex.js | 1 + source/_build/html/substitutions.html | 92 + .../_build/html/swupdate_about_sw_update.html | 192 + .../html/swupdate_how_to_run_the_updater.html | 138 + source/_static/images/bundles_overview.png | Bin 0 -> 115841 bytes .../_static/images/gs_confirmation_screen.png | Bin 0 -> 42586 bytes .../images/openstack_example_architecture.jpg | Bin 0 -> 31111 bytes source/bundles_in_clr_html.rst | 7 +- source/bundles_overview.rst | 2 +- source/conf.py | 62 +- source/gs_creating_bootable_usb.rst | 2 +- source/index.rst | 46 +- source/openstack_environment-database.rst | 58 + source/openstack_environment-messaging.rst | 59 + 142 files changed, 29360 insertions(+), 48 deletions(-) create mode 100644 source/Makefile create mode 100644 source/_build/doctrees/bundles_in_clr.doctree create mode 100644 source/_build/doctrees/bundles_in_clr_html.doctree create mode 100644 source/_build/doctrees/bundles_overview.doctree create mode 100644 source/_build/doctrees/disclaimers.doctree create mode 100644 source/_build/doctrees/documentation_license.doctree create mode 100644 source/_build/doctrees/environment.pickle create mode 100644 source/_build/doctrees/gs-clear-containers-gettting-started.doctree create mode 100644 source/_build/doctrees/gs_creating_bootable_usb.doctree create mode 100644 source/_build/doctrees/gs_getting_started.doctree create mode 100644 source/_build/doctrees/gs_installing_clr_as_host.doctree create mode 100644 source/_build/doctrees/gs_running_clr_virtual.doctree create mode 100644 source/_build/doctrees/gs_supported_hardware.doctree create mode 100644 source/_build/doctrees/index.doctree create mode 100644 source/_build/doctrees/openstack_block_storage.doctree create mode 100644 source/_build/doctrees/openstack_bundle_and_service_summary.doctree create mode 100644 source/_build/doctrees/openstack_compute.doctree create mode 100644 source/_build/doctrees/openstack_dashboard.doctree create mode 100644 source/_build/doctrees/openstack_environment-database.doctree create mode 100644 source/_build/doctrees/openstack_environment-messaging.doctree create mode 100644 source/_build/doctrees/openstack_identity-openrc.doctree create mode 100644 source/_build/doctrees/openstack_identity.doctree create mode 100644 source/_build/doctrees/openstack_image.doctree create mode 100644 source/_build/doctrees/openstack_installing_bundles.doctree create mode 100644 source/_build/doctrees/openstack_networking.doctree create mode 100644 source/_build/doctrees/openstack_object_storage.doctree create mode 100644 source/_build/doctrees/openstack_orchestration.doctree create mode 100644 source/_build/doctrees/openstack_supporting-database.doctree create mode 100644 source/_build/doctrees/openstack_supporting-messaging.doctree create mode 100644 source/_build/doctrees/openstack_sys_req_and_pw_summary.doctree create mode 100644 source/_build/doctrees/openstack_telemetry.doctree create mode 100644 source/_build/doctrees/openstack_use_cases.doctree create mode 100644 source/_build/doctrees/substitutions.doctree create mode 100644 source/_build/doctrees/swupdate_about_sw_update.doctree create mode 100644 source/_build/doctrees/swupdate_how_to_run_the_updater.doctree create mode 100644 source/_build/html/.buildinfo rename source/{images => _build/html/_images}/bundles_overview.png (100%) rename source/{images => _build/html/_images}/gs_confirmation_screen.png (100%) create mode 100644 source/_build/html/_sources/bundles_in_clr.txt create mode 100644 source/_build/html/_sources/bundles_in_clr_html.txt create mode 100644 source/_build/html/_sources/bundles_overview.txt create mode 100644 source/_build/html/_sources/disclaimers.txt create mode 100644 source/_build/html/_sources/documentation_license.txt create mode 100644 source/_build/html/_sources/gs-clear-containers-gettting-started.txt create mode 100644 source/_build/html/_sources/gs_creating_bootable_usb.txt create mode 100644 source/_build/html/_sources/gs_getting_started.txt create mode 100644 source/_build/html/_sources/gs_installing_clr_as_host.txt create mode 100644 source/_build/html/_sources/gs_running_clr_virtual.txt create mode 100644 source/_build/html/_sources/gs_supported_hardware.txt create mode 100644 source/_build/html/_sources/index.txt create mode 100644 source/_build/html/_sources/openstack_block_storage.txt create mode 100644 source/_build/html/_sources/openstack_bundle_and_service_summary.txt create mode 100644 source/_build/html/_sources/openstack_compute.txt create mode 100644 source/_build/html/_sources/openstack_dashboard.txt create mode 100644 source/_build/html/_sources/openstack_environment-database.txt create mode 100644 source/_build/html/_sources/openstack_environment-messaging.txt create mode 100644 source/_build/html/_sources/openstack_identity-openrc.txt create mode 100644 source/_build/html/_sources/openstack_identity.txt create mode 100644 source/_build/html/_sources/openstack_image.txt create mode 100644 source/_build/html/_sources/openstack_installing_bundles.txt create mode 100644 source/_build/html/_sources/openstack_networking.txt create mode 100644 source/_build/html/_sources/openstack_object_storage.txt create mode 100644 source/_build/html/_sources/openstack_orchestration.txt create mode 100644 source/_build/html/_sources/openstack_supporting-database.txt create mode 100644 source/_build/html/_sources/openstack_supporting-messaging.txt create mode 100644 source/_build/html/_sources/openstack_sys_req_and_pw_summary.txt create mode 100644 source/_build/html/_sources/openstack_telemetry.txt create mode 100644 source/_build/html/_sources/openstack_use_cases.txt create mode 100644 source/_build/html/_sources/substitutions.txt create mode 100644 source/_build/html/_sources/swupdate_about_sw_update.txt create mode 100644 source/_build/html/_sources/swupdate_how_to_run_the_updater.txt create mode 100644 source/_build/html/_static/ajax-loader.gif create mode 100644 source/_build/html/_static/alabaster.css create mode 100644 source/_build/html/_static/basic.css create mode 100644 source/_build/html/_static/comment-bright.png create mode 100644 source/_build/html/_static/comment-close.png create mode 100644 source/_build/html/_static/comment.png create mode 100644 source/_build/html/_static/doctools.js create mode 100644 source/_build/html/_static/down-pressed.png create mode 100644 source/_build/html/_static/down.png create mode 100644 source/_build/html/_static/file.png create mode 100644 source/_build/html/_static/images/bundles_overview.png create mode 100644 source/_build/html/_static/images/gs_confirmation_screen.png rename source/{ => _build/html/_static}/images/openstack_example_architecture.jpg (100%) create mode 100644 source/_build/html/_static/jquery-1.11.1.js create mode 100644 source/_build/html/_static/jquery.js create mode 100644 source/_build/html/_static/minus.png create mode 100644 source/_build/html/_static/plus.png create mode 100644 source/_build/html/_static/pygments.css create mode 100644 source/_build/html/_static/searchtools.js create mode 100644 source/_build/html/_static/underscore-1.3.1.js create mode 100644 source/_build/html/_static/underscore.js create mode 100644 source/_build/html/_static/up-pressed.png create mode 100644 source/_build/html/_static/up.png create mode 100644 source/_build/html/_static/websupport.js create mode 100644 source/_build/html/bundles_in_clr.html create mode 100644 source/_build/html/bundles_in_clr_html.html create mode 100644 source/_build/html/bundles_overview.html create mode 100644 source/_build/html/disclaimers.html create mode 100644 source/_build/html/documentation_license.html create mode 100644 source/_build/html/genindex.html create mode 100644 source/_build/html/gs-clear-containers-gettting-started.html create mode 100644 source/_build/html/gs_creating_bootable_usb.html create mode 100644 source/_build/html/gs_getting_started.html create mode 100644 source/_build/html/gs_installing_clr_as_host.html create mode 100644 source/_build/html/gs_running_clr_virtual.html create mode 100644 source/_build/html/gs_supported_hardware.html create mode 100644 source/_build/html/index.html create mode 100644 source/_build/html/objects.inv create mode 100644 source/_build/html/openstack_block_storage.html create mode 100644 source/_build/html/openstack_bundle_and_service_summary.html create mode 100644 source/_build/html/openstack_compute.html create mode 100644 source/_build/html/openstack_dashboard.html create mode 100644 source/_build/html/openstack_environment-database.html create mode 100644 source/_build/html/openstack_environment-messaging.html create mode 100644 source/_build/html/openstack_identity-openrc.html create mode 100644 source/_build/html/openstack_identity.html create mode 100644 source/_build/html/openstack_image.html create mode 100644 source/_build/html/openstack_installing_bundles.html create mode 100644 source/_build/html/openstack_networking.html create mode 100644 source/_build/html/openstack_object_storage.html create mode 100644 source/_build/html/openstack_orchestration.html create mode 100644 source/_build/html/openstack_supporting-database.html create mode 100644 source/_build/html/openstack_supporting-messaging.html create mode 100644 source/_build/html/openstack_sys_req_and_pw_summary.html create mode 100644 source/_build/html/openstack_telemetry.html create mode 100644 source/_build/html/openstack_use_cases.html create mode 100644 source/_build/html/search.html create mode 100644 source/_build/html/searchindex.js create mode 100644 source/_build/html/substitutions.html create mode 100644 source/_build/html/swupdate_about_sw_update.html create mode 100644 source/_build/html/swupdate_how_to_run_the_updater.html create mode 100644 source/_static/images/bundles_overview.png create mode 100644 source/_static/images/gs_confirmation_screen.png create mode 100644 source/_static/images/openstack_example_architecture.jpg create mode 100644 source/openstack_environment-database.rst create mode 100644 source/openstack_environment-messaging.rst diff --git a/source/Makefile b/source/Makefile new file mode 100644 index 00000000..655286aa --- /dev/null +++ b/source/Makefile @@ -0,0 +1,192 @@ +# 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) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.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 ' where 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/ClearLinuxDocumentation.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/ClearLinuxDocumentation.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/ClearLinuxDocumentation" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/ClearLinuxDocumentation" + @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." diff --git a/source/_build/doctrees/bundles_in_clr.doctree b/source/_build/doctrees/bundles_in_clr.doctree new file mode 100644 index 0000000000000000000000000000000000000000..46e4815f3d8ed9afcbe45bb4c951ea9baefdab5f GIT binary patch literal 34294 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 F{vW-EJmLTV literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/bundles_in_clr_html.doctree b/source/_build/doctrees/bundles_in_clr_html.doctree new file mode 100644 index 0000000000000000000000000000000000000000..5c425eaa3f950f649b1ea6a69c010aab07c903e3 GIT binary patch literal 33728 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 literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/bundles_overview.doctree b/source/_build/doctrees/bundles_overview.doctree new file mode 100644 index 0000000000000000000000000000000000000000..6f773a1655d69b9da0941bdab8c8b141b6e8ca7b GIT binary patch literal 5200 zcmeHLX?Gk)6_q7xnXxuIwi7#c(vbQ+x7SrI zX@G_p2v}j?cL@6)_I=L};iqu8Ro$ay5a;lPFC6QG&UAOxd#~QR_bv70s2?PLu4Ski zaT0J_uGnQ?BS}LF4OlBO@c7JPtzcB%3_jlzfXOT8bT4 zc}HofAuoyDfOi#57Bt0XQ!i88jkr=?4?=2fs3PMeJxPu$j~1u^fj@pAozHa$;FcsV-?^ElnU zItpP`VCnf{RKO`OSRD2WA{X*HEy5=k3%ax@PTNS|I~3^`iW|jAag#VB&a!d4hn55^ zUS1Tpw8gD$;k3nVZE>NU3n&(qy2h}!HNFjyH4jyB$5U77MFqVWCJ3YMV&3uc&aec8 z$m?ZZD(dtS*nGL5ml~V@i6A{_qO#oa6c3yvx6u% z9!OQj6ktlRYP(y(H|(TVxkmAyQ}!Z^TFluCre*jXtZn2T4C zHZZ}FF*bK(>}8Ux2EA-wh-$lTqL-U6-FaA;jt;`~3emjozy_@VfUhj*RR(~@nU^g9 zg@M^!1-;t9Z0*R%$U|P-cMb*_fdN9&P#WkMc*Pod#9*fkSrya38N|JAW2chk3J}Pl z%Y$!A&X$nAaFC0vG@w1sLj+m(9Zy#ut=u7~1w0LtzS$!)K&Pv>Afn+sF15hR1kl-# zz_c;zfcZ=Hk|T~6L^3w$^>mVfF`i{h44@$ohoOaMo(7%H&7Cb|z)&SNX9C6bLDmFd2jnpMvP`yB zqO>XAHWPS(tbQOVf=WiU&FLl)L+C(~A*oHt5Lgjsk1|&PcV{O^JhmN%hdclpCRSZZt@;6Kq0Yq6$?>nu5+d0$rvkrG07~|!lKXI3 znL?aA1uMB1)eoyhHdDl$2dFG20Jb6>Fb35MCl92loKd~QL+Ise7vCb4m##m#iG2!;ZI>^kz=UBu>zeV zp3$3IY-V>RvNOP23VJJ>!q2kze_KIqHm~|oCkfrbN=0vPlgo}Dn5gXTceKf4Cx@21 z_EV=#KCAiCga`dA1#RNSIyOBR-RyMH#iX`t;ogwfYm+c$rAdZxk!-Ok8B|l;6PV&= z_S>RpqfH^387M0ahzg3?ylE*i)D9N|AUXs^Nt;qOg{HzZ^@?cUAk)okzZKLU^THg{ zEM*C)g7hLgF>r-zh9?-lp(uwLH$Zff1(;ULB?WO znoZlmG$hyEMw0cKLPuefwpk4>@VSvq{cD(bd1}sJsv2@Py|cw;%_xw%=>N=kt>|3{ zq)v>EfjRGHmGTJD92A4PVpKFbT1Z z^T^#c2&WGtCUZd^rS2}K6nzA~!u%@ZZc;7#D3;Blsf~@nWkIBmwb&`+_bwU;6EzpZ z9_-beKF+4_VfpquE(i1pcARfZTsr{PxvG5gN%&^MaFGuPO8oFv+1+FsOMg-(UjXLr~bk2mRat?FE<;(35`L?M0NxNkc} zKklMg;aQBHhrR$l8K0o9w$pWW;xF#7W91O&8uZeaV5Y(7K9qeKDux_SUt#09?k?X+ zUuE@by8-mquv^CaLquO^HM??I$sRq!=3Gn$W{d>{%}`3;Xt5d?oI;`8rf(uK)wI`f zw`8CNeQOohJO^<^-)7@%?E$F%4x1d@@_bjEVRK-y#`JHv02gWc-ZfV1@z{*%aQ63M zngzg~OMU>bs|fc$F6FojQuM88B-E+au*r*KX=dd;M#vnR~C&w7W5}^7Rep8^3S%p nv(;{J^@Y10-0R>*ht&pYRMB7B^j9`v(0~i5zZLZNywms>ev5LF literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/disclaimers.doctree b/source/_build/doctrees/disclaimers.doctree new file mode 100644 index 0000000000000000000000000000000000000000..7f656f6f46b21b0b47788d37175e70fd88791304 GIT binary patch literal 3641 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 VN#P?P!mqV@oLqilaTLkz{{hj$BEkRw literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/gs_creating_bootable_usb.doctree b/source/_build/doctrees/gs_creating_bootable_usb.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f69ef0e82ad6713e7a88f4ac049df6d4426ebb02 GIT binary patch literal 15401 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 literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/gs_supported_hardware.doctree b/source/_build/doctrees/gs_supported_hardware.doctree new file mode 100644 index 0000000000000000000000000000000000000000..3e80d7bc548d967aa8972cf57dc2c68496ec4a6d GIT binary patch literal 4222 zcmcIn_kR?}6$gQ&y8{Uj1{;u*HExF!>6{o60x5Q|v9avK4h&Jsdb77Xce7@9XW!1O zN}P=$u@fo1_v%!qIK6kL_uhN{l6+_P?j*$VoB4duhr8R^neY34zi-}qXNEjqdYKMF zH62TztD5;5@mSYr{l2p_l+%VftHy4`^_#UY4dn z;wYJ=9;eMsR`aUW?HtT)UnjuQQA#4jnAxSqXuu_E83FN*18yB6MZ~W zeLUO5DBICdQv)7NWUS(eAoOuOZMW%?`dXH7RELA39pGqZPM3nC)Sd4Fy=-mt92T*G7W+sm(%0xY=hy*vRS3&dZ$yP#ufPDXNh@N z(O#R4dZDWnK3{3G;quq3@Cj=JpRN`lY9lamx(2LQde)(9#gN!;XRWoYDZ~KjYE%bp z`*OOjE-qv11ZWVu#U8ecFC$l!2J=(lX7~pm@vCT>>JJ(JJ2Do z(SCqFkkeBDx=4T%=O@5Z5z9Uk3t$ez=OL$q2ISMu0SRz@Q0Bx#Yk4}!7vQbK7dqwX z51yrG#g-q~KOthM}Af;*JG#c}P5& zDrE8;w_2RX7EEGNdp^*@I%2G7-C?|Vopt;KUQMlIvF72Uk61UQNE8j#vXmd9XRnIC z+6O>K3q})9KN{Fj)JsXbGprtW?=w@S)Mll%}m7@<@qqmW6le`0Pc8U zPPTD}0duNw2eL{SJ?_cL=>^_1{w$X<{C`(3d8}IwSaUaASP!1g@$|xah(d%H4G6n0 zf?J5t%E`MZSjb1*_pBCy4?r_hGa|IRB0Q#KPzNH2oB|_)0n_Su(y1FO zTtN{}>E0$A>(~FHfSt}MWEFfYi&d0U%(kkGZx28rfhSToL=_Lps z*9}rKH~h2Vkk9dOW_@|1^!f#q7}Pw};-dbd`ffD+8QXZQdGt8FG&3UIU-;!rPG|c& zzU+KOcZvJV;+I3w!?NaSGNq*^s|0?xiCacMW2@y+^eUTP&Bl8CmzumLr`NKr zLF@;q=^IMKie6{a>sdu{tx?_-y9a7;5~ z7*O;Uz}SwhW$L3@P4FJNk^tS%Tbpci+V-#%U2B$x^foprv`*BaMng-9W;)=yJuTBt zL+B`M(A!xRuJE|oo8Ga6hLsiMW~M*P)fwy7Kq(7wc{>1%*#JlfAtMPJ7eYlx?Bu;EO%rw-CLS*`oJ zG4!|ab`YIDVkq7O3p<^4%t@B7+kg7%b5Da93Bg+j8auUkiG4 zrozV0^$~ra4YQL+ar6(^Xm7~-A?AQB7_Br~V3P}=NYjs&ShZ93Kp^|afL0h_g_57Z z>?*?e=TL@GP|;79*=8ekKS6)StX_i7&(BXMi(1IINKl{8HLz4Q=;x+V#M)hOM9>i- z{xtmp7p#ms^h-8*E*)#K;8)^dHg0Y#XN7`avmp!@zX4i_xd+2QSE=7Fvpr>=@sJnE z4wAHRdb8H=;N~u=g;y2*-ex-s*9NiTX)!$W*l_RDAC}lAjGoA(^7|jn)mhNfzX1Q# z%vx;6+NxHL%YU9(SB`;y$?30k3_<%aKkduR#Jp-!FN^8la{4>&^J`6Q`bSYoiY9k$ jNy=EYcb6*qr%nH2BgPUKHUFK{f5e1M{}nr3>_7c~IAjwm literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/index.doctree b/source/_build/doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..07f2e0d82ebfa69a1ddf89826eb92e3678b11fe5 GIT binary patch literal 12307 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 F{BOm2Kdk@& literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/openstack_compute.doctree b/source/_build/doctrees/openstack_compute.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d9e31d8531161e200d149c5581012fdbfd7ac86a GIT binary patch literal 96682 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 literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/openstack_environment-database.doctree b/source/_build/doctrees/openstack_environment-database.doctree new file mode 100644 index 0000000000000000000000000000000000000000..bd5c92e97c20d924da6086af58daecfc0a41af3e GIT binary patch literal 11047 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 SKHe|VLwJbkXZVb&L;nZ)?HA|( literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/openstack_environment-messaging.doctree b/source/_build/doctrees/openstack_environment-messaging.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e3b4a200068150e0f57ecbecf1f32a7f31ee1a42 GIT binary patch literal 10243 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 XK8vT>4f{v2gdW95OrOIus#X36Y^Nms literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/openstack_identity-openrc.doctree b/source/_build/doctrees/openstack_identity-openrc.doctree new file mode 100644 index 0000000000000000000000000000000000000000..c9b82719f0e6ab03fd36bf9f67ae71893727ec0a GIT binary patch literal 15855 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 Apa1{> literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/openstack_identity.doctree b/source/_build/doctrees/openstack_identity.doctree new file mode 100644 index 0000000000000000000000000000000000000000..b8a4f04fe4aa8efab572196c31cb9e8ff866fea6 GIT binary patch literal 77327 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
    oi~Hlc&=OOMG@`%DW190xU&_o`MR6AGLgP7u ze5p#N-pnwH2+7gMlYAWlj_X2W(F*}^2-Zd7i7F$G>q27-gEgvCU5{#vWuL;bDx^p8 zGS&4{`m>)4$Lr4>RKEiNK>eCSE)D`3)w@3uPdtEeOT8gh19~&dAf5zC)xi5Uc}Xir zfAuBZI}cX#7|+R;3K-qNSpv0kPRC)mnQeb<27wyC>!RDN{V(gT87|kQ%3+t0hL#uQ zT3ua}g#(E=4SOK-6lrc>!yd%>q+vI49d1^2pyOCussoyWq+qJrgBe$Z_UMzSDIP+= zBdK*Q(h(0uIW)>GNO1o(Q|M?J3z((q)|Ky8Mt7S+cPW_C5^knFG_2VgS{_O@Z)eo; zs`(U>$HM^tc^nSX;t{|F89fpSuIXmVQgNx8T5;tdtZc933iqIki}S{(ZP&$i2=QnD zQhf9nF5I;zxwwRbCrdaLkq?3ukHz~UkH#jKxRsj7+KB9M^e7I4J(^B&9i2@cP17^U zqqmK1-60-Fba5b}KdAb6!cSWF1pM&C9r!EHRt3!`@hXsfwQME*wYQL zJ21v3J=qMY$hGQgV%U>S~7mZ!pq zH}l)K;4h6dB#+YqCBqVL#p|);iGE$Q$-3fgT{Xd(W8>f%|>&@NAY%#_!#~sm+SVBE%kA{!~ROjSy{j_-vXC=k4tysicfN}Pf_Ml z+#FiP$w998G#=N~2jp>94%Yvca|u49#7&6LAip9$i@%=u9Kj|})Ot0Z!J)t;Ay<4J zIk1S6K(8Wl<2jp70>@Z>0h;**Bq7hTsF*odPaN;&r|_! zq;c+H#JBNo6iSb(x)7xF7~f&QL_S@rDzNVo*y7}J#a{_~mm!hw5nO)rSn>=sc}0vv zP&mp7N3zRDTvv>EONj3SEV+^@;G!T-mEu7*@dJ9jIA>>SQ{sn&DY?>~&e)_f2XQ-W z-o_E?Kf?RllV?_H)tOqg5&j<&q9yVWBk>b@SWcJ0muu7G2gv`3pW+=__4r(EdS=`= zWmo(R@8Oj&i-QA`cW0nw;`ac$J$V!+^28q)nXLGXYu9q9 z<#b8>kzcQ*Au}klUKZ?%Kk@q$NqTNABPWlf2>;ADkCmOwI2nuh3j?npd+^tS@AVs!~7371lR9nky1rl-nr{SuGRc_R(XLF00Jvg4Z_ypiWBj2PqKqe1t*=^fA`XIc7Q{S?Ao%Op<;_vbQz>7YWqSiu#Y_>Jp-@plb}F2xHGzZB_^eVl^7 zKkp!Jxt?Q0KF^z@Y0O6S=Fj3_M&4^NgeQu3ifiZ(MK{Im_)|-s2y=jctl|O%R6|B8 zr!v9Q@E4J6KLw1Z6LGqyL0;bw3e{`LWxB_4#TfwIBhJKMzRrQ7ue0#riL>!H-@8Xx Ll%Agk-R}PbSEOv> literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/openstack_image.doctree b/source/_build/doctrees/openstack_image.doctree new file mode 100644 index 0000000000000000000000000000000000000000..c25eae118dbb9e179d90ec8bc7cc9fe03ce93b25 GIT binary patch literal 54499 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 literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/openstack_installing_bundles.doctree b/source/_build/doctrees/openstack_installing_bundles.doctree new file mode 100644 index 0000000000000000000000000000000000000000..02534a313bdc5d3ceca1a664b219eb8e811fd24b GIT binary patch literal 11967 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 literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/openstack_networking.doctree b/source/_build/doctrees/openstack_networking.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d4840e97ff332b435260e111f8b8c38d63b69839 GIT binary patch literal 57647 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

    _C8?rMRX3(LQ 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 Jlt#Vr{|8iEZr=a^ literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/openstack_object_storage.doctree b/source/_build/doctrees/openstack_object_storage.doctree new file mode 100644 index 0000000000000000000000000000000000000000..92523a217d6a9d914a74eb269d515ac5a8de1df7 GIT binary patch literal 122303 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

    ~L1_D_TsJuY;Bj;Jha=hv9(8 zdh$v{S@p{A+Bq4QQEno243LDMqQ(6FpXwThm0!(PBFbujX-V)XPoAh*Aj(Z7J6tmO z6)o1TmWZ+%P=uY^|LvYin334jErBsXbT#V3r5Ie8KAA#4Xj_4l*v z2Ta)?<0Sg#dg`V+g9o}NXn!}*QXjB~cL28Cg`XcP-apK>{p+FP`fZ-W&kq&9ALiQr z^$>CTo+~!(CC>w2OILgsAmEB;ePd*ZJnI`1hca|U(ScPk9*cM?+koN&>K4Xh zVMO+?2u15>)aPJ`&0Qr@x@|RRdN5}59Da`S8RSNNj;XuxVA4cM;yXhMBB7=+*LyHU_A;?EHNcyE*BsY_E?vQGABbstdX_@1#_vhnWO_1;n znf{%6MiAoTnn0=`$6Rkq2}Dn7wZAZ6zfaotv5UON2H^fk|6|OTk^aY7*H4(b z%JJvxJ#MYKqGJ)E*kk-pvPg`?;M>`;d`h78p7I2I>eI+ZTYLry!rh5UZ){Hh25n(7 z7}tM}r9N*;-2j%G`UDlULff0b6OZY4zd+WK``vd^JYNI^#Iq;xuD%3b&=y}t;;OHZ zb!`_SXU{HlWSgwQ$)@(N6838WY&f*->&&oJLwy5phK|)6fN}kT+19V4Aijw_MnQZF z5BUQa1#zdpYx~>8B{6N^!IP`L%ip2H&R2Q(QtM^=`}YJ*S5bI0`pRIo@3WxAl!=1~ zNc})cgic+LVE!QhAgLcAan+BBud`^#33pmW#j1Wnke_Oh^fss{MijwGy|GvbUnDy8 zEHN5FM{dD4TwLDfVCil_3TFcQ2jSOL28Rl382=Pd#7*1-9>UV#u9BaTwYW6i=L`Pl zQn3F)<^BJ_0_6P*B(C};Iqoc)3WaRrBSv0hSFD(*@pZFU={;ok7KVk90_=$foZ;JSd5Bmc6C&6Xk z_P>bw-x@U!4+_Um*ax9vo3J1I*Q5S}GLVY!W~9OxivJQ-Oe%hNwb#CY7rWXU54cQ5Ebq+K;(9v^vbT+8KHv-G zI)#G>J;#C$S6_C4bTBu{kwzmt9gKXmc?U=Zu_x*fyahXlB075I9P9EbW&tO zyoBxrF!=GpK%&}k3>k<@E4Y2&Smuj5Jd6wh}j)Yev;C#gtqdep=7m2Ipk(}0JsSj)Cecd~SAg5}O^qQFlgv13gvyhP9*^m&# zsOV64#-G)R>jCGn=Ldwuw69@Eh^~~ZqdX`fA(Jo~ z*$O0#dRu|~ufm93Y3ptvQIX`>l}Q+l?5SuZ(YEdiniivxtwD_>+RoiUvOo~+V^5=x zjdgbZi0gFbOCLL*KKTseljot+X)Z8Ce7W7do=FTbii00xA9I#KHys$V0MO`Bx{|xPoMJtad1d0J*TG@)(+o3iZE_apQc)z!`w(<$O^nf z6P=61RgWY@EHFgcr#|9^8JtJZ^9|_q;y)h6(osgcib6?dKaZAl8u1@1Q4Y1a0Ew$s z;Vtn5TCftePFLbmR^l>UiS(YzElgTBuFQU9 zdUrY5UT@gGsQI2~s-d#yJWQXmffSPalrPeGYy<>!q>U`7A)thQU4g_^SCRv*UsCI! zcStk;F*<(_3a^NcW*$opqgK{8_+`rPD&#_bH=zk1{OAyMHMoK3Hz9G=HDr7b3a^kB z*X=JhFia*l8zyhZ%3kYpfk=RbJs0rf7up(a-#Uwv%&UAB+d8RgoyAFJR6dJsoldpR z;v{n^pT%}gq#}MaLoH4AqhF&R7y$(Qz^ocaLY~?kYB9Zq0bfV{KT~6sg<7IR$RWX1 zchq9t7mN3$FZLE>M+ve;gQQQIcDO~Xfn*^t_7V{gvr!lSzeinId$?pLk++LJ@;caL zBv07T70Pd6ZyEG3jLZHNLJD4jyy&(qvpI_pQEsMPiKe%gO!^S|ZA7Ky`{uX6>m&(=CA^LUgG$PwyFvS1?J1rSdrd#tMRr| zMqP+=wpUokSTIIt@cSH#j0^NsQ5Piup=T%~an%IzO&xV1YzHIw3d<@}_GgWwE@JLK zIPcT@x}4Y{%tl_o&i0tlyTA~mPt%UPXkfCD*I{xq@H=5d_OA#<>u1CVdajWWQC0%a zX(6!5=;vrL|4ZA{p*I%4d+j zM>&4@eY#__#8##IOP(73knXq!2)N@}|CkVrj&f-XmU$e z&<<^H1W!Pw|9vuk+o+XSd`QMV+_V^ zguOk04aZ;~{@212BH)Z~J}*5lH~XGx3DW zy7^o0dpFyI%_T65zIe9a=qd_#Mq3$u@f?=2*fG%;0iEYc3BB(<0qygU3jsYJ368KM zvd*HRC46b^6oYypL0+Umc#geZaj6G%-XbL$##g)*xscS`khtpYMAlg}w1h7$DT%Lm2SMJc zLAdS2;)U@Q?_%B*@fCmd1@LZyOMJz9i26>Ax~2Gv_o57>BD@)?Fuvk_L=}^Y-yOYQ z;Kg`8fCpE7kl>v~gH716d!DTU zb-{%A3S9}fY%jjzb1d+AQ(zb!r}1>MkDBonn>TBZQbBM< zR29BJ>QPYz!4+R*zUac2$nBR6w`a7%EmTnIYAelGh$lvO@NZO_uQInkeMABk^)+Oo zoxY9)ck>dmGZ7MGg=wQW-z5CE47|RIF)Xdkn-svfs+jpKPKQ$3}7!1wX6nS zYnZXoPl+peZ1fMd#yx;Qji*IS{S1X6l%FHP4WOi@g(5YfElAbG&HaKPztkYx36~FIghwMT zBb$*L$+E2*Ij~mHU`tXXE+hMq8p*PqTask)A=<^?OOG1u(1I@hSIn0#{@3)tzcC(o z9y*uiVmrih+nxJwi6KUD@L%js?i1*yV>^BaX!IYyM}i=0B5onJLu#Z4T+(^|kx2ez zkX+Yf=Q)GGj!C)=G!(^Vdf`8lspMYxKNQ>jfPmN@T&~q$zy+G)uSi_=H!`iebCIo< zv}n@bng0)+KO5B{pT3%ihxBy9it6|$MHn}wz4wu^=)ag7iR$<_UZRQqg9LX~6CxJX zA?*`Hb?k+&^0=BBf90h0=|y$y!_rYkyNW_dSlt)-P~Vns_1F*PP@Dacxat5B(F!L_ zb5Ok-qdE@M#1A6zIhy$Hi0TM8M+eCrY{(@>bsWOX#?n3%`H*%rs^c)chA z9{KzGw;zaLjz;`VGJo>dBAj`I-O z{;7a~?a!*Ne(%x2cOpmZ;O9ig5g=BXQMyYOWs5iI=6%^_Eu8Ajp{-Bz?lP z<2J%gBS9PCH;Ef`0rf!d(FI9v8k@Z*qh{R#Qhi|V$%t1@IRL?V7@GSb<@xG7(Y8@ z#D=(Kd);&)3&scy9?Ox(B7vSNVxt#8=o1zran%yyn>u1c*bc_%OIdcADf>gDO^x9? zn&=81=zgI6od7X5dsC7gvF@?gBn2iIeTv##kRNe?(Y?sgg0@!;kc6LR;Bmr;>|aqn zgS?3M+dVaC+T8?vMW3R42KiA}`rvx~fUoFNl+Pf4k8=5#0@4wiDd5?3e92S535R*Xh4*rFqfy0}PoU>M=2Xt5SX#bHGDuUXINNyBsf5l`!7>vXrY z!9&C|sy=u+j3&=P;;I#NjCzGZ#)zR6hI0w>NDY#H9vAkLqBNS>t+pHE0+RMeoJXc( zqi%nAe?IeNc>gF?^3kS}lLTjoH0*)>N*0Nc7@W)g81<*HIb$N~KkGz<;lKaO~Sf90kKz&*!rutD3H61|Ws!K>m ztDDq9*GZaTkooI$e)@9ins=!wmzrjNiHf=u*u$0QF8<3%G~SS>vf`IZq5j>((Rv_< za5f-u)kgBsSu|{lL_BlEnx8ED$?p9j!d{_axhFlkbN@=_S@ltAycwE@J7;UEFjB8M zj0urDIz|gy>MA35wRX!Mm}SUltpW}L|Uee&nzDT}L!S>i;l#*?cy@por> z9-0dm*BI>jev1%xZj7y}YXoUmQL11piGd@-L}M{*0!ISEo25j5({wTbhge6DxGGER zokc@jI1kh=M-WGYq~C~otSV3Fn}##lY`I>l^+@1I&z9>JSZCSzuQH{aw_0l6>6)f$ z<&GLQd`aKfba{~Io*X)wU!whqj{(aQ4Y>&rSPi@iC+Kh5fqlEli`@u*)#)#lb%5qW6j_X z$DYZ283#NIPp*14e|M()+gc?sCK5A@(N{i)gkp>hLfY8h_FRGPPp@q!7wUOH3e9;w z5`;ODerJ10pq?T|t%9;c21$Pr2ac~nH%bM!BgrgJW&716r6yBK`_@{nhYCIirQ` zLIz(}tMyU&FN(isK;A*l!^0dgVL zn+W)311PtwH&k<(-o1r@QI<4D@pErQz8O;lBUZ~;)Y||6{@#wnRqr4+ZHdANEYT06 zln_GQzery_g<+|8YP9bn+IMTT>6TFVVv*_5`yrY45Z9d=7kXRN{=NM1p)|b0UT5Ze zH{};^%4=Cje6ndkNa1~ilYaI6MDhWRB>ioaYlrn9_&vQOJfW?J0~IrF@y>lSe7%Q(?XW2sG3K#h>~r=s^L#hQw80$6s$(wa814 zYNV5c5XBXJgJ9p(VCiQ-h?XmwelH#Bqmz4R<9ZT$XRpgQeKTChx5!`I7(5s9ZRU#$ z`3~#zT~nXIcGm~3FA}re#rH@n%3I&yDz^UjnHzQ&KfpV*&<~Ng>PG~Kx(lg>aTh-( z*iQ`D!%!n}7xAVMSNl^!MS1Be3OaEb_eiP_u85;hKSM6~`Z*GWUE{B(Il_YNIu?S7 zMt1Erp5d^=XoC8MM*d48zgHtqPXiHJKnurn1HU51UmJ`v8HiVn&LFC39;Z|@uVIZ@ z|Ay$2&H6$%>~8@9QBIehx)0?c?B5}A)$d78`)R3!}N4nR$IL(xIJ{UuTqUJ6n4mhASWzI3x%o13x$x~ZQ#ck1&7anB7adu4B|)s zEbwBl_v67;e<6719#b6=vTfskC4aH%3=U8g{>I$?bgGHQP=5z7+Wj9$T=h?u>};we zq%6WRUg2LX|8G-X4weWvvv`C5FgMDzMkC(fzsQFQN3M+B3p;(m;ND1ZO)ma=UO-6N zUSI==HePm~wl=AKH3R#Rf&DcD>D@%k7b?7ocf`s8Bz&MDd@X8uX(@$;TD@St0JG|9 zT{)O}mnR&RDsL+}s+uoMq{^dBt$0;;RBO(7wl;<{<*)#(YN`4}E`yII_`I=Y3vl(| zL;Sp+90FMBT45dL+4CX1D~UtY(h_1rc*hZNRm61 zODU{l00CjOMnxTqQjo~QkhtnN6470W@UFWOGuk_zAhMTVgtinjR;adoNWvOxO<`pU z3LWYN%E;8Os*O8<1sz(C1<|D=MJ!pRHt6w*7)kI&3129(WA&VTZ7S5NSb~{wN;#*L zEjU#!V0mlBT;m#-?n~p{mUlFlTJEWla=BLZSCE6oa7vjGbbIUuyGgl64r{}=tkgIx z4&TI_ocBi7i0p>cl$tAwW{viDCsL#_8}OHl9?pC*%uY5zmuZ3zYO{E#HUT6dDrI|v zN3dowNeo_21()kTpx_^PNLO2>PzxB`$w*u^mlf`Oh}Q`%DViDhy?LzMDW-B05x>`x zsZG<)JmoUp^Hj2u>^+C5T&Dp7%JpFIs!j)OsKk6Et~!IPY9B0e4Ef+Q338SONk13o zb{QXRW=!5NqoGeVK8-%p|MKR@et?G8kFS5XA&O4rivziFAjV0tR-|V!|&yBWVO!l+&KdbnAiU^eSZ{HH>Ps)ULYd zjD%rO%uo^rOGFGD3gEVIZ%~Iv8J2tZhewQ}rJB!Lh4>5YAp(7#iH``d%up8sL=kmp zse%7@ts-HNyMTRGY-r~Xa=V!?gWMkWaSKf!w>22;JrI2yIF~-w9+WO3Co#?k(;PSS z3Uq(E_<*vh7K18A402|rtCo_%&IgzWNJ?5N81yY8GiMuSevH%}yM+dQ5x0o5GUG#o z@S7a?& zUtt8Z8n3!%H9kJAiR(@H&14$yb(Ut5y_~K;d6In4 z$ktkyf${ALbA-6S!*4=rJ`+D-SeWe_njF&2YP@WQ@BW_~4XJbB>oG-Hfy7nkvTM+b znlexD7B%tZ)c>EEb1}B#k%YJAT zns_Xxbv#Evc#Rb5Z;8%@C;};7ganb0B+yyZ#EZhco_@)+c`ZTuHAuP}Cmn9g7pmS) z8+Z}RsFwJ;m#KBgmuh@s=BGY09JS)j77&3}Ul8LLvuaQ3 zLTn?i7O-`_kS)}9EWiRYc=1|{QA_xOJ?bcY!2?URZSuK}kvZN9Hlxstb6|+swsMCv zK2h6Yu0I;VEl6AaLOF98QfiF^ubGeO=H-GEb~oTzPV~nX7TN9YzsPRhydX7Ruh#ex z6RWnV3^u|SYWx;BfrUKAyQTE+Z3XO^FPHH3-plAHXS4N*9bO0=w#paqabMHzNv#~K z<;(Rgc}nim@V8APsg7!WVxp|@K~uKPaN~{nPDx_U_L_X~$RyS6xaGVYB?Kh>TG{M3^*) zt1?@WE~B6>H-eH4$-ZsESY;#9dgetHQ6rI!NE?t3r+N^IdRDGB;vHIH2#Kq%AOhX@ z2syY+KO_J@_o4x*EAfaTX(XrJd4TmC3U(LM6Om9MdnCYy# z2JgVZFcMd7CIZd0kh7US5b8ARwdl1}Mhk6(Ld$BQrDp|XxpiZ0vg7q6h92iAD@V(U zp~v1RhC{DWW>~7Lw&2Z>7jYaJdYN9kTZUZ-+8>`l|5&P3RUTzH04v}jKZk*}NBCFG z6-h%zU|aFzsxkiVwS`?x*mejVCd9n}b7H z9WBP^dMlek2j9vCmmR3fEmo7pfue-|&fYz36j~_LFCVZF2$MAlBGvR>u}LdpxG;i` zNdoFEnq<_QJEV88;bZFUe@wfM`7$eb9G+bDc>eB8-+}IKk5UxWO;p*`jRQ}YyvFJ_ z2s1!${{(^VPd{}JtBATDe8DT+fW%cdvI?Dh9G8%`=!5o9vOo1Evin5C?zwOyQ^a0R zVYE|}4$P&2#ZFOva&w)ca6r7VtxkbrazpiW*{p^?iBe5o4SyJQ`N@EQF3*a6Mq*b_ zff!+WHzRS?EtI+*H;Z;t*JbP@z2>b1xlMzlKaC}leHeNlvcHPD`>n~inY7HJQyLx!#>ecJlY}jB*o0Sq2Sy)xqE|kGs zhh(kC=CKUc3^s2LPz9KP$ioBiaKScMZMaXwHT~D;Mf&8OdwTqu-v1z%ECi* zU9Be^=|54Jz(PgISuu{4nUDm{ZUQNvnUG)#RltG==#H0jb(|ID2l%J13L`NU_FkgK zc_)K)8f@>zauPiQ8j^=AnPEYgC5(S+j#@#$5Jzw?))@;L(fn}-%Qo5S8KBA?Ej7@@<-$2 z3D~3%$14aYKK7MF@+yraeHMlkK}@jcv*0ZnoK2GC3n%r2VL#}ZP3t}|*#l17|4q~T z$xUa>Nt6s<7o#`u~in~eF&=hG_+jd`1s!=Zc22Y~xzJa;n zz~wjM9qiyuNL=-10z?Csr9#GT-$Jmr8n8oYw|-k|6MY*qqbzh41&avk?UHK$;g?kJ zz)NuPP9&~+7yf$ICK`)Jub60Kvp#xXtH@O03OuHVmECXcS?QU^Z(2sHoym>ARtQ7tI&T}WK@Axc4y zcBS?8XxBQS;ll*GTZ5%<3%Lky4Ak`KDl)c88d-Tbn;BP$v-=1+i`%g0>^{nTadx{{ zlaHC2tZq|Hpj9Fw+p~R~B%&sp6!!(hbH+H5?6hi08!5-+#ApK8G?P* zfE|sB;7A5fZeCl6Y(7VjC?j1(!6p9f^OE+b4+n-wdG!Tkfuk=Xan+ab*Yk2h-1c%D zbNGF6gHg5D?&`}L?N^BQs~W8yb2N(r^46m8eAd^9>+1&Bx$(Mmc%o@SrM%WOKH?k1 zn(QOG*_z)31VlJPvg%tv195*FiL1Uts@f){b}^g$F2TO1!O|}bX>w>T(0G^>onADU zTwE1G$Ek%kLL!E#rxj4c?~~EE8hR%B1Lli~{*V>>k*V1F-BK|$vB=Lh*dLQ%l)=8i zMQq}qFgI+lKgBz=*F8vF^)muQ4OZ%64EE;)`#%GA6siS-4M|pyM}9$wC?8!#K_&M3 zOG*3Fa@<0=xVjfP;OAFJT=i@G^~_aB+veJbvW*5MQ|W~Iji&NjQn^o4NzVi$+Cq!T zGv?nB_3tgz;fnGkm8LY$Yi47~e;~?aOJ2fe{v#kDT&d11b{EjvD$zk2?Hr=*&}ds;CDOw3R*4QKu0u2~y-IW_ ze>7etVzWXZhY?Ozi4G@{BQ%oPRU&=(PqS;}qI*YDbaCC2))C!1iuq!`N8`y=$ME;= zUL}%dwe9ySSh= zg|4Dt5kYlH8eJuN1YUxRlaRP7g}>f_ObFW6*q)Ufb+V>6m-OaodhJ^!(gO1aX{V6L zsfNh^*zyR*jnqLiZaj^(OddC$M;$yJ5NQ7YF)^t5s1_9X3?!~PlTy&#iL|~wl;wBP zvk108gQex%OK-}L^Tn}*=uN@(>IB|+FB0eE(GIRd{8cxR$Ia05S3S%Zf3=XzEHcc@ zv6(^Z3ahq<=_OngZ{Oe=w(eqq)_X&}8mT3C2hl7=;;LmV-pSpg9t5Ze50nzuRnI2q zaszrEIEqT7C3$$YFgn^tyvaIx5o>V{AW(}L6ILsL2vt89iK`w-x>_rwhB2);k6`C( zuswgB;!$KYstH|1Ps1L~e9^F#tk?ynV!LgfLgZ(w>M9b9GT1lR&qiL&+;C^O2Jg^b z7b0=hMFfa;hEf;P8D31VwFa#5Iz>MrqI`4}1(o!O1Cl1LQ(S@^@H2?SRqOEA>lTHy z-7U^!RY6^4|}*fN{h*z!iAOt$4gHuDf5Alw

    IBB=vA{ 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 literal 0 HcmV?d00001 diff --git a/source/_build/html/.buildinfo b/source/_build/html/.buildinfo new file mode 100644 index 00000000..677cd893 --- /dev/null +++ b/source/_build/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: a4b5d0b7716605b8ac63fc8c986b086d +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/source/images/bundles_overview.png b/source/_build/html/_images/bundles_overview.png similarity index 100% rename from source/images/bundles_overview.png rename to source/_build/html/_images/bundles_overview.png diff --git a/source/images/gs_confirmation_screen.png b/source/_build/html/_images/gs_confirmation_screen.png similarity index 100% rename from source/images/gs_confirmation_screen.png rename to source/_build/html/_images/gs_confirmation_screen.png diff --git a/source/_build/html/_sources/bundles_in_clr.txt b/source/_build/html/_sources/bundles_in_clr.txt new file mode 100644 index 00000000..bd7e1367 --- /dev/null +++ b/source/_build/html/_sources/bundles_in_clr.txt @@ -0,0 +1,7 @@ +List of bundles +############################################################ + +This is a list of the basic bundles in Clear Linux* OS for Intel® Architecture: + + +.. include:: bundles_in_clr_html.rst \ No newline at end of file diff --git a/source/_build/html/_sources/bundles_in_clr_html.txt b/source/_build/html/_sources/bundles_in_clr_html.txt new file mode 100644 index 00000000..bda7d91e --- /dev/null +++ b/source/_build/html/_sources/bundles_in_clr_html.txt @@ -0,0 +1,773 @@ +.. _bundles_in_clr_html: + +Bundles in ClearLinux +##################### + +.. raw:: html + + + Bundles in ClearLinux + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Bundle NameStatusDescription
    bat ACTIVE +

    Provides the neccesary bundles to perform BAT succesfully

    +
  • Includes (devtools-basic) bundle.

    +
  • Includes (openstack-test-suite) bundle.

    +
  • Includes (os-testsuite) bundle.

    +
  • Includes (pnp-tools-basic) bundle.

    +
  • Includes (openstack-all-in-one) bundle.

    +
  • Includes (storage-utils) bundle.

    +
  • bootloader ACTIVE +

    UEFI bootloaders

    +
    clr-devops ACTIVE +

    Provides build/release tools for Clear devops team

    +
    containers-basic WIP +

    Installs rkt base for Clear Containers

    +
  • Includes (storage-utils) bundle.

    +
  • Includes (network-basic) bundle.

    +
  • Includes (kernel-container) bundle.

    +
  • cryptography ACTIVE +

    Cryptographic tools

    +
    database-mariadb ACTIVE +

    Provides components needed to run MariaDB

    +
    database-mongodb WIP +

    Provides components needed to run mongodb

    +
    devtools-basic ACTIVE +

    Provides basic set of languages and tools for development

    +
  • Includes (R-basic) bundle.

    +
  • Includes (go-basic) bundle.

    +
  • Includes (hpc-basic) bundle.

    +
  • Includes (os-core-dev) bundle.

    +
  • Includes (perl-basic) bundle.

    +
  • Includes (python-basic) bundle.

    +
  • Includes (ruby-basic) bundle.

    +
  • devtools-extras ACTIVE +

    Provides extra set of languages and tools for development

    +
  • Includes (R-extras) bundle.

    +
  • Includes (devtools-basic) bundle.

    +
  • Includes (go-extras) bundle.

    +
  • Includes (perl-extras) bundle.

    +
  • Includes (python-extras) bundle.

    +
  • Includes (ruby-extras) bundle.

    +
  • dev-utils ACTIVE +

    Provides a limited set of development utilities

    +
    dpdk-dev ACTIVE +

    All headers and libraries necessary to develop with the Data Plane Development Kit.

    +
  • Includes (os-core-dev) bundle.

    +
  • editors ACTIVE +

    Provides popular text editors

    +
    file-utils ACTIVE +

    Provides basic set of file manipulation utilities

    +
    go-basic ACTIVE +

    Provides basic Go language development

    +
    go-extras ACTIVE +

    Most popular Golang libraries

    +
  • Includes (go-basic) bundle.

    +
  • hpc-basic ACTIVE +

    Provides basic suite of MPI/HPC development tools

    +
  • Includes (os-core-dev) bundle.

    +
  • iot WIP +

    The IoT (Internet of Things) base bundle

    +
    kernel-container WIP +

    Provides a Linux kernel appropriate for a Clear Container

    +
    kernel-kvm ACTIVE +

    Provides a Linux kernel appropriate for running under KVM

    +
  • Includes (bootloader) bundle.

    +
  • kernel-native ACTIVE +

    Provides a Linux kernel appropriate for physical machines

    +
  • Includes (bootloader) bundle.

    +
  • kernel-pxe ACTIVE +

    Provides a Linux kernel linking an initramfs as root

    +
    koji WIP +

    Sets up a koji build service (builder-only, for now) based on NFS mounts.

    +
    kvm-host WIP +

    Provides necessary tools to run usable virtual machines with QEMU-KVM (independently of OpenStack).

    +
  • Includes (kernel-kvm) bundle.

    +
  • lamp-basic ACTIVE +

    Basic LAMP Server (apache2, mariadb, php5)

    +
    mail-utils WIP +

    Provides utilities for reading and sending email

    +
    message-broker-rabbitmq ACTIVE +

    Provides the RabbitMQ messaging service

    +
    net-utils ACTIVE +

    Provides an essential suite of core networking configuration and debug tools

    +
    network-advanced WIP +

    More utilities for advanced host-level networking; bridge, switch, netfilter, vpn etc.

    +
    network-basic ACTIVE +

    Provides a basic suite of networking utilities

    +
    network-proxy-client WIP +

    Tools for dealing with client-side network proxy settings.

    +
    openssh-server ACTIVE +

    Provides an SSH server (and client)

    +
    openstack-all-in-one WIP +

    Provides an All-in-one OpenStack deployment

    +
  • Includes (database-mariadb) bundle.

    +
  • Includes (database-mongodb) bundle.

    +
  • Includes (message-broker-rabbitmq) bundle.

    +
  • Includes (openstack-block-storage) bundle.

    +
  • Includes (openstack-block-storage-controller) bundle.

    +
  • Includes (openstack-compute) bundle.

    +
  • Includes (openstack-compute-controller) bundle.

    +
  • Includes (openstack-dashboard) bundle.

    +
  • Includes (openstack-database) bundle.

    +
  • Includes (openstack-identity) bundle.

    +
  • Includes (openstack-image) bundle.

    +
  • Includes (openstack-lbaas) bundle.

    +
  • Includes (openstack-network) bundle.

    +
  • Includes (openstack-object-storage) bundle.

    +
  • Includes (openstack-orchestration) bundle.

    +
  • Includes (openstack-python-clients) bundle.

    +
  • Includes (openstack-telemetry-controller) bundle.

    +
  • openstack-block-storage WIP +

    Provides an OpenStack Cinder service

    +
    openstack-block-storage-controller WIP +

    Provides an OpenStack Cinder controller service

    +
    openstack-compute WIP +

    Provides an OpenStack nova-compute node

    +
    openstack-compute-controller WIP +

    Provides an OpenStack Nova control server

    +
    openstack-configure WIP +

    Provides a suggested default configuration for OpenStack on Clear Linux.

    +
    openstack-controller WIP +

    Provides an OpenStack multi-service control server

    +
  • Includes (database-mariadb) bundle.

    +
  • Includes (message-broker-rabbitmq) bundle.

    +
  • Includes (openstack-identity) bundle.

    +
  • Includes (openstack-image) bundle.

    +
  • Includes (openstack-compute-controller) bundle.

    +
  • Includes (openstack-dashboard) bundle.

    +
  • Includes (openstack-python-clients) bundle.

    +
  • openstack-dashboard WIP +

    Provides an OpenStack Horizon server

    +
    openstack-database WIP +

    Provides a Database as a Service server

    +
    openstack-identity WIP +

    Provides an OpenStack Keystone server

    +
    openstack-image WIP +

    Provides an OpenStack Glance server

    +
    openstack-lbaas WIP +

    Provides Load Balancing as a Service

    +
    openstack-network WIP +

    Provides an OpenStack Neutron server

    +
    openstack-object-storage WIP +

    Provides an OpenStack Swift service

    +
    openstack-orchestration WIP +

    Provides an OpenStack Heat service

    +
    openstack-python-clients WIP +

    Provides OpenStack command-line utilities

    +
    openstack-telemetry-controller WIP +

    Provides an OpenStack Telemetry server

    +
    openstack-test-suite WIP +

    Provides an OpenStack Tempest/test suite

    +
    os-cloudguest WIP +

    Provides cloud-init cloud guest configuration utilities

    +
  • Includes (openssh-server) bundle.

    +
  • Includes (telemetrics) bundle.

    +
  • os-clr-on-clr WIP +

    content for development of the Clear Linux OS on the Clear Linux OS

    +
  • Includes (storage-utils) bundle.

    +
  • Includes (mail-utils) bundle.

    +
  • os-core ACTIVE +

    The basic core OS components of Clear Linux for iA

    +
    os-core-dev ACTIVE +

    Basic development tools

    +
    os-core-update ACTIVE +

    Provides basic suite for running the Clear Linux for iA Updater

    +
    os-installer ACTIVE +

    Provides an installer for Clear Linux for iA

    +
  • Includes (telemetrics) bundle.

    +
  • Includes (network-proxy-client) bundle.

    +
  • os-testsuite WIP +

    Provides basic test suite for Clear Linux for iA

    +
    os-testsuite-phoronix ACTIVE +

    All the required pieces for running the Phoronix Test Suite

    +
  • Includes (os-utils) bundle.

    +
  • Includes (devtools-basic) bundle.

    +
  • os-utils ACTIVE +

    Provides a core set of OS utilities

    +
  • Includes (editors) bundle.

    +
  • Includes (dev-utils) bundle.

    +
  • Includes (sysadmin) bundle.

    +
  • Includes (network-basic) bundle.

    +
  • Includes (file-utils) bundle.

    +
  • Includes (network-proxy-client) bundle.

    +
  • os-utils-gui ACTIVE +

    Provides a graphical desktop environment

    +
    perl-basic ACTIVE +

    Provides essential Perl language and dev tools

    +
    perl-extras ACTIVE +

    Provides extra libraries for Perl

    +
  • Includes (perl-basic) bundle.

    +
  • pnp-tools-advanced WIP +

    Provides advanced Power and Performance measurement tools

    +
    pnp-tools-basic WIP +

    Provides basic Power and Performance testing tools

    +
    pnp-tools-intermediate WIP +

    Provides a deeper-level suite of Power and Performance testing tools

    +
    python-basic ACTIVE +

    Provides core Python language and libraries

    +
    python-extras ACTIVE +

    Provides extra libraries for Python

    +
  • Includes (python-basic) bundle.

    +
  • R-basic ACTIVE +

    Provides core R language and libraries

    +
    R-extras ACTIVE +

    Provides deeper functionality R language libraries

    +
  • Includes (R-basic) bundle.

    +
  • ruby-basic ACTIVE +

    Top 3 basic Ruby Libraries

    +
    ruby-extras ACTIVE +

    Top 3 to 6 basic Ruby Libraries

    +
  • Includes (ruby-basic) bundle.

    +
  • shells ACTIVE +

    All available shell programs for Clear, along with ancillary files

    +
    storage-utils ACTIVE +

    Provides basic storage-related utilities

    +
    sysadmin ACTIVE +

    Provides a basic set of system administration utilities.

    +
    telemetrics ACTIVE +

    Provides the Telemetrics client for Clear Linux for iA

    +
    virtualbox-guest ACTIVE +

    Include the modules and binaries meant to be used as a VirtualBox instance

    +
    diff --git a/source/_build/html/_sources/bundles_overview.txt b/source/_build/html/_sources/bundles_overview.txt new file mode 100644 index 00000000..29f01de4 --- /dev/null +++ b/source/_build/html/_sources/bundles_overview.txt @@ -0,0 +1,25 @@ +Bundle overview +############################################################ + +Linux-based operating systems contain the code of several hundred, if +not thousands, of open source projects. To make this manageable, +distributions use a concept called "packages" to configure and compile +the source code of these projects into binaries. + +Many distributions then split the content of these compiled packages +into so-called sub-packages, which are the granularity at which these +distributions deploy their software. With those kinds of distributions, +system administrators can then install and update sub-packages +individually or as a set, using tools such as "yum" and "apt-get." + +The Clear Linux* OS for Intel® Architecture does things a bit differently. While we also use the +concept of packages to manage compiling source code into binaries, we do +not use the package concept to deploy software. Instead, we provide +"bundles" that  provide a set of functionality to the system +administrator, independent of how many and which pieces of the upstream +open source projects are needed for this functionality. The diagram +below gives an overall picture of it. + +.. image:: _static/images/bundles_overview.png + :align: center + :alt: confirmation diff --git a/source/_build/html/_sources/disclaimers.txt b/source/_build/html/_sources/disclaimers.txt new file mode 100644 index 00000000..4786a970 --- /dev/null +++ b/source/_build/html/_sources/disclaimers.txt @@ -0,0 +1,10 @@ +.. _disclaimers: + + +.. rubric:: Disclaimer + +.. important:: + This documentation is a work in progress and is being provided for + informative purposes only. Because it is a work in progress, there are + parts that are either missing or will be revised as code development + continues. diff --git a/source/_build/html/_sources/documentation_license.txt b/source/_build/html/_sources/documentation_license.txt new file mode 100644 index 00000000..ab5ead7b --- /dev/null +++ b/source/_build/html/_sources/documentation_license.txt @@ -0,0 +1,12 @@ +Copyright © 2015 Intel Corporation + +.. raw:: html + +
    Creative Commons License
    This work is licensed under a Creative Commons + Attribution 4.0 International License + diff --git a/source/_build/html/_sources/gs-clear-containers-gettting-started.txt b/source/_build/html/_sources/gs-clear-containers-gettting-started.txt new file mode 100644 index 00000000..b698937c --- /dev/null +++ b/source/_build/html/_sources/gs-clear-containers-gettting-started.txt @@ -0,0 +1,75 @@ +.. _gs-clear-containers-gettting-started: + +Clear Containers getting started guide +###################################### + +Clear Containers for Docker* Engine is now available on multiple +operating systems. This enables executing existing Docker applications +in the secure and fast Clear Containers environment. + +Binary packages +=============== + +The primary host platform is Clear Linux* Project for Intel® Architecture, version 4000 +or better. However, binaries for a range of operating systems are available from: + +- https://software.opensuse.org/download.html?project=home%3Aclearlinux%3Apreview&package=clear-containers-docker + +Currently experimental builds are available for: + +- CentOS*, Scientific Linux* 7 +- Fedora* 21, 22 +- openSUSE* 13.1, 13.2, Tumbleweed +- SUSE* Linux Enterprise 12 +- Debian* 8.0 +- Ubuntu* 15.04 + +If you have any feedback, please mail it to the dev@lists.clearlinux.org mailing list. +Subscription to this list is available at: https://lists.clearlinux.org/mailman/listinfo/dev. + +Installation instructions +========================= + +Using hosts other than Clear Linux OS for Intel Architecture +------------------------------------------------------------ + +If you are *not* using Clear Linux OS for Intel Architecture, follow the instructions below: + +#. Visit the link below, and select your operating system by clicking the appropriate icon: + https://software.opensuse.org/download.html?project=home%3Aclearlinux%3Apreview&package=clear-containers-docker + +#. Follow the brief instructions shown. + +#. Reload your systemd configuration:: + + $ sudo systemctl daemon-reload + +#. Start the Docker service:: + + $ systemctl restart docker + +Using Clear Linux OS for Intel Architecture as Host +--------------------------------------------------- + +If you are running Clear Linux OS for Intel Architecture on your host system, follow the +instructions below: + +#. Enable the repository by running the following as the ``root`` user:: + + # clr_bundle_add containers-basic + +#. Reload your systemd configuration:: + + $ sudo systemctl daemon-reload + +#. Start the Docker service:: + + $ systemctl restart docker + +Source Code +=========== + +The experimental source code is based on the Docker version 1.8.1 upstream release and is available at: + +- https://github.com/clearlinux/docker + diff --git a/source/_build/html/_sources/gs_creating_bootable_usb.txt b/source/_build/html/_sources/gs_creating_bootable_usb.txt new file mode 100644 index 00000000..24c72abf --- /dev/null +++ b/source/_build/html/_sources/gs_creating_bootable_usb.txt @@ -0,0 +1,69 @@ +.. _gs_creating_bootable_usb: + +Creating a bootable USB to install the OS +########################################## + +Here's how to create a USB drive that initiates the process for +:ref:`gs_installing_clr_as_host`. Alternatively, you can test the +OS by :ref:`gs_running_clr_virtual`. + + +What you need +============= + +* A USB stick, formatted as ``ext4``. Remember that the process of flashing + data to a USB completely deletes the contents of the drive; as always, run + ``dd`` with caution. +* A ClearLinux OS image; the most current version can be found here: + `https://download.clearlinux.org/image `_ + + .. tip:: + + For older versions, see our `downloads page `_. + + +Download and checksum +===================== + +:: + +$ wget https://download.clearlinux.org/image/clear-[release_number]-installer.img.xz +$ sha512sum clear-[release_number]-installer.img.xz` + +Confirm the mount point on the USB drive +======================================== + +Using ``$ lsblk`` is helpful to show the block-level devices; a USB drive +usually shows up under ``/sdb`` or ``/sdc`` (almost never ``/sda``), and should +indicate disk space approximately the size of the USB drive:: + + $ lsblk /dev/sdb + NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT + ?? sdb 8:16 1 14.9G 0 + ?? sdb1 8:17 1 14.9G 0 part + +and make sure the drive isn't already mounted. The easiest way is with:: + + # df + +Flash the image to the USB +========================== + +Flash the image with the following command, adding the ``-v`` option for verbose mode +(recommended), as the image file may be large, and the process can take a while. This +may need to be done as root:: + + $ xzcat -v clear-[release_number]-installer.img.xz | dd of=/dev/sdb bs=4M + +Wait for the final confirmation +=============================== + +This example shows ``clear-2190-installer.img.xz`` flashed to a 16GB USB drive +mounted on ``/sdc``. + +.. image:: _static/images/gs_confirmation_screen.png + :align: center + :alt: confirmation + +Success! Your USB stick is now ready to boot and initiate the process for +:ref:`gs_installing_clr_as_host`. \ No newline at end of file diff --git a/source/_build/html/_sources/gs_getting_started.txt b/source/_build/html/_sources/gs_getting_started.txt new file mode 100644 index 00000000..28aed9bd --- /dev/null +++ b/source/_build/html/_sources/gs_getting_started.txt @@ -0,0 +1,11 @@ +.. _gs_getting_started: + +Getting started with Clear Linux* OS for Intel® Architecture +############################################################ + +The easiest way to give Clear Linux OS for Intel Architecture a spin is to download a +recent KVM image from the `image directory `_ +on our download page. This directory contains a current image, the UEFI firmware +helper and the KVM start helper script. See :ref:`gs_running_clr_virtual` for details. + +You can also :ref:`gs_installing_clr_as_host` on a target computer. \ No newline at end of file diff --git a/source/_build/html/_sources/gs_installing_clr_as_host.txt b/source/_build/html/_sources/gs_installing_clr_as_host.txt new file mode 100644 index 00000000..b4e28de8 --- /dev/null +++ b/source/_build/html/_sources/gs_installing_clr_as_host.txt @@ -0,0 +1,38 @@ +.. _gs_installing_clr_as_host: + +Installing the OS as host +########################################################## + +Running Clear Linux* OS for Intel® Architecture natively on a system is easy +with the simple installer image. To get started you'll need the following: + +* A USB stick flashed with the `installer image `_. + For instructions on how to do this, see :ref:`gs_creating_bootable_usb`. +* Host machine running :ref:`gs_supported_hardware`. +* Network access via DHCP. + +Installing Clear Linux OS for Intel Architecture to a target system +=================================================================== + +1. Configure the BIOS; this may involve changing the boot device order + to boot first from the USB device. +2. Insert the USB device that is flashed with the + `installer image `_ into the + target system, then reboot. As the system boots, you'll see:: + + Clear Linux OS for Intel Architecture installation in progress... Your + computer will power off once installation completes successfully. + +The entire installation should take no more than a few minutes. If you run into +any trouble, log in as root during the installation phase and check the status +of the install with:: + + $ systemctl status ister + +You might need to switch to another TTY. + +For feedback on installation or other topics, please feel free to write in to our +`mailing list `_. + +Note: You can also :ref:`gs_running_clr_virtual`. + diff --git a/source/_build/html/_sources/gs_running_clr_virtual.txt b/source/_build/html/_sources/gs_running_clr_virtual.txt new file mode 100644 index 00000000..67ca6114 --- /dev/null +++ b/source/_build/html/_sources/gs_running_clr_virtual.txt @@ -0,0 +1,67 @@ +.. _gs_running_clr_virtual: + +Running in a virtualized environment +########################################################################## + +The easiest way to get started running Clear Linux* OS for Intel® Architecture in a virtualized +environment is to download a recent KVM image from the `image +directory `_. This directory +contains an image file, the UEFI firmware helper and the KVM start +helper script. + +Starter script +============== + +To start the image, run the ``start_qemu.sh`` script from +`here `_, or modify +the following script for your needs and run it from the command line +with ``$ script clr_image``:: + + #!/bin/bash + if [ $# -eq 0 ] ; then + echo "Please provide an image to emulate as first argument" + exit 1 + fi + image=$1 + shift + # FIXME: Add a proper MAC address + macaddr=XX:XX:XX:XX:XX:XX + qemu-system-x86_64 \ + -usb -device usb-kbd \ + -cpu qemu64,+vmx \ + -enable-kvm \ + -m 512m -bios OVMF.fd \ + -drive file="$image",index=0,if=ide \ + -net nic,model=e1000,macaddr=$macaddr \ + -net user,hostfwd=tcp::2223-:22 \ + -monitor stdio "$@" + +To run this script, connect from host via SSH. Take note that SSH is not +enabled by default. To enable it, log in through serial console with the +username ``root``. After setting the password, enable root login via SSH +by configuring ``/etc/ssh/sshd_config`` with this content:: + + PermitRootLogin yes + +Now you may connect from host via SSH through 2223:: + + $ ssh -p 2223 root@localhost + +Alternately, there are a few other ways to approach this. + +- To run the script without modifying its permissions:: + + $ bash start_qemu.sh clr_image + +- To run it as a background process:: + + $ `bash start_qemu.sh clr_image` & + +- If you'd like to run the script with execute permission:: + + $ chmod +x start_qemu.sh + $ ./start_qemu.sh clr_image + +- And to run it as a background process:: + + $ `./start_qemu.sh clr_image` & diff --git a/source/_build/html/_sources/gs_supported_hardware.txt b/source/_build/html/_sources/gs_supported_hardware.txt new file mode 100644 index 00000000..a61e6e42 --- /dev/null +++ b/source/_build/html/_sources/gs_supported_hardware.txt @@ -0,0 +1,11 @@ +.. _gs_supported_hardware: + +Supported hardware +################## + +The following processors have been tested with Clear Linux* OS for Intel® Architecture: + +- 4th Generation Intel® Core™ processor family on the system of + your choice. +- Intel® Xeon® Processor E5 v3 processor family on the server of + your choice. diff --git a/source/_build/html/_sources/index.txt b/source/_build/html/_sources/index.txt new file mode 100644 index 00000000..e2fafc5b --- /dev/null +++ b/source/_build/html/_sources/index.txt @@ -0,0 +1,100 @@ +.. ClearLinux Documentation documentation master file, created by + sphinx-quickstart on Fri Nov 13 12:23:35 2015. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + + +Welcome to ClearLinux Documentation +=================================== + +Contents: + +.. toctree:: + :maxdepth: 2 + + .. + Clear Linux Project documentation master file + + +.. include:: documentation_license.rst + + +Getting started +############### + +.. toctree:: + :maxdepth: 1 + + gs_getting_started + gs_supported_hardware + gs_creating_bootable_usb + gs_installing_clr_as_host + gs_running_clr_virtual + gs-clear-containers-gettting-started + +Software update +############### + +.. toctree:: + :maxdepth: 1 + + swupdate_about_sw_update + swupdate_how_to_run_the_updater + +Bundles +####### + +.. toctree:: + :maxdepth: 1 + + bundles_overview + bundles_in_clr + bundles_in_clr_html + + +OpenStack``*`` implementation +############################# + +.. toctree:: + :maxdepth: 1 + + openstack_use_cases + openstack_bundle_and_service_summary + openstack_sys_req_and_pw_summary + openstack_installing_bundles + openstack_environment-database + openstack_environment-messaging + openstack_identity + openstack_identity-openrc + openstack_image + openstack_compute + openstack_block_storage + openstack_dashboard + openstack_networking + openstack_orchestration + openstack_telemetry + openstack_object_storage + openstack_supporting-database + openstack_supporting-messaging + + +Disclaimers +=========== + disclaimers + + +Index and search +################ + +* :ref:`genindex` + +* :ref:`search` + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/source/_build/html/_sources/openstack_block_storage.txt b/source/_build/html/_sources/openstack_block_storage.txt new file mode 100644 index 00000000..75f66027 --- /dev/null +++ b/source/_build/html/_sources/openstack_block_storage.txt @@ -0,0 +1,479 @@ +.. _openstack_block_storage: + +Block Storage +######################## + +The OpenStack Block Storage service (cinder) adds persistent storage to +a virtual machine. Block Storage provides an infrastructure for managing +volumes, and interacts with OpenStack Compute to provide volumes for +instances. The service also enables management of volume snapshots, and +volume types. + +Install and configure controller node +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section describes how to install and configure the Block +Storage service, code-named cinder, on the controller node. This +service requires at least one additional storage node that provides +volumes to instances. + +Prerequisites: +-------------- + +Before you install and configure the Block Storage service, you + +#. To create the database, complete these steps: + + * Use the database access client to connect to the database + server as the ``root`` user:: + + $ mysql -u root -p + + * Create the ``cinder`` database:: + + CREATE DATABASE cinder; + + * Grant proper access to the ``cinder`` database:: + + GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' \ + IDENTIFIED BY 'CINDER_DBPASS'; + GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' \ + IDENTIFIED BY 'CINDER_DBPASS'; + + Replace ``CINDER_DBPASS`` with a suitable password. + + * Exit the database access client. + +#. Source the ``admin`` credentials to gain access to admin-only + CLI commands:: + + $ source admin-openrc.sh + +#. To create the service credentials, complete these steps: + + * Create a ``cinder`` user:: + + $ openstack user create --domain default --password-prompt cinder + User Password: + Repeat User Password: + +-----------+----------------------------------+ + | Field | Value | + +-----------+----------------------------------+ + | domain_id | default | + | enabled | True | + | id | bb279f8ffc444637af38811a5e1f0562 | + | name | cinder | + +-----------+----------------------------------+ + + * Add the ``admin`` role to the ``cinder`` user:: + + $ openstack role add --project service --user cinder admin + + * Create the ``cinder`` and ``cinderv2`` service entities:: + + $ openstack service create --name cinder \ + --description "OpenStack Block Storage" volume + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | OpenStack Block Storage | + | enabled | True | + | id | ab3bbbef780845a1a283490d281e7fda | + | name | cinder | + | type | volume | + +-------------+----------------------------------+ + + $ openstack service create --name cinderv2 \ + --description "OpenStack Block Storage" volumev2 + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | OpenStack Block Storage | + | enabled | True | + | id | eb9fd245bdbc414695952e93f29fe3ac | + | name | cinderv2 | + | type | volumev2 | + +-------------+----------------------------------+ + + .. note:: + + The Block Storage services requires two service entities. + +#. Create the Block Storage service API endpoints:: + + $ openstack endpoint create --region RegionOne \ + volume public http://controller:8776/v1/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 03fa2c90153546c295bf30ca86b1344b | + | interface | public | + | region | RegionOne | + | region_id | RegionOne | + | service_id | ab3bbbef780845a1a283490d281e7fda | + | service_name | cinder | + | service_type | volume | + | url | http://controller:8776/v1/%(tenant_id)s | + +--------------+-----------------------------------------+ + + $ openstack endpoint create --region RegionOne \ + volume internal http://controller:8776/v1/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 94f684395d1b41068c70e4ecb11364b2 | + | interface | internal | + | region | RegionOne | + | region_id | RegionOne | + | service_id | ab3bbbef780845a1a283490d281e7fda | + | service_name | cinder | + | service_type | volume | + | url | http://controller:8776/v1/%(tenant_id)s | + +--------------+-----------------------------------------+ + + $ openstack endpoint create --region RegionOne \ + volume admin http://controller:8776/v1/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 4511c28a0f9840c78bacb25f10f62c98 | + | interface | admin | + | region | RegionOne | + | region_id | RegionOne | + | service_id | ab3bbbef780845a1a283490d281e7fda | + | service_name | cinder | + | service_type | volume | + | url | http://controller:8776/v1/%(tenant_id)s | + +--------------+-----------------------------------------+ + + $ openstack endpoint create --region RegionOne \ + volumev2 public http://controller:8776/v2/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 513e73819e14460fb904163f41ef3759 | + | interface | public | + | region | RegionOne | + | region_id | RegionOne | + | service_id | eb9fd245bdbc414695952e93f29fe3ac | + | service_name | cinderv2 | + | service_type | volumev2 | + | url | http://controller:8776/v2/%(tenant_id)s | + +--------------+-----------------------------------------+ + + $ openstack endpoint create --region RegionOne \ + volumev2 internal http://controller:8776/v2/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 6436a8a23d014cfdb69c586eff146a32 | + | interface | internal | + | region | RegionOne | + | region_id | RegionOne | + | service_id | eb9fd245bdbc414695952e93f29fe3ac | + | service_name | cinderv2 | + | service_type | volumev2 | + | url | http://controller:8776/v2/%(tenant_id)s | + +--------------+-----------------------------------------+ + + $ openstack endpoint create --region RegionOne \ + volumev2 admin http://controller:8776/v2/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | e652cf84dd334f359ae9b045a2c91d96 | + | interface | admin | + | region | RegionOne | + | region_id | RegionOne | + | service_id | eb9fd245bdbc414695952e93f29fe3ac | + | service_name | cinderv2 | + | service_type | volumev2 | + | url | http://controller:8776/v2/%(tenant_id)s | + +--------------+-----------------------------------------+ + + .. note:: + + The Block Storage services requires endpoints for each service + entity. + +Install and configure components +-------------------------------- + +#. Install OpenStack Block Storage Controller bundle:: + + # swupd bundle-add openstack-block-storage-controller + # swupd verify --fix + +#. Custom configurations will be located at ``/etc/cinder``. + + * Create ``/etc/cinder`` directory:: + + mkdir /etc/cinder + + * Create empty cinder configuration file in + ``/etc/cinder/cinder.conf``:: + + touch /etc/cinder/cinder.conf + +#. Edit the ``/etc/cinder/cinder.conf`` file and complete the following + actions: + + * In the ``[database]`` section, configure database access. Replace + ``CINDER_DBPASS`` with the password you chose for the + database:: + + [database] + ... + connection=mysql://cinder:CINDER_DBPASS@controller/cinder + + * In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` section, + configure RabbitMQ message queue access. Replace ``RABBIT_PASS`` + with the password you chose for the account in + RabbitMQ:: + + [DEFAULT] + ... + rpc_backend = rabbit + + [oslo_messaging_rabbit] + ... + rabbit_host = controller + rabbit_userid = openstack + rabbit_password = RABBIT_PASS + + * In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, configure + Identity service access. Replace ``CINDER_PASS`` with the password you + chose for the ``cinder`` user in the Identity service.:: + + [DEFAULT] + ... + auth_strategy = keystone + + [keystone_authtoken] + ... + auth_uri = http://controller:5000 + auth_url = http://controller:35357 + auth_plugin = password + project_domain_id = default + user_domain_id = default + project_name = service + username = cinder + password = CINDER_PASS + + * In the ``[DEFAULT]`` section, configure the ``my_ip`` option to + use the management interface IP address of the controller node:: + + [DEFAULT] + ... + my_ip = 10.0.0.11 + +#. Populate the Block Storage database:: + + # su -s /bin/sh -c "cinder-manage db sync" cinder + +Configure Compute to use Block Storage +-------------------------------------- + +* Edit the ``/etc/nova/nova.conf`` file and add the following + to it:: + + [cinder] + os_region_name = RegionOne + +Finalize installation +--------------------- + +#. Restart the Compute API service:: + + # systemctl restart uwsgi@nova-api.service + +#. Start the Block Storage services and configure them to start when + the system boots:: + + # systemctl enable cinder-api cinder-scheduler + # systemctl start cinder-api cinder-scheduler + +Install and configure a storage node +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section describes how to install and configure storage nodes +for the Block Storage service. For simplicity, this configuration +references one storage node with an empty local block storage device. +The instructions use ``/dev/sdb``, but you can substitute a different +value for your particular node. + +The service provisions logical volumes on this device using the +LVM driver and provides them to instances via iSCSI transport. +You can follow these instructions with minor modifications to +horizontally scale your environment with additional storage nodes. + +Prerequisites +------------- + +#. Install the openstack block storage bundle:: + + # swupd bundle-add openstack-block-storage + # swupd verify --fix + +#. Create the LVM physical volume: ``/dev/sdb1`` If your system uses a + different device name, adjust these steps accordingly:: + + # pvcreate /dev/sdb1 + Physical volume "/dev/sdb1" successfully created + +#. Create the LVM volume group ``cinder-volumes``:: + + # vgcreate cinder-volumes /dev/sdb1 + Volume group "cinder-volumes" successfully created + + The Block Storage service creates logical volumes in this volume + group. + +#. Only instances can access Block Storage 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`` volume group. Edit the ``/etc/lvm/lvm.conf`` file + and complete the following action: + + * In the ``devices`` section, add a filter that accepts the + ``/dev/sdb`` device and rejects all other devices:: + + devices { + filter = [ "a/sdb/", "r/.*/"] + } + +Install and configure components +-------------------------------- + +#. Edit the ``/etc/cinder/cinder.conf`` file and complete the following + actions: + + * In the ``[database]`` section, configure database access. Replace + ``CINDER_DBPASS`` with the password you chose for the Block Storage + database:: + + [database] + ... + connection = mysql://cinder:CINDER_DBPASS@controller/cinder + + * In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, + configure ``RabbitMQ`` message queue access. Replace ``RABBIT_PASS`` + with the password you chose for the openstack account in + ``RabbitMQ``:: + + [DEFAULT] + ... + rpc_backend = rabbit + + [oslo_messaging_rabbit] + ... + rabbit_host = controller + rabbit_userid = openstack + rabbit_password = RABBIT_PASS + + * In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, + configure Identity service access. Replace ``CINDER_PASS`` with the + password you chose for the cinder user in the Identity service:: + + [DEFAULT] + ... + auth_strategy = keystone + + [keystone_authtoken] + ... + auth_uri = http://controller:5000 + auth_url = http://controller:35357 + auth_plugin = password + project_domain_id = default + user_domain_id = default + project_name = service + username = cinder + password = CINDER_PASS + + * In the ``[DEFAULT]`` section, configure the ``my_ip`` option. + 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 example + architecture:: + + [DEFAULT] + ... + my_ip = MANAGEMENT_INTERFACE_IP_ADDRESS + + * In the ``[lvm]`` section, configure the LVM back end with the LVM + driver, ``cinder-volumes`` volume group, iSCSI protocol, and + appropriate iSCSI service:: + + [lvm] + ... + volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver + volume_group = cinder-volumes + iscsi_protocol = iscsi + iscsi_helper = tgtadm + + * In the ``[DEFAULT]`` section, enable the LVM back end:: + + [DEFAULT] + ... + enabled_backends = lvm + + * In the ``[DEFAULT]`` section, configure the location of the Image + service:: + + [DEFAULT] + ... + glance_host = controller + +#. Let systemd set the correct permissions for files in ``/etc/cinder``:: + + # systemctl restart update-triggers.target + +Finalize installation +--------------------- + +#. Start the Block Storage volume service including its dependencies + and configure them to start when the system boots:: + + # systemctl enable iscsid tgtd cinder-volume + # systemctl start iscsid tgtd cinder-volume + +Configuring a compute node to use Block Storage +----------------------------------------------- + +#. Perform the following steps to enable a compute node to work with + block storage:: + + # systemctl enable iscsid + # systemctl start iscsi-gen-initiatorname iscsid + +Verify operation +~~~~~~~~~~~~~~~~ +Verify operation of the Block Storage service. + +#. Source the ``admin`` credentials to gain access to + admin-only CLI commands:: + + $ source admin-openrc.sh + +#. List service components to verify successful launch of each process:: + + $ cinder service-list + +------------------+------------+------+---------+-------+----------------------------+-----------------+ + | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason | + +------------------+------------+------+---------+-------+----------------------------+-----------------+ + | cinder-scheduler | controller | nova | enabled | up | 2014-10-18T01:30:54.000000 | None | + | cinder-volume | block1@lvm | nova | enabled | up | 2014-10-18T01:30:57.000000 | None | + +------------------+------------+------+---------+-------+----------------------------+-----------------+ + +Next topic: :ref:`openstack_dashboard`. diff --git a/source/_build/html/_sources/openstack_bundle_and_service_summary.txt b/source/_build/html/_sources/openstack_bundle_and_service_summary.txt new file mode 100644 index 00000000..1ae888de --- /dev/null +++ b/source/_build/html/_sources/openstack_bundle_and_service_summary.txt @@ -0,0 +1,51 @@ +.. _openstack_bundle_and_service_summary: + +OpenStack* bundle and service summary +############################################################ + +OpenStack provides an Infrastructure-as-a-Service (IaaS) solution +through a variety of complementary services. Each service offers an +application programming interface (API) that facilitates this +integration. The following table provides a list of OpenStack MVP +services: + +.. csv-table:: OpenStack MVP services + :header: "Bundle Name (service)", "Project Name", "Description" + :widths: 90, 90, 300 + + "openstack-compute-controller", "Nova", "Manages the lifecycle of compute instances in an OpenStack environment. Responsibilities include spawning, scheduling and decommissioning of virtual machines on demand." + "openstack-identity", "Keystone", "Provides an authentication and authorization service for other OpenStack services. Provides a catalog of endpoints for all OpenStack services." + "openstack-image", "Glance", "Stores and retrieves virtual machine disk images. OpenStack Compute makes use of this during instance provisioning." + "openstack-dashboard", "Horizon", "Provides a web-based self-service portal to interact with underlying OpenStack services." + "openstack-network", "Neutron", "Enables Network-Connectivity-as-a-Service for some OpenStack services. Besides, it provides an API for users to define networks and the attachments into them." + "openstack-object-storage", "Swift", "Stores and retrieves arbitrary unstructured data objects. It is highly fault tolerant with its data replication and scale-out architecture." + "openstack-block-storage/openstack-block-storage-controller", "Cinder", "Provides persistent block storage to running instances." + "openstack-telemetry-controller", "Ceilometer", "Monitors and meters the OpenStack cloud for billing, benchmarking, scalability, and statistical purposes." + "openstack-orchestration", "Heat", "Orchestrates multiple composite cloud applications by using either the native Heat Orchestration Template (HOT) template format or the AWS CloudFormation template format." + +OpenStack is highly configurable to meet different needs. This guide +uses two-node architecture with legacy networking (Nova-network). + +- The controller node runs the Identity Service, Image Service, + management portion of Compute, and the Dashboard. It also includes + supporting services such as a SQL database and message queue. + Optionally, the controller node runs management portions of Block + Storage services. +- The compute node runs the hypervisor portion of Compute that operates + project virtual machines or instances. By default, Compute uses KVM + as the hypervisor. Compute also provisions project networks and + provides firewalling (security groups) services. You can run more + than one compute node. +- (Optional) Block Storage node contains the disks that the Block + Storage service provisions for instances. You can deploy more than + one block storage node. +- (Optional) Object Storage node contain the disks that the Object + Storage service uses for storing accounts, containers, and objects. + This service requires two nodes. Each node requires a minimum of one + network interface. You can deploy more than two object storage nodes. +- The self-service networks option augments the provider networks option + with layer-3 (routing) services that enable self-service networks + using overlay segmentation methods. Additionally, this option provides + the foundation for advanced services such as LBaaS and FWaaS. + +Next topic: :ref:`openstack_sys_req_and_pw_summary`. \ No newline at end of file diff --git a/source/_build/html/_sources/openstack_compute.txt b/source/_build/html/_sources/openstack_compute.txt new file mode 100644 index 00000000..8f8e5d68 --- /dev/null +++ b/source/_build/html/_sources/openstack_compute.txt @@ -0,0 +1,528 @@ +.. _openstack_compute: + +Compute +################## + +Use OpenStack Compute to host and manage cloud computing systems. +OpenStack Compute interacts with OpenStack Identity for authentication, +OpenStack Image Service for disk and server images, and OpenStack +Dashboard for the user and administrative interface. Image access is +limited by projects, and by users; quotas are limited per project (the +number of instances, for example). OpenStack Compute can scale +horizontally on standard hardware and download images to launch +instances. + +Install and configure controller node +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section describes how to install and configure the +Compute service, code-named nova, on the controller node. + +Prerequisites +------------- + +Before you install and configure the Compute 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:: + + $ mysql -u root -p + + * Create the ``nova`` database:: + + CREATE DATABASE nova; + + * Grant proper access to the nova database. Replace ``NOVA_DBPASS`` + with a suitable password:: + + GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \ + IDENTIFIED BY 'NOVA_DBPASS'; + GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \ + IDENTIFIED BY 'NOVA_DBPASS'; + + * Exit the database access client. + +#. Source the admin credentials to gain access to admin-only CLI + commands:: + + $ source admin-openrc.sh + +#. To create the service credentials, complete these steps: + + * Create the ``nova`` user:: + + $ openstack user create --domain default --password-prompt nova + User Password: + Repeat User Password: + +-----------+----------------------------------+ + | Field | Value | + +-----------+----------------------------------+ + | domain_id | default | + | enabled | True | + | id | 8c46e4760902464b889293a74a0c90a8 | + | name | nova | + +-----------+----------------------------------+ + + * Add the ``admin`` role to the ``nova`` user:: + + $ openstack role add --project service --user nova admin + + * Create the ``nova`` service entity:: + + $ openstack service create --name nova \ + --description "OpenStack Compute" compute + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | OpenStack Compute | + | enabled | True | + | id | 060d59eac51b4594815603d75a00aba2 | + | name | nova | + | type | compute | + +-------------+----------------------------------+ + +#. Create the Compute service API endpoints:: + + $ openstack endpoint create --region RegionOne \ + compute public http://controller:8774/v2/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 3c1caa473bfe4390a11e7177894bcc7b | + | interface | public | + | region | RegionOne | + | region_id | RegionOne | + | service_id | e702f6f497ed42e6a8ae3ba2e5871c78 | + | service_name | nova | + | service_type | compute | + | url | http://controller:8774/v2/%(tenant_id)s | + +--------------+-----------------------------------------+ + + $ openstack endpoint create --region RegionOne \ + compute internal http://controller:8774/v2/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | e3c918de680746a586eac1f2d9bc10ab | + | interface | internal | + | region | RegionOne | + | region_id | RegionOne | + | service_id | e702f6f497ed42e6a8ae3ba2e5871c78 | + | service_name | nova | + | service_type | compute | + | url | http://controller:8774/v2/%(tenant_id)s | + +--------------+-----------------------------------------+ + + $ openstack endpoint create --region RegionOne \ + compute admin http://controller:8774/v2/%\(tenant_id\)s + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | enabled | True | + | id | 38f7af91666a47cfb97b4dc790b94424 | + | interface | admin | + | region | RegionOne | + | region_id | RegionOne | + | service_id | e702f6f497ed42e6a8ae3ba2e5871c78 | + | service_name | nova | + | service_type | compute | + | url | http://controller:8774/v2/%(tenant_id)s | + +--------------+-----------------------------------------+ + +Installing and configuring the Compute controller components +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To install and configure the Compute controller components: + +#. Install OpenStack Compute Controller bundle:: + + # swupd bundle-add openstack-compute-controller + # swupd verify --fix + +#. Custom configurations will be located at ``/etc/nova``. + + * Create ``/etc/nova directory``:: + + # mkdir /etc/nova + + * Create empty nova configuration file ``/etc/nova/nova.conf``:: + + # touch /etc/nova/nova.conf + +#. Edit the ``/etc/nova/nova.conf`` file and complete the following + actions: + + * In the ``[database]`` section, configure database access. Replace + ``NOVA_DBPASS`` with the password you chose for the Compute database:: + + [database] + ... + connection=mysql://nova:NOVA_DBPASS@controller/nova + + * In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, + configure ``RabbitMQ`` message queue access. Replace ``RABBIT_PASS`` + with the password you chose for the guest account in RabbitMQ:: + + [DEFAULT] + ... + rpc_backend = rabbit + + [oslo_messaging_rabbit] + ... + rabbit_host = controller + rabbit_userid = openstack + rabbit_password = RABBIT_PASS + + * In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, + configure Identity service access. Replace ``NOVA_PASS`` with the + password you chose for the nova user in the Identity service:: + + [DEFAULT] + ... + auth_strategy = keystone + + [keystone_authtoken] + ... + auth_uri = http://controller:5000 + auth_url = http://controller:35357 + auth_plugin = password + project_domain_id = default + user_domain_id = default + project_name = service + username = nova + password = NOVA_PASS + + + * In the ``[DEFAULT]`` section, configure the ``my_ip`` option to + use the management interface IP address of the controller node:: + + [DEFAULT] + ... + my_ip = 10.0.0.11 + + * In the ``[DEFAULT]`` section, enable support for the Networking service:: + + [DEFAULT] + ... + network_api_class = nova.network.neutronv2.api.API + security_group_api = neutron + linuxnet_interface_driver = nova.network.linux_net.NeutronLinuxBridgeInterfaceDriver + firewall_driver = nova.virt.firewall.NoopFirewallDriver + + * In the ``[vnc]`` section, configure the VNC proxy to use the + management interface IP address of the controller node:: + + [vnc] + ... + vncserver_listen = 10.0.0.11 + vncserver_proxyclient_address = 10.0.0.11 + + * In the ``[glance]`` section, configure the location of the + Image Service:: + + [glance] + ... + host = controller + +#. Ensure files have proper ownership by running the following command:: + + # systemctl restart update-triggers.target + +#. Populate the Compute database:: + + su -s /bin/sh -c "nova-manage db sync" nova + +Finalizing Compute installation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Complete the following steps to finalize Compute installation: + +#. Create the ``/etc/nginx`` directory if doesn't exists and setup nova-api + and nova-metadata to start with the Nginx http server:: + + # mkdir -p /etc/nginx + # ln -s /usr/share/nginx/conf.d/nova-api.template /etc/nginx/nova-api.conf + +#. Restart the Nginx server to reload new configurations:: + + # systemctl restart nginx + +#. Start the Compute Service services and configure them to start + when the system boots:: + + # systemctl enable uwsgi@nova-api.socket \ + uwsgi@nova-metadata.socket nova-cert.service \ + nova-consoleauth.service nova-scheduler.service \ + nova-conductor.service nova-novncproxy.service + # systemctl start uwsgi@nova-api.socket \ + uwsgi@nova-metadata.socket nova-cert.service \ + nova-consoleauth.service nova-scheduler.service \ + nova-conductor.service nova-novncproxy.service + +Install and configure a compute note +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section describes how to install and configure the Compute service +on a compute node. This configuration uses the QEMU hypervisor with the +KVM extension on compute nodes that support hardware acceleration for +virtual machines. + +Install and configure components +-------------------------------- + +#. Install OpenStack Compute bundle:: + + # clr_bundle_add openstack-compute + +#. Custom configurations will be located at ``/etc/nova``. + + * Create ``/etc/nova`` directory:: + + # mkdir /etc/nova + + * Create empty nova configuration file ``/etc/nova/nova.conf``:: + + # touch /etc/nova/nova.conf + +#. Edit the ``/etc/nova/nova.conf`` file and complete the following + actions: + + * In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, + configure RabbitMQ message broker access. Replace ``RABBIT_PASS`` + with the password you chose for the ``openstack`` account in ``RabbitMQ``:: + + [DEFAULT] + ... + rpc_backend = rabbit + + [oslo_messaging_rabbit] + ... + rabbit_host = controller + rabbit_userid = openstack + rabbit_password = RABBIT_PASS + + * In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, + configure Identity service access. Replace ``NOVA_PASS`` with the + password you chose for the nova user in the Identity service:: + + [DEFAULT] + ... + auth_strategy = keystone + + [keystone_authtoken] + ... + auth_uri = http://controller:5000 + auth_url = http://controller:35357 + auth_plugin = password + project_domain_id = default + user_domain_id = default + project_name = service + username = nova + password = NOVA_PASS + + * In the ``[DEFAULT]`` section, configure the ``my_ip`` option. + Replace ``MANAGEMENT_INTERFACE_IP_ADDRESS`` with the IP address of + the management network interface on your compute node, typically + ``10.0.0.31`` for the first node in the example architecture:: + + [DEFAULT] + ... + my_ip = MANAGEMENT_INTERFACE_IP_ADDRESS + + * In the ``[DEFAULT]`` section, enable support for the Networking service:: + + [DEFAULT] + ... + network_api_class = nova.network.neutronv2.api.API + security_group_api = neutron + linuxnet_interface_driver = nova.network.linux_net.NeutronLinuxBridgeInterfaceDriver + firewall_driver = nova.virt.firewall.NoopFirewallDriver + + * In the ``[vnc]`` section, enable and configure remote console access:: + + [vnc] + ... + enabled = True + vncserver_listen = 0.0.0.0 + vncserver_proxyclient_address = MANAGEMENT_INTERFACE_IP_ADDRESS + novncproxy_base_url = http://controller:6080/vnc_auto.html + + The server component listens on all IP addresses and the proxy + component only listens on the management interface IP address of + the compute node. The base URL indicates the location where you + can use a web browser to access remote consoles of instances on + this compute node. + + * In the ``[glance]`` section, configure the location of the + Image Service:: + + [glance] + ... + host = controller + +Finalize compute node installation +---------------------------------- + +#. Determine whether your compute node supports hardware acceleration + for virtual machines:: + + $ egrep -c '(vmx|svm)' /proc/cpuinfo + + If this command returns a value of ``one or greater``, your compute + node supports hardware acceleration which typically requires no + additional configuration. + + If this command returns a value of ``zero`` , your compute node does + not support hardware acceleration and you must configure ``libvirt`` + to use QEMU instead of KVM. + + * Edit the ``[libvirt]`` section in the ``/etc/nova/nova.conf`` file + as follows:: + + [libvirt] + ... + virt_type = qemu + +#. Ensure files have proper ownership by running the following command:: + + # systemctl restart update-triggers.target + +#. Start the Compute service including its dependencies and configure + them to start automatically when the system boots:: + + # systemctl enable libvirtd.service \ + nova-compute.service + # systemctl start libvirtd.service \ + nova-compute.service + +Verify operation +~~~~~~~~~~~~~~~~ +Verify operation of the Compute service. + +*Note:* Perform these commands on the controller node. + +#. Source the ``admin`` credentials to gain access to + admin-only CLI commands:: + + $ source admin-openrc.sh + +#. List service components to verify successful launch and + registration of each process:: + + $ nova service-list + +----+------------------+------------+----------+---------+-------+--------------+-----------------+ + | Id | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason | + +----+------------------+------------+----------+---------+-------+--------------+-----------------+ + | 1 | nova-conductor | controller | internal | enabled | up | 2014-09-16.. | - | + | 2 | nova-consoleauth | controller | internal | enabled | up | 2014-09-16.. | - | + | 3 | nova-scheduler | controller | internal | enabled | up | 2014-09-16.. | - | + | 4 | nova-cert | controller | internal | enabled | up | 2014-09-16.. | - | + | 5 | nova-compute | compute1 | nova | enabled | up | 2014-09-16.. | - | + +----+------------------+------------+----------+---------+-------+--------------+-----------------+ + +#. List API endpoints in the Identity service to verify connectivity + with the Identity service:: + + $ nova endpoints + +-----------+------------------------------------------------------------+ + | nova | Value | + +-----------+------------------------------------------------------------+ + | id | 1fb997666b79463fb68db4ccfe4e6a71 | + | interface | public | + | region | RegionOne | + | region_id | RegionOne | + | url | http://controller:8774/v2/ae7a98326b9c455588edd2656d723b9d | + +-----------+------------------------------------------------------------+ + +-----------+------------------------------------------------------------+ + | nova | Value | + +-----------+------------------------------------------------------------+ + | id | bac365db1ff34f08a31d4ae98b056924 | + | interface | admin | + | region | RegionOne | + | region_id | RegionOne | + | url | http://controller:8774/v2/ae7a98326b9c455588edd2656d723b9d | + +-----------+------------------------------------------------------------+ + +-----------+------------------------------------------------------------+ + | nova | Value | + +-----------+------------------------------------------------------------+ + | id | e37186d38b8e4b81a54de34e73b43f34 | + | interface | internal | + | region | RegionOne | + | region_id | RegionOne | + | url | http://controller:8774/v2/ae7a98326b9c455588edd2656d723b9d | + +-----------+------------------------------------------------------------+ + + +-----------+----------------------------------+ + | glance | Value | + +-----------+----------------------------------+ + | id | 41ad39f6c6444b7d8fd8318c18ae0043 | + | interface | admin | + | region | RegionOne | + | region_id | RegionOne | + | url | http://controller:9292 | + +-----------+----------------------------------+ + +-----------+----------------------------------+ + | glance | Value | + +-----------+----------------------------------+ + | id | 50ecc4ce62724e319f4fae3861e50f7d | + | interface | internal | + | region | RegionOne | + | region_id | RegionOne | + | url | http://controller:9292 | + +-----------+----------------------------------+ + +-----------+----------------------------------+ + | glance | Value | + +-----------+----------------------------------+ + | id | 7d3df077a20b4461a372269f603b7516 | + | interface | public | + | region | RegionOne | + | region_id | RegionOne | + | url | http://controller:9292 | + +-----------+----------------------------------+ + + +-----------+----------------------------------+ + | keystone | Value | + +-----------+----------------------------------+ + | id | 88150c2fdc9d406c9b25113701248192 | + | interface | internal | + | region | RegionOne | + | region_id | RegionOne | + | url | http://controller:5000/v2.0 | + +-----------+----------------------------------+ + +-----------+----------------------------------+ + | keystone | Value | + +-----------+----------------------------------+ + | id | cecab58c0f024d95b36a4ffa3e8d81e1 | + | interface | public | + | region | RegionOne | + | region_id | RegionOne | + | url | http://controller:5000/v2.0 | + +-----------+----------------------------------+ + +-----------+----------------------------------+ + | keystone | Value | + +-----------+----------------------------------+ + | id | fc90391ae7cd4216aca070042654e424 | + | interface | admin | + | region | RegionOne | + | region_id | RegionOne | + | url | http://controller:35357/v2.0 | + +-----------+----------------------------------+ + + *Note:* Ignore any warnings in this output. + +#. List images in the Image service catalog to verify connectivity + with the Image service:: + + $ nova image-list + +--------------------------------------+--------+--------+--------+ + | ID | Name | Status | Server | + +--------------------------------------+--------+--------+--------+ + | 38047887-61a7-41ea-9b49-27987d5e8bb9 | cirros | ACTIVE | | + +--------------------------------------+--------+--------+--------+ + +Next topic: :ref:`openstack_block_storage`. \ No newline at end of file diff --git a/source/_build/html/_sources/openstack_dashboard.txt b/source/_build/html/_sources/openstack_dashboard.txt new file mode 100644 index 00000000..ce585372 --- /dev/null +++ b/source/_build/html/_sources/openstack_dashboard.txt @@ -0,0 +1,34 @@ +.. _openstack_dashboard: + +Dashboard +#################### + +The OpenStack Dashboard, also known as Horizon, is a web-based interface +for cloud administrators and users to manage various OpenStack resources +and services. + +The Dashboard enables web-based interactions with the +OpenStack Compute cloud controller through the OpenStack APIs. + +Installation and configuration +------------------------------ + +The dashboard relies on functional core services including +Identity, Image service, Compute, and either Networking (neutron) +or legacy networking (nova-network). Environments with +stand-alone services such as Object Storage cannot use the +dashboard. + +To get started with OpenStack Dashboard services: + +#. Install the OpenStack Dashboard bundle:: + + # swupd bundle-add openstack-dashboard + # swupd verify --fix + +#. Enable and start the dashboard socket and the Nginx server:: + + # systemctl enable nginx uwsgi@horizon.socket + # systemctl restart nginx uwsgi@horizon.socket + +Next topic: :ref:`openstack_networking`. diff --git a/source/_build/html/_sources/openstack_environment-database.txt b/source/_build/html/_sources/openstack_environment-database.txt new file mode 100644 index 00000000..a971bd3d --- /dev/null +++ b/source/_build/html/_sources/openstack_environment-database.txt @@ -0,0 +1,58 @@ +.. openstack_environment-database: + +Database +~~~~~~~~ +Most OpenStack services use an SQL database to store information. The +database typically runs on the controller node. The procedures in this +guide use MariaDB. + +Install and configure the database server +----------------------------------------- + +#. Install MariaDB bundle: + + .. code-block:: console + + # clr_bundle_add database-mariadb + +#. Create the ``/etc/mariadb/`` folder and the ``/etc/mariadb/openstack.cnf`` file. + + .. code-block:: console + + # mkdir /etc/mariadb + # touch /etc/mariadb/openstack.cnf + +#. Add the ``[mysqld]`` section, set the bind-address key to the + management IP address of the controller node to enable access by + other nodes via the management network and enable useful options for + UTF-8 character set: + + .. code:: console + + [mysqld] + bind-address = 10.0.0.11 + default-storage-engine = innodb + innodb_file_per_table + collation-server = utf8_general_ci + init-connect = 'SET NAMES utf8' + character-set-server = utf8 + +Finalizing database installation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Complete the following steps to finalize database installation: + +#. Start the database service and configure it to start when the system + boots: + + .. code:: console + + # systemctl enable mariadb.service + # systemctl start mariadb.service + +2. Secure the database service including choosing a suitable password + for the root account: + + .. code:: console + + # mysql_secure_installation diff --git a/source/_build/html/_sources/openstack_environment-messaging.txt b/source/_build/html/_sources/openstack_environment-messaging.txt new file mode 100644 index 00000000..25a9237b --- /dev/null +++ b/source/_build/html/_sources/openstack_environment-messaging.txt @@ -0,0 +1,59 @@ +.. openstack_environment-messaging: + +Message queue +~~~~~~~~~~~~~ + +OpenStack uses a ``message queue`` to coordinate operations and +status details among services. The message queue service typically +runs on the controller node. OpenStack supports several message queue +services. This guide implements the ``RabbitMQ`` message queue service. + +Install the message queue service +--------------------------------- + + .. code-block:: console + + # clr_bundle_add message-broker-rabbitmq + + +Configuring the message broker service +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Complete the following steps to configure the message broker service: + +1. Message broker service needs to be able to resolve to itself. Add the + following line to :file:`/etc/hosts` + + .. code-block:: literal + + 127.0.0.1 controller + + +2. Start the message broker service and configure it to start when the + system boots: + + .. code-block:: console + + # systemctl enable rabbitmq-server.service + # systemctl start rabbitmq-server.service + + +3. Add the OpenStack user: + + .. code-block:: console + + # rabbitmqctl add_user openstack RABBIT_PASS + Creating user openstack ... + ...done. + + Replace ``RABBIT_PASS`` with a suitable password. + + +4. Permit configuration, write, and read access for the OpenStack user: + + .. code-block:: console + + # rabbitmqctl set_permissions openstack ".*" ".*" ".*" + + Setting permissions for user "openstack" in vhost "/" ... + ...done. diff --git a/source/_build/html/_sources/openstack_identity-openrc.txt b/source/_build/html/_sources/openstack_identity-openrc.txt new file mode 100644 index 00000000..724333db --- /dev/null +++ b/source/_build/html/_sources/openstack_identity-openrc.txt @@ -0,0 +1,75 @@ +.. _openstack_identity-openrc: + +Create OpenStack* client environment scripts +############################################ + +The previous section used a combination of environment variables and +command options to interact with the Identity service via the +``openstack`` client. To increase efficiency of client operations, +OpenStack supports simple client environment scripts also known as +OpenRC files. These scripts typically contain common options for +all clients but also support unique options. For more information, see the +`OpenStack User Guide `__. + +Creating the scripts +-------------------- + +Create client environment scripts for the ``admin`` and ``demo`` +projects and users. Future portions of this guide reference these +scripts to load appropriate credentials for client operations. + +#. Create the ``admin-openrc.sh`` file and add the following content:: + + export OS_PROJECT_DOMAIN_ID=default + export OS_USER_DOMAIN_ID=default + export OS_PROJECT_NAME=admin + export OS_TENANT_NAME=admin + export OS_USERNAME=admin + export OS_PASSWORD=ADMIN_PASS + export OS_AUTH_URL=http://controller:35357/v3 + export OS_IDENTITY_API_VERSION=3 + + Replace ``ADMIN_PASS`` with the password you chose + for the ``admin`` user in the Identity service. + +#. Create the ``demo-openrc.sh`` file and add the following content:: + + export OS_PROJECT_DOMAIN_ID=default + export OS_USER_DOMAIN_ID=default + export OS_PROJECT_NAME=demo + export OS_TENANT_NAME=demo + export OS_USERNAME=demo + export OS_PASSWORD=DEMO_PASS + export OS_AUTH_URL=http://controller:5000/v3 + export OS_IDENTITY_API_VERSION=3 + + Replace ``DEMO_PASS`` with the password you chose + for the ``demo`` user in the Identity service. + +Using the scripts +----------------- + +To run clients as a specific project and user, you can simply load +the associated client environment script prior to running them. +For example: + +#. Load the ``admin-openrc.sh`` file to populate + environment variables with the location of the Identity service + and the ``admin`` project and user credentials:: + + $ source admin-openrc.sh + +#. Request an authentication token:: + + $ openstack token issue + +------------+----------------------------------+ + | Field | Value | + +------------+----------------------------------+ + | expires | 2015-03-25T01:45:49.950092Z | + | id | cd4110152ac24bdeaa82e1443c910c36 | + | project_id | cf12a15c5ea84b019aec3dc45580896b | + | user_id | 4d411f2291f34941b30eef9bd797505a | + +------------+----------------------------------+ + +Next topic: :ref:`openstack_image`. \ No newline at end of file diff --git a/source/_build/html/_sources/openstack_identity.txt b/source/_build/html/_sources/openstack_identity.txt new file mode 100644 index 00000000..7ef71f0e --- /dev/null +++ b/source/_build/html/_sources/openstack_identity.txt @@ -0,0 +1,418 @@ +.. _openstack_identity: + +Identity Service +################### + +The OpenStack Identity service provides a single point of integration for +managing authentication, authorization, and service catalog services. +Additionally, it provides information about users but that are not included in +OpenStack (such as LDAP services) can be integrated into a pre-existing +infrastructure. + +When installing OpenStack Identity service, you must register each +service in your OpenStack installation. Identity service can then track +which OpenStack services are installed and where they are located on +the network. + +Install and configure +~~~~~~~~~~~~~~~~~~~~~ + +This section describes how to install and configure the OpenStack +Identity service, code-named keystone, on the controller node. For +performance, this configuration deploys the Nginx* HTTP server to handle +requests. + +Prerequisites +------------- + +Before you configure the OpenStack Identity service, you must create a +database and an administration token. + +#. To create the database, complete the following actions: + + * Use the database access client to connect to the database server as the + ``root`` user.:: + + $ mysql -u root -p + + * Create the ``keystone`` database.:: + + CREATE DATABASE keystone; + + * Grant proper access to the ``keystone`` databaseReplace ``KEYSTONE_DBPASS`` + with a suitable password.:: + + GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \ + IDENTIFIED BY 'KEYSTONE_DBPASS'; + GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \ + IDENTIFIED BY 'KEYSTONE_DBPASS'; + + + * Exit the database access client. + +#. Generate a random value to use as the administration token during + initial configuration:: + + $ openssl rand -hex 10 + +Install and configure components +-------------------------------- + +#. Run the following command to install the packages.:: + + # swupd bundle-add openstack-identity + # swupd verify --fix + +#. Custom configurations will be located at ``/etc/keystone/``. + + * Create the ``/etc/keystone`` directory.:: + + # mkdir /etc/keystone + + * Create keystone configuration file ``/etc/keystone/keystone.conf``.:: + + # touch /etc/keystone/keystone.conf + +#. Edit the ``/etc/keystone/keystone.conf`` file and complete the following + actions: + + * In the ``[DEFAULT]`` section, define the value of the initial + administration token. Replace ``ADMIN_TOKEN`` with the random value that + you generated in a previous step.:: + + [DEFAULT] + ... + admin_token = ADMIN_TOKEN + + * In the ``[database]`` section, configure database access. Replace + ``KEYSTONE_DBPASS`` with the password you chose for the database.:: + + [database] + ... + connection = mysql://keystone:KEYSTONE_DBPASS@controller/keystone + + +#. Ensure files have proper ownership by running the following command:: + + # systemctl restart update-triggers.target + +#. Populate the Identity service database:: + + # su -s /bin/sh -c "keystone-manage db_sync" keystone + +Finalize the installation +------------------------- + +#. Keystone is deployed as a uwsgi module. To start the Identity + service, you should enable and start the nginx service.:: + + # systemctl enable nginx uwsgi@keystone-admin.socket \ + uwsgi@keystone-public.socket + + # systemctl start nginx uwsgi@keystone-admin.socket \ + uwsgi@keystone-public.socket + + +Create the service entity and API endpoints +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The Identity service provides a catalog of services and their locations. +Each service that you add to your OpenStack environment requires a +service entity and several API endpoints in the catalog. + +Prerequisites +------------- + +You must pass the value of the authentication token to the `openstack` +command with the ``--os-token`` parameter or set the OS_TOKEN +environment variable. Similarly, you must also pass the value of the +Identity service URL to the `openstack` command with the ``--os-url`` +parameter or set the OS_URL environment variable. This guide uses +environment variables to reduce command length. + +#. Configure the authentication token:: + + $ export OS_TOKEN=ADMIN_TOKEN + + Replace ``ADMIN_TOKEN`` with the authentication token that you + generated before. For example:: + + $ export OS_TOKEN=294a4c8a8a475f9b9836 + +#. Configure the endpoint URL:: + + $ export OS_URL=http://controller:35357/v3 + +#. Configure the Identity API version:: + + $ export OS_IDENTITY_API_VERSION=3 + +#. Install the OpenStack Python clients bundle:: + + # swupd bundle-add openstack-python-clients + # swupd verify --fix + + +Create the service entity and API endpoints +------------------------------------------- + + +#. The Identity service manages a catalog of services in your OpenStack + environment. Services use this catalog to determine the other services + available in your environment. + + Create the service entity for the Identity service:: + + $ openstack service create \ + --name keystone --description "OpenStack Identity" identity + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | OpenStack Identity | + | enabled | True | + | id | 4ddaae90388b4ebc9d252ec2252d8d10 | + | name | keystone | + | type | identity | + +-------------+----------------------------------+ + +#. The Identity service manages a catalog of API endpoints associated with + the services in your OpenStack environment. Services use this catalog to + determine how to communicate with other services in your environment. + + OpenStack uses three API endpoint variants for each service: admin, + internal, and public. The admin API endpoint allows modifying users and + tenants by default, while the public and internal APIs do not allow these + operations. In a production environment, the variants might reside on + separate networks that service different types of users for security + reasons. For instance, the public API network might be visible from the + Internet so customers can manage their clouds. The admin API network + might be restricted to operators within the organization that manages + cloud infrastructure. The internal API network might be restricted to + the hosts that contain OpenStack services. Also, OpenStack supports + multiple regions for scalability. For simplicity, this guide uses the + management network for all endpoint variations and the default + ``RegionOne`` region. + + Create the Identity service API endpoints:: + + $ openstack endpoint create --region RegionOne \ + identity public http://controller:5000/v3 + +--------------+----------------------------------+ + | Field | Value | + +--------------+----------------------------------+ + | enabled | True | + | id | 30fff543e7dc4b7d9a0fb13791b78bf4 | + | interface | public | + | region | RegionOne | + | region_id | RegionOne | + | service_id | 8c8c0927262a45ad9066cfe70d46892c | + | service_name | keystone | + | service_type | identity | + | url | http://controller:5000/v3 | + +--------------+----------------------------------+ + + $ openstack endpoint create --region RegionOne \ + identity internal http://controller:5000/v3 + +--------------+----------------------------------+ + | Field | Value | + +--------------+----------------------------------+ + | enabled | True | + | id | 57cfa543e7dc4b712c0ab137911bc4fe | + | interface | internal | + | region | RegionOne | + | region_id | RegionOne | + | service_id | 6f8de927262ac12f6066cfe70d99ac51 | + | service_name | keystone | + | service_type | identity | + | url | http://controller:5000/v3 | + +--------------+----------------------------------+ + + $ openstack endpoint create --region RegionOne \ + identity admin http://controller:35357/v3 + +--------------+----------------------------------+ + | Field | Value | + +--------------+----------------------------------+ + | enabled | True | + | id | 78c3dfa3e7dc44c98ab1b1379122ecb1 | + | interface | admin | + | region | RegionOne | + | region_id | RegionOne | + | service_id | 34ab3d27262ac449cba6cfe704dbc11f | + | service_name | keystone | + | service_type | identity | + | url | http://controller:35357/v3 | + +--------------+----------------------------------+ + +Creating projects, users and roles +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Complete the following steps to create projects, users and roles: + +#. Create an administrative project, user, and role for administrative + operations in your environment: + + * Create the ``admin`` project:: + + $ openstack project create --domain default \ + --description "Admin Project" admin + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | Admin Project | + | domain_id | default | + | enabled | True | + | id | 343d245e850143a096806dfaefa9afdc | + | is_domain | False | + | name | admin | + | parent_id | None | + +-------------+----------------------------------+ + + * Create the ``admin`` user:: + + $ openstack user create --domain default \ + --password-prompt admin + User Password: + Repeat User Password: + +-----------+----------------------------------+ + | Field | Value | + +-----------+----------------------------------+ + | domain_id | default | + | email | admin@example.com | + | enabled | True | + | id | ac3377633149401296f6c0d92d79dc16 | + | name | admin | + +-----------+----------------------------------+ + + * Create the ``admin`` role:: + + $ openstack role create admin + +-------+----------------------------------+ + | Field | Value | + +-------+----------------------------------+ + | id | cd2cb9a39e874ea69e5d4b896eb16128 | + | name | admin | + +-------+----------------------------------+ + + * Add the ``admin`` role to the ``admin`` project and user:: + + $ openstack role add --project admin --user admin admin + +#. This guide uses a service project that contains a unique user for each + service that you add to your environment. Create the ``service`` + project:: + + $ openstack project create --domain default \ + --description "Service Project" service + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | Service Project | + | domain_id | default | + | enabled | True | + | id | 894cdfa366d34e9d835d3de01e752262 | + | is_domain | False | + | name | service | + | parent_id | None | + +-------------+----------------------------------+ + +#. Regular (non-admin) tasks should use an unprivileged project and user. + As an example, this guide creates the ``demo`` project and user. + + * Create the ``demo`` project:: + + $ openstack project create --domain default \ + --description "Demo Project" demo + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | Demo Project | + | domain_id | default | + | enabled | True | + | id | ed0b60bf607743088218b0a533d5943f | + | is_domain | False | + | name | demo | + | parent_id | None | + +-------------+----------------------------------+ + + * Create the ``demo`` user:: + + $ openstack user create --domain default \ + --password-prompt demo + User Password: + Repeat User Password: + +-----------+----------------------------------+ + | Field | Value | + +-----------+----------------------------------+ + | domain_id | default | + | email | demo@example.com | + | enabled | True | + | id | 58126687cbcc4888bfa9ab73a2256f27 | + | name | demo | + +-----------+----------------------------------+ + + * Create the ``user`` role:: + + $ openstack role create user + +-------+----------------------------------+ + | Field | Value | + +-------+----------------------------------+ + | id | 997ce8d05fc143ac97d83fdfb5998552 | + | name | user | + +-------+----------------------------------+ + + * Add the ``user`` role to the ``demo`` project and user:: + + $ openstack role add --project demo --user demo user + +Verify operation +~~~~~~~~~~~~~~~~ + +Verify operation of the Identity service before installing other +services. + +#. For security reasons, remove admin_token from + ``/etc/keystone/keystone.conf``: + + Edit the ``[DEFAULT]`` section and remove ``admin_token``. + +#. Restart the keystone-admin service to reload the changes:: + + # systemctl restart uwsgi@keystone-admin.service + +#. Unset the temporary ``OS_TOKEN`` and ``OS_URL`` environment variables:: + + $ unset OS_TOKEN OS_URL + +#. As the ``admin`` user, request an authentication token:: + + $ openstack --os-auth-url http://controller:35357/v3 \ + --os-project-domain-id default --os-user-domain-id default \ + --os-project-name admin --os-username admin --os-auth-type password \ + token issue + Password: + +------------+----------------------------------+ + | Field | Value | + +------------+----------------------------------+ + | expires | 2015-03-24T18:55:01Z | + | id | ff5ed908984c4a4190f584d826d75fed | + | project_id | cf12a15c5ea84b019aec3dc45580896b | + | user_id | 4d411f2291f34941b30eef9bd797505a | + +------------+----------------------------------+ + +#. As the ``demo`` user, request an authentication token:: + + $ openstack --os-auth-url http://controller:5000/v3 \ + --os-project-domain-id default --os-user-domain-id default \ + --os-project-name demo --os-username demo --os-auth-type password \ + token issue + Password: + +------------+----------------------------------+ + | Field | Value | + +------------+----------------------------------+ + | expires | 2014-10-10T12:51:33Z | + | id | 1b87ceae9e08411ba4a16e4dada04802 | + | project_id | 4aa51bb942be4dd0ac0555d7591f80a6 | + | user_id | 7004dfa0dda84d63aef81cf7f100af01 | + +------------+----------------------------------+ + +Next topic: :ref:`openstack_identity-openrc`. \ No newline at end of file diff --git a/source/_build/html/_sources/openstack_image.txt b/source/_build/html/_sources/openstack_image.txt new file mode 100644 index 00000000..d31d7f1f --- /dev/null +++ b/source/_build/html/_sources/openstack_image.txt @@ -0,0 +1,278 @@ +.. _openstack_image: + +Image Service +################ + +The OpenStack Image service (glance) enables users to discover, register, and +retrieve virtual machine images. + +Install and configure the Image Service +--------------------------------------- + +This section describes how to install and configure the Image service, +code-named glance, on the controller node. For simplicity, this configuration +stores images on the local file system. By default, this directory is +``/var/lib/glance/images/``. + +Prerequisites +~~~~~~~~~~~~~ + +Before you install and configure the Image 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.:: + + $ mysql -u root -p + + * Create the ``glance`` database:: + + CREATE DATABASE glance; + + * Grant proper access to the ``glance`` database. Replace ``GLANCE_DBPASS`` + with a suitable password.:: + + GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' \ + IDENTIFIED BY 'GLANCE_DBPASS'; + GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' \ + IDENTIFIED BY 'GLANCE_DBPASS'; + + * Exit the database access client. + +#. Source the ``admin`` credentials to gain access to admin-only CLI commands.:: + + $ source admin-openrc.sh + +#. To create the service credentials, complete these steps: + + * Create the ``glance`` user:: + + $ openstack user create --domain default --password-prompt glance + User Password: + Repeat User Password: + +-----------+----------------------------------+ + | Field | Value | + +-----------+----------------------------------+ + | domain_id | default | + | enabled | True | + | id | e38230eeff474607805b596c91fa15d9 | + | name | glance | + +-----------+----------------------------------+ + + * Add the ``admin`` role to the ``glance`` user and ``service`` project.:: + + $ openstack role add --project service --user glance admin + + * Create the ``glance`` service entity.:: + + $ openstack service create --name glance \ + --description "OpenStack Image service" image + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | OpenStack Image service | + | enabled | True | + | id | 8c2c7f1b9b5049ea9e63757b5533e6d2 | + | name | glance | + | type | image | + +-------------+----------------------------------+ + +#. Create the Image service API endpoints.:: + + $ openstack endpoint create --region RegionOne \ + image public http://controller:9292 + +--------------+----------------------------------+ + | Field | Value | + +--------------+----------------------------------+ + | enabled | True | + | id | 340be3625e9b4239a6415d034e98aace | + | interface | public | + | region | RegionOne | + | region_id | RegionOne | + | service_id | 8c2c7f1b9b5049ea9e63757b5533e6d2 | + | service_name | glance | + | service_type | image | + | url | http://controller:9292 | + +--------------+----------------------------------+ + + $ openstack endpoint create --region RegionOne \ + image internal http://controller:9292 + +--------------+----------------------------------+ + | Field | Value | + +--------------+----------------------------------+ + | enabled | True | + | id | a6e4b153c2ae4c919eccfdbb7dceb5d2 | + | interface | internal | + | region | RegionOne | + | region_id | RegionOne | + | service_id | 8c2c7f1b9b5049ea9e63757b5533e6d2 | + | service_name | glance | + | service_type | image | + | url | http://controller:9292 | + +--------------+----------------------------------+ + + $ openstack endpoint create --region RegionOne \ + image admin http://controller:9292 + +--------------+----------------------------------+ + | Field | Value | + +--------------+----------------------------------+ + | enabled | True | + | id | 0c37ed58103f4300a84ff125a539032d | + | interface | admin | + | region | RegionOne | + | region_id | RegionOne | + | service_id | 8c2c7f1b9b5049ea9e63757b5533e6d2 | + | service_name | glance | + | service_type | image | + | url | http://controller:9292 | + +--------------+----------------------------------+ + +Install and configure components +-------------------------------- + +#. Install OpenStack Image bundle.:: + + # swupd bundle-add openstack-image + # swupd verify --fix + +#. Configurations will be located at ``/etc/glance``. + + * Create ``/etc/glance`` directory.:: + + # mkdir /etc/glance + + * Create ``/etc/glance/glance-api.conf`` and + ``/etc/glance/glance-registry.conf`` configuration files.:: + + # touch /etc/glance/glance-{api,registry}.conf + +#. Edit the ``/etc/glance/glance-api.conf`` file and complete the following + actions: + + * In the ``[database]`` section, configure database access. Replace + ``GLANCE_DBPASS`` with the password you chose for the Image service + database.:: + + [database] + ... + connection = mysql://glance:GLANCE_DBPASS@controller/glance + + * In the ``[keystone_authtoken]`` section, configure Identity service access. + Replace ``GLANCE_PASS`` with the password you chose for the ``glance`` user + in the Identity service.:: + + [keystone_authtoken] + ... + auth_uri = http://controller:5000 + auth_url = http://controller:35357 + auth_plugin = password + project_domain_id = default + user_domain_id = default + project_name = service + username = glance + password = GLANCE_PASS + +#. Edit the ``/etc/glance/glance-registry.conf`` file and complete the following + actions: + + * In the ``[database]`` section, configure database access. Replace + ``GLANCE_DBPASS`` with the password you chose for the Image service + database.:: + + [database] + ... + connection = mysql://glance:GLANCE_DBPASS@controller/glance + + * In the ``[keystone_authtoken]`` section, configure Identity service + access. Replace ``GLANCE_PASS`` with the password you chose for the + ``glance`` user in the Identity service.:: + + [keystone_authtoken] + ... + auth_uri = http://controller:5000 + auth_url = http://controller:35357 + auth_plugin = password + project_domain_id = default + user_domain_id = default + project_name = service + username = glance + password = GLANCE_PASS + +#. Ensure files have proper ownership by running the following command:: + + # systemctl restart update-triggers.target + +#. Populate the Image Service database:: + + # su -s /bin/sh -c "glance-manage db_sync" glance + +Finalize installation +--------------------- + +#. Start the Image Service services and configure them to start when the + system boots:: + + # systemctl enable glance-api.service glance-registry.service + # systemctl start glance-api.service glance-registry.service + +Verify operation +~~~~~~~~~~~~~~~~ + +Verify operation of the Image service using +`CirrOS `__, a small +Linux image that helps you test your OpenStack deployment. + +#. In each client environment script, configure the Image service + client to use API version 2.0:: + + $ echo "export OS_IMAGE_API_VERSION=2" \ + | tee -a admin-openrc.sh demo-openrc.sh + +#. Source the ``admin`` credentials to gain access to admin-only CLI commands:: + + $ source admin-openrc.sh + +#. Download the source image:: + + $ curl -Ok http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img + +#. Upload the image to the Image service using the `QCOW2` disk format, `bare` + container format, and public visibility so all projects can access it:: + + $ openstack image create cirros --file cirros-0.3.4-x86_64-disk.img \ + --disk-format qcow2 --container-format bare --public + +------------------+------------------------------------------------------+ + | Field | Value | + +------------------+------------------------------------------------------+ + | checksum | ee1eca47dc88f4879d8a229cc70a07c6 | + | container_format | bare | + | created_at | 2015-10-26T23:40:03Z | + | disk_format | qcow2 | + | file | /v2/images/fcf6fa55-56e9-4402-8137-3e9315c84905/file | + | id | fcf6fa55-56e9-4402-8137-3e9315c84905 | + | min_disk | 0 | + | min_ram | 0 | + | name | cirros | + | owner | 2e3093872ebf4143a122e2cc01a50d13 | + | protected | False | + | schema | /v2/schemas/image | + | size | 13287936 | + | status | active | + | tags | | + | updated_at | 2015-10-26T23:40:03Z | + | virtual_size | None | + | visibility | public | + +------------------+------------------------------------------------------+ + +#. Confirm upload of the image and validate attributes:: + + $ openstack image list + +--------------------------------------+--------+ + | ID | Name | + +--------------------------------------+--------+ + | 38047887-61a7-41ea-9b49-27987d5e8bb9 | cirros | + +--------------------------------------+--------+ + +Next topic: :ref:`openstack_compute`. \ No newline at end of file diff --git a/source/_build/html/_sources/openstack_installing_bundles.txt b/source/_build/html/_sources/openstack_installing_bundles.txt new file mode 100644 index 00000000..b19a1296 --- /dev/null +++ b/source/_build/html/_sources/openstack_installing_bundles.txt @@ -0,0 +1,26 @@ +.. _openstack_installing_bundles: + +Installing OpenStack* MVP bundles +############################################################ + +Note: This article walks through an OpenStack MVP installation by using +bundles available for Clear Linux* OS for Intel® Architecture. The sample +configuration files that are included would likely require modification +for your environment. + +To install, continue with the following topics: + +* `Database `_ +* `Message queue `_ +* `OpenStack Identity `_ +* `Create OpenStack client environment scripts `_ +* `OpenStack Image `_ +* `OpenStack Compute `_ +* `OpenStack Block Storage `_ +* `OpenStack Dashboard `_ +* `OpenStack Networking `_ +* `OpenStack Orchestration `_ +* `OpenStack Telemetry `_ +* `OpenStack Object Storage `_ + +Next topic: :ref:`openstack_supporting-database`. \ No newline at end of file diff --git a/source/_build/html/_sources/openstack_networking.txt b/source/_build/html/_sources/openstack_networking.txt new file mode 100644 index 00000000..673001fa --- /dev/null +++ b/source/_build/html/_sources/openstack_networking.txt @@ -0,0 +1,309 @@ +.. _openstack_networking: + +Networking +############################################################ + +OpenStack* Networking allows you to create and attach interface devices +managed by other OpenStack services to networks. Plug-ins can be +implemented to accommodate different networking equipment and software, +providing flexibility to OpenStack architecture and deployment. + +Installing and configuring the controller node +------------------------------------------------- + +Prerequisites +~~~~~~~~~~~~~ + +Before configuring the OpenStack Networking (neutron) service, create a +database, service credentials, and an API endpoint. + +#. Create the database: + + * Use the database access client to connect to the database server + as the ``root`` user:: + + $ mysql -u root -p + + * Create the ``neutron`` database:: + + CREATE DATABASE neutron; + + * Grant proper access to the ``neutron`` database. Replace + *``NEUTRON_DBPASS``* with a suitable password:: + + GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' \ + IDENTIFIED BY 'NEUTRON_DBPASS'; + GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' \ + IDENTIFIED BY 'NEUTRON_DBPASS'; + + * Exit the database access client. + +#. Source the ``admin`` credentials to gain access to admin-only CLI + commands:: + + $ source admin-openrc.sh + +#. To create the service credentials, complete these steps: + + * Create the ``neutron`` user:: + + $ openstack user create --password-prompt neutron + User Password: + Repeat User Password: + +----------+----------------------------------+ + | Field | Value | + +----------+----------------------------------+ + | email | None | + | enabled | True | + | id | ab67f043d9304017aaa73d692eeb4945 | + | name | neutron | + | username | neutron | + +----------+----------------------------------+ + + * Add the ``admin`` role to the ``neutron`` user:: + + +-------+----------------------------------+ + | Field | Value | + +-------+----------------------------------+ + | id | cd2cb9a39e874ea69e5d4b896eb16128 | + | name | admin | + +-------+----------------------------------+ + + * Create the ``neutron`` service entity:: + + $ openstack service create --name neutron \ + --description "OpenStack Networking" network + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | OpenStack Networking | + | enabled | True | + | id | f71529314dab4a4d8eca427e701d209e | + | name | neutron | + | type | network | + +-------------+----------------------------------+ + +#. Create the Networking service API endpoint:: + + --publicurl http://controller:9696 \ + --adminurl http://controller:9696 \ + --internalurl http://controller:9696 \ + --region RegionOne \ + network + +--------------+----------------------------------+ + | Field | Value | + +--------------+----------------------------------+ + | adminurl | http://controller:9696 | + | id | 04a7d3c1de784099aaba83a8a74100b3 | + | internalurl | http://controller:9696 | + | publicurl | http://controller:9696 | + | region | RegionOne | + | service_id | f71529314dab4a4d8eca427e701d209e | + | service_name | neutron | + | service_type | network | + +--------------+----------------------------------+ + +Installing the Networking components +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Complete the following step to install the Networking components: + +- Install OpenStack networking bundle:: + + # clr_bundle_add openstack-network + +Configuring the Networking server component +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Complete the following steps to configure the Networking server component: + +The Networking server component configuration includes the database, +authentication mechanism, message queue, topology change notifications, +and plug-in. + +Edit the ``/etc/neutron/neutron.conf `` file: + +#. Custom configurations will be located at ``/etc/neutron``. + + * Create /etc/neutron directory:: + + $ mkdir /etc/neutron + + * Create empty neutron configuration + file:: + + $ touch /etc/neutron/neutron.conf + +#. In the ``[database]`` section, configure database access. Replace + *NEUTRON_DBPASS* with the password you chose for the database:: + + [database] + ... + connection = mysql://neutron:NEUTRON_DBPASS@controller/neutron + +#. In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, + configure RabbitMQ message queue access. Replace *``RABBIT_PASS``* + with the password you chose for the ``openstack`` account in + RabbitMQ:: + + [DEFAULT] + ... + rpc_backend = rabbit + [oslo_messaging_rabbit] + ... + rabbit_host = controller + rabbit_userid = openstack + rabbit_password = RABBIT_PASS + +#. In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, configure + Identity service access. Replace *``NEUTRON_PASS``* with the password + you chose for the ``neutron`` user in the Identity service:: + + [DEFAULT] + ... + auth_strategy = keystone + [keystone_authtoken] + ... + auth_uri = http://controller:5000 + auth_url = http://controller:35357 + auth_plugin = password + project_domain_id = default + user_domain_id = default + project_name = service + username = neutron + password = NEUTRON_PASS + +#. In the ``[DEFAULT]`` section, enable the Modular Layer 2 (ML2) + plug-in, router service, and overlapping IP addresses:: + + [DEFAULT] + ... + core_plugin = ml2 + service_plugins = router + allow_overlapping_ips = True + +#. In the ``[DEFAULT]`` and ``[nova]`` sections, configure Networking to + notify Compute of network topology changes. Replace ``NOVA_PASS`` + with the password you chose for the ``nova`` user in the Identity + service:: + + [DEFAULT] + ... + notify_nova_on_port_status_changes = True + notify_nova_on_port_data_changes = True + nova_url = http://controller:8774/v2 + [nova] + ... + auth_url = http://controller:35357 + auth_plugin = password + project_domain_id = default + user_domain_id = default + region_name = RegionOne + project_name = service + username = nova + password = NOVA_PASS + +Configuring the Modular Layer 2 (ML2) plug-in +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ML2 plug-in uses the Open vSwitch (OVS) mechanism (agent) to build +the virtual networking framework for instances. However, the controller +node does not need the OVS components because it does not handle +instance network traffic. + +#. Custom configuration for ML2 plug-in will be stored in ``/etc/neutron/plugins/ml2``:: + + mkdir -p /etc/neutron/plugins/ml2 + touch /etc/neutron.plugins/ml2/ml2_conf.ini + +#. Edit the ``/etc/neutron/plugins/ml2/ml2_conf.ini`` file as follows: + + * In the ``[ml2]`` section, enable the flat, VLAN, generic routing + encapsulation (GRE), and virtual extensible LAN (VXLAN) network + type drivers, GRE tenant networks, and the OVS mechanism driver:: + + [ml2] + ... + type_drivers = flat,vlan,gre,vxlan + tenant_network_types = gre + mechanism_drivers = openvswitch + + * In the ``[ml2_type_gre]`` section, configure the tunnel identifier + (id) range:: + + [ml2_type_gre] + ... + tunnel_id_ranges = 1:1000 + + * In the ``[securitygroup]`` section, enable security groups, enable + ipset, and configure the OVS iptables firewall driver:: + + [securitygroup] + ... + enable_security_group = True + enable_ipset = True + firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver + +Configuring Compute to use Networking +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +By default, distribution packages configure Compute to use legacy +networking. You must reconfigure Compute to manage networks through +Networking. + +#. Edit the ``/etc/nova/nova.conf`` file on the controller node as + follows: + + * In the ``[DEFAULT]`` section, configure the APIs and drivers:: + + [DEFAULT] + ... + network_api_class = nova.network.neutronv2.api.API + security_group_api = neutron + linuxnet_interface_driver = nova.network.linux_net.LinuxOVSInterfaceDriver + firewall_driver = nova.virt.firewall.NoopFirewallDriver + + * In the ``[neutron]`` section, configure access + parameters. Replace *NEUTRON_PASS* with the password you + chose for the ``neutron`` user in the Identity service:: + + [neutron] + ... + url = http://controller:9696 + auth_strategy = keystone + admin_auth_url = http://controller:35357/v2.0 + admin_tenant_name = service + admin_username = neutron + admin_password = NEUTRON_PASS + +Finalizing installation +~~~~~~~~~~~~~~~~~~~~~~~~ + +#. The Networking service initialization scripts expect a symbolic link + ``/etc/neutron/plugin.ini`` pointing to the ML2 plug-in configuration + file, ``/etc/neutron/plugins/ml2/ml2_conf.ini``. If this symbolic + link does not exist, create it using the following command:: + + # ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini + +#. Populate the database:: + + # su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \ + --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron + +#. Let ``systemd`` set the correct permissions for files in ``/etc/neutron``:: + + # systemctl restart update-triggers.target + +#. Restart the Compute services:: + + # systemctl restart nova-api.service nova-scheduler.service \ + nova-conductor.service + +#. Start the Networking service and configure it to start when the + system boots:: + + # systemctl enable neutron-server.service + # systemctl start neutron-server.service + +Next topic: :ref:`openstack_orchestration`. \ No newline at end of file diff --git a/source/_build/html/_sources/openstack_object_storage.txt b/source/_build/html/_sources/openstack_object_storage.txt new file mode 100644 index 00000000..b01654b6 --- /dev/null +++ b/source/_build/html/_sources/openstack_object_storage.txt @@ -0,0 +1,626 @@ +.. _openstack_object_storage: + +Object Storage +######################### + +Install and configure the controller node +----------------------------------------- + +This section describes how to install and configure the proxy service +that handles requests for the account, container, and object services +operating on the storage nodes. For simplicity, this guide installs and +configures the proxy service on the controller node. However, you can +run the proxy service on any node with network connectivity to the +storage nodes. Additionally, you can install and configure the proxy +service on multiple nodes to increase performance and redundancy. + +To configure prerequisites +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The proxy service relies on an authentication and authorization +mechanism such as the Identity service. However, unlike other services, +it also offers an internal mechanism that allows it to operate without +any other OpenStack* services. However, for simplicity, this guide +references the Identity service OpenStack Identity Service. Before you +configure the Object Storage service, you must create service +credentials and an API endpoint. + +#. Source the ``admin`` credentials to gain access to admin-only CLI + commands:: + + $ source admin-openrc.sh + +#. To create the Identity service credentials, complete these steps: + + * Create the swift user:: + + $ openstack user create --password-prompt swift + User Password: + Repeat User Password: + +----------+----------------------------------+  + | Field    | Value                            |  + +----------+----------------------------------+  + | email    | None                             |  + | enabled  | True                             |  + | id       | d535e5cbd2b74ac7bfb97db9cced3ed6 |  + | name     | swift                            |  + | username | swift                            |  + +----------+----------------------------------+ + + * Add the admin role to the swift user:: + + $ openstack role add --project service --user swift admin + +-------+----------------------------------+ + | Field | Value                            | + +-------+----------------------------------+ + | id    | cd2cb9a39e874ea69e5d4b896eb16128 | + | name  | admin                            | + +-------+----------------------------------+ + + * Create the swift service entity:: + + $ openstack service create --name swift \ + --description "OpenStack Object Storage" object-store + +-------------+----------------------------------+ + | Field       | Value                            | + +-------------+----------------------------------+ + | description | OpenStack Object Storage         | + | enabled     | True                             | + | id          | 75ef509da2c340499d454ae96a2c5c34 | + | name        | swift                            | + | type        | object-store                     | + +-------------+----------------------------------+ + +#. Create the Object Storage service API endpoint:: + + $ openstack endpoint create \ + --publicurl 'http://controller:8080/v1/AUTH_%(tenant_id)s' \ + --internalurl 'http://controller:8080/v1/AUTH_%(tenant_id)s' \ + --adminurl http://controller:8080 \ + --region RegionOne \ + object-store + +--------------+----------------------------------------------+ + | Field        | Value                                        | + +--------------+----------------------------------------------+ + | adminurl     | http://controller:8080/                      | + | id           | af534fb8b7ff40a6acf725437c586ebe             | + | internalurl  | http://controller:8080/v1/AUTH_%(tenant_id)s | + | publicurl    | http://controller:8080/v1/AUTH_%(tenant_id)s | + | region       | RegionOne                                    | + | service_id   | 75ef509da2c340499d454ae96a2c5c34             | + | service_name | swift                                        | + | service_type | object-store                                 | + +--------------+----------------------------------------------+ + +To install and configure the controller node components +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +#. Install the bundle:: + + # clr_bundle_add openstack-object-storage + +#. Create the directory ``/etc/swift`` if does not exist:: + + # mkdir /etc/swift + +#. Copy the sample proxy-server config file to the configuration + directory:: + + # cp /usr/share/defaults/swift/proxy-server.conf /etc/swift + +#. Edit the ``/etc/swift/proxy-server.conf`` file and complete the + following actions: + + * In the ``[pipeline:main]`` section, enable the appropriate + modules:: + + [pipeline:main] + pipeline = catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk ratelimit authtoken keystoneauth container-quotas account-quotas slo dlo proxy-logging proxy-server + + * In the ``[app:proxy-server]`` section, enable automatic account + creation:: + + [app:proxy-server] + ... + account_autocreate = true + + * In the ``[filter:keystoneauth]`` section, configure the operator + roles:: + + [filter:keystoneauth] + use = egg:swift#keystoneauth + ... + operator_roles = admin,user + + * In the ``[filter:authtoken]`` section, configure Identity service + access. Replace SWIFT\_PASS with the password you chose for the + swift user in the Identity service:: + + [filter:authtoken] + paste.filter_factory = keystonemiddleware.auth_token:filter_factory + ... + auth_uri = http://controller:5000 + auth_url = http://controller:35357 + auth_plugin = password + project_domain_id = default + user_domain_id = default + project_name = service + username = swift + password = SWIFT_PASS + delay_auth_decision = true + + * In the ``[filter:cache]`` section, configure the memcached + location:: + + [filter:cache] + ... + memcache_servers = 127.0.0.1:11211 + +Install and configure the storage nodes +--------------------------------------- + +This section describes how to install and configure storage nodes that +operate the account, container, and object services. For simplicity, +this configuration references two storage nodes, each containing two +empty local block storage devices. Each of the devices, ``/dev/sdb`` and +``/dev/sdc``, must contain a suitable partition table with one partition +occupying the entire device. Although the Object Storage service +supports any file system with extended attributes (xattr), testing and +benchmarking indicate the best performance and reliability on XFS. + +To configure prerequisites +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You must configure each storage node before you install and configure +the Object Storage service on it. Similar to the controller node, each +storage node contains one network interface on the management network. +Optionally, each storage node can contain a second network interface on +a separate network for replication. + +#. Configure unique items on the first storage node: + + * Configure the management interface:: + + IP address: 10.0.0.51 + Network mask: 255.255.255.0 (or /24) + Default gateway: 10.0.0.1 + + * Set the hostname of the node to ``object1``. + +#. Configure unique items on the second storage node: + + * Configure the management interface:: + + IP address: 10.0.0.52 + Network mask: 255.255.255.0 (or /24) + Default gateway: 10.0.0.1 + + * Set the hostname of the node to ``object2``. + +#. Configure shared items on both storage nodes: + + * Copy the contents of the ``/etc/hosts`` file from the controller + node and add the following to it:: + + # object1 + 10.0.0.51 object1 + # object2 + 10.0.0.52 object2 + + Also add this content to the ``/etc/hosts`` file on all other nodes in your environment. + + * Install the OpenStack Object Storage bundle:: + + # clr\_bundle\_add openstack-object-storage + + * Format the ``/dev/sdb1`` and ``/dev/sdc1`` partitions as XFS:: + + # mkfs.xfs /dev/sdb1 + # mkfs.xfs /dev/sdc1 + + * Create the mount point directory structure:: + + # mkdir -p /srv/node/sdb1 + # mkdir -p /srv/node/sdc1 + + * Edit the ``/etc/fstab`` file and add the following to it:: + + /dev/sdb1 /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 2 + /dev/sdc1 /srv/node/sdc1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 2 + + * Mount the devices:: + + # mount /srv/node/sdb1 + # mount /srv/node/sdc1 + +#. Edit the ``/etc/rsyncd.conf`` file and add the following to it:: + + uid = swift + gid = swift + log file = /var/log/rsyncd.log + pid file = /var/run/rsyncd.pid + address = MANAGEMENT\_INTERFACE\_IP\_ADDRESS + [account] + max connections = 2 + path = /srv/node/ + read only = false + lock file = /var/lock/account.lock + [container] + max connections = 2 + path = /srv/node/ + read only = false + lock file = /var/lock/container.lock + [object] + max connections = 2 + path = /srv/node/ + read only = false + lock file = /var/lock/object.lock + + Replace ``MANAGEMENT_INTERFACE_IP_ADDRESS`` with the IP address of + the management network on the storage node. + + Note: The ``rsync`` service requires no authentication, so consider + running it on a private network. + +#. Start the ``rsyncd`` service and configure it to start when the + system boots:: + + # systemctl enable rsyncd.service + # systemctl start rsyncd.service + +Install and configure storage node components +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +#. Copy the accounting, container, object, container-reconciler, and + object-expirer service configuration files to the configuration + directory:: + + # cp /usr/share/defaults/swift/account-server.conf /etc/swift + # cp /usr/share/defaults/swift/container-server.conf /etc/swift + # cp /usr/share/defaults/swift/object-server.conf /etc/swift + # cp /usr/share/defaults/swift/container-reconciler.conf/etc/swift + # cp /usr/share/defaults/swift/object-expirer.conf /etc/swift + +#. Edit the ``/etc/swift/account-server.conf`` file and complete the + following actions: + + * In the ``[DEFAULT]`` section, configure the bind IP address and + mount point directory:: + + [DEFAULT] + ... + bind\_ip = MANAGEMENT\_INTERFACE\_IP\_ADDRESS + devices = /srv/node + + Replace ``MANAGEMENT_INTERFACE_IP_ADDRESS`` with the IP + address of the management network on the storage node. + + * In the ``[pipeline:main]`` section, enable the appropriate + modules:: + + [pipeline:main] + pipeline = healthcheck recon account-server + + * In the ``[filter:recon]`` section, configure the recon (metrics) + cache directory:: + + [filter:recon] + ... + recon\_cache\_path = /var/cache/swift + +#. Edit the ``/etc/swift/container-server.conf`` file and complete the + following actions: + + * In the ``[DEFAULT]`` section, configure the bind IP address and + mount point directory:: + + [DEFAULT] + ... + bind\_ip = MANAGEMENT\_INTERFACE\_IP\_ADDRESS + devices = /srv/node + + Replace ``MANAGEMENT_INTERFACE_IP_ADDRESS`` with the IP + address of the management network on the storage node. + + * modules:: + + [pipeline:main] + pipeline = healthcheck recon container-server + + * In the ``[filter:recon]`` section, configure the recon (metrics) + cache directory:: + + [filter:recon] + ... + recon\_cache\_path = /var/cache/swift + +#. Edit the ``/etc/swift/object-server.conf`` file and complete the + following actions: + + * In the ``[DEFAULT]`` section, configure the bind IP address and + mount point directory:: + + [DEFAULT] + ... + bind\_ip = MANAGEMENT\_INTERFACE\_IP\_ADDRESS + devices = /srv/node + + Replace ``MANAGEMENT_INTERFACE_IP_ADDRESS`` with the IP + address of the management network on the storage node. + + * In the ``[pipeline:main]`` section, enable the appropriate + modules:: + + [pipeline:main] + pipeline = healthcheck recon object-server + + * In the ``[filter:recon]`` section, configure the recon (metrics) + cache and lock directories:: + + [filter:recon] + ... + recon\_cache\_path = /var/cache/swift + recon\_lock\_path = /var/lock + +#. Ensure proper ownership of the mount point directory structure:: + + # systemctl restart update-triggers.target + +About Creating initial rings +---------------------------- + +Before starting the Object Storage services, you must create the initial +account, container, and object rings. The ring builder creates +configuration files that each node uses to determine and deploy the +storage architecture. For simplicity, this guide uses one region and +zone with 2^10 (1024) maximum partitions, 3 replicas of each object, and +1 hour minimum time between moving a partition more than once. For +Object Storage, a partition indicates a directory on a storage device +rather than a conventional partition table. + +Create Account Ring +------------------- + +The account server uses the account ring to maintain lists of +containers. + +To create the ring +~~~~~~~~~~~~~~~~~~ + +#. Change to the /etc/swift directory. +#. Create the base account.builder file:: + + # swift-ring-builder account.builder create 10 3 1 + +#. Add each storage node to the ring:: + + # swift-ring-builder account.builder \ + add r1z1-STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS:6002/DEVICE_NAME DEVICE_WEIGHT + + Replace *STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS* with the + IP address of the management network on the storage node. Replace + *DEVICE_NAME* with a storage device name on the same storage node. + For example, using the first storage node with the ``/dev/sdb1`` storage + device and weight of 100:: + + # swift-ring-builder account.builder add r1z1-10.0.0.51:6002/sdb1 100 + + Repeat this command for each storage device on each storage node. In + the example architecture, use the command in four variations:: + + # swift-ring-builder account.builder add r1z1-10.0.0.51:6002/sdb1 100 + Device d0r1z1-10.0.0.51:6002R10.0.0.51:6002/sdb1_"" with 100.0 weight got id 0 + # swift-ring-builder account.builder add r1z2-10.0.0.51:6002/sdc1 100 + Device d1r1z2-10.0.0.51:6002R10.0.0.51:6002/sdc1_"" with 100.0 weight got id 1 + # swift-ring-builder account.builder add r1z3-10.0.0.52:6002/sdb1 100 + Device d2r1z3-10.0.0.52:6002R10.0.0.52:6002/sdb1_"" with 100.0 weight got id 2 + # swift-ring-builder account.builder add r1z4-10.0.0.52:6002/sdc1 100 + Device d3r1z4-10.0.0.52:6002R10.0.0.52:6002/sdc1_"" with 100.0 weight got id 3 + +#. Verify the ring contents:: + + # swift-ring-builder account.builder account.builder, build version 4 + 1024 partitions, 3.000000 replicas, 1 regions, 4 zones, 4 devices, 100.00 balance, 0.00 dispersion + The minimum number of hours before a partition can be reassigned is 1 + The overload factor is 0.00% (0.000000) + Devices:    id  region  zone      ip address  port  replication ip  replication port      name weight partitions balance meta +              0       1     1       10.0.0.51  6002       10.0.0.51              6002      sdb1 100.00          0 -100.00 +              1       1     2       10.0.0.51  6002       10.0.0.51              6002      sdc1 100.00          0 -100.00 +              2       1     3       10.0.0.52  6002       10.0.0.52              6002      sdb1 100.00          0 -100.00 +              3       1     4       10.0.0.52  6002       10.0.0.52              6002      sdc1 100.00          0 -100.00 + +#. Rebalance the ring:: + + # swift-ring-builder account.builder rebalance + Reassigned 1024 (100.00%) partitions. Balance is now 0.00. Dispersion is now 0.00 + +Create Container Ring +--------------------- + +The container server uses the container ring to maintain lists of +objects. However, it does not track object locations. + +To create the ring +~~~~~~~~~~~~~~~~~~ + +#. Change to the ``/etc/swift`` directory. +#. Create the base container.builder file:: + + # swift-ring-builder container.builder create 10 3 1 + +#. Add each storage node to the ring:: + + # swift-ring-builder container.builder \ + add r1z1-STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS:6001/DEVICE_NAME DEVICE_WEIGHT + + Replace *STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS* with the + IP address of the management network on the storage node. Replace + *DEVICE_NAME* with a storage device name on the same storage node. + For example, using the first storage node with the /dev/sdb1 storage + device and weight of 100:: + + # swift-ring-builder container.builder add r1z1-10.0.0.51:6001/sdb1 100 + + Repeat this command for each storage device on each storage node. In + the example architecture, use the command in four variations:: + + # swift-ring-builder container.builder add r1z1-10.0.0.51:6001/sdb1 100 + Device d0r1z1-10.0.0.51:6002R10.0.0.51:6002/sdb1_"" with 100.0 weight got id 0 + # swift-ring-builder container.builder add r1z2-10.0.0.51:6001/sdc1 100 + Device d1r1z2-10.0.0.51:6002R10.0.0.51:6002/sdc1_"" with 100.0 weight got id 1 + # swift-ring-builder container.builder add r1z3-10.0.0.52:6001/sdb1 100 + Device d2r1z3-10.0.0.52:6002R10.0.0.52:6002/sdb1_"" with 100.0 weight got id 2 + # swift-ring-builder container.builder add r1z4-10.0.0.52:6001/sdc1 100 + Device d3r1z4-10.0.0.52:6002R10.0.0.52:6002/sdc1_"" with 100.0 weight got id 3 + +#. Verify the ring contents:: + + # swift-ring-builder container.builder + container.builder, build version 4 + 1024 partitions, 3.000000 replicas, 1 regions, 4 zones, 4 devices, 100.00 balance, 0.00 dispersion + The minimum number of hours before a partition can be reassigned is 1 + The overload factor is 0.00% (0.000000) + Devices:    id  region  zone      ip address  port  replication ip  replication port      name weight partitions balance meta +              0       1     1       10.0.0.51  6001       10.0.0.51              6001      sdb1 100.00          0 -100.00 +              1       1     2       10.0.0.51  6001       10.0.0.51              6001      sdc1 100.00          0 -100.00 +              2       1     3       10.0.0.52  6001       10.0.0.52              6001      sdb1 100.00          0 -100.00 +              3       1     4       10.0.0.52  6001       10.0.0.52              6001      sdc1 100.00          0 -100.00 + +#. Rebalance the ring:: + + # swift-ring-builder container.builder rebalance + Reassigned 1024 (100.00%) partitions. Balance is now 0.00. Dispersion is now 0.00 + +Create Object Ring +------------------ + +The object server uses the object ring to maintain lists of object +locations on local devices. + +To create the ring +~~~~~~~~~~~~~~~~~~ + +#. Change to the ``/etc/swift`` directory. +#. Create the base ``object.builder`` file:: + + # swift-ring-builder object.builder create 10 3 1 + +#. Add each storage node to the ring:: + + # swift-ring-builder object.builder \ + add r1z1-STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS:6000/DEVICE_NAME DEVICE_WEIGHT + + Replace *STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS* with the + IP address of the management network on the storage node. Replace + *DEVICE_NAME* with a storage device name on the same storage node. + For example, using the first storage node with the /dev/sdb1 storage + device and weight of 100:: + + # swift-ring-builder object.builder add r1z1-10.0.0.51:6000/sdb1 100 + + Repeat this command for each storage device on each storage node. In + the example architecture, use the command in four variations:: + + # swift-ring-builder object.builder add r1z1-10.0.0.51:6000/sdb1 100 + Device d0r1z1-10.0.0.51:6002R10.0.0.51:6002/sdb1_"" with 100.0 weight got id 0 + # swift-ring-builder object.builder add r1z2-10.0.0.51:6000/sdc1 100 + Device d1r1z2-10.0.0.51:6002R10.0.0.51:6002/sdc1_"" with 100.0 weight got id 1 + # swift-ring-builder object.builder add r1z3-10.0.0.52:6000/sdb1 100 + Device d2r1z3-10.0.0.52:6002R10.0.0.52:6002/sdb1_"" with 100.0 weight got id 2 + # swift-ring-builder object.builder add r1z4-10.0.0.52:6000/sdc1 100 + Device d3r1z4-10.0.0.52:6002R10.0.0.52:6002/sdc1_"" with 100.0 weight got id 3 + +#. Verify the ring contents:: + + # swift-ring-builder object.builder + object.builder, build version 4 + 1024 partitions, 3.000000 replicas, 1 regions, 4 zones, 4 devices, 100.00 balance, 0.00 dispersion + The minimum number of hours before a partition can be reassigned is 1 + The overload factor is 0.00% (0.000000) + Devices:    id  region  zone      ip address  port  replication ip  replication port      name weight partitions balance meta +              0       1     1       10.0.0.51  6000       10.0.0.51              6000      sdb1 100.00          0 -100.00 +              1       1     2       10.0.0.51  6000       10.0.0.51              6000      sdc1 100.00          0 -100.00 +              2       1     3       10.0.0.52  6000       10.0.0.52              6000      sdb1 100.00          0 -100.00 +              3       1     4       10.0.0.52  6000       10.0.0.52              6000      sdc1 100.00          0 -100.00 + +#. Rebalance the ring:: + + # swift-ring-builder object.builder rebalance + Reassigned 1024 (100.00%) partitions. Balance is now 0.00. Dispersion is now 0.00 + +Distribute ring configuration files +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Copy the account.ring.gz, container.ring.gz, and object.ring.gz files to +the /etc/swift directory on each storage node and any additional nodes +running the proxy service. + +Finalize installation +--------------------- + +Configure hashes and default storage policy +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +#. Copy the swift service configuration file to the configuration directory:: + + # cp /usr/share/defaults/swift/swift.conf /etc/swift + +#. Edit the ``/etc/swift/swift.conf`` file and complete the following + actions: + + * In the ``[swift-hash]`` section, configure the hash path prefix and + suffix for your environment:: + + [swift-hash] + ... + swift_hash_path_suffix = HASH_PATH_PREFIX + swift_hash_path_prefix = HASH_PATH_SUFFIX + + * In the ``[storage-policy:0]`` section, configure the default storage + policy:: + + [storage-policy:0] + ... + name = Policy-0 + default = yes + +#. Copy the swift.conf file to the ``/etc/swift`` directory on each storage + node and any additional nodes running the proxy service. +#. On all nodes, ensure proper ownership of the configuration directory:: + + # systemctl restart update-triggers.target + +#. On the controller node and any other nodes running the proxy service, + start the Object Storage proxy service including its dependencies and + configure them to start when the system boots:: + + # systemctl enable swift-proxy.service memcached.service + # systemctl start swift-proxy.service memcached.service + +#. On the storage nodes, start the Object Storage services and configure + them to start when the system boots:: + + # systemctl enable swift-account.service \ +                 swift-account-auditor.service \ +                 swift-account-reaper.service \ +                 swift-account-replicator.service \ +                 swift-container.service \ +                 swift-container-auditor.service \ +                 swift-container-replicator.service \ +                 swift-container-updater.service \ +                 swift-object.service \ +                 swift-object-auditor.service \ +                 swift-object-replicator.service \ +                 swift-object-updater.service + # systemctl start swift-account.service \ +                 swift-account-auditor.service \ +                 swift-account-reaper.service \ +                 swift-account-replicator.service \ +                 swift-container.service \ +                 swift-container-auditor.service \ +                 swift-container-replicator.service \ +                 swift-container-updater.service \ +                 swift-object.service \ +                 swift-object-auditor.service \ +                 swift-object-replicator.service \ +                 swift-object-updater.service diff --git a/source/_build/html/_sources/openstack_orchestration.txt b/source/_build/html/_sources/openstack_orchestration.txt new file mode 100644 index 00000000..b3af8090 --- /dev/null +++ b/source/_build/html/_sources/openstack_orchestration.txt @@ -0,0 +1,290 @@ +.. _openstack_orchestration: + +Orchestration +############################################################ + +The Orchestration module provides template-based OpenStack* API calls +on a cloud application. It integrates core components of OpenStack into +a one-file template system that allows you to create most OpenStack +resource types, including: instances, floating IPs, volumes, security +groups, and users. The module also provides advanced functionality: +instance high availability, instance auto-scaling, and nested stacks, +all of which allow OpenStack core projects to accommodate a larger user +base.   + +The service enables deployers to integrate with the Orchestration module +directly, or through custom plugins. + +Installing and configuring controller node +----------------------------------------------- + +This section describes how to install and configure the Orchestration +module, codenamed heat, on the controller node. + +Configuring prerequisites +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Before you install and configure Orchestration, 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:: + + $ mysql -u root -p + + * Create the ``heat`` database:: + + CREATE DATABASE heat; + + * Grant proper access to the ``heat`` database. + Replace *HEAT_DBPASS*  with a suitable password:: + + GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'localhost' \ + IDENTIFIED BY 'HEAT_DBPASS'; + GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'%' \ + IDENTIFIED BY 'HEAT_DBPASS'; + + * Exit the database access client. + +#. Source the ``admin`` credentials to gain access to admin-only CLI + commands:: + + $ source admin-openrc.sh + +#. To create the service credentials, complete these steps: + + * Create the ``heat`` user:: + + $ openstack user create --password-prompt heat + User Password: + Repeat User Password: + +----------+----------------------------------+ + | Field | Value | + +----------+----------------------------------+ + | email | None | + | enabled | True | + | id | 7fd67878dcd04d0393469ef825a7e005 | + | name | heat | + | username | heat | + +----------+----------------------------------+ + + * Add the ``admin`` role to the ``heat`` user:: + + $ openstack role add --project service --user heat admin + +-------+----------------------------------+ + | Field | Value | + +-------+----------------------------------+ + | id | cd2cb9a39e874ea69e5d4b896eb16128 | + | name | admin | + +-------+----------------------------------+ + + * Create the ``heat_stack_owner`` role:: + + $ openstack role create heat_stack_owner + +-------+----------------------------------+ + | Field | Value | + +-------+----------------------------------+ + | id | c0a1cbee7261446abc873392f616de87 | + | name | heat_stack_owner | + +-------+----------------------------------+ + + * Add the ``heat_stack_owner`` role to the ``demo`` tenant and + user. + + Note: You must add the ``heat_stack_owner`` role to users that + manage stacks:: + + $ openstack role add --project demo --user demo heat_stack_owner + +-------+----------------------------------+ + | Field | Value | + +-------+----------------------------------+ + | id | c0a1cbee7261446abc873392f616de87 | + | name | heat_stack_owner | + +-------+----------------------------------+ + + * Create the ``heat_stack_user`` role. + + Note: The Orchestration service automatically assigns the ``heat_stack_user`` role + to users that it creates during stack deployment. By default, this role restricts  + API operations. To avoid conflicts, do not add this role to users with the  + heat_stack_owner role:: + + $ openstack role create heat_stack_user + +-------+----------------------------------+ + | Field | Value | + +-------+----------------------------------+ + | id | e01546b1a81c4e32a6d14a9259e60154 | + | name | heat_stack_user | + +-------+----------------------------------+ + + * Create the ``heat`` and ``heat-cfn`` service entities:: + + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | Orchestration | + | enabled | True | + | id | 031112165cad4c2bb23e84603957de29 | + | name | heat | + | type | orchestration | + +-------------+----------------------------------+ + $ openstack service create --name heat-cfn \ + --description "Orchestration" cloudformation + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | Orchestration | + | enabled | True | + | id | 297740d74c0a446bbff867acdccb33fa | + | name | heat-cfn | + | type | cloudformation | + +-------------+----------------------------------+ + +#. Create the Orchestration service API endpoints:: + + $ openstack endpoint create \ + --publicurl http://controller:8004/v1/%\(tenant_id\)s \ + --internalurl http://controller:8004/v1/%\(tenant_id\)s \ + --adminurl http://controller:8004/v1/%\(tenant_id\)s \ + --region RegionOne \ + orchestration + +--------------+-----------------------------------------+ + | Field | Value | + +--------------+-----------------------------------------+ + | adminurl | http://controller:8004/v1/%(tenant_id)s | + | id | f41225f665694b95a46448e8676b0dc2 | + | internalurl | http://controller:8004/v1/%(tenant_id)s | + | publicurl | http://controller:8004/v1/%(tenant_id)s | + | region | RegionOne | + | service_id | 031112165cad4c2bb23e84603957de29 | + | service_name | heat | + | service_type | orchestration | + +--------------+-----------------------------------------+ + $ openstack endpoint create \ + --publicurl http://controller:8000/v1 \ + --internalurl http://controller:8000/v1 \ + --adminurl http://controller:8000/v1 \ + --region RegionOne \ + cloudformation + +--------------+----------------------------------+ + | Field | Value | + +--------------+----------------------------------+ + | adminurl | http://controller:8000/v1 | + | id | f41225f665694b95a46448e8676b0dc2 | + | internalurl | http://controller:8000/v1 | + | publicurl | http://controller:8000/v1 | + | region | RegionOne | + | service_id | 297740d74c0a446bbff867acdccb33fa | + | service_name | heat-cfn | + | service_type | cloudformation | + +--------------+----------------------------------+ + +Installing and configuring the Orchestration components +---------------------------------------------------------- + +To install and configure the Orchestration components: + +#. Install OpenStack Orchestration bundle:: + + # clr_bundle_add openstack-orchestration + +#. Create the ``/etc/heat/heat.conf file``:: + + # mkdir /etc/heat # touch /etc/heat/heat.conf + +#. Edit the ``/etc/heat/heat.conf`` file and complete the following + actions: + + * In the ``[database]`` section, configure database access. + Replace *HEAT_DBPASS*  with the password you chose for the + Orchestration database:: + + [database] + ... + connection = mysql://heat:HEAT_DBPASS@controller/heat + + * In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, + configure RabbitMQ message queue access. + Replace *``RABBIT_PASS``*  with the password you chose for + the ``openstack`` account in RabbitMQ:: + + [DEFAULT] + ... + rpc_backend = rabbit + [oslo_messaging_rabbit] + ... + rabbit_host = controller + rabbit_userid = openstack + rabbit_password = RABBIT_PASS + + * In the ``[keystone_authtoken]`` and ``[ec2authtoken]`` sections, + configure Identity service access. Replace *HEAT_PASS*  with + the password you chose for the ``heat`` user in the Identity + service:: + + [keystone_authtoken] + ... + auth_uri = http://controller:5000/v2.0 + identity_uri = http://controller:35357 + admin_tenant_name = service + admin_user = heat + admin_password = HEAT_PASS + [ec2authtoken] + ... + auth_uri = http://controller:5000/v2.0 + + * In the ``[DEFAULT]`` section, configure the metadata and wait + condition URLs:: + + [DEFAULT] + ... + heat_metadata_server_url = http://controller:8000 + heat_waitcondition_server_url = http://controller:8000/v1/waitcondition + + * In the ``[DEFAULT]`` section, configure information about the + heat Identity service domain. Replace  *``HEAT_DOMAIN_PASS``* +  with the password you chose for the admin user of + the ``heat`` user domain in the Identity service:: + + [DEFAULT] + ... + stack_domain_admin = heat_domain_admin + stack_domain_admin_password = HEAT_DOMAIN_PASS + stack_user_domain_name = heat_user_domain + +#. Source the ``admin`` credentials to gain access to admin-only CLI + commands:: + + $ source admin-openrc.sh + +#. Create the heat domain in Identity service. + Replace *``HEAT_DOMAIN_PASS``*  with a suitable + password:: + + $ heat-keystone-setup-domain \ + --stack-user-domain-name heat_user_domain \ + --stack-domain-admin heat_domain_admin \ + --stack-domain-admin-password HEAT_DOMAIN_PASS + +#. Let systemd set the correct permissions for files in ``/etc/heat``:: + + # systemctl restart update-triggers.target + +#. Populate the Orchestration database:: + + # su -s /bin/sh -c "heat-manage db_sync" heat`` + +Finalizing installation +~~~~~~~~~~~~~~~~~~~~~~~~ + +Complete this step to finalize the installation: + +* Start the Orchestration services and configure them to start when the + system boots:: + + # systemctl enable heat-api.service heat-api-cfn.service heat-engine.service + # systemctl start heat-api.service heat-api-cfn.service heat-engine.service`` + +Next topic: :ref:`openstack_telemetry`. \ No newline at end of file diff --git a/source/_build/html/_sources/openstack_supporting-database.txt b/source/_build/html/_sources/openstack_supporting-database.txt new file mode 100644 index 00000000..62eac990 --- /dev/null +++ b/source/_build/html/_sources/openstack_supporting-database.txt @@ -0,0 +1,53 @@ +.. _openstack_supporting-database: + +Database +######## + +Most OpenStack* services use an SQL database to store information. The +database typically runs on the controller node. The procedures in this +guide use MariaDB. + +Install and configure the database server +----------------------------------------- + +#. Install MariaDB bundle:: + + # swupd bundle-add database-mariadb + # swupd verify --fix + +#. Create the ``/etc/mariadb/`` folder and the ``/etc/mariadb/openstack.cnf`` + file:: + + # mkdir /etc/mariadb + # touch /etc/mariadb/openstack.cnf + +#. Add the ``[mysqld]`` section, set the bind-address key to the + management IP address of the controller node to enable access by + other nodes via the management network and enable useful options for + UTF-8 character set:: + + [mysqld] + bind-address = 10.0.0.11 + default-storage-engine = innodb + innodb_file_per_table + collation-server = utf8_general_ci + init-connect = 'SET NAMES utf8' + character-set-server = utf8 + +Finalizing database installation +-------------------------------- + +Complete the following steps to finalize database installation: + +#. Start the database service and configure it to start when the system + boots:: + + # systemctl enable mariadb.service + # systemctl start mariadb.service + +#. Secure the database service including choosing a suitable password + for the root account:: + + # mysql_secure_installation + +Next topic: :ref:`openstack_supporting-messaging`. \ No newline at end of file diff --git a/source/_build/html/_sources/openstack_supporting-messaging.txt b/source/_build/html/_sources/openstack_supporting-messaging.txt new file mode 100644 index 00000000..be9c167d --- /dev/null +++ b/source/_build/html/_sources/openstack_supporting-messaging.txt @@ -0,0 +1,48 @@ +.. _openstack_supporting-messaging: + +Message queue +############# + +OpenStack* uses a `message queue` to coordinate operations and +status information among services. The message queue service typically +runs on the controller node. OpenStack supports several message queue +services. This guide implements the RabbitMQ message queue service. + +Install the message queue service +--------------------------------- + +#. Install the message queue bundle.:: + + # swupd bundle-add message-broker-rabbitmq + # swupd verify --fix + +Configuring the message broker service +-------------------------------------- + +Complete the following steps to configure the message broker service: + +#. Message broker service needs to be able to resolve to itself. Add the + following line to ``/etc/hosts``.:: + + 127.0.0.1 controller + +#. Start the message broker service and configure it to start when the + system boots.:: + + # systemctl enable rabbitmq-server.service + # systemctl start rabbitmq-server.service + +#. Add the OpenStack user. Replace ``RABBIT_PASS`` with a suitable password.:: + + # rabbitmqctl add_user openstack RABBIT_PASS + Creating user openstack ... + ...done. + + +#. Permit configuration, write, and read access for the OpenStack user.:: + + # rabbitmqctl set_permissions openstack ".*" ".*" ".*" + Setting permissions for user "openstack" in vhost "/" ... + ...done. + +Next topic: :ref:`openstack_identity`. \ No newline at end of file diff --git a/source/_build/html/_sources/openstack_sys_req_and_pw_summary.txt b/source/_build/html/_sources/openstack_sys_req_and_pw_summary.txt new file mode 100644 index 00000000..c67ae79b --- /dev/null +++ b/source/_build/html/_sources/openstack_sys_req_and_pw_summary.txt @@ -0,0 +1,78 @@ +.. _openstack_sys_req_and_pw_summary: + +System requirements and password summary +############################################################ + +System requirements +---------------------------- + +For best performance, we recommend that your environment meets or +exceeds the following hardware requirements: + +- Controller Node: 1 processor, 2 GB memory, and 5 GB storage. +- Compute Node: 1 processor, 2 GB memory, and 10 GB storage. + +For OpenStack* services, this guide uses \ ``SERVICE_PASS``\ to reference +service account passwords and ``SERVICE_DBPASS`` to reference database +passwords. + +Prerequisites +--------------------- + +All nodes require Internet access to install OpenStack bundles and +perform maintenance tasks such as periodic updates. + +OpenStack and supporting services require administrative privileges +during installation and operation. + +You must also configure networking so that each node can resolve the +other nodes by name in addition to IP address. For example, the +``controller`` name must resolve to ``10.0.0.11``, the IP address of the +management interface on the controller node. + +To configure name resolution: + +#. Set the hostname of the node to ``controller``:: + + # hostnamectl set-hostname controller + +#. Edit the ``/etc/hosts`` file to contain the following:: + + # controller 10.0.0.11 controller + # compute1 10.0.0.31 compute1 + +Password summary +------------------------ + +The following table provides a list of services that require passwords +and their associated references in the guide: + ++----------------------------------------+--------------------------------------------------+ +| **Password name** | **Description** | ++----------------------------------------+--------------------------------------------------+ +| Database password (no variable used) | Root password for the database | ++----------------------------------------+--------------------------------------------------+ +| RABBIT_PASS | Password of user guest of RabbitMQ | ++----------------------------------------+--------------------------------------------------+ +| KEYSTONE_DBPASS | Database password of Identity service | ++----------------------------------------+--------------------------------------------------+ +| DEMO_PASS | Password of user demo | ++----------------------------------------+--------------------------------------------------+ +| ADMIN_PASS | Password of user admin | ++----------------------------------------+--------------------------------------------------+ +| GLANCE_DBPASS | Database password for Image Service | ++----------------------------------------+--------------------------------------------------+ +| GLANCE_PASS | Password of Image Service user glance | ++----------------------------------------+--------------------------------------------------+ +| NOVA_DBPASS | Database password for Compute service | ++----------------------------------------+--------------------------------------------------+ +| NOVA_PASS | Password of Compute service user nova | ++----------------------------------------+--------------------------------------------------+ +| DASH_DBPASS | Database password for the dashboard | ++----------------------------------------+--------------------------------------------------+ +| CINDER_DBPASS | Database password for the Block Storage service | ++----------------------------------------+--------------------------------------------------+ +| CINDER_PASS | Password of Block Storage service user cinder | ++----------------------------------------+--------------------------------------------------+ + +Next topic: :ref:`openstack_installing_bundles`. \ No newline at end of file diff --git a/source/_build/html/_sources/openstack_telemetry.txt b/source/_build/html/_sources/openstack_telemetry.txt new file mode 100644 index 00000000..51b6e257 --- /dev/null +++ b/source/_build/html/_sources/openstack_telemetry.txt @@ -0,0 +1,224 @@ +.. _openstack_telemetry: + +Telemetry +############################################################ + +Overview +--------- + +The Telemetry module performs the following functions: + +- Efficiently polls metering data related to OpenStack services; +- Collects event and metering data by monitoring notifications sent + from services; +- Publishes collected data to various targets, including data stores + and message queues; and +- Creates alarms when collected data breaks defined rules. + +Installing and configuring controller node +----------------------------------------------- + +This section describes how to install and configure the Telemetry +module, code-named ceilometer, on the controller node. The Telemetry +module uses separate agents to collect measurements from each OpenStack +service in your environment. + +Prerequisites +~~~~~~~~~~~~~~~ + +Before installing and configuring the ``telemetry`` module, install +MongoDB* and create a MongoDB database, service credentials, and API +endpoint. + +#. Install the MongoDB bundle:: + + # clr_bundle_add database-mongodb + +#. Create the ``/etc/mongodb/`` folder and the + ``/etc/mongodb/openstack.cnf`` file. +#. Configure the ``bind_ip`` key to use the management interface IP + address of the controller node:: + + bind_ip = 10.0.0.11 + +#. Start the database service and configure it to start when the system + boots with the following commands:: + + # systemctl enable mongodb.service + # systemctl start mongodb.service + +#. Create the ``ceilometer`` database. Replace *CEILOMETER_DBPASS* + with a suitable password:: + + # mongo --host controller --eval ' + db = db.getSiblingDB("ceilometer"); + db.createUser({user: "ceilometer", + pwd: "CEILOMETER_DBPASS", + roles: [ "readWrite", "dbAdmin" ]})' + + MongoDB shell version: 2.6.x + connecting to: controller:27017/test + Successfully added user: { "user" : "ceilometer", "roles" : [ "readWrite", "dbAdmin" ] } + +#. Source the ``admin`` credentials to gain access to admin-only CLI + commands:: + + $ source admin-openrc.sh + +#. To create the service credentials, complete these steps: + + * Create the ``ceilometer`` user:: + + $ openstack user create --password-prompt ceilometer + User Password: + Repeat User Password: + +----------+----------------------------------+ + | Field | Value | + +----------+----------------------------------+ + | email | None | + | enabled | True | + | id | b7657c9ea07a4556aef5d34cf70713a3 | + | name | ceilometer | + | username | ceilometer | + +----------+----------------------------------+ + + * Add the ``admin`` role to the ``ceilometer`` user:: + + $ openstack role add --project service --user ceilometer admin + +-------+----------------------------------+ + | Field | Value | + +-------+----------------------------------+ + | id | cd2cb9a39e874ea69e5d4b896eb16128 | + | name | admin | + +-------+----------------------------------+ + + * Create the ``ceilometer`` service entity:: + + $ openstack service create --name ceilometer \ + --description "Telemetry" metering + +-------------+----------------------------------+ + | Field | Value | + +-------------+----------------------------------+ + | description | Telemetry | + | enabled | True | + | id | 3405453b14da441ebb258edfeba96d83 | + | name | ceilometer | + | type | metering | + +-------------+----------------------------------+ + +#. Create the Telemetry module API endpoint:: + + $ openstack endpoint create \ + --publicurl http://controller:8777 \ + --internalurl http://controller:8777 \ + --adminurl http://controller:8777 \ + --region RegionOne \ + metering + +--------------+----------------------------------+ + | Field | Value | + +--------------+----------------------------------+ + | adminurl | http://controller:8777 | + | id | d3716d85b10d4e60a67a52c6af0068cd | + | internalurl | http://controller:8777 | + | publicurl | http://controller:8777 | + | region | RegionOne | + | service_id | 3405453b14da441ebb258edfeba96d83 | + | service_name | ceilometer | + | service_type | metering | + +--------------+----------------------------------+ + +Installing and configuring the Telemetry module components +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +#. Install the OpenStack Telemetry Controller bundle:: + + # clr_bundle_add openstack-telemetry-controller + +#. Generate a random value to use as the telemetry secret:: + + $ openssl rand -hex 10 + +#. Custom configurations will be located at ``/etc/ceilometer``. + + * Create ``/etc/ceilometer`` directory:: + + mkdir /etc/ceilometer + + * Create the empty ceilometer configuration file:: + + /etc/ceilometer/ceilometer.conf + touch /etc/ceilometer/ceilometer.conf + +#. Edit the following file:\ ``/etc/ceilometer/ceilometer.conf``\ Then + complete the following actions: + + * In the ``[database]`` section, configure database access. Replace + *``CEILOMETER_DBPASS``* with the password you chose for the + Telemetry module database. You must escape special characters such + as ':', '/', '+', and '@' in the connection string in accordance + with RFC2396:: + + [database] + ... + connection = mongodb://ceilometer:CEILOMETER_DBPASS@controller:27017/ceilometer + + * In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, + configure RabbitMQ message queue access. Replace *``RABBIT_PASS``* + with the password you chose for the ``openstack`` account in + RabbitMQ:: + + [DEFAULT] + ... + rpc_backend = rabbit + [oslo_messaging_rabbit] + rabbit_host = controller + rabbit_userid = openstack + rabbit_password = RABBIT_PASS + + * In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, + configure Identity service access. Replace *``CEILOMETER_PASS``* + with the password you chose for the ``celiometer`` user in the + Identity service:: + + [DEFAULT] + ... + auth_strategy = keystone + [keystone_authtoken] + auth_uri = http://controller:5000/v2.0 + identity_uri = http://controller:35357 + admin_tenant_name = service + admin_user = ceilometer + admin_password = CEILOMETER_PASS + + * In the ``[service_credentials]`` section, configure service + credentials. Replace *``CEILOMETER_PASS``* with the password you + chose for the ``ceilometer`` user in the Identity service:: + + [service_credentials] + ... + os_auth_url = http://controller:5000/v2.0 + os_username = ceilometer + os_tenant_name = service + os_password = CEILOMETER_PASS + os_endpoint_type = internalURL + os_region_name = RegionOne + + * In the ``[publisher]`` section, configure the telemetry secret. + Replace *``TELEMETRY_SECRET``* with the telemetry secret that you + generated in a previous step:: + + [publisher] + ... + telemetry_secret = TELEMETRY_SECRET + +Finalizing installation +~~~~~~~~~~~~~~~~~~~~~~~~ + +* Start the Telemetry services and configure them to start when the system boots:: + + # systemctl enable ceilometer-api.service ceilometer-agent-notification.service ceilometer-agent-central.service ceilometer-collector.service \ + ceilometer-alarm-evaluator.service ceilometer-alarm-notifier.service + # systemctl start ceilometer-api.service ceilometer-agent-notification.service ceilometer-agent-central.service ceilometer-collector.service \ + ceilometer-alarm-evaluator.service ceilometer-alarm-notifier.service + +Next topic: :ref:`openstack_object_storage`. \ No newline at end of file diff --git a/source/_build/html/_sources/openstack_use_cases.txt b/source/_build/html/_sources/openstack_use_cases.txt new file mode 100644 index 00000000..fe69751f --- /dev/null +++ b/source/_build/html/_sources/openstack_use_cases.txt @@ -0,0 +1,27 @@ +.. _openstack_use_cases: + +OpenStack* use cases with Clear Linux* OS for Intel® Architecture +################################################################### + +The installation and configuration of a Cloud Management Platform +depends on use cases and associated architectural choices. + +OpenStack supports the following use cases: + +- *General purpose* -- A cloud built with common components that should + address about 80 percent of common use cases. + +- *Compute-focused* -- A cloud designed to address compute-intensive + workloads such as high performance computing (HPC). + +- *Storage-focused* -- A cloud focused on storage intensive workloads + such as data analytics with parallel file systems. + +- *Network-focused* -- A cloud depending on high performance and + reliable networking, such as a Content Delivery Network (CDN). + +Clear Linux OS for Intel Architecture is designed with all of these use +cases in mind, but the initial target is to enable only those services +required for Cloud. + +Next topic: :ref:`openstack_bundle_and_service_summary`. \ No newline at end of file diff --git a/source/_build/html/_sources/substitutions.txt b/source/_build/html/_sources/substitutions.txt new file mode 100644 index 00000000..d913bfcc --- /dev/null +++ b/source/_build/html/_sources/substitutions.txt @@ -0,0 +1,5 @@ +.. |codename| replace:: Zephyr Kernel + +.. |PM| replace:: Hirally Rodriguez Santiago + +.. |project| replace:: Zephyr Project diff --git a/source/_build/html/_sources/swupdate_about_sw_update.txt b/source/_build/html/_sources/swupdate_about_sw_update.txt new file mode 100644 index 00000000..18c83c93 --- /dev/null +++ b/source/_build/html/_sources/swupdate_about_sw_update.txt @@ -0,0 +1,105 @@ +About software update +################################################################ + +Linux*-based operating systems contain the code of several hundred, if +not thousands, of open source projects. To make this manageable, +distributions use a concept called "packages" to configure and compile +the source code of these projects into binaries, which can then be +logically installed. + +Many distributions then combine these compiled binaries into so-called +packages, resolving dependencies and providing everything needed to +install. This is the granularity at which typical distributions deploy +their software, enabling system administrators to install and update +each package individually or as a set, using tools such as "yum" and +"apt-get." + +The Clear way +------------- + +The Clear Linux OS for Intel® Architecture does things a bit +differently. While we use the concept of packages to manage compiling +source code into installable binaries, we do not deploy software through +packages as many distributions do. Instead, we provide "bundles" that +each contain a set of functionality for the system +administrator--functionality that is enabled by composing all the +required upstream open source projects into one logical unit: a bundle. + +There is another notable difference between package-based distributions +and the Clear Linux OS for Intel Architecture. On a package-based OS, a +system administrator can update each individual package or piece of +software to a newer (or older!) version. In the Clear Linux OS for Intel +Architecture, an update translates to an entirely new OS version, +containing one or many updates; it is not possible to update a piece of +the system while remaining on the same version of Clear Linux. + +Why would you want this? This may sound like a huge restriction or +limitation at first, but we consider this a great feature. Imagine a +cloud environment with many machines. In this case, it is desirable and +more advantageous to have a homogeneous set of software. + +With traditional distributions, to describe what version of software a +server is running, one might need to: + +- List and keep track of the current OS release (generally + uninformative about any singular packages or functionality) + +- Keep track of all packages and repositories used, updating those as + required to keep up to date + +- List and keep track of every package available and installed on the + system, none of which are directly tied to the current OS release + +This is done very well, but given the nearly endless combinations of +packages and versions of packages a server may have, it quickly becomes +non-trivial to define what "version" the system is and what software it +is running without explicitly going through each system and inspecting +every package. + +With the Clear Linux OS for Intel Architecture, we must keep track of: + +- One single number + +That number represents the current OS release, and it is sufficient to +describe the versions of all the software on the OS. Each build is +composed of a specific set of bundles made from a particular version of +packages. This matters on a daily basis to system administrators, who +need to determine which of their systems do not have the latest security +fixes, or which combinations of software have been tested with which +other pieces. Every release of the same number is guaranteed to contain +the same versions of software, so there is no ambiguity between two +systems running the same Clear Linux OS for Intel Architecture. + +Incredible update speeds +------------------------ + +Software updates with Clear Linux OS for Intel Architecture are also +efficient; bundles are only describing a set of files, and the update +technology only updates files that actually changed, using so-called +binary-delta technology for efficiency. Updating using this method is +different from operating systems that use packages as the unit of +deployment. In those operating systems, the entire package gets updated +when needed, even if only one small file in that package has changed. + +It is quite common for a full OS update fixing a security hole to be +only 15 kilobytes in total update size. If only several kilobytes need +to be changed, it does not make sense to re-download and reinstall an +entire package or suite of programs just to incorporate a miniscule (yet +important) update. Through binary deltas, the OS is able to update only +those bits that changed, yielding very small update content (deltas) +that can be applied exceedingly fast. One can then expect a major +security patch or core update to take seconds. + +We realize that while our definition of bundles makes sense to us, each +data center operator may have special needs and ideas. For that reason +we are working on completing a "mixer" tool, which would allow users of +Clear Linux OS for Intel Architecture to customize and add bundles and +their own software while still using the content of the operating +system, and its updates, as the base. This way system administrators can +focus on the pieces of their OS deployment that are custom to their +environment, while continuing to stay on a controlled update stream. + +Note: The software update technology for Clear Linux OS for Intel Architecture +was first presented at the Linux Plumbers conference in 2012. + + diff --git a/source/_build/html/_sources/swupdate_how_to_run_the_updater.txt b/source/_build/html/_sources/swupdate_how_to_run_the_updater.txt new file mode 100644 index 00000000..c57e02ed --- /dev/null +++ b/source/_build/html/_sources/swupdate_how_to_run_the_updater.txt @@ -0,0 +1,39 @@ +How to run the updater +############################################################ + +This section describes how to manually trigger the software update code in Clear Linux* OS for Intel® Architecture. + +Prerequisites +~~~~~~~~~~~~~ + +- System is up and running a Clear Linux OS for Intel + Architecture official build 300 or later. + +- Device is on a well-connected network. + +- Device is able to connect to release infrastructure. For example: + http://update.clearlinux.org/update/300/ + +Running the updater +~~~~~~~~~~~~~~~~~~~ + +#. Open a Terminal Emulator. + +#. Become root and trigger update by typing ``# swupd_update`` + +#. If the updater console output indicates a kernel update occurred, + then at your convenience reboot to begin using the new OS version. + +Updater options +~~~~~~~~~~~~~~~ + +Help options: + +- ``-h, --help`` Display help options. + +Application options: + +- ``-d, --download`` Download all content, but do not actually install + the update. + +- ``-v, --verbose`` Increase verbosity of log and console messages. diff --git a/source/_build/html/_static/ajax-loader.gif b/source/_build/html/_static/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..61faf8cab23993bd3e1560bff0668bd628642330 GIT binary patch literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nno%(3)e{?)x>&1u}A`t?OF7Z|1gRivOgXi&7IyQd1Pl zGfOfQ60;I3a`F>X^fL3(@);C=vM_KlFfb_o=k{|A33hf2a5d61U}gjg=>Rd%XaNQW zW@Cw{|b%Y*pl8F?4B9 zlo4Fz*0kZGJabY|>}Okf0}CCg{u4`zEPY^pV?j2@h+|igy0+Kz6p;@SpM4s6)XEMg z#3Y4GX>Hjlml5ftdH$4x0JGdn8~MX(U~_^d!Hi)=HU{V%g+mi8#UGbE-*ao8f#h+S z2a0-5+vc7MU$e-NhmBjLIC1v|)9+Im8x1yacJ7{^tLX(ZhYi^rpmXm0`@ku9b53aN zEXH@Y3JaztblgpxbJt{AtE1ad1Ca>{v$rwwvK(>{m~Gf_=-Ro7Fk{#;i~+{{>QtvI yb2P8Zac~?~=sRA>$6{!(^3;ZP0TPFR(G_-UDU(8Jl0?(IXu$~#4A!880|o%~Al1tN literal 0 HcmV?d00001 diff --git a/source/_build/html/_static/alabaster.css b/source/_build/html/_static/alabaster.css new file mode 100644 index 00000000..07a9e2a4 --- /dev/null +++ b/source/_build/html/_static/alabaster.css @@ -0,0 +1,585 @@ + + + + + + + + + + + + + + + + + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif; + font-size: 17px; + background-color: white; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + width: 940px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #ffffff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebar { + font-size: 14px; + line-height: 1.5; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: 'Garamond', 'Georgia', serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif; + font-size: 1em; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #999; + background: #999; + + text-align: left; + margin-left: 0; + width: 50%; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #FCC; + border: 1px solid #FAA; +} + +div.admonition tt.xref, div.admonition a tt { + border-bottom: 1px solid #fafafa; +} + +dd div.admonition { + margin-left: -60px; + padding-left: 60px; +} + +div.admonition p.admonition-title { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: white; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #eee; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #eee; + -webkit-box-shadow: 2px 2px 4px #eee; + box-shadow: 2px 2px 4px #eee; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #eee; + -webkit-box-shadow: 2px 2px 4px #eee; + box-shadow: 2px 2px 4px #eee; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.footnote td.label { + width: 0px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #EEE; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +dl dl pre { + margin-left: -90px; + padding-left: 90px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid white; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + + +@media screen and (max-width: 870px) { + + div.sphinxsidebar { + display: none; + } + + div.document { + width: 100%; + + } + + div.documentwrapper { + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.bodywrapper { + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + margin-left: 0; + } + + ul { + margin-left: 0; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .bodywrapper { + margin: 0; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + + +} + + + +@media screen and (max-width: 875px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: white; + } + + div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: white; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Make nested-list/multi-paragraph items look better in Releases changelog + * pages. Without this, docutils' magical list fuckery causes inconsistent + * formatting between different release sub-lists. + */ +div#changelog > div.section > ul > li > p:only-child { + margin-bottom: 0; +} + +/* Hide fugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} \ No newline at end of file diff --git a/source/_build/html/_static/basic.css b/source/_build/html/_static/basic.css new file mode 100644 index 00000000..9fa77d88 --- /dev/null +++ b/source/_build/html/_static/basic.css @@ -0,0 +1,599 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox input[type="text"] { + width: 170px; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + width: 30px; +} + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable dl, table.indextable dd { + margin-top: 0; + margin-bottom: 0; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- general body styles --------------------------------------------------- */ + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.field-list ul { + padding-left: 1em; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.field-list td, table.field-list th { + border: 0 !important; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text { +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, .highlighted { + background-color: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +div.code-block-caption { + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +div.code-block-caption + div > div.highlight > pre { + margin-top: 0; +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + padding: 1em 1em 0; +} + +div.literal-block-wrapper div.highlight { + margin: 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/source/_build/html/_static/comment-bright.png b/source/_build/html/_static/comment-bright.png new file mode 100644 index 0000000000000000000000000000000000000000..551517b8c83b76f734ff791f847829a760ad1903 GIT binary patch literal 3500 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 A2LJ#7 literal 0 HcmV?d00001 diff --git a/source/_build/html/_static/comment.png b/source/_build/html/_static/comment.png new file mode 100644 index 0000000000000000000000000000000000000000..92feb52b8824c6b0f59b658b1196c61de9162a95 GIT binary patch literal 3445 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 Xn!ZpXD%P(H00000NkvXXu0mjf= 0 && !jQuery(node.parentNode).hasClass(className)) { + var span = document.createElement("span"); + span.className = className; + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this); + }); + } + } + return this.each(function() { + highlight(this); + }); +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated == 'undefined') + return string; + return (typeof translated == 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated == 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('

    ') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) == 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this == '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/source/_build/html/_static/down-pressed.png b/source/_build/html/_static/down-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..7c30d004b71b32bb2fc06b3bd4dc8278baab0946 GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~&H|6fVxZ#d zAk65bF}ngN$X?><>&kwMor^(NtW3yF87Slz;1l8sq&LUMQwy<>&kwMol#tg zK_ydLmzem(vK1>2TzUEGl*lj!N<7$PCrdoWV0 z$w0*Ap!bZ4if7h;-yfL#MC0e;t{xY+$l~DX2EWYIPet1cohf^BdG+jXhtuq&W-0|c zKPmlKv-7OTjb}T)7@fTGd9y~u4{g8An;)c2U=w=nwQ7}zVDc>n+a literal 0 HcmV?d00001 diff --git a/source/_build/html/_static/file.png b/source/_build/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..254c60bfbe2715ae2edca48ebccfd074deb8031d GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJXMsm#F#`j)FbFd;%$g$s6l5>) z^mS#w%FV~i&ZxO9L3Zxqw8>dd4I&zcKG){Yx14xKr0

    ZQJ$m%mv17-NAAj}g)$7-<-@JMA z_U+TRK=AR}yLa#2zkmPX!-tO_KYsf3>Hq)#%qnY_1Fd8&3GxeO2wSmci|LJf=|BO- zByV>Yl`U*PX977no-U3d5|XS39sLdkFt8q|+|QqL_#ErUf6I%zFA7b%b>3$hFGGFs zc72AL|61pRJ1(+5wNdg|xP#*`gQ~lOnTFKiIjl#S3)+QV=h{~`9{M=hx#5uZ&-tIF sG!8onYS_8EFr8v&@CavkqYey&g)1epR*Fkm0PSV)boFyt=akR{044O6bN~PV literal 0 HcmV?d00001 diff --git a/source/_build/html/_static/images/bundles_overview.png b/source/_build/html/_static/images/bundles_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..c30de12914583f834a39d8f0b14c208edd1adc25 GIT binary patch literal 115841 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%0AT|LfT=O1bJUl8dLn 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

    Z0T%f@FRf_f*r%iHN>);Q0%ixo78Xr(YVe zglxQuewmjdpR7Oc+~j*cUeQJ*S*RNC?Xc_?8)My6#%DH2&<(uQTZv4@de6b-mHnvAc zM<*3-KXjcP9VyOkZd7ovv3J%l`St5sGst{d_KuD#7rDZJTug3q#|Yvu24jX{S;V#c z>~Uo-2g&RV{nL~h2$KVARu31<-N%Irj=W&qY$^eqpBwAZN(FVDK!Or`oS$-MZ#%O;$f)T0G+LtfCmfpA_9v>PSngw3^ zK%rHaP+5Nd16pcV8V=(-3}wUnx&@CfRkvygSP;ugm&cmYbl}d%>orDlZ-|kRS9J{y z{Colejdr%SCG3&)4j{u0IKlQK7!++L*!9xFscXg!4uFCf&zMN9M>n583^k4d(|r1F zP|%bne28zN8?O*F@ey>+9_JJiDvc{CaZx8`xX?T9Pf>*-y3>M!a~`DMGcz>AFU&s5 z5hcrkxfb(dB=l&@yDpe-?kDdiu(XvACNX}*j=4cuw57=e1_zHY)6@S9i-<4{h4rBw zx}Cz%$JrH+cE=0+{QR^)RZp4Jrysxe`Dr46m3z>B>}HHnHdgff7uGj6w!y}_$4xfs z_yK2dPc4#gFJX4_q%H zc;5#|Xu`GRLj&HIJY&B`c+|AAv$K~2Jf5~2qalJAtcxMuKc>@tBrvVzFs&AH|Niz7 zjCb|`NG)^m{Q0M1XpJq#B-^7eFWlO!u+SJ=VQ{2*?p*5S{<`pbvWHmo=0EP*<4WOg z-Gda?^j#nA*@>!Bi??j7hzsFm69{Y0X?6~_D) zQ)Q#JvtcE0%0B#!>H|QlzA!Vpz@ZRZZcY5VfhrZICqAMx+UYZ_Nyk8LZ%y@DUHNqT z_U(0GHopbaUjiPGZkWTF@5Mx1D;(jLMsbhq&%T64J*&-=qj}L4o>B zpLo%Yr;y24VqdAtq-iRC>AC!C?GvH6#p$5?J_`wHybD{-&lFYY##_-cn0^Spw-crm z^J(!i)cB)Xcm({__po$klDTlfEK~8IB)Er_VrsL?SC2|=lG;(qXWbS+axZ#U`E7M0 zYi`Zd?MaK@gBK6&H_A<+5n=LhGv($!@i6MbrS4an&6kuYw=uiX4LHdvuZq5Z&b`KF zJl#=YYG+%0r+I6RU83~fv9=q2iPnuw?bGF?P$lDUr7jL53#q%E?dRU!c@w(I>?|mB z$#jg7*Wrb$d7o%>-V6N>J@baI+ssNrDQVw)iJgyr{jOC1G@o6ZWv2$uh`b6GwkP%) zVm2xsTY|Vlec!+U<9Td@z3;*gkqpt@p81Zm zU|`_==VbRI?Ch887RM@CzX1G9u=2CRHTn)(d!<{+ZYQ1v`1Pt{5CzUd0}h@USpr zqife5>vSE*rna4UWH8Zv6L<3UYRzqo_HDxtOuzv|dVuIweTRnlqeqUAi9hPG0~#I* z7CIprWB&M<;NQo?09Da|Ep%tPo~;_g+$j&eZ{fUaN?ipq-+cYqd4i%>yu)M4)3b8 zDS=avE!o6EN1l$6@lgv#x*U{Rg%2D^&c@_>8;0BpSy)(nAGhj zuPdm&Os!;mMYxx9O1tFh#i0#y=Ong#bQx%`;@`2ZA*WYmAJL;4g@LJ9ia%z)R0`f> zyyl8}i~tUz{iNRsH=NaAY; zNTmL~m1NAsMy(;?qlEJ4~$d;JRcc`i)%ZVx@5q*-k9_4ZKV$krBa2sHUOb^i zHi463GsWIx$86LADHw%2c6NBK@2y+1j`sHDFpVoB<6+?7=Pz`E&knnoSkGRZng%#Z zjbOY=^lIx9bMJkTM^fv6)^!Y&WW$@0s*OGER*o4WYZYbXgc!`zETJEI23DemJ4r#T zVk>9l#8~_3c<|%N7VdGb|?t1rKB6$E$b1tGK4Iu8wQumG9;p9Mq-jNZ{B%0$t=;gG%%5UQS=!06h7=f4 zd+em@d_J$a^e9I%5n+?698A-UhG`>R)=_R$$W>vIUC+E=Eurzp5=LI)?JT^mskO~) z_43a?`nIO)$l7x4bL+{+DDA6`&i+Dft z>T5k)4VfzNQT6!4f`aMS#6I)$=hY$%$WQ{fZ4ew3bXi_r-j=`{@7}fR#~vK$SFNmK zHKBldhz0g69_E}VUEBV5>t|}DL29qKP#=M_;C?ChBh&x`^0<^ zXzlMd{*uZ&G1;bs=M_(gXntuwVz#Mh%wzQ3T(`MGQM5s8KAMO^+}+EK;e{@Rmu`T) zu7^|Lt|KfuT3RLq#KZ#2A_4w5mv`Z9rDbMvd$rqT02$+^EiZrf9S-?60v%C{rLdAp z?1%)8p)pQuH4tchR$^+1xN+*ujj8BpCpq5_A^;^Fn5;_zq(;FG>(Lw&m~I0xPV!eR zEF$&GoyQA;f~YqGKdno;6BOh=hSg#n5gu+NR2?Rl=J*vBIt~)E%Gjl}2--y*kP{Ur`1n5LJ%3)d2xu@5@h}OM=;k~p z#vS<({V>w>W>OHj%Cf7lxe&GaUSe_ddz#j)s+?wOYuMADd%Zz#te#D8Q9*Jzl?c&Ec+ z&^Z^bbKG933XwXyj%2V>lyme`O^>;LXwfw2-_W+LvR3%=z^;sP*#VP!TGrno&SyQy z?LU66u8{dE6>~C&rWcN`dh|&R+`oT3T*KeRwOF_HlhWy`&-D=@cR$!GO-FYeer(~s zdW4TwH1bO6;~w4%{d=v*O->7|j;fD)y(ienk>i67NO z_V&I{liS_OpT6S1L*hZ(Sj%`sL;&Y?(wVOx)-FC1Auskv9L*{O=4ggz+*cPTRV)<#5(s7O5M~ zG@sA&=#alYY8XGUdt`Tb+^=pcUBA|p@eKXd??w{3j#lw?Zaee~m!>EjeX@1vIWk?B zG4y+XVsn3CG?!OjW#n}knL5?cr7N_*J{n}?CfW_GKI@-lJ)KJ;MarwE@^B{24v$>E zu1kK_IGLm;mm#NQ{;I((qr{!;Xy3V?MoK`fr>tdW*!G^ia=TcI+q`2L)!8@F{j-b$ zi|q02Y9_0{oBBs+ru-s8>&66foa)7+WT#cu50$x>cTMtmc}%~Z9HUi^5cuW7ux?;c ze8DsuVPJa4Xb$b3>r3O~Z^bhriWcp<&YAk0W>bBk-_viHPii(6X4j3y zJS+Dv>m2;@@Uy3>Pxp?bF1-o?;onxKy@%E6ot{n6K0PtJEKMGs*6WTZ4<%cE;271I zUhqx25Pv9SHk0Yvv`M{_#d80-)>nN-<97kuxXtyr2?j2oYuERpqGXuW%UPxgz)GZ#L|Z z3%P-}yQO+bsWR5*t~`st*mb!#Dy-2h;k@l7T1QsPmn_8kSLJC=H#n}ItGp^#`}Zg0 znHeznwEQh6X4qw5l$=BQ_#ysWR*G>3j~v$?74mSyvVxbO@dsq{;(z@_|IleS-g)<*B&ok%hJ7zG(Z9adBChAX7?42sjFQE=Q(ZlUAx>2<C@Ia{U#uD>N41sRh5yt!B0fGx$Q`l8{AfliG-@-dN`G8e-xj!63#4!bJ zq{Yq64R<$z^XJc>k&)TtIp4oKh@SUbltZiiDRXV=En8p@W3xD83HMQMT(C3p@-)zr zY?tP2;ZMlW(9nRido7SY_hMu30<^?}aIrDV0^U7yhzDR);g1<|5zi%h_^egm+jrJ{ zXFW`$z@xeexl@NBwp;ljQ8et%%p|3dcZSV364M@25N- zMeVgTP6Z1>osmMgh5%bY^QF>@)vkmINz@s*(PBVZ15~i(!OYwW?N4#)ZPpp)i)W@S zwPRdEP03TwGZs!|4i(+GlXl7Ic*>rRrD~cN_h>@N6*QHOgx)|rzRbscdwp^`+zC71`iT7 z!^sVp(>x1_ZM;Evtg5H0nA{KT>{nOo=h^mpv_)9<4B!w)CNx z7aS}ER8PPMn$8om#cS8C6E`qm#loQ%br-yCEw-io?_Pi{j5DvEA(P9Qs((5W`EBS& z`gg?7jag^8!dug>nVNF6<{E^+)E5TD^biLj0kMIPatrEI8Xc8dZd%#~(#Hg;&6s^Q zLT-BO#0j5@3Q>${-UWE+5!D69bxWqc{=a(*gg4hyIiEDxor@HAyb&S&YT^x)b2>L1-?5@ax@%dj=y>qX_n zDlNxR-Nmm#e1XH}%ito>z;4X4X5qm0jZ@Rp!{*aB@u1v@kKYH*T`&+J0rPOPpM$zX zA#$q9!?j&KTRXnEc+Pj&{gYj=62z368)Brn#l_q$8#bgpcT`h>6!OwjD}4D*VIe;Z zKVqYDlaqZx3%T+`73i(cqb)n@m zzq^cOg5l@17EX{86Q4XGRXvaMAQ!51EoDr$9Lj7E%4pCjcjkr1=!pm6;a@>d6LkDV z565v^%u(;I*e$UY8@?Lri0pg?3Ia05Yml?;=j5b) ziF|f6JOW%Po-bp-PhzFaMNI?rw^vMz74P~OFK_zJ%#4+MeoKQGS2Eq-2S`e{7n#pN zG_zyMEI5WZMowl{G!8Ou*Wc4j4SRNqGs$7!hgPT*ZCx_&-fg(vrq$e^X6Cj~{ndOT` zp8qQ9@!U+p!!BD>4#D;t{%LN^Yc+GmPBH_4lQkqHacaB@7cXuG5+!HO0M!fSD5XSc z6tUKT1bALvURqq70xGiZ_yUwg5(%eTw(2M_tLJc%pmLx*Fuix$_x9~IB%p`5KM-88 zVSC~9^mGyl>Q{iv4h~sot0){0q@e?r@bPxLY-*YSLrUkl-}~@})nI>Rq>ZoJ3c&?X)Fk{z=}@ZPedGlw(FVY&-g;M5aDRr-+7h z4EnjuWcc?DmH;)K;&XQyY6(1I}P&>Yl;%fc}5m zYkAnf86+Lv%Wt=$GO!!*23@3?m|VP~A)JMNwm;_t!7zAk&Y7N`-Vi3HScNyz(+{Bv zvZX}#F1(CT`k=sPz7ZD}x87Vv?Ze|!JMinOFbIAJd{|I1zJug5*XXt4lb?T*#8sL27??7#>3K~3^ zMfV;(3WUcOT={a1-cw~TLiQledS_?n8d3!)BxmvH$3A+mLcW5k%ewv2K~+$Plyr52 zpszp@+j=qLFomMaYOztxCU{RKpmgxIuI{ER$7{U&F@%T+2NIiRu%H1U@Rg4d+Q-L7 zhvSeqc~C$zG&A$(vuJH;WSkQFpYG1cZXOA_574DZ8Ym ziP^E9H$i(&=ofeYal~aTHj$%n$wB~t5xq{gnZzXK$%LrE>k<=DL;8_)T0meogqT+# z8tQAto*V#K=Ov?c`S^Qx3yWcy)y(FUj0U%*IbIw9Q}68>%k)MD;=DY+j$9*Ky1|>M zd_sl3P?jy-ocR;GZp6nRrr(r~@@dX>2t%-)pzX`Dt>? z73j-t6XRw}_~BD@h))G_4xmJ9e~pY>GBH_4MMVX8V3M5!AJ|E!5PT z2&oPX1d$?q>~<(iWc@Qwte8;)R7G8UWjw@dX&s4Bqp;(|wgGL$kD9E~(a4w>%TlA7 zfN(^hUZ`BSr>jPf_4e9y_4Ihb&Qm?Gqjehz+FakS!NK_#1qBY#fFI}KJPH5+SrLb~ z-$1wuX9~b=7XghRbYLi;9;5w_2*r>a)niDm2XNyecvJ+GS^v%_Kb(QMn}o{BM*Iph zLPDfOVG97%!zf5=6Y$6;05yd3k=negt^ILBmLrU-9?-~NX@u5`RoVR+-o}1JVRd41 zavFuOSr(NP*^T_Faxq9;@&+&0?la~!YamJf-s^BkPU$> zn2P5?XM9%|&K+5KjTx-D3DRDWKIZ`b6e)lUUC7OwH$~sp*PmEIY%qd@z8WN%Nbo&b z&PhwVW>i7b#p@u{9I{OAKl zf|^%7O-xs7(mxesricRayC6o|3CQZBWb-I2EZKEW=#O81tJE(7t8L0B#diHNZKXk1 zVDH#Nsdx**cKVo*NS8I_*UmEYC=?gGsLpJIwku0^CGe z<*G-XgUQrhH#fwVa!4g*Eu|v1rX^Lql1r~|`%)?rh27kg&i-Z$@RfFa%;e(_Kk>8*TVL=s*70q_RpU` zJvaF#sE=bmbKgLs2JctXqwT91m`4lZYKM`8(C+q^3>ZowfV%6wu|Bt?o0XGnaM_DU zhS+=?uW6X!e|lO?WW~kBS@X@wLzgaJPI?2KJ5_8M8`|3k1TfHooI!s5C?{GjFD+F-Z7-Y#YioO8%_d9B zk!Og(sTCuX!bKECc{h;q^YdkHa2C;!otR@y&CR3r9AeM2b5VICSKncBT1^gS=^Scx zqD47%m&5HC$%nYP-Au1Nj`Y6(p#Vr+>a`>TgPxH(-b>&y%VDdlU?d^Y;V&M_R$^!R z=Z)UL)+L1`(!Cda0NcERu7m=k|%ITJuD*5Ho5?8d17_dg9tVbZr8&$&wvK02hC&;9;-j?^pV)2%)r<$wozY!6A$uJ7$JwP6BH_`Wn~Bk3{f zpj2zu9zM#=y~7RFqBT{BR4cg;9r~mXqfBMEJO&nM@sPLt$9p5H{NSy%5#^xLl9C!= z6=#leaos0sy08wMCCUszs3fYxM$iH^(wMBn0oo?4h9W>jufeG= zkfzc|JmTP%Z?47BY6GM(6{;LVdr@ZshfWSg)BM#iRy>OS5K7cbRNHugH_LT!auV|( zilX}Z`tfiq5A%Z~X4HX;5$-AS%xR`Y1kRa2;c_l{Q!!B{l5&IV`TuvSl^x8oYh zR?EO)c@dpCuL)8nK4o)@|2agnQ-~&FuzP1gKXNnyAGrs-&mX{ebuELOwEHlwUkr+j zTHx~~L}tGZyi@aS0!v9B5YvV3?(Q=1(3UTt7IUBAQ=(MJOGFv_4<7uvjHQ*0gq%k) zH5O?U?c~G+HF)}6C^%6=I`iT?e*8X`d<`?P95po`UO_IMhz=VL65N$93?EN{Q@d@k zB-^1)D9eG%#7Rp_%bFp-q^fZ8^i3N*c?mH&f0fC{b0-hTOUSuLZ%?i5$obqLIBq8M zn8Bh9S2@fy^~co7y_{Sm>Vt#G+&oeB70U4+;f^h> zj7ZCQsu#NTb3>ZwQ$45##Z4c(~`#pv-r<>MhU8Nlo&m(WNSj}=pk?fiPHy~tl`Y!VBa2%OVZ7obHA z{zNr=u_WbtI<4GL-9zjU5d;!4b*ZPJVKfVV7Wo{;fBm9_-RKfhuS6+%MpjO4WD^O9 zYngx4V>Lw6@&HTO<)wVz`{z$23<$f=*;L^HaWfa9*=IvC`0JI}h;GIIO=H7!0Zr10&G zz84g#wfNV^VqPo=^hk4_JGLn;e}dTFa%|n&wR?Gaw;_&fvpL>ofqmXaWR0wC?46T6nO1$BsDv)TE@f$epFMwHZX`dMO131$!YI8F}k3|Md-PNzvqPQElfM26V(@U$C$ zN4}X48aKXS+Xoy{%EjdrA=p7AAaZWxM8wVxE$B2JD-sEtsl}I3Z_Y~1fEpug&4$%? zwmmH>I)~2z0pT{5$zi?Ho!Qz2O?{mb1xZ$3=wZr31Q^70YC94TKpH6sp&?3EJ)QZW z*Vi0ZJLN8ShXqAt1-b4{a;C<9h%>k@*{Y5Z+VP~`@b}*+x;)h^lY2zJoE~!F`3n~) z6rVS0ovKXnxS%(ZNvNOZWG)cJgF3A_klBZ&GM%O~gefM`Y&E6to)@nKiFR z_;xcmIJj>4xZ?7-xC-*=rS~FgmVIVJzfu{R@?wN++sJv$dTwHUmc}n#gmyG2NL=g4-)L7-o^TC!pLkqg zvyAK4=Iqfp3Fu@mDoyA@*;eW_MuVb`{a80Mz`NDhUY?>=kfb1glk@~d9_SW6F)_^S z+c%;el8RL9vB(c*?pY*f6-`S}=dzn-2iqCBa2e?R@#8k~gG9oQLxjED57*(93L!2A?_|725}u7MhNybl`GRc_@qpR-FozQ%9VO7I{INB;cSQ7H2T$) zO^B3-xd32tL8xPlNMlx@W##FiWpM@7pl;*32ZvrlInmi4E;EUHMM);M8p$#!g#y`G zSxqp#_(jVkcx)8cl>=@E1&_qMR&HbeI@$_=xK@c>|3qZA56)H=QXgX8O6bn1g#U#S znsca7Ubu}Ex=0W0XrF6p`tPIJ^gBFGLWsx<>ZBEMPFvx(Uk5XJ5%}^e4uehou3B1q z8rvTogp%uxr)VQOeBo2U_SB?)*TJ2euq_em31Zl7Nj3@+LcpzrV1&wv@4C&qNF>M6 zFa9XT$W(4`wfD$iKX8D8q@JsvX`&8q5uZ6YDBxD>U5@PSP zlRb5HLnXG#ub(U}!M23^gBRQ!)FK8!l07kL-aLvHN#$WXF%s zOfHfNtf_c9{qCFdxme?52*K(n%3#p?{30TDdCq;MqGl4@ii8GTmQ~%{dIj$CWe^%`SqpsMshPpBhy`n%6qm9e$L?^S?gS4 zENrfi^(}#ir0Wur=n8!Gh%85EW)Aye`OQLANO47vzT9KM@iJ^^H0!)kODUnO!ZRl3 zXlECo5nSz@|gk`hL8R!12uCvoE#7-Z#jaBa9v9DziBu)W%OUnv`acF8i;e*0yY;5ed4D#rH z>AOrW&RAn^XV0Fsn5|#KcNM3i4T7C>h_<*_pk2R4{$e{lq~?x?h(tWn(W-qY&bnN?#AXeh{enYB3$Eid@5p~(MhyR5L z`jnGWQ;8}d+VJQm)tJAeD?f6KjEGnd6)|8HEzK0(MF;te3I=J>*3VrKh2|?#xWdyK zBi_3DdL=y7wiEYaVzTXGc$)p1Cdqv-n8iFr&|XGMl$anq9pvVIjgBk|61KEj?5cm% zO0g9|9iyvk$Xq-n#{4>PVY@@ekI9_6X9WdPMn>OGj1=NXH?8mj2o(*ODH$gLqA z%s`isj)7h3krA;+*zwv!XkQ-z&+Q7I#QkVDtMaC(M5X5l4XN75w&eNq$^N2l*Wo^( z$U~5!N})%w;5%Wevz0`T^F41N=XEoV{b`>J&D*rBEGr50L=K*mGOqmn)x}tbr)g;i z5%Tn+ZB5$Iksl}FZ~W()suPj1jzcXQu~=%MPk=Xm`$8DU>FaTMLc=O7?%kyhn-R8< zyrHAg6Z;@43BMt2#v>v@r3(n*b?BP)#fCvPTlR2wM?FN(c8{g4EicX^9;h~D-&%K> z7o!P$eV%3zF4p!x3(0r<{a+&bBx{G1j>sS0WsE?m*mar<#evYrkAtA^ufaILLp}?2 zJ@wGF2n>GP3m@d-dWGin;9y1p2?YgOtbDq9#3h?ac+cv2Um)yfEc0o_h(2ghX`WTb zcMu;5Wd|f2H?R$gqfk;6ro)0p=Ky5n-ysOl^O>vG45T#-WT`e+B<0Mg0kypilOQ*U zf;ZG9Nl#Cr97)5<8Yfd^K$i3v&CL`Ry*k?BQptz_;Nu&ImL(*eyY(5=^!1PClxBf= zKZM<}6gyR@MEq8C@#arYPA&?aI@R9#`t^R9!@Ici3kvE%b65KG7G5Y4b9b3a zigQ|5ai*`;t#EH&t+{9}jiRgQeBTag`eP(~{8oEGxd<$r4uNjx#D)$vxslI#i5J|p z0s{kiokn%(85xa{c{-GiMpNg1eu&ofza#gI)k%ddeBq8#e4LVH85wy6&r@0>uM+lP zIl4y$OyQ~Sd`%+?g}0#wqREgLhnPd5pXi=!C>)AtN5*~)R!rH1)+LNEt~feNfSWth z7fEyk27AQO(|$?r`yMpFz9fVXqInj&%)*bF1Nu2Mb&~fa;+<1o$VVMFA?VC6GRl_I zOESlhyS zIr1LI_~*OPo1m#Tp}h45JKrSq@59kJlSZL6&lu$ue?d|^hDVciBSZ~zQ&aUp{#d-0 z!XJI7m@pad#ugm}SDBo5tT|btBogJ53zFih@86$ngU=yk%;w;2`=yygv9CQ+PCuy- zORl8r<09$Vg5;G_^Wneu{qQ&Z!l=8cj=|`XM4Y{bPWSEy0zLUoTQeG|dxHDQW2i)IAm~{t>d+lA->{;#3F; ztoddKcdO=qX$HK4PIzss52uli>HjOr(Z9Z-|EHh!|Hq3jv##;ouGj9lla_?93sUlu JITD69{|8?l5pw_l literal 0 HcmV?d00001 diff --git a/source/_build/html/_static/images/gs_confirmation_screen.png b/source/_build/html/_static/images/gs_confirmation_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..2ddcaa8ab2778a17f90a643c8874e419b1b18961 GIT binary patch literal 42586 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 0 && j < len ? [ this[j] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( support.ownLast ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call(obj) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + var length = obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v1.10.19 + * http://sizzlejs.com/ + * + * Copyright 2013 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-04-18 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + -(new Date()), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + strundefined = typeof undefined, + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf if we can't use a native one + indexOf = arr.indexOf || function( elem ) { + var i = 0, + len = this.length; + for ( ; i < len; i++ ) { + if ( this[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + characterEncoding + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { + return []; + } + + if ( documentIsHTML && !seed ) { + + // Shortcuts + if ( (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document (jQuery #6963) + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType === 9 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== strundefined && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, + doc = node ? node.ownerDocument || node : preferredDoc, + parent = doc.defaultView; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + + // Support tests + documentIsHTML = !isXML( doc ); + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent !== parent.top ) { + // IE11 does not have attachEvent, so all must suffer + if ( parent.addEventListener ) { + parent.addEventListener( "unload", function() { + setDocument(); + }, false ); + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", function() { + setDocument(); + }); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Check if getElementsByClassName can be trusted + support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) { + div.innerHTML = "
    "; + + // Support: Safari<4 + // Catch class over-caching + div.firstChild.className = "i"; + // Support: Opera<10 + // Catch gEBCN failure to find non-leading classes + return div.getElementsByClassName("i").length === 2; + }); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== strundefined ) { + return context.getElementsByTagName( tag ); + } + } : + function( tag, context ) { + var elem, + tmp = [], + i = 0, + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + div.innerHTML = ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowclip^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch(e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (oldCache = outerCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + outerCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context !== document && context; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is no seed and only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome<14 +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; + }); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); +}; + +jQuery.fn.extend({ + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +}); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof rootjQuery.ready !== "undefined" ? + rootjQuery.ready( selector ) : + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.extend({ + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +jQuery.fn.extend({ + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.unique( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.unique( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +}); +var rnotwhite = (/\S+/g); + + + +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // First callback to fire (used internally by add and fireWith) + firingStart, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !(--remaining) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend({ + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +}); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // we once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + + // If IE event model is used + } else { + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch(e) {} + + if ( top && top.doScroll ) { + (function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll("left"); + } catch(e) { + return setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + })(); + } + } + } + return readyList.promise( obj ); +}; + + +var strundefined = typeof undefined; + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownLast = i !== "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery(function() { + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== strundefined ) { + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +}); + + + + +(function() { + var div = document.createElement( "div" ); + + // Execute the test only if not already executed in another module. + if (support.deleteExpando == null) { + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +})(); + + +/** + * Determines whether an object can have data + */ +jQuery.acceptData = function( elem ) { + var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute("classid") === noData; +}; + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split(" "); + } + } + } else { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, null + } else { + cache[ id ] = null; + } +} + +jQuery.extend({ + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var i, name, data, + elem = this[0], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + return arguments.length > 1 ? + + // Sets one value + this.each(function() { + jQuery.data( this, key, value ); + }) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + + +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray(data) ) { + queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; +}; +var rcheckableType = (/^(?:checkbox|radio)$/i); + + + +(function() { + // Minified: var a,b,c + var input = document.createElement( "input" ), + div = document.createElement( "div" ), + fragment = document.createDocumentFragment(); + + // Setup + div.innerHTML = "
    a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + div.innerHTML = ""; + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Opera does not clone events (and typeof div.attachEvent === undefined). + // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() + support.noCloneEvent = true; + if ( div.attachEvent ) { + div.attachEvent( "onclick", function() { + support.noCloneEvent = false; + }); + + div.cloneNode( true ).click(); + } + + // Execute the test only if not already executed in another module. + if (support.deleteExpando == null) { + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + } +})(); + + +(function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event) + for ( i in { submit: true, change: true, focusin: true }) { + eventName = "on" + i; + + if ( !(support[ i + "Bubbles" ] = eventName in window) ) { + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +})(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && jQuery.acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, ret, handleObj, matched, j, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var sel, handleObj, matches, i, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Chrome 23+, Safari? + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, to properly expose it to GC + if ( typeof elem[ name ] === strundefined ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + if ( !e ) { + return; + } + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "submitBubbles" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "submitBubbles", true ); + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "changeBubbles", true ); + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var type, origFn; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
    ", "
    " ], + area: [ 1, "", "" ], + param: [ 1, "", "" ], + thead: [ 1, "", "
    " ], + tr: [ 2, "", "
    " ], + col: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
    ", "
    " ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + +// Used in buildFragment, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[1]; + } else { + elem.removeAttribute("type"); + } + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; (elem = elems[i]) != null; i++ ) { + jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); + } +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( (!support.noCloneEvent || !support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; (node = srcElements[i]) != null; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + fixCloneNodeIssues( node, destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; (node = srcElements[i]) != null; i++ ) { + cloneCopyEvent( node, destElements[i] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var j, elem, contains, + tmp, tag, tbody, wrap, + l = elems.length, + + // Ensure a safe fragment + safe = createSafeFragment( context ), + + nodes = [], + i = 0; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || safe.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + + tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; + + // Descend through wrappers to the right content + j = wrap[0]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Manually add leading whitespace removed by IE + if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); + } + + // Remove IE's autoinserted from table fragments + if ( !support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[1] === "
    " && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + if ( acceptData || jQuery.acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( typeof elem.removeAttribute !== strundefined ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + deletedIds.push( id ); + } + } + } + } + } +}); + +jQuery.fn.extend({ + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + remove: function( selector, keepData /* Internal Use Only */ ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map(function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var arg = arguments[ 0 ]; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + arg = this.parentNode; + + jQuery.cleanData( getAll( this ) ); + + if ( arg ) { + arg.replaceChild( elem, this ); + } + }); + + // Force removal if there was no new content (e.g., from empty arguments) + return arg && (arg.length || arg.nodeType) ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[0], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[0] = value.call( this, index, self.html() ); + } + self.domManip( args, callback ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[i], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return this; + } +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone(true); + jQuery( insert[i] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + + +var iframe, + elemdisplay = {}; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var style, + elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + // getDefaultComputedStyle might be reliably used only on attached element + display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? + + // Use of this method is a temporary fix (more like optmization) until something better comes along, + // since it was removed from specification and supported only in FF + style.display : jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = (iframe || jQuery( "

    >4 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 OH`}(x=hF^8xA6z`v$384 literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/openstack_orchestration.doctree b/source/_build/doctrees/openstack_orchestration.doctree new file mode 100644 index 0000000000000000000000000000000000000000..7b3c71a9a021ee735c3391a0ef1efce907387968 GIT binary patch literal 57967 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 literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/openstack_supporting-database.doctree b/source/_build/doctrees/openstack_supporting-database.doctree new file mode 100644 index 0000000000000000000000000000000000000000..313f3ff04ad2bbb51edbc874948e289987eed9ef GIT binary patch literal 10563 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 literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/openstack_supporting-messaging.doctree b/source/_build/doctrees/openstack_supporting-messaging.doctree new file mode 100644 index 0000000000000000000000000000000000000000..b84b0c4e2e951e11be740c9892b20c597005741c GIT binary patch literal 10570 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 Qzt+k@DsZ|g54}DA2W2sxxc~qF literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/openstack_telemetry.doctree b/source/_build/doctrees/openstack_telemetry.doctree new file mode 100644 index 0000000000000000000000000000000000000000..30d2efc6db0d4dadae92c1f5d015564ad1380108 GIT binary patch literal 45808 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 literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/openstack_use_cases.doctree b/source/_build/doctrees/openstack_use_cases.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d9d06f5f00a21a78f2dc3228bf7079e7ebd8a992 GIT binary patch literal 8109 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 W2VPQjHvW18C3Oz}yV}8bi~j-N@BkYC literal 0 HcmV?d00001 diff --git a/source/_build/doctrees/substitutions.doctree b/source/_build/doctrees/substitutions.doctree new file mode 100644 index 0000000000000000000000000000000000000000..816b6abee226f5b7c81b85b4955f3710728c49fd GIT binary patch literal 2760 zcmai02X`Aq5O$o{mK0mILkgsTAqgmerO+YtUQ9%QOfcm*R(C7ylDpfR-8~n`0ioLT z-h2O<%$`oR{Q~1ylZeY$Fauz*wD~Ws@01;uvppbd9#sBq_eMKl^&|) zxSbx-Y|*Gp2OP)e50kTIbLLFx@XUH@d*?>TPniweN1;^$A)}BY#r+;0*i7$9zC=m8c)m_ypUV$k^43|L$??*L z82`89%fy7JWgV7v<|||zkPeEV4+@u=LpdIHhL@M=7##mgKIXVicvK^I!=f%G#gv#9 zM9Ae0vC|W~Jh9sodptpLULg*$OzfT8A}B6F(KN)x^Aqd9`;PDk;l47*tK9SFpI%Mx z9O}a!Cestgakc>5%(3MxW=p^)j&Fqekkl-SmS>(&p_aXjzclkCORQu)bsp}c=i$Ca z%oez}4sc&fxcAaK|Lqm8qad!&@dgL!f3Dt05jBg5GN_ZL4fjbyhV@81H+gt7)Pqbr zrTeAGZ)rm<|#yi_EvF4%>>s>kC4Hf#?SL!`E-V0M^Iqs;)AKWx}pNIFu^f>?u z>jyl15O!|5?iWW7dH66?18Iu@3_jxFoZ}Y82ay)F@F)eghH#ye;~ushtW;@BxF4er z8J0nxpr9ugv0iOm ztrE+Vuy%??88u9tSNL>}&op4ifC}GLIRQUy@L7U!0l8K>q^6OQ9Zv#D`FySo zLwzXq0~NatZjezTt#WS+;B;VwPV_PcFcGn&myx#Ue#kL|VQMTKsv)C3W?7tK*Fh}E z^&`H(BkavlVkivi{YhVOf&?g7WXlVZde%eoP?=3L`(Hj&8VE!R z%_Agal;R|d{Us-K)RdaZFpE=vOm}ZmZxBwM8m_2;-`VbdknlDKzR#JCnN{W_Xa|DULY8R~&sy zsUopSlCMr!WbjogE5`|qwjxDk#ILQw_I`u$orv))!E{pHAhy@(iA}`g8!(dD?(EI@ zCe%uEr|Y-KS|%G)gl|K&xH)Txgm+-l52axpqO#;=r43aogVbR--8i2`2aorK8y`|;|F3ACaIV$%|%xdM3Kc0SD@PC38#ihWPe1^3IVKB z@-b=N#MCu?%&3DJ{A3lzU8>jW^i!A_)al~lVl!Q~LM26=hJ2w#S4|5)bKNnqY{?h0 zCnEZ{_&LpWmGtln*nch^o2uYTflzmi%U`G9D;Sm`eobgqurX8Ltiry2x$%e>HBTg2 z;SV;BZ%NH1sfAVze&@mNLbWn6To?Nr4SV7~#P3&NJMCXoN&W91Tn8=aS?hy8wzCfG z+T6+eQ|70+q5ekmbB@1|t~RcS{ju?Dj=wcTh5inTgY#}?r?HsLXieDX)`Z`SaZ3vV ltw!Y*M>_qX2xA#p^2#8!C5~m>GhH*?+Me#I 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