Merge "Delete the XML content to prepare for Juno"

This commit is contained in:
Jenkins 2015-02-09 17:29:39 +00:00 committed by Gerrit Code Review
commit e383d9916a
103 changed files with 0 additions and 83585 deletions

View File

@ -1,10 +0,0 @@
Important note about glossary
=============================
This directory is synced from openstack-manuals. If you need to make
changes, make the changes in openstack-manuals/doc/glossary. After any
change merged to openstack-manuals/doc/glossary, automatically a patch
for this directory will be proposed.
**Note:** Core-reviewers please do not let any patches go through into
this directory. Redirect the patches to openstack-manuals.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<book xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="bk_architect-training-guide">
<title>Architect Training Guide</title>
<chapter xml:id="architect-training-guide-coming-soon">
<title>Architect Training Guide Coming Soon</title>
<para>TBD</para>
</chapter>
</book>

View File

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<book xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="bk_associate-training-guide">
<title>Associate Training Guide</title>
<xi:include href="ch_associate-getting-started.xml"></xi:include>
<xi:include href="ch_associate-getting-started-quiz.xml"></xi:include>
<xi:include href="ch_associate-controller-node.xml"></xi:include>
<xi:include href="ch_associate-controller-node-quiz.xml"></xi:include>
<xi:include href="ch_associate-compute-node.xml"></xi:include>
<xi:include href="ch_associate-compute-node-quiz.xml"></xi:include>
<xi:include href="ch_associate-network-node.xml"></xi:include>
<xi:include href="ch_associate-network-node-quiz.xml"></xi:include>
<xi:include href="ch_associate-object-storage-node.xml"></xi:include>
<xi:include href="ch_associate-object-storage-node-quiz.xml"></xi:include>
<xi:include href="ch_associate-assessment.xml"></xi:include>
<xi:include href="ch_associate-review-concept.xml"></xi:include>
</book>

View File

@ -1,57 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="associate-assessment">
<?dbhtml stop-chunking?>
<title>Assessment</title>
<section xml:id="day-two-assessment-schedule">
<title>Day 2, 15:00 to 16:00</title>
<para></para>
</section>
<section xml:id="assessment">
<title>Questions</title>
<para><table rules="all" width="1011">
<caption>Assessment Question 1</caption>
<col width="95%"/>
<col width="05%"/>
<thead>
<tr>
<th>Task</th>
<th>Completed?</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<para>Configure a ....</para>
</td>
<td>
<para/>
</td>
</tr>
</tbody>
</table>
<table rules="all" width="1011">
<caption>Assessment Question 2</caption>
<col width="95%"/>
<col width="05%"/>
<thead>
<tr>
<th>Task</th>
<th>Completed?</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<para>Configure a ....</para>
</td>
<td>
<para/>
</td>
</tr>
</tbody>
</table>
</para>
</section>
</chapter>

View File

@ -1,265 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="associate-compute-node-quiz">
<?dbhtml stop-chunking?>
<title>Compute Node Quiz</title>
<section xml:id="day-one-compute-quiz-schedule">
<title>Day 1, 16:40 to 17:00</title>
<formalpara>
<title>Associate Training Guide, Compute Node Quiz Questions</title>
<para>
<orderedlist>
<listitem>
<formalpara>
<title>Which component determines which host a VM should launch on?</title>
<para>
<orderedlist>
<listitem>
<para>nova-network</para>
</listitem>
<listitem>
<para>queue</para>
</listitem>
<listitem>
<para>nova-compute</para>
</listitem>
<listitem>
<para>nova-console</para>
</listitem>
<listitem>
<para>nova-scheduler</para>
</listitem>
<listitem>
<para>nova-api</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>All compute nodes (also known as hosts in terms of OpenStack) periodically publish
their status, resources available and hardware capabilities: (choose all that apply)</title>
<para>
<orderedlist>
<listitem>
<para>through the queue</para>
</listitem>
<listitem>
<para>with SQL calls to the database</para>
</listitem>
<listitem>
<para>with direct interprocess communication</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>By default, the compute node's scheduler is configured as:</title>
<para>
<orderedlist>
<listitem>
<para>the RAM scheduler</para>
</listitem>
<listitem>
<para>the base scheduler</para>
</listitem>
<listitem>
<para>the chance scheduler</para>
</listitem>
<listitem>
<para>the filter scheduler</para>
</listitem>
<listitem>
<para>the weight scheduler</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>If the compute node is using the filter scheduler, it works by:</title>
<para>
<orderedlist>
<listitem>
<para>filtering hosts by using predefined properties</para>
</listitem>
<listitem>
<para>weighting hosts by applying predefined weights</para>
</listitem>
<listitem>
<para>sorting hosts by using weights to determine host preference list first, then applying filters</para>
</listitem>
<listitem>
<para>filtering hosts first, then using weights to determine host preference</para>
</listitem>
<listitem>
<para>filtering hosts first, then choosing a random host from the filtered list</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>Scheduler always returns a host on which Nova can start the requested VM.</title>
<para>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>OpenStack provides which classes of block storage? (choose all that apply)</title>
<para>
<orderedlist>
<listitem>
<para>RAM storage</para>
</listitem>
<listitem>
<para>object storage</para>
</listitem>
<listitem>
<para>persistent storage</para>
</listitem>
<listitem>
<para>file storage</para>
</listitem>
<listitem>
<para>SSD storage</para>
</listitem>
<listitem>
<para>ephemeral storage</para>
</listitem>
<listitem>
<para>disk storage</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>Persistent volumes can be used by more than one instance at the same time:</title>
<para>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>Specify in which order these steps must be completed to provision VMs:</title>
<para>
<orderedlist>
<listitem>
<para>nova-scheduler picks up the request from the queue.</para>
</listitem>
<listitem>
<para>nova-compute generates data for the hypervisor driver and executes the request on the hypervisor (via libvirt or API).</para>
</listitem>
<listitem>
<para>nova-scheduler interacts with nova DB to find an appropriate host via filtering and weighting, returns the updated instance entry with the appropriate host ID and sends the rpc.cast request to nova-compute for launching an instance on the appropriate host.</para>
</listitem>
<listitem>
<para>nova-conductor interacts with nova DB and returns the instance information. nova-compute picks up the instance information from the queue.</para>
</listitem>
<listitem>
<para>nova-api receives the request and sends a request to the Identity Service for validation of the auth-token and access permission. The Identity Service validates the token.</para>
</listitem>
<listitem>
<para>nova-compute picks up the request for launching an instance on the appropriate host from the queue.</para>
</listitem>
<listitem>
<para>neutron-server validates the auth-token with Identity Service. nova-compute retrieves the network info.</para>
</listitem>
<listitem>
<para>nova-compute performs the REST-call by passing the auth-token to Network API to allocate and configure the network so that the instance gets the IP address.</para>
</listitem>
<listitem>
<para>The dashboard or CLI converts the new instance request to a REST API request and sends it to nova-api.</para>
</listitem>
<listitem>
<para>nova-compute performs the REST call by passing the auth-token to glance-api. Then, nova-compute uses the Image ID to retrieve the Image URI from the Image Service, and loads the image from the image storage.</para>
</listitem>
<listitem>
<para>nova-compute sends the rpc.call request to nova-conductor to fetch the instance information such as host ID and flavor (RAM, CPU, disk).</para>
</listitem>
<listitem>
<para>cinder-api validates the auth-token with Identity Service. nova-compute retrieves the block storage info.</para>
</listitem>
<listitem>
<para>The dashboard or CLI gets the user credentials and authenticates with the Identity Service via REST API. The Identity Service authenticates the user and sends back an auth-token.</para>
</listitem>
<listitem>
<para>glance-api validates the auth-token with Identity Service. nova-compute gets the image metadata.</para>
</listitem>
<listitem>
<para>nova-compute performs the REST call by passing the auth-token to Volume API to attach volumes to the instance.</para>
</listitem>
<listitem>
<para>nova-api checks for conflicts with nova DB and creates the initial database entry for a new instance.</para>
</listitem>
<listitem>
<para>nova-api sends the rpc.call request to nova-scheduler expecting to get an updated instance entry with the host ID specified.</para>
</listitem>
<listitem>
<para>nova-conductor picks up the request from the queue.</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
</orderedlist>
</para>
</formalpara>
<formalpara>
<title>Associate Training Guide, Compute Node Quiz Answers</title>
<para>
<orderedlist>
<listitem>
<para>e (nova-scheduler)</para>
</listitem>
<listitem>
<para>a (through the queue) - This increases scalability.</para>
</listitem>
<listitem>
<para>d (the filter scheduler)</para>
</listitem>
<listitem>
<para>d filtering hosts first, then using weights to determine host preference</para>
</listitem>
<listitem>
<para>b (False) - Scheduler can also return an error (no suitable host for the requested VM).</para>
</listitem>
<listitem>
<para>c (persistent storage), f (ephemeral storage) - The question is about OpenStack's block storage classes.</para>
</listitem>
<listitem>
<para>b (False)</para>
</listitem>
<listitem>
<para>a (6), b (18), c (7), d (11), e (3), f (8), g (15), h (14), i (2), j (12), k (9), l (17), m (1), n (13), o (16), p (4), q (5), r (10)</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</section>
</chapter>

View File

@ -1,70 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="associate-computer-node">
<?dbhtml stop-chunking?>
<title>Compute Node</title>
<section xml:id="associate-day-one-afternoon-schedule">
<title>Day 1, 15:00 to 17:00</title>
<para></para>
</section>
<section xml:id="associate-vm-placement">
<title>VM Placement</title>
<xi:include href="../common/section_vm-placement.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_vm-placement']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-vm-provisioning-indepth">
<title>VM provisioning in-depth</title>
<xi:include href="../common/section_vm-provisioning-indepth.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_vm-provisioning-indepth']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-block-storage">
<title>OpenStack Block Storage</title>
<xi:include href="../common/section_block-storage.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_block-storage']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-compute-node-administration-tasks">
<title>Administration Tasks</title>
<section xml:id="associate-block-storage-commands">
<title>Block Storage CLI Commands</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/cli-reference/generated/ch_cli_cinder_commands.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'cinderclient_commands']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-block-storage-manage-volumes">
<title>Block Storage Manage Volumes</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_cli_cinder_manage_volumes.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'cli_manage_volumes']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-nova-cli-commands">
<title>Compute CLI Commands</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/cli-reference/generated/ch_cli_nova_commands.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'novaclient_commands']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-nova-image-creation">
<title>Compute Image creation</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_cli_nova_images.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'nova_manage_images']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-nova-boot-instance">
<title>Compute Boot Instance</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_cli_nova_boot_from_volume.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'boot_from_volume']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-nova-terminate-instance">
<title>Compute Terminate Instance</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/user-guide/section_cli_nova_terminate.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'terminating']/*[not(self::db:title)])">
</xi:include>
</section>
</section>
</chapter>

View File

@ -1,384 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="associate-controller-node-quiz">
<?dbhtml stop-chunking?>
<title>Controller Node Quiz</title>
<section xml:id="associate-day-one-controller-quiz-schedule">
<title>Day 1, 14:25 to 14:45</title>
<formalpara>
<title>Associate Training Guide, Controller Node Quiz Questions</title>
<para>
<orderedlist>
<listitem>
<formalpara>
<title>When managing images for OpenStack you can complete all those tasks with the OpenStack
dashboard.</title>
<para>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>When setting up access and security, SSH credentials (keypairs) must be injected
into images after they are launched with a script.</title>
<para>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>You can track monthly costs with metrics like: (choose all that apply)</title>
<para>
<orderedlist>
<listitem>
<para>VCPU</para>
</listitem>
<listitem>
<para>QoS</para>
</listitem>
<listitem>
<para>Uptime</para>
</listitem>
<listitem>
<para>Disks</para>
</listitem>
<listitem>
<para>RAM</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>The following OpenStack command-line clients are available: (choose all that apply)</title>
<para>
<orderedlist>
<listitem>
<para>python-keystoneclient</para>
</listitem>
<listitem>
<para>python-hypervisorclient</para>
</listitem>
<listitem>
<para>python-imageclient</para>
</listitem>
<listitem>
<para>python-cinderclient</para>
</listitem>
<listitem>
<para>python-novaclient</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>To install a client package</title>
<para>
Run this command:
<screen><prompt>#</prompt> <userinput>pip install [--update] python-project client</userinput></screen>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>To list images</title>
<para>
Run this command:
<screen><prompt>$</prompt> <userinput>glance image-list</userinput></screen>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>When troubleshooting image creation you will need to look at which of the following
log files for errors? (choose all that apply)</title>
<para>
<orderedlist>
<listitem>
<para>Examine the /var/log/nova-api.log</para>
</listitem>
<listitem>
<para>Examine the /var/log/nova-compute.log</para>
</listitem>
<listitem>
<para>Examine the /var/log/nova-error.log</para>
</listitem>
<listitem>
<para>Examine the /var/log/nova-status.log</para>
</listitem>
<listitem>
<para>Examine the /var/log/nova-image.log</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>To generate a keypair use the following command syntax:
$ nova keypair-add --pub_key ~/.ssh/id_rsa.pub KEY_NAME</title>
<para>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>When you want to launch an instance you can only do that from an image.</title>
<para>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>An instance has a Private IP address which has the following properties: (choose all that apply)</title>
<para>
<orderedlist>
<listitem>
<para>Used for communication between instances</para>
</listitem>
<listitem>
<para>VMware vShpere 4.1, update 1 or greater</para>
</listitem>
<listitem>
<para>Stays the same, even after reboots</para>
</listitem>
<listitem>
<para>Stays allocated, even if you terminate the instance</para>
</listitem>
<listitem>
<para>To see the status of the Private IP addresses you use the following command:
$ nova floating-ip-pool-list</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>To start and stop and instance you can use the following options: (choose all that apply)</title>
<para>
<orderedlist>
<listitem>
<para>Pause/Un-pause</para>
</listitem>
<listitem>
<para>Suspend/Resume</para>
</listitem>
<listitem>
<para>Reboot</para>
</listitem>
<listitem>
<para>Evacuate</para>
</listitem>
<listitem>
<para>Shutdown/Restart</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>To create a network in OpenStack use the following command: $ neutron net-create net1</title>
<para>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>Identity Service provides the following functions: (choose all that apply)</title>
<para>
<orderedlist>
<listitem>
<para>Group policy objects</para>
</listitem>
<listitem>
<para>Message queuing</para>
</listitem>
<listitem>
<para>User management</para>
</listitem>
<listitem>
<para>Publishing</para>
</listitem>
<listitem>
<para>Service catalog</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>The AMQP supports the following messaging bus options: (choose all that apply)</title>
<para>
<orderedlist>
<listitem>
<para>ZeroMQ</para>
</listitem>
<listitem>
<para>RabbitMQ</para>
</listitem>
<listitem>
<para>Tibco Rendezvous</para>
</listitem>
<listitem>
<para>IBM WebSphere Message Broker</para>
</listitem>
<listitem>
<para>Qpid</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>OpenStack uses the term tenant but in earlier versions it used the term customer.</title>
<para>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
</orderedlist>
</para>
</formalpara>
<formalpara>
<title>Associate Training Guide, Controller Node Quiz Answers</title>
<para>
<orderedlist>
<listitem>
<para>B (False) - you can manage images through only the glance and nova clients or the Image
Service and Compute APIs.</para>
</listitem>
<listitem>
<para>B (False) - Keypairs are SSH credentials that are injected into images when they are launched.
For this to work, the image must contain the cloud-init package</para>
</listitem>
<listitem>
<para>A, C, D, E - You can track costs per month by showing metrics like number of VCPUs, disks,
RAM, and uptime of all your instances</para>
</listitem>
<listitem>
<para>A, D, E - The following command-line clients are available for the respective services' APIs:
cinder(python-cinderclient)
Client for the Block Storage service API. Use to create and manage volumes.
glance(python-glanceclient)
Client for the Image Service API. Use to create and manage images.
keystone(python-keystoneclient)
Client for the Identity Service API. Use to create and manage users, tenants, roles, endpoints, and credentials.
nova(python-novaclient)
Client for the Compute API and its extensions. Use to create and manage images, instances, and flavors.
neutron(python-neutronclient)
Client for the Networking API. Use to configure networks for guest servers. This client was previously known as quantum.
swift(python-swiftclient)
Client for the Object Storage API. Use to gather statistics, list items, update metadata, upload, download and delete files stored by the object storage service. Provides access to a swift installation for ad hoc processing.
heat(python-heatclient)</para>
</listitem>
<listitem>
<para>A (True)</para>
</listitem>
<listitem>
<para>A (True)</para>
</listitem>
<listitem>
<para>A, B</para>
</listitem>
<listitem>
<para>B (False) - $ nova keypair-add KEY_NAME > MY_KEY.pem</para>
</listitem>
<listitem>
<para>B (False) - you can launch and instance from an image or a volume</para>
</listitem>
<listitem>
<para>A, B, C</para>
</listitem>
<listitem>
<para>A, B, C, D</para>
</listitem>
<listitem>
<para>A (True)</para>
</listitem>
<listitem>
<para>C, E</para>
</listitem>
<listitem>
<para>A, B, E</para>
</listitem>
<listitem>
<para>B (False) - Because the term project was used instead of tenant in earlier versions of
OpenStack Compute, some command-line tools use --project_id instead of --tenant-id or
--os-tenant-id to refer to a tenant ID.</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</section>
</chapter>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="associate-controller-node">
<?dbhtml stop-chunking?>
<title>Controller Node</title>
<section xml:id="associate-day-one-late-morning-schedule">
<title>Day 1, 11:15 to 12:30, 13:30 to 14:45</title>
<para></para>
</section>
<section xml:id="associate-overview-horizon-cli">
<title>Overview Horizon and OpenStack CLI</title>
<xi:include href="../common/section_overview-horizon-cli.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_overview-horizon-cli']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-keystone-arch">
<title>Keystone Architecture</title>
<xi:include href="../common/section_keystone-arch.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_keystone-arch']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-queues-messaging">
<title>OpenStack Messaging and Queues</title>
<xi:include href="../common/section_queues-messaging.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_queues-messaging']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-controller-node-administration-tasks">
<title>Administration Tasks</title>
<section xml:id="associate-identity-cli-commands">
<title>Identity CI Commands</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_cli_keystone_example_usage.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'example-usage']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-identity-user-management">
<title>Identity User Management</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_keystone-concepts-user-management.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'keystone-user-management']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-glance-cli-commands">
<title>Image CLI Commands</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/cli-reference/generated/ch_cli_glance_commands.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'glanceclient_commands']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-glance-image-list">
<title>Image List Images</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_cli_glance_manage_images.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'glance-image-list']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-glance-image-add">
<title>Image Adding Images</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_cli_glance_manage_images.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'glance_add_image']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-glance-manage-images">
<title>Image Manage Images</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_cli_nova_manage_images.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'nova_manage_images']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-oslo-configuration">
<title>Message Queue Configuration</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/config-reference/compute/section_rpc.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'configuring-rpc']/*[not(self::db:title)])">
</xi:include>
</section>
</section>
</chapter>

View File

@ -1,249 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="associate-getting-started-quiz">
<?dbhtml stop-chunking?>
<title>Getting Started Quiz</title>
<section xml:id="associate-day-one-getting-started-quiz-schedule">
<title>Day 1, 10:40 to 11:00</title>
<formalpara>
<title>Associate Training Guide, Getting Started Quiz Questions</title>
<para>
<orderedlist>
<listitem>
<formalpara>
<title>What are some of the compelling features of a cloud? (choose all that apply)</title>
<para>
<orderedlist>
<listitem>
<para>On-demand self-service</para>
</listitem>
<listitem>
<para>Resource pooling</para>
</listitem>
<listitem>
<para>Metered or measured service</para>
</listitem>
<listitem>
<para>Elasticity</para>
</listitem>
<listitem>
<para>Network access</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>What three service models does cloud computing provide? (choose all that apply)</title>
<para>
<orderedlist>
<listitem>
<para>Software-as-a-Service (SaaS)</para>
</listitem>
<listitem>
<para>Applications-as-a-Service (AaaS)</para>
</listitem>
<listitem>
<para>Hardware-as-a-Service (HaaS)</para>
</listitem>
<listitem>
<para>Infrastructure-as-a-Service (IaaS)</para>
</listitem>
<listitem>
<para>Platform-as-a-Service (PaaS)</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>What does the OpenStack project aim to deliver? (choose all that apply)</title>
<para>
<orderedlist>
<listitem>
<para>Simple to implement cloud solution</para>
</listitem>
<listitem>
<para>Massively scalable cloud solution</para>
</listitem>
<listitem>
<para>Feature rich cloud solution</para>
</listitem>
<listitem>
<para>Multi-vendor interoperability cloud solution</para>
</listitem>
<listitem>
<para>A new hypervisor cloud solution</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>OpenStack code is freely available via the FreeBSD license.</title>
<para>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>OpenStack Swift is Object Storage.</title>
<para>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>OpenStack Networking is now called Quantum.</title>
<para>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>The Image Service (Glance) in OpenStack provides: (Choose all that apply)</title>
<para>
<orderedlist>
<listitem>
<para>Base Templates which users can start new compute instances</para>
</listitem>
<listitem>
<para>Configuration of centralized policies across users and systems</para>
</listitem>
<listitem>
<para>Available images for users to choose from or create their own from existing servers</para>
</listitem>
<listitem>
<para>A central directory of users</para>
</listitem>
<listitem>
<para>Ability to take store snapshots in the Image Service for backup</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>OpenStack APIs are compatible with Amazon EC2 and Amazon S3.</title>
<para>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>Horizon is the OpenStack name for Compute.</title>
<para>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>Which Hypervisors can be supported in OpenStack? (Choose all that apply)</title>
<para>
<orderedlist>
<listitem>
<para>KVM</para>
</listitem>
<listitem>
<para>VMware vShpere 4.1, update 1 or greater</para>
</listitem>
<listitem>
<para>bhyve (BSD)</para>
</listitem>
<listitem>
<para>Xen</para>
</listitem>
<listitem>
<para>LXC</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
</orderedlist>
</para>
</formalpara>
<formalpara>
<title>Associate Training Guide, Getting Started Quiz Answers</title>
<para>
<orderedlist>
<listitem>
<para>A, B, C, D, E</para>
</listitem>
<listitem>
<para>A, D, E</para>
</listitem>
<listitem>
<para>A, B, C</para>
</listitem>
<listitem>
<para>B</para>
</listitem>
<listitem>
<para>A</para>
</listitem>
<listitem>
<para>B</para>
</listitem>
<listitem>
<para>A, C, E</para>
</listitem>
<listitem>
<para>A</para>
</listitem>
<listitem>
<para>B</para>
</listitem>
<listitem>
<para>A, B, D, E</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</section>
</chapter>

View File

@ -1,58 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="associate-getting-started">
<?dbhtml stop-chunking?>
<title>Getting Started</title>
<section xml:id="associate-day-one-morning-schedule">
<title>Day 1, 09:00 to 11:00</title>
<para></para>
</section>
<section xml:id="associate-getting-started-overview">
<title>Overview</title>
<para>Training will take 1 month self paced, (2) 2 week periods with a user group meeting,
or 16 hours instructor led.</para>
<para>Prerequisites</para>
<orderedlist>
<listitem><para>Working knowledge of Linux CLI, basic Linux SysAdmin skills (directory structure, vi, ssh,
installing software)</para></listitem>
<listitem><para>Basic networking knowledge (Ethernet, VLAN, IP addressing)</para></listitem>
<listitem><para>Laptop with VirtualBox installed (highly recommended)</para></listitem>
</orderedlist>
</section>
<section xml:id="associate-intro-text">
<title>Introduction Text</title>
<xi:include href="../common/section_intro-text.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_intro-text']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="associate-brief-overview">
<title>Brief Overview</title>
<xi:include href="../common/section_brief-overview.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_brief-overview']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="associate-official-programs">
<title>Official Programs</title>
<xi:include href="../common/section_official-programs.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_official-programs']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="associate-openstack-architecture">
<title>OpenStack Architecture</title>
<xi:include href="../common/section_openstack-architecture.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_openstack-architecture']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="associate-vm-provisioning-walk-through">
<title>Virtual Machine Provisioning Walk-Through</title>
<xi:include href="../common/section_vm-provisioning-walk-through.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_vm-provisioning-walk-through']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
</chapter>

View File

@ -1,145 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="associate-network-node-quiz">
<?dbhtml stop-chunking?>
<title>Network Node Quiz</title>
<section xml:id="day-two-network-quiz-schedule">
<title>Day 2, 10:40 to 11:00</title>
<formalpara>
<title>Associate Training Guide, Network Node Quiz Questions</title>
<para>
<orderedlist>
<listitem>
<formalpara>
<title>The concept of a plug-in, which is a pluggable back-end implementation of the OpenStack Networking API, is used in OpenStack Networking and nova-network.</title>
<para>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>A plug-in implements the logical API requests with L2-in-L3 tunneling or OpenFlow.</title>
<para>
<orderedlist>
<listitem>
<para>True</para>
</listitem>
<listitem>
<para>False</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>As part of creating a VM, which process communicates with the OpenStack Networking API to plug each virtual NIC on the VM into a particular network:</title>
<para>
<orderedlist>
<listitem>
<para>nova-scheduler</para>
</listitem>
<listitem>
<para>nova-network</para>
</listitem>
<listitem>
<para>nova-compute</para>
</listitem>
<listitem>
<para>nova-quantum</para>
</listitem>
<listitem>
<para>nova-neutron</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>A standard OpenStack Networking setup (like it was presented in this guide) has many distinct physical data center networks: (choose all that apply)</title>
<para>
<orderedlist>
<listitem>
<para>isolated network</para>
</listitem>
<listitem>
<para>cloud network</para>
</listitem>
<listitem>
<para>management network</para>
</listitem>
<listitem>
<para>data network</para>
</listitem>
<listitem>
<para>external-network</para>
</listitem>
<listitem>
<para>API network</para>
</listitem>
<listitem>
<para>datacenter network</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>In this guide, we focused primarily on a standard architecture that includes a “cloud controller” host (Control node), a “network gateway” host (Network node), and a set of hypervisors for running VMs (Compute nodes). For each of the following services identify a host on which it usually runs:</title>
<para>
<orderedlist>
<listitem>
<para>Neutron plugin agent</para>
</listitem>
<listitem>
<para>Neutron L3 agent</para>
</listitem>
<listitem>
<para>Neutron DHCP agent</para>
</listitem>
<listitem>
<para>Neutron server</para>
</listitem>
<listitem>
<para>Neutron metadata agent</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</listitem>
</orderedlist>
</para>
</formalpara>
<formalpara>
<title>Associate Training Guide, Network Node Quiz Answers</title>
<para>
<orderedlist>
<listitem>
<para>B (False) - only OpenStack Networking (Neutron) has a pluggable back-end.</para>
</listitem>
<listitem>
<para>B (False) - a plug-in can use a variety of technologies to implement the logical API requests. Some OpenStack Networking plug-ins might use basic Linux VLANs and IP tables, while others might use more advanced technologies, such as L2-in-L3 tunneling or OpenFlow, to provide similar benefits.</para>
</listitem>
<listitem>
<para>C</para>
</listitem>
<listitem>
<para>C, D, E, F</para>
</listitem>
<listitem>
<para>A - network node, compute nodes, B - network node, C - network node, D - control node, E - network node</para>
</listitem>
</orderedlist>
</para>
</formalpara>
</section>
</chapter>

View File

@ -1,34 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="associate-network-node">
<?dbhtml stop-chunking?>
<title>Network Node</title>
<section xml:id="associate-day-two-morning-schedule">
<title>Day 2, 09:00 to 11:00</title>
<para></para>
</section>
<section xml:id="associate-networking-in-openstack">
<title>Networking in OpenStack</title>
<xi:include href="../common/section_networking-in-openstack.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_networking-in-openstack']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-openstack-networking-concepts">
<title>OpenStack Networking Concepts</title>
<xi:include href="../common/section_openstack-networking-concepts.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_openstack-networking-concepts']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-network-node-administration-tasks">
<title>Administration Tasks</title>
<section xml:id="associate-network-manage">
<title>Manage Networks</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_cli_neutron_manage_networks.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'neutron_client_sample_commands']/*[not(self::db:title)])">
</xi:include>
</section>
</section>
</chapter>

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="associate-object-storage-node-quiz">
<title>Object Storage Node Quiz</title>
<section xml:id="day-two-object-store-quiz-schedule">
<title>Day 2, 14:25 to 14:45</title>
<para></para>
</section>
</chapter>

View File

@ -1,38 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="associate-storage-node">
<?dbhtml stop-chunking?>
<title>Object Storage Node</title>
<section xml:id="associate-day-two-late-morning-schedule">
<title>Day 2, 11:30 to 12:30, 13:30 to 14:45</title>
<para></para>
</section>
<section xml:id="associate-intro-object-store">
<title>Introduction to Object Storage</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_objectstorage-intro.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_objectstorage-intro']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-object-store-features-benefits">
<title>Features and Benefits</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_objectstorage-features.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_objectstorage_features']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-object-store-node-administration-tasks">
<title>Administration Tasks</title>
<section xml:id="associate-object-store-cli-commands">
<title>Object Storage CLI Commands</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/cli-reference/generated/ch_cli_swift_commands.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'swiftclient_commands']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="associate-object-store-manage">
<title>Manage Object Storage</title>
<para>Will be included from the swift developer reference</para>
</section>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="associate-review-concept">
<?dbhtml stop-chunking?>
<title>Review of Concepts</title>
<section xml:id="day-two-review-schedule">
<title>Day 2, 16:00 to 17:00</title>
<para></para>
</section>
</chapter>

View File

@ -1,13 +0,0 @@
Introduction
============
* This folder contains the XML files related to Basic Install Guide.
* Refer to the following etherpad for more details on the design and planning
for the basic install guide section.
https://etherpad.openstack.org/p/training-guides-install-guide
* Please refer the following link to get more information about this project
https://launchpad.net/openstack-training-guides
* Please follow the following wiki to get more information about development
process of Training Guides. This should provide enough information to start
contributing to training guides
https://wiki.openstack.org/wiki/Training-guides

View File

@ -1,4 +0,0 @@
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin_pass
export OS_AUTH_URL="http://192.168.100.51:5000/v2.0/"

View File

@ -1,56 +0,0 @@
#!/bin/bash
#
# License: Apache Software License (ASL) 2.0
# Inspired by
# https://github.com/openstack/keystone/blob/master/tools/sample_data.sh
###############################################################################
# #
# This script adds users and grants them roles #
# #
###############################################################################
HOST_IP=10.10.10.51
ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin_pass}
SERVICE_PASSWORD=${SERVICE_PASSWORD:-service_pass}
export SERVICE_TOKEN="ADMIN"
export SERVICE_ENDPOINT="http://${HOST_IP}:35357/v2.0"
SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-service}
get_id () {
echo $($@ | awk '/ id / { print $4 }')
}
# Tenants
ADMIN_TENANT=$(get_id keystone tenant-create --name=admin)
SERVICE_TENANT=$(get_id keystone tenant-create --name=$SERVICE_TENANT_NAME)
# Users
ADMIN_USER=$(get_id keystone user-create --name=admin --pass="$ADMIN_PASSWORD" --email=admin@domain.com)
# Roles
ADMIN_ROLE=$(get_id keystone role-create --name=admin)
KEYSTONEADMIN_ROLE=$(get_id keystone role-create --name=KeystoneAdmin)
KEYSTONESERVICE_ROLE=$(get_id keystone role-create --name=KeystoneServiceAdmin)
# Add Roles to Users in Tenants
keystone user-role-add --user-id $ADMIN_USER --role-id $ADMIN_ROLE --tenant-id $ADMIN_TENANT
keystone user-role-add --user-id $ADMIN_USER --role-id $KEYSTONEADMIN_ROLE --tenant-id $ADMIN_TENANT
keystone user-role-add --user-id $ADMIN_USER --role-id $KEYSTONESERVICE_ROLE --tenant-id $ADMIN_TENANT
# The Member role is used by Horizon and Swift
MEMBER_ROLE=$(get_id keystone role-create --name=Member)
# Configure service users/roles
NOVA_USER=$(get_id keystone user-create --name=nova --pass="$SERVICE_PASSWORD" --tenant-id $SERVICE_TENANT --email=nova@domain.com)
keystone user-role-add --tenant-id $SERVICE_TENANT --user-id $NOVA_USER --role-id $ADMIN_ROLE
GLANCE_USER=$(get_id keystone user-create --name=glance --pass="$SERVICE_PASSWORD" --tenant-id $SERVICE_TENANT --email=glance@domain.com)
keystone user-role-add --tenant-id $SERVICE_TENANT --user-id $GLANCE_USER --role-id $ADMIN_ROLE
neutron_USER=$(get_id keystone user-create --name=neutron --pass="$SERVICE_PASSWORD" --tenant-id $SERVICE_TENANT --email=neutron@domain.com)
keystone user-role-add --tenant-id $SERVICE_TENANT --user-id $neutron_USER --role-id $ADMIN_ROLE
CINDER_USER=$(get_id keystone user-create --name=cinder --pass="$SERVICE_PASSWORD" --tenant-id $SERVICE_TENANT --email=cinder@domain.com)
keystone user-role-add --tenant-id $SERVICE_TENANT --user-id $CINDER_USER --role-id $ADMIN_ROLE

View File

@ -1,133 +0,0 @@
#!/bin/bash
#
# License: Apache Software License (ASL) 2.0
# Inspired by
# https://github.com/openstack/keystone/blob/master/tools/sample_data.sh
###############################################################################
# #
# This script creates keystone services and endpoints #
# #
###############################################################################
# Host address
HOST_IP=10.10.10.51
EXT_HOST_IP=192.168.100.51
# MySQL definitions
MYSQL_USER=keystoneUser
MYSQL_DATABASE=keystone
MYSQL_HOST=$HOST_IP
MYSQL_PASSWORD=keystonePass
# Keystone definitions
KEYSTONE_REGION=RegionOne
export SERVICE_TOKEN=ADMIN
export SERVICE_ENDPOINT="http://${HOST_IP}:35357/v2.0"
while getopts "u:D:p:m:K:R:E:T:vh" opt; do
case $opt in
u)
MYSQL_USER=$OPTARG
;;
D)
MYSQL_DATABASE=$OPTARG
;;
p)
MYSQL_PASSWORD=$OPTARG
;;
m)
MYSQL_HOST=$OPTARG
;;
K)
MASTER=$OPTARG
;;
R)
KEYSTONE_REGION=$OPTARG
;;
E)
export SERVICE_ENDPOINT=$OPTARG
;;
T)
export SERVICE_TOKEN=$OPTARG
;;
v)
set -x
;;
h)
cat <<EOF
Usage: $0 [-m mysql_hostname] [-u mysql_username] [-D mysql_database] [-p mysql_password]
[-K keystone_master ] [ -R keystone_region ] [ -E keystone_endpoint_url ]
[ -T keystone_token ]
Add -v for verbose mode, -h to display this message.
EOF
exit 0
;;
\?)
echo "Unknown option -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument" >&2
exit 1
;;
esac
done
if [ -z "$KEYSTONE_REGION" ]; then
echo "Keystone region not set. Please set with -R option or set KEYSTONE_REGION variable." >&2
missing_args="true"
fi
if [ -z "$SERVICE_TOKEN" ]; then
echo "Keystone service token not set. Please set with -T option or set SERVICE_TOKEN variable." >&2
missing_args="true"
fi
if [ -z "$SERVICE_ENDPOINT" ]; then
echo "Keystone service endpoint not set. Please set with -E option or set SERVICE_ENDPOINT variable." >&2
missing_args="true"
fi
if [ -z "$MYSQL_PASSWORD" ]; then
echo "MySQL password not set. Please set with -p option or set MYSQL_PASSWORD variable." >&2
missing_args="true"
fi
if [ -n "$missing_args" ]; then
exit 1
fi
keystone service-create --name nova --type compute --description 'OpenStack Compute Service'
keystone service-create --name cinder --type volume --description 'OpenStack Volume Service'
keystone service-create --name glance --type image --description 'OpenStack Image Service'
keystone service-create --name keystone --type identity --description 'OpenStack Identity'
keystone service-create --name ec2 --type ec2 --description 'OpenStack EC2 service'
keystone service-create --name neutron --type network --description 'OpenStack Networking service'
create_endpoint () {
case $1 in
compute)
keystone endpoint-create --region $KEYSTONE_REGION --service-id $2 --publicurl 'http://'"$EXT_HOST_IP"':8774/v2/$(tenant_id)s' --adminurl 'http://'"$HOST_IP"':8774/v2/$(tenant_id)s' --internalurl 'http://'"$HOST_IP"':8774/v2/$(tenant_id)s'
;;
volume)
keystone endpoint-create --region $KEYSTONE_REGION --service-id $2 --publicurl 'http://'"$EXT_HOST_IP"':8776/v1/$(tenant_id)s' --adminurl 'http://'"$HOST_IP"':8776/v1/$(tenant_id)s' --internalurl 'http://'"$HOST_IP"':8776/v1/$(tenant_id)s'
;;
image)
keystone endpoint-create --region $KEYSTONE_REGION --service-id $2 --publicurl 'http://'"$EXT_HOST_IP"':9292/' --adminurl 'http://'"$HOST_IP"':9292/' --internalurl 'http://'"$HOST_IP"':9292/'
;;
identity)
keystone endpoint-create --region $KEYSTONE_REGION --service-id $2 --publicurl 'http://'"$EXT_HOST_IP"':5000/v2.0' --adminurl 'http://'"$HOST_IP"':35357/v2.0' --internalurl 'http://'"$HOST_IP"':5000/v2.0'
;;
ec2)
keystone endpoint-create --region $KEYSTONE_REGION --service-id $2 --publicurl 'http://'"$EXT_HOST_IP"':8773/services/Cloud' --adminurl 'http://'"$HOST_IP"':8773/services/Admin' --internalurl 'http://'"$HOST_IP"':8773/services/Cloud'
;;
network)
keystone endpoint-create --region $KEYSTONE_REGION --service-id $2 --publicurl 'http://'"$EXT_HOST_IP"':9696/' --adminurl 'http://'"$HOST_IP"':9696/' --internalurl 'http://'"$HOST_IP"':9696/'
;;
esac
}
for i in compute volume image object-store identity ec2 network; do
id=$(mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE" -ss -e "SELECT id FROM service WHERE type='"$i"';") || exit 1
create_endpoint $i $id
done

View File

@ -1,288 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="lab_compute-node">
<title>Compute Node</title>
<orderedlist>
<listitem>
<para><emphasis role="bold">Network Diagram:</emphasis></para>
</listitem>
</orderedlist>
<figure>
<title>Network Diagram</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image03.png"
contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<para>Publicly editable image source at <link
xlink:href="https://docs.google.com/drawings/d/1GX3FXmkz3c_tUDpZXUVMpyIxicWuHs5fNsHvYNjwNNk/edit?usp=sharing"
>https://docs.google.com/drawings/d/1GX3FXmkz3c_tUDpZXUVMpyIxicWuHs5fNsHvYNjwNNk/edit?usp=sharing</link></para>
<para><emphasis role="bold">Vboxnet0</emphasis>, <emphasis
role="bold">Vboxnet1</emphasis>, <emphasis role="bold"
>Vboxnet2</emphasis> - are virtual networks set up up by VirtualBox
with your host machine. This is the way the host can
communicate with the virtual machines. These networks are in turn
used by VirtualBox VMs for OpenStack networks, so that
OpenStacks services can communicate with each other.</para>
<para><guilabel>Compute node</guilabel></para>
<para>Start the controller node, which was set up in a previous section.</para>
<note>
<para>After the reboot of the node, the VM may lose internet and network
connectivity. Restart the networking service and use the
<command>ping</command> command to verify the network
connectivity for the given VM.</para>
</note>
<note>
<para>Take regular snapshots of the VirtualBox virtual machines after
each section. In case the VM is broken, you may revert back to the
snapshot to save time and effort.</para>
</note>
<para><guilabel>Controller node</guilabel></para>
<para>
Start the controller node, which was set up in a previous section.
</para>
<para><emphasis role="bold">Preparing Ubuntu 14.04</emphasis></para>
<para><emphasis role="bold">Networking:</emphasis></para>
<para>Configure your network by editing the
<filename>/etc/network/interfaces</filename> file</para>
<itemizedlist>
<listitem>
<para>Open <filename>/etc/network/interfaces</filename> and edit the
file as mentioned:</para>
<programlisting>
# This file is for the OpenStack compute node for the OpenStack training project.
# Note: Selection of the IP addresses is important.
# Any changes to the IP addresses may break OpenStack related services.
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface - VirtualBox NAT connection
# (VirtualBox Network Adapter 1)
auto eth0
iface eth0 inet dhcp
# VirtualBox vboxnet0 - OpenStack management network
# (VirtualBox Network Adapter 2)
auto eth1
iface eth1 inet static
address 10.10.10.53
netmask 255.255.255.0
# VirtualBox vboxnet2 - OpenStack VM data/communication network
# (VirtualBox Network Adapter 3)
auto eth2
iface eth2 inet static
address 10.20.20.53
netmask 255.255.255.0
</programlisting>
</listitem>
<listitem>
<para>After saving the interfaces file, restart the networking
service:</para>
<screen><prompt>#</prompt> <userinput>service networking restart</userinput></screen>
<screen><prompt>#</prompt> <userinput>ifconfig</userinput></screen>
</listitem>
<listitem>
<para>The expected network interface should match with the required IP
addresses as configured above.</para>
</listitem>
</itemizedlist>
<para><emphasis role="bold">SSH from host</emphasis></para>
<itemizedlist>
<listitem>
<para>To SSH into the compute node from the host machine, type the
command below:</para>
<screen><prompt>$</prompt> <userinput>ssh compute@10.10.10.53</userinput></screen>
<screen><prompt>$</prompt> <userinput>sudo su</userinput></screen>
</listitem>
</itemizedlist>
<para><emphasis role="bold">Preparing Ubuntu 14.04</emphasis></para>
<itemizedlist>
<listitem>
<para>After installing Ubuntu Server, switch to the root user</para>
<para>
<screen><prompt>$</prompt> <userinput>sudo su</userinput></screen>
</para>
</listitem>
<listitem>
<para>Add the Icehouse repositories:</para>
<para>
<screen><prompt>#</prompt><userinput>apt-get install ubuntu-cloud-keyring python-software-properties software-properties-common python-keyring</userinput></screen>
<screen><prompt>#</prompt><userinput>add-apt-repository cloud-archive:icehouse</userinput></screen>
</para>
</listitem>
<listitem>
<para>Update your system:</para>
<para>
<screen><prompt>#</prompt><userinput>apt-get update</userinput></screen>
<screen><prompt>#</prompt><userinput>apt-get upgrade</userinput></screen>
<screen><prompt>#</prompt><userinput>apt-get dist-upgrade</userinput></screen>
</para>
</listitem>
<listitem>
<para>Restart the machine for the changes to apply:</para>
<screen><prompt>#</prompt> <userinput>reboot</userinput></screen>
</listitem>
<listitem>
<para>Install vlan and bridge-utils packages:</para>
<screen><prompt>#</prompt> <userinput>apt-get install vlan bridge-utils</userinput></screen>
</listitem>
<listitem>
<para>Install NTP:</para>
<para>
<screen><prompt>#</prompt> <userinput>apt-get install ntp</userinput></screen>
</para>
</listitem>
<listitem>
<para>Configure NTP Server to controller node:</para>
<para>
<screen><prompt>#</prompt> <userinput>sed -i 's/server 0.ubuntu.pool.ntp.org/#server 0.ubuntu.pool.ntp.org/g' /etc/ntp.conf</userinput></screen>
<screen><prompt>#</prompt> <userinput>sed -i 's/server 1.ubuntu.pool.ntp.org/#server 1.ubuntu.pool.ntp.org/g' /etc/ntp.conf</userinput></screen>
<screen><prompt>#</prompt> <userinput>sed -i 's/server 2.ubuntu.pool.ntp.org/#server 2.ubuntu.pool.ntp.org/g' /etc/ntp.conf</userinput></screen>
<screen><prompt>#</prompt> <userinput>sed -i 's/server 3.ubuntu.pool.ntp.org/#server 3.ubuntu.pool.ntp.org/g' /etc/ntp.conf</userinput></screen>
<screen><prompt>#</prompt> <userinput>sed -i 's/server ntp.ubuntu.com/server 10.10.10.51/g'/etc/ntp.conf</userinput></screen>
</para>
</listitem>
<listitem>
<para>Enable IP forwarding by adding the following to <filename>/etc/sysctl.conf</filename>:</para>
<para>
<programlisting>net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0</programlisting>
</para>
</listitem>
<listitem>
<para>Run the following commands:</para>
<para>
<screen><prompt>#</prompt> <userinput>sysctl net.ipv4.ip_forward=1</userinput></screen>
<screen><prompt>#</prompt> <userinput>sysctl net.ipv4.conf.all.rp_filter=0</userinput></screen>
<screen><prompt>#</prompt> <userinput>sysctl net.ipv4.conf.default.rp_filter=0</userinput></screen>
<screen><prompt>#</prompt> <userinput>sysctl -p</userinput></screen>
</para>
</listitem>
</itemizedlist>
<para><emphasis role='bold'>Nova and KVM</emphasis></para>
<itemizedlist>
<listitem>
<para>Install the Compute packages:</para>
<screen><prompt>#</prompt><userinput>apt-get install nova-compute-kvm python-guestfs</userinput></screen>
<screen><prompt>#</prompt><userinput>dpkg-statoverride --update --add root root 0644 /boot/vmlinuz-$(uname -r)</userinput></screen>
</listitem>
<listitem>
<para>Configure <filename>/etc/nova/nova.conf</filename></para>
<para><programlisting>[DEFAULT]
auth_strategy = keystone
rpc_backend = rabbit
rabbit_host = 10.10.10.51
my_ip = 10.10.10.53
vnc_enabled = True
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = 10.10.10.53
novncproxy_base_url = http://10.10.10.51:6080/vnc_auto.html
glance_host = 10.10.10.51
network_api_class = nova.network.neutronv2.api.API
neutron_url = http://10.10.10.51:9696
neutron_auth_strategy = keystone
neutron_admin_tenant_name = service
neutron_admin_username = neutron
neutron_admin_password = service_pass
neutron_admin_auth_url = http://10.10.10.51:35357/v2.0
linuxnet_interface_driver = nova.network.linux_net.LinuxOVSInterfaceDriver
firewall_driver = nova.virt.firewall.NoopFirewallDriver
security_group_api = neutron
[database]
# The SQLAlchemy connection string used to connect to the database
connection = mysql://novaUSER:novaPass@10.10.10.51/nova
[keystone_authtoken]
auth_uri = http://10.10.10.51:5000
auth_host = 10.10.10.51
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = nova
admin_password = service_pass</programlisting></para>
</listitem>
<listitem>
<para>Edit <filename>/etc/nova/nova-compute.conf</filename></para>
<para><programlisting>[libvirt]
virt_type = qemu</programlisting></para>
</listitem>
<listitem>
<para>Restart the Nova Compute Service:</para>
<screen><prompt>#</prompt><userinput>service nova-compute restart</userinput></screen>
</listitem>
</itemizedlist>
<para><emphasis role="bold">Neutron and OVS</emphasis></para>
<itemizedlist>
<listitem>
<para>Install Open vSwitch:</para>
<screen><prompt>#</prompt> <userinput>apt-get install -y neutron-common neutron-plugin-ml2 neutron-plugin-openvswitch-agent</userinput></screen>
</listitem>
<listitem>
<para>Edit <filename>/etc/neutron/plugins/ml2/ml2_conf.ini</filename></para>
<para><programlisting>[ml2]
type_drivers = gre
tenant_network_types = gre
mechanism_drivers = openvswitch
[ml2_type_gre]
tunnel_id_ranges = 1:1000
[ovs]
local_ip = 10.20.20.53
tunnel_type = gre
enable_tunneling = True
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
enable_security_group = True</programlisting></para>
</listitem>
<listitem>
<para>Edit <filename>/etc/neutron/neutron.conf</filename></para>
<para><programlisting>[DEFAULT]
auth_strategy = keystone
rpc_backend = neutron.openstack.common.rpc.impl_kombu
rabbit_host = 10.10.10.51
rabbit_password = RABBIT_PASS
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
[keystone_authtoken]
...
auth_uri = http://10.10.10.51:5000
auth_host = 10.10.10.51
auth_protocol = http
auth_port = 35357
admin_tenant_name = service
admin_user = neutron
admin_password = service_pass</programlisting></para>
</listitem>
<listitem>
<para>Restart all the services:</para>
<para>
<screen><prompt>#</prompt> <userinput>service openvswitch-switch restart</userinput></screen>
</para>
</listitem>
<listitem>
<para>Add the integration bridge:</para>
<screen><prompt>#</prompt><userinput>ovs-vsctl add-br br-int</userinput></screen>
</listitem>
<listitem>
<para><emphasis role="bold">Nova</emphasis></para>
<para>List nova services (Check for the Smiley Faces to know if the services are running):</para>
<screen><prompt>#</prompt> <userinput>nova-manage service list</userinput></screen>
</listitem>
</itemizedlist>
</chapter>

View File

@ -1,598 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="lab_control-node.xml">
<title>Controller node</title>
<para><emphasis role="bold">Network Diagram:</emphasis></para>
<figure>
<title>Network Diagram</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image03.png"
contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<para>Publicly editable image source at <link
xlink:href="https://docs.google.com/drawings/d/1GX3FXmkz3c_tUDpZXUVMpyIxicWuHs5fNsHvYNjwNNk/edit?usp=sharing"
>https://docs.google.com/drawings/d/1GX3FXmkz3c_tUDpZXUVMpyIxicWuHs5fNsHvYNjwNNk/edit?usp=sharing</link></para>
<para><emphasis role="bold">Vboxnet0</emphasis>, <emphasis
role="bold">Vboxnet1</emphasis>, <emphasis role="bold"
>Vboxnet2</emphasis> - are virtual networks setup up by virtual
box with your host machine. This is the way your host can
communicate with the virtual machines. These networks are in turn
used by VirtualBox VMs for OpenStack networks, so
that OpenStacks services can communicate with each other.</para>
<note>
<para>On reboot the node VM may lose internet and network connectivity.
Restart the networking service and use the <command>ping</command>
command to verify the network connectivity for the given VM.</para>
</note>
<note>
<para>To avoid issues on the VirtualBox virtual machine
(controller node), <emphasis role="bold">save the virtual
machine</emphasis> state instead of completing a reboot or
shut down.</para>
</note>
<note>
<para>Take regular snapshots of the VirtualBox virtual machines after
each section. In case the VM is broken, you may revert back to the
snapshot to save time and effort.</para>
</note>
<para><guilabel>Controller node</guilabel></para>
<para>
Start the controller node which was set up in a previous section.
</para>
<para><emphasis role="bold">Preparing Ubuntu 14.04</emphasis></para>
<para><emphasis role="bold">Networking :</emphasis></para>
<para>Configure your network by editing the
<filename>/etc/network/interfaces</filename> file</para>
<itemizedlist>
<listitem>
<para>Open <filename>/etc/network/interfaces</filename> and edit the
file as mentioned:</para>
<programlisting>
# This file is for the OpenStack controller node for OpenStack training project.
# Note: Selection of the IP addresses is important.
# Any changes to the IP addresses may break OpenStack related services.
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface - VirtualBox NAT connection
# (VirtualBox Network Adapter 1)
auto eth0
iface eth0 inet dhcp
# VirtualBox vboxnet0 - OpenStack management network
# (VirtualBox Network Adapter 2)
auto eth1
iface eth1 inet static
address 10.10.10.51
netmask 255.255.255.0
# VirtualBox vboxnet2 - OpenStack API network
# (VirtualBox Network Adapter 3)
auto eth2
iface eth2 inet static
address 192.168.100.51
netmask 255.255.255.0
</programlisting>
</listitem>
<listitem>
<para>After saving the interfaces file, restart the networking
service:</para>
<screen><prompt>#</prompt> <userinput>service networking restart</userinput></screen>
<screen><prompt>#</prompt> <userinput>ifconfig</userinput></screen>
</listitem>
<listitem>
<para>Verify if the network interfaces have the given IP addresses as
configured above.</para>
</listitem>
</itemizedlist>
<para><emphasis role="bold">SSH from host</emphasis></para>
<itemizedlist>
<listitem>
<para>To SSH into the controller node from the host machine, type
the following command.</para>
<screen><prompt>$</prompt> <userinput>ssh control@10.10.10.51</userinput></screen>
<screen><prompt>$</prompt> <userinput>sudo su</userinput></screen>
</listitem>
<listitem>
<para>Now you can have access to your host clipboard.</para>
</listitem>
</itemizedlist>
<para><emphasis role="bold">Update package lists and repository information</emphasis></para>
<screen>
<prompt>#</prompt><userinput>apt-get update</userinput>
</screen>
<para><emphasis role="bold">Update Ubuntu Cloud Archive for Icehouse</emphasis>
</para>
<para>The <link
xlink:href="https://wiki.ubuntu.com/ServerTeam/CloudArchive"
>Ubuntu Cloud Archive</link> is a special repository that
allows you to install newer releases of OpenStack on the
stable supported version of Ubuntu.</para>
<para>Install the Ubuntu Cloud Archive for Icehouse
<screen>
<prompt>#</prompt><userinput>apt-get install ubuntu-cloud-keyring software-properties-common \
python-software-properties</userinput>
<prompt>#</prompt><userinput>add-apt-repository cloud-archive:icehouse</userinput>
</screen>
</para>
<para>Update the package database and upgrade your system:</para>
<screen>
<prompt>#</prompt> <userinput>apt-get update</userinput>
<prompt>#</prompt> <userinput>apt-get dist-upgrade</userinput>
</screen>
<para>Reboot the system for all changes to take effect:</para>
<screen>
<prompt>#</prompt> <userinput>reboot</userinput>
</screen>
<para>Install vlan and bridge-utils packages:</para>
<para>
<screen><prompt>#</prompt> <userinput>apt-get install vlan bridge-utils</userinput></screen>
</para>
<para>Install NTP:</para>
<para>
<screen><prompt>#</prompt> <userinput>apt-get install -y ntp</userinput></screen>
</para>
<para>Configure NTP Server to controller node:</para>
<para>
<screen><prompt>#</prompt> <userinput>sed -i 's/server 0.ubuntu.pool.ntp.org/#server 0.ubuntu.pool.ntp.org/g' /etc/ntp.conf</userinput></screen>
<screen><prompt>#</prompt> <userinput>sed -i 's/server 1.ubuntu.pool.ntp.org/#server 1.ubuntu.pool.ntp.org/g' /etc/ntp.conf</userinput></screen>
<screen><prompt>#</prompt> <userinput>sed -i 's/server 2.ubuntu.pool.ntp.org/#server 2.ubuntu.pool.ntp.org/g' /etc/ntp.conf</userinput></screen>
<screen><prompt>#</prompt> <userinput>sed -i 's/server 3.ubuntu.pool.ntp.org/#server 3.ubuntu.pool.ntp.org/g' /etc/ntp.conf</userinput></screen>
<screen><prompt>#</prompt> <userinput>sed -i 's/server ntp.ubuntu.com/server 10.10.10.51/g'/etc/ntp.conf</userinput></screen>
</para>
<para><emphasis role="bold">MySQL</emphasis></para>
<itemizedlist>
<listitem>
<para>Install MySQL:</para>
<screen>
<prompt>#</prompt>
<userinput>apt-get install -y mysql-server python-mysqldb</userinput>
</screen>
</listitem>
<listitem>
<para>Configure mysql to accept all incoming requests:</para>
<screen>
<prompt>#</prompt> <userinput>sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf</userinput>
</screen>
<screen>
<prompt>#</prompt> <userinput>service mysql restart</userinput></screen>
</listitem>
</itemizedlist>
<para><emphasis role="bold">RabbitMQ</emphasis></para>
<itemizedlist>
<listitem>
<para>Install RabbitMQ:</para>
<screen>
<prompt>#</prompt>
<userinput>apt-get install -y rabbitmq-server</userinput>
</screen>
</listitem>
<listitem>
<para>Create these databases:</para>
<screen><prompt>$</prompt> <userinput>mysql -u root -p</userinput></screen>
<screen><prompt>mysql></prompt> <userinput>CREATE DATABASE keystone;</userinput></screen>
<screen><prompt>mysql></prompt> <userinput>GRANT ALL ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS';</userinput></screen>
<screen><prompt>mysql></prompt> <userinput>CREATE DATABASE glance;</userinput></screen>
<screen><prompt>mysql></prompt> <userinput>GRANT ALL ON glance.* TO 'glance'@'%' IDENTIFIED BY 'GLANCE_DBPASS';</userinput></screen>
<screen><prompt>mysql></prompt> <userinput>CREATE DATABASE neutron;</userinput></screen>
<screen><prompt>mysql></prompt> <userinput>GRANT ALL ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'NEUTRON_DBPASS';</userinput></screen>
<screen><prompt>mysql></prompt> <userinput>CREATE DATABASE nova;</userinput></screen>
<screen><prompt>mysql></prompt> <userinput>GRANT ALL ON nova.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';</userinput></screen>
<screen><prompt>mysql></prompt> <userinput>CREATE DATABASE cinder;</userinput></screen>
<screen><prompt>mysql></prompt> <userinput>GRANT ALL ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'CINDER_DBPASS';</userinput></screen>
<screen><prompt>mysql></prompt> <userinput>quit;</userinput></screen>
</listitem>
</itemizedlist>
<para><emphasis role="bold">Installing Keystone</emphasis></para>
<itemizedlist>
<listitem>
<para>Install the Keystone packages:</para>
<screen><prompt>#</prompt> <userinput>apt-get install -y keystone</userinput></screen>
</listitem>
<listitem>
<para>Adapt the connection attribute in the
<filename>/etc/keystone/keystone.conf</filename> to the new
database:</para>
<programlisting>connection = mysql://keystone:KEYSTONE_DBPASS@10.10.10.51/keystone</programlisting>
</listitem>
<listitem>
<para>Restart the identity service then synchronize the
database:</para>
<screen><prompt>#</prompt> <userinput>service keystone restart</userinput></screen>
<screen><prompt>#</prompt> <userinput>keystone-manage db_sync</userinput></screen>
</listitem>
<listitem>
<para>Fill up the keystone database using the following
scripts:</para>
<para>
<link
xlink:href="http://git.openstack.org/cgit/openstack/training-guides/plain/doc/training-guides/basic-install-guide/keystone-scripts/keystone_basic.sh">
<filename>keystone_basic.sh</filename>
</link></para>
<para>
<link
xlink:href="http://git.openstack.org/cgit/openstack/training-guides/plain/doc/training-guides/basic-install-guide/keystone-scripts/keystone_endpoints_basic.sh">
<filename>keystone_endpoints_basic.sh</filename>
</link></para>
</listitem>
<listitem>
<para>Run scripts:</para>
<screen><prompt>$</prompt> <userinput>chmod +x keystone_basic.sh</userinput></screen>
<screen><prompt>$</prompt> <userinput>chmod +x keystone_endpoints_basic.sh</userinput></screen>
<screen><prompt>$</prompt> <userinput>./keystone_basic.sh</userinput></screen>
<screen><prompt>$</prompt> <userinput>./keystone_endpoints_basic.sh</userinput></screen>
</listitem>
<listitem>
<para>Create a simple credentials file</para>
<programlisting>nano Credentials.sh</programlisting>
</listitem>
<listitem>
<para>Paste the following:</para>
<screen><prompt>$</prompt> <userinput>export OS_TENANT_NAME=admin</userinput></screen>
<screen><prompt>$</prompt> <userinput>export OS_USERNAME=admin</userinput></screen>
<screen><prompt>$</prompt> <userinput>export OS_PASSWORD=admin_pass</userinput></screen>
<screen><prompt>$</prompt> <userinput>export OS_AUTH_URL="http://192.168.100.51:5000/v2.0/"</userinput></screen>
</listitem>
<listitem>
<para>Load the above credentials:</para>
<screen><prompt>$</prompt> <userinput>source Credentials.sh</userinput></screen>
</listitem>
<listitem>
<para>To test Keystone, we use a simple CLI command:</para>
<screen><prompt>$</prompt> <userinput>keystone user-list</userinput></screen>
</listitem>
</itemizedlist>
<para><emphasis role="bold">Glance</emphasis></para>
<para>The OpenStack Glance project provides services for
discovering, registering, and retrieving virtual machine images.
Glance has a RESTful API that allows querying of VM image metadata
as well as retrieval of the actual image.</para>
<para>VM images made available through Glance can be stored in a
variety of locations from simple file systems to object-storage
systems like the OpenStack Swift project.</para>
<para>Glance, as with all OpenStack projects, is written with the
following design guidelines in mind:</para>
<itemizedlist>
<listitem>
<para>Component based architecture: Quickly adds new
behaviors</para>
</listitem>
<listitem>
<para>Highly available: Scales to very serious workloads</para>
</listitem>
<listitem>
<para>Fault tolerant: Isolated processes avoid cascading
failures</para>
</listitem>
<listitem>
<para>Recoverable: Failures should be easy to diagnose, debug,
and rectify</para>
</listitem>
<listitem>
<para>Open standards: Be a reference implementation for a
community-driven api</para>
</listitem>
<listitem>
<para>Install Glance:</para>
<screen><prompt>#</prompt> <userinput>apt-get install -y glance</userinput></screen>
</listitem>
<listitem>
<para>Update
<filename>/etc/glance/glance-api-paste.ini</filename>:</para>
<programlisting>[filter:authtoken]
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory
delay_auth_decision = true
auth_host = 10.10.10.51
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = glance
admin_password = service_pass</programlisting>
</listitem>
<listitem>
<para>Update the
<filename>/etc/glance/glance-registry-paste.ini</filename>:</para>
<programlisting>[filter:authtoken]
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory
auth_host = 10.10.10.51
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = glance
admin_password = service_pass</programlisting>
</listitem>
<listitem>
<para>Update the
<filename>/etc/glance/glance-api.conf</filename>:</para>
<programlisting>
[DEFAULT]
rpc_backend = rabbit
rabbit_host = 10.10.10.51
[database]
sql_connection = mysql://glance:GLANCE_DBPASS@10.10.10.51/glance
[keystone_authtoken]
auth_host = 10.10.10.51
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = glance
admin_password = service_pass
[paste_deploy]
flavor = keystone</programlisting>
</listitem>
<listitem>
<para>Update the
<filename>/etc/glance/glance-registry.conf</filename>:</para>
<programlisting>[database]
sql_connection = mysql://glance:GLANCE_DBPASS@10.10.10.51/glance
[keystone_authtoken]
auth_host = 10.10.10.51
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = glance
admin_password = service_pass
[paste_deploy]
flavor = keystone</programlisting>
</listitem>
<listitem>
<para>Restart the glance-api and glance-registry
services:</para>
<screen><prompt>#</prompt> <userinput>service glance-api restart; service glance-registry restart</userinput></screen>
</listitem>
<listitem>
<para>Synchronize the Glance database:</para>
<screen><prompt>#</prompt> <userinput>glance-manage db_sync</userinput></screen>
</listitem>
<listitem>
<para>To test Glance, upload the “cirros cloud image” directly
from the internet:</para>
<screen><prompt>$</prompt> <userinput>glance image-create --name OS4Y_Cirros --is-public true --container-format bare --disk-format qcow2 --location https://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-x86_64-disk.img</userinput></screen>
</listitem>
<listitem>
<para>Check if the image is successfully uploaded:</para>
<screen><prompt>$</prompt> <userinput>glance image-list</userinput></screen>
</listitem>
</itemizedlist>
<para><emphasis role="bold">Nova</emphasis></para>
<para>Nova is the project name for OpenStack Compute, a cloud
computing fabric controller, the main part of an IaaS system.
Individuals and organizations can use Nova to host and manage
their own cloud computing systems. Nova originated as a project
out of NASA Ames Research Laboratory.</para>
<para>Nova is written with the following design guidelines in
mind:</para>
<para>Install nova components:</para>
<screen>
<prompt>#</prompt> <userinput>apt-get install -y nova-api nova-cert nova-conductor nova-consoleauth nova-novncproxy nova-scheduler python-novaclient</userinput>
</screen>
<itemizedlist>
<listitem>
<para>Edit <filename>/etc/nova/nova.conf</filename></para>
<programlisting>[database]
connection = mysql://nova:NOVA_DBPASS@10.10.10.51/nova
[DEFAULT]
rpc_backend = rabbit
rabbit_host = 10.10.10.51
my_ip = 10.10.10.51
vncserver_listen = 10.10.10.51
vncserver_proxyclient_address = 10.10.10.51
auth_strategy = keystone
network_api_class = nova.network.neutronv2.api.API
neutron_url = http://10.10.10.51:9696
neutron_auth_strategy = keystone
neutron_admin_tenant_name = service
neutron_admin_username = neutron
neutron_admin_password = service_pass
neutron_admin_auth_url = http://10.10.10.51:35357/v2.0
linuxnet_interface_driver = nova.network.linux_net.LinuxOVSInterfaceDriver
firewall_driver = nova.virt.firewall.NoopFirewallDriver
security_group_api = neutron
service_neutron_metadata_proxy = true
neutron_metadata_proxy_shared_secret = OpenStackTraining
[keystone_authtoken]
auth_uri = http://10.10.10.51:5000
auth_host = 10.10.10.51
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = nova
admin_password = service_pass
</programlisting>
</listitem>
<listitem>
<para>Synchronize your database:</para>
<screen><prompt>#</prompt> <userinput>nova-manage db sync</userinput></screen>
</listitem>
<listitem>
<para>Restart nova-* services (all nova services):</para>
<screen><prompt>#</prompt><userinput>service nova-api restart</userinput></screen>
<screen><prompt>#</prompt><userinput>service nova-cert restart</userinput></screen>
<screen><prompt>#</prompt><userinput>service nova-consoleauth restart</userinput></screen>
<screen><prompt>#</prompt><userinput>service nova-scheduler restart</userinput></screen>
<screen><prompt>#</prompt><userinput>service nova-conductor restart</userinput></screen>
<screen><prompt>#</prompt><userinput>service nova-novncproxy restart</userinput></screen>
</listitem>
<listitem>
<para>Check for the smiling faces on
<systemitem class="service">nova-*</systemitem> services to confirm your
installation:</para>
<screen><prompt>#</prompt> <userinput>nova-manage service list</userinput></screen>
</listitem>
</itemizedlist>
<para><emphasis role="bold">Neutron</emphasis></para>
<para>Neutron is an OpenStack project to provide “network
connectivity as a service" between interface devices (e.g., vNICs)
managed by other OpenStack services (e.g., nova).</para>
<itemizedlist>
<listitem>
<para>Install the Neutron Server and the Open vSwitch package
collection:</para>
<screen><prompt>#</prompt> <userinput>apt-get install -y neutron-server neutron-plugin-ml2</userinput></screen>
</listitem>
<listitem>
<para>Edit the
<filename>/etc/neutron/plugins/ml2/ml2_conf.ini</filename>:</para>
<programlisting>[ml2]
type_drivers = gre
tenant_network_types = gre
mechanism_drivers = openvswitch
[ml2_type_gre]
tunnel_id_ranges = 1:1000
[securitygroup]
firewall_driver =
neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
enable_security_group = True</programlisting>
</listitem>
<listitem>
<para>Edit the
<filename>/etc/neutron/api-paste.ini</filename>:</para>
<programlisting>[filter:authtoken]
firewall_driver =
neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriverpaste.
filter_factory = keystoneclient.middleware.auth_token:filter_factory
auth_host = 10.10.10.51
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = neutron
admin_password = service_pass</programlisting>
</listitem>
<listitem>
<para>Edit the
<filename>/etc/neutron/neutron.conf</filename>:</para>
<programlisting>[DEFAULT]
auth_strategy = keystone
rpc_backend = neutron.openstack.common.rpc.impl_kombu
rabbit_host = controller
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True
nova_url = http://controller:8774/v2
nova_admin_username = nova
nova_admin_tenant_id = SERVICE_TENANT_ID
nova_admin_password = NOVA_PASS
nova_admin_auth_url = http://controller:35357/v2.0
[keystone_authtoken]
auth_host = 10.10.10.51
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = neutron
admin_password = service_pass
signing_dir = /var/lib/neutron/keystone-signing
[database]
connection = mysql://neutron:NEUTRON_DBPASS@10.10.10.51/neutron</programlisting>
</listitem>
<listitem>
<para>Restart Nova Services</para>
<screen><prompt>#</prompt> <userinput>service nova-api restart</userinput></screen>
<screen><prompt>#</prompt> <userinput>service nova-scheduler restart</userinput></screen>
<screen><prompt>#</prompt> <userinput>service nova-conductor restart</userinput></screen>
<para>Restart Neutron services:</para>
<screen><prompt>#</prompt> <userinput>service neutron-server restart</userinput></screen>
</listitem>
</itemizedlist>
<para><emphasis role="bold">Cinder</emphasis></para>
<para>Cinder is an OpenStack project that provides “block storage as a
service”.</para>
<itemizedlist>
<listitem>
<para>Install Cinder components:</para>
<screen><prompt>#</prompt> <userinput>apt-get install -y cinder-api cinder-scheduler cinder-volume lvm2</userinput></screen>
</listitem>
<listitem>
<para>Edit <filename>/etc/cinder/cinder.conf</filename>:</para>
<programlisting>[database]
sql_connection = mysql://cinder:CINDER_DBPASS@10.10.10.51/cinder
[keystone_authtoken]
auth_uri = http://10.10.10.51:5000
auth_host = 10.10.10.51
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = cinder
admin_password = service_pass
[DEFAULT]
rpc_backend = cinder.openstack.common.rpc.impl_kombu
rabbit_host = 10.10.10.51
rabbit_port = 5672
rabbit_userid = guest
</programlisting>
</listitem>
<listitem>
<para>Then, synchronize Cinder database:</para>
<screen><prompt>#</prompt> <userinput>cinder-manage db sync</userinput></screen>
</listitem>
<listitem>
<para>Restart Cinder Services</para>
<screen><prompt>#</prompt> <userinput>service cinder-scheduler restart</userinput></screen>
<screen><prompt>#</prompt> <userinput>service cinder-api restart</userinput></screen>
</listitem>
<listitem>
<para>Finally, create a volume group and name it
<literal>cinder-volumes</literal>:</para>
<screen><prompt>#</prompt> <userinput>dd if=/dev/zero of=cinder-volumes bs=1 count=0 seek=2G</userinput></screen>
<screen><prompt>#</prompt> <userinput>losetup /dev/loop2 cinder-volumes</userinput></screen>
<screen><prompt>#</prompt> <userinput>fdisk /dev/loop2</userinput></screen>
<screen><prompt>Command (m for help):</prompt> <userinput>n</userinput></screen>
<screen><prompt>Command (m for help):</prompt> <userinput>p</userinput></screen>
<screen><prompt>Command (m for help):</prompt> <userinput>1</userinput></screen>
<screen><prompt>Command (m for help):</prompt> <userinput>t</userinput></screen>
<screen><prompt>Command (m for help):</prompt> <userinput>8e</userinput></screen>
<screen><prompt>Command (m for help):</prompt> <userinput>w</userinput></screen>
</listitem>
<listitem>
<para>Proceed to create the physical volume then the volume
group:</para>
<screen><prompt>#</prompt> <userinput>pvcreate /dev/loop2</userinput></screen>
<screen><prompt>#</prompt> <userinput>vgcreate cinder-volumes /dev/loop2</userinput></screen>
</listitem>
<listitem>
<note>
<para>Be aware that this volume group gets lost after a system
reboot. If you do not want to perform this step again, make
sure that you save the machine state and do not shut it
down.</para>
</note>
</listitem>
</itemizedlist>
<para><emphasis role="bold">Horizon</emphasis></para>
<para>Horizon is the canonical implementation of OpenStacks
dashboard, which provides a web-based user interface to OpenStack
services including Nova, Swift, Keystone, etc.</para>
<itemizedlist>
<listitem>
<para>To install Horizon, complete these steps:</para>
<screen><prompt>#</prompt> <userinput>apt-get install -y openstack-dashboard memcached</userinput></screen>
</listitem>
<listitem>
<para>If you do not like the OpenStack Ubuntu Theme, you can
remove it with the below command:</para>
<screen><prompt>#</prompt> <userinput>dpkg --purge openstack-dashboard-ubuntu-theme</userinput></screen>
</listitem>
<listitem>
<para>Reload Apache and memcached:</para>
<screen><prompt>#</prompt> <userinput>service apache2 restart; service memcached restart</userinput></screen>
</listitem>
</itemizedlist>
</chapter>

View File

@ -1,61 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="lab_important-terms">
<title>Important terms</title>
<formalpara>
<title>Host Operating System (Host)</title>
<para>The operating system that is installed on your laptop or
desktop that hosts virtual machines. This is commonly referred to as
the host OS or <glossterm>host</glossterm>.
In short, the machine where your VirtualBox is
installed.</para>
</formalpara>
<formalpara>
<title>Guest Operating System (Guest)</title>
<para>The operating system that is installed on your VirtualBox
Virtual Machine. This virtual instance is independent of the
host OS. It is commonly referred to as the <glossterm>guest OS</glossterm>
or guest.</para>
</formalpara>
<formalpara>
<title>Node</title>
<para>In this context, node refers specifically to servers. Each
OpenStack server is a node.</para>
</formalpara>
<formalpara>
<title>Control Node</title>
<para>Hosts the database, Keystone (Middleware), and the servers
for the scope of the current OpenStack deployment. It acts as the
brains behind OpenStack and drives services such as
authentication, database, and so on.</para>
</formalpara>
<formalpara>
<title>Compute Node</title>
<para>Has the required Hypervisor (Qemu/KVM) and is your Virtual
Machine host.</para>
</formalpara>
<formalpara>
<title>Network Node</title>
<para>Provides Network-as-a-Service and virtual networks for
OpenStack.</para>
</formalpara>
<formalpara>
<title>Using OpenSSH</title>
<para>After the network interfaces file has been setup, you can switch
to an SSH session by using an OpenSSH client to log in remotely
to the required server node (Control, Network, Compute). Open a
terminal on your host machine and run the following command:
<screen><prompt>$</prompt> <userinput>ssh-keygen -t rsa</userinput>
<computeroutput>Generating public/private rsa key pair.
Enter the location in which to save the key (/u/kim/.ssh/id_rsa): [RETURN]
Enter passphrase (empty for no passphrase): &lt;can be left empty>
Enter same passphrase again: &lt;can be left empty>
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
b7:18:ad:3b:0b:50:5c:e1:da:2d:6f:5b:65:82:94:c5 xyz@example</computeroutput></screen>
</para>
</formalpara>
</chapter>

View File

@ -1,307 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="lab_network-node">
<title>Network Node</title>
<orderedlist>
<listitem>
<para><emphasis role="bold">Network Diagram:</emphasis></para>
</listitem>
</orderedlist>
<figure>
<title>Network Diagram</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image03.png"
contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<para>Publicly editable image source at <link
xlink:href="https://docs.google.com/drawings/d/1GX3FXmkz3c_tUDpZXUVMpyIxicWuHs5fNsHvYNjwNNk/edit?usp=sharing"
>https://docs.google.com/drawings/d/1GX3FXmkz3c_tUDpZXUVMpyIxicWuHs5fNsHvYNjwNNk/edit?usp=sharing</link></para>
<para><emphasis role="bold">Vboxnet0</emphasis>, <emphasis role="bold">Vboxnet1</emphasis>,
<emphasis role="bold">Vboxnet2</emphasis> - are virtual networks setup up by VirtualBox with
your host machine. This is the way the host can communicate with the virtual machine instances. These
networks are in turn used by VirtualBox VMs for OpenStack networks, so that OpenStacks
services can communicate with each other.</para>
<para><guilabel>Network node</guilabel></para>
<para>Start the controller node which was set up in a previous section.</para>
<note>
<para>On reboot the VirtualBox VM may lose internet and network
connectivity. Restart the networking service and use the
<command>ping</command> command to verify the network
connectivity for the given VM.</para>
</note>
<note>
<para>Take regular snapshots of the VirtualBox virtual machines after
each section. In case the VM is broken, you may revert back to the
snapshot to save time and effort.</para>
</note>
<para><guilabel>Controller node</guilabel></para>
<para>
Start the controller node which was set up in a previous section.
</para>
<para><emphasis role="bold">Preparing Ubuntu 14.04</emphasis></para>
<para><emphasis role="bold">Networking :</emphasis></para>
<para>Configure your network by editing the
<filename>/etc/network/interfaces</filename> file</para>
<itemizedlist>
<listitem>
<para>Open <filename>/etc/network/interfaces</filename> and edit the
file as mentioned:</para>
<programlisting>
# This file is for the OpenStack network node for OpenStack training project.
# Note: Selection of the IP addresses is important.
# Any changes to the IP addresses may break OpenStack related services.
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface - VirtualBox NAT connection
# (VirtualBox Network Adapter 1)
auto eth0
iface eth0 inet dhcp
# VirtualBox vboxnet0 - OpenStack management network
# (VirtualBox Network Adapter 2)
auto eth1
iface eth1 inet static
address 10.10.10.52
netmask 255.255.255.0
# VirtualBox vboxnet2 - OpenStack VM data/communication network
# (VirtualBox Network Adapter 3)
auto eth2
iface eth2 inet static
address 10.20.20.52
netmask 255.255.255.0
# VirtualBox vboxnet3 - For exposing external network
# (VirtualBox Network Adapter 4)
auto eth3
iface eth3 inet static
address 192.168.100.52
netmask 255.255.255.0
</programlisting>
</listitem>
<listitem>
<para>After saving the interfaces file, restart the networking
service:</para>
<screen><prompt>#</prompt> <userinput>service networking restart</userinput></screen>
<screen><prompt>#</prompt> <userinput>ifconfig</userinput></screen>
</listitem>
<listitem>
<para>The expected network interface should match with the required IP
addresses as configured above.</para>
</listitem>
</itemizedlist>
<para><emphasis role="bold">SSH from host</emphasis></para>
<itemizedlist>
<listitem>
<para>Create an SSH keypair for the controller node.</para>
</listitem>
<listitem>
<para>To SSH into the network node from the host machine, type the
command mentioned below.</para>
<screen><prompt>$</prompt> <userinput>ssh network@10.10.10.51</userinput></screen>
<screen><prompt>$</prompt> <userinput>sudo su</userinput></screen>
</listitem>
</itemizedlist>
<para><emphasis role="bold">Preparing Ubuntu 14.04</emphasis></para>
<itemizedlist>
<listitem>
<para>After installing Ubuntu Server, ssh into the VM and change to the root user</para>
<para>
<screen><prompt>$</prompt> <userinput>sudo su</userinput></screen>
</para>
</listitem>
<listitem>
<para>Add Icehouse repositories:</para>
<para>
<screen><prompt>#</prompt><userinput>apt-get install ubuntu-cloud-keyring python-software-properties software-properties-common python-keyring</userinput></screen>
<screen><prompt>#</prompt><userinput>add-apt-repository cloud-archive:icehouse</userinput></screen>
</para>
</listitem>
<listitem>
<para>Update your system:</para>
<para>
<screen><prompt>#</prompt><userinput>apt-get update</userinput></screen>
<screen><prompt>#</prompt><userinput>apt-get upgrade</userinput></screen>
<screen><prompt>#</prompt><userinput>apt-get dist-upgrade</userinput></screen>
</para>
</listitem>
<listitem>
<para>Restart the machine for the changes to apply</para>
<screen><prompt>#</prompt> <userinput>reboot</userinput></screen>
</listitem>
<listitem>
<para>Install vlan and bridge-utils packages:</para>
<screen><prompt>#</prompt> <userinput>apt-get install vlan bridge-utils</userinput></screen>
</listitem>
<listitem>
<para>Install NTP:</para>
<para>
<screen><prompt>#</prompt> <userinput>apt-get install ntp</userinput></screen>
</para>
</listitem>
<listitem>
<para>Configure NTP server to controller node:</para>
<para>
<screen><prompt>#</prompt> <userinput>sed -i 's/server 0.ubuntu.pool.ntp.org/#server0.ubuntu.pool.ntp.org/g' /etc/ntp.conf</userinput></screen>
<screen><prompt>#</prompt> <userinput>sed -i 's/server 1.ubuntu.pool.ntp.org/#server1.ubuntu.pool.ntp.org/g' /etc/ntp.conf</userinput></screen>
<screen><prompt>#</prompt> <userinput>sed -i 's/server 2.ubuntu.pool.ntp.org/#server2.ubuntu.pool.ntp.org/g' /etc/ntp.conf</userinput></screen>
<screen><prompt>#</prompt> <userinput>sed -i 's/server 3.ubuntu.pool.ntp.org/#server3.ubuntu.pool.ntp.org/g' /etc/ntp.conf</userinput></screen>
<screen><prompt>#</prompt> <userinput>sed -i 's/server ntp.ubuntu.com/server 10.10.10.51/g'/etc/ntp.conf</userinput></screen>
</para>
</listitem>
<listitem>
<para>Enable IP forwarding by adding the following to <filename>/etc/sysctl.conf</filename>:</para>
<para>
<programlisting>net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0</programlisting>
</para>
</listitem>
<listitem>
<para>Run the following commands:</para>
<para>
<screen><prompt>#</prompt> <userinput>sysctl net.ipv4.ip_forward=1</userinput></screen>
<screen><prompt>#</prompt> <userinput>sysctl net.ipv4.conf.all.rp_filter=0</userinput></screen>
<screen><prompt>#</prompt> <userinput>sysctl net.ipv4.conf.default.rp_filter=0</userinput></screen>
<screen><prompt>#</prompt> <userinput>sysctl -p</userinput></screen>
</para>
</listitem>
</itemizedlist>
<para><emphasis role="bold">Open vSwitch</emphasis></para>
<itemizedlist>
<listitem>
<para>Install Open vSwitch packages:</para>
<para>
<screen><prompt>#</prompt> <userinput>apt-get install -y openvswitch-switch openvswitch-datapath-dkms</userinput></screen>
<note os="ubuntu">
<para>The Ubuntu version 14.04 or Linux kernel version 3.11 or
newer do not require the
<emphasis>openvswitch-datapath-dkms</emphasis>
package.</para>
</note>
</para>
</listitem>
<listitem>
<para>Create the bridges:</para>
<para>
<screen><prompt>#</prompt> <userinput>ovs-vsctl add-br br-int</userinput></screen>
<screen><prompt>#</prompt> <userinput>ovs-vsctl add-br br-ex</userinput></screen>
</para>
</listitem>
</itemizedlist>
<para><emphasis role="bold">Neutron</emphasis></para>
<itemizedlist>
<listitem>
<para>Neutron:</para>
<para>
<screen><prompt>#</prompt> <userinput>apt-get install neutron-plugin-ml2 neutron-plugin-openvswitch-agent openvswitch-datapath-dkms \
neutron-l3-agent neutron-dhcp-agent</userinput></screen>
</para>
</listitem>
<listitem>
<para>Edit <filename>/etc/neutron/neutron.conf</filename></para>
<para><programlisting>[DEFAULT]
auth_strategy = keystone
rpc_backend = neutron.openstack.common.rpc.impl_kombu
rabbit_host = 10.10.10.51
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
[keystone_authtoken]
auth_uri = http://10.10.10.51:5000
auth_host = 10.10.10.51
auth_protocol = http
auth_port = 35357
admin_tenant_name = service
admin_user = neutron
admin_password = service_pass</programlisting></para>
</listitem>
<listitem>
<para>Edit <filename>/etc/neutron/l3_agent.ini</filename></para>
<para><programlisting>[DEFAULT]
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
use_namespaces = True</programlisting></para>
</listitem>
<listitem>
<para>Edit <filename>/etc/neutron/metadata_agent.ini</filename></para>
<para><programlisting>[DEFAULT]
auth_url = http://10.10.10.51:5000/v2.0
auth_region = regionOne
admin_tenant_name = service
admin_user = neutron
admin_password = service_pass
nova_metadata_ip = 10.10.10.51
metadata_proxy_shared_secret = OpenStackTraining</programlisting></para>
</listitem>
<listitem>
<para>Configure ML2 Plugin by editing the file <filename>/etc/neutron/plugins/ml2/ml2_conf.ini</filename></para>
<para><programlisting>[ml2]
type_drivers = gre
tenant_network_types = gre
mechanism_drivers = openvswitch
[ml2_type_gre]
tunnel_id_ranges = 1:1000
[ovs]
local_ip = 10.20.20.52
tunnel_type = gre
enable_tunneling = True
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
enable_security_group = True</programlisting></para>
</listitem>
<listitem>
<para>Restart OVS service</para>
<screen><prompt>#</prompt><userinput>service openvswitch-switch restart</userinput></screen>
</listitem>
<listitem>
<para>Add the integration bridge</para>
<screen><prompt>#</prompt><userinput>ovs-vsctl add-br br-int</userinput></screen>
<para>Add the external bridge</para>
<screen><prompt>#</prompt><userinput>ovs-vsctl add-br br-ex</userinput></screen>
</listitem>
<listitem>
<para>Edit <filename>/etc/network/interfaces</filename> to make
the following changes:</para>
<programlisting>
# VirtualBox vboxnet2 - OpenStack VM internet access
# (VirtualBox Network Adapter 3)
auto eth3
iface eth3 inet manual
up ifconfig $IFACE 0.0.0.0 up
up ip link set $IFACE promisc on
down ip link set $IFACE promisc off
down ifconfig $IFACE down
# For giving access to network node via. the external network
auto br-ex
iface br-ex inet static
address 192.168.100.52
netmask 255.255.255.0
</programlisting>
</listitem>
<listitem>
<para>Add port to external bridge</para>
<screen><prompt>#</prompt><userinput>ovs-vsctl add-port br-ex eth3</userinput></screen>
</listitem>
<listitem>
<para>Restart neutron services</para>
<screen><prompt>#</prompt><userinput>service neutron-plugin-openvswitch-agent restart</userinput></screen>
<screen><prompt>#</prompt><userinput>service neutron-l3-agent restart</userinput></screen>
<screen><prompt>#</prompt><userinput>service neutron-dhcp-agent restart</userinput></screen>
<screen><prompt>#</prompt><userinput>service neutron-metadata-agent restart</userinput></screen>
</listitem>
</itemizedlist>
</chapter>

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="lab_openstack-production.xml">
<title>OpenStack In Production</title>
<para>More Content To be Added.</para>
</chapter>

View File

@ -1,662 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="lab_virtualbox-basics">
<title>VirtualBox basics</title>
<para><guilabel>Getting Started</guilabel></para>
<para>The following methods are conventional for deploying
OpenStack on VirtualBox for the sake of a test/sandbox or just to
try out OpenStack on commodity hardware.</para>
<para>1. DevStack</para>
<para>2. Vagrant</para>
<para>DevStack and Vagrant bring in some level of automated
deployment as running the scripts will get your VirtualBox
instance configured as the required OpenStack deployment. We
will be manually deploying OpenStack on VirtualBox to
get a better view of how OpenStack works.</para>
<para><guilabel>Prerequisites:</guilabel></para>
<para>Networking and Linux are required to get setup.</para>
<para>The Virtual Machines and Virtual Networks will be given
equal privileges as a physical machine on a physical
network.</para>
<para>For more information, refer to the following
links:</para>
<para>
<emphasis role="bold">OpenStack:</emphasis> <link
xlink:href="http://docs.openstack.org">OpenStack Official
Documentation</link></para>
<para><emphasis role="bold">Networking:</emphasis> Computer
Networks (5th Edition) by Andrew S. Tanenbaum</para>
<para><emphasis role="bold">VirtualBox:</emphasis> <link
xlink:href="http://www.virtualbox.org/manual/UserManual.html">Virtual
Box Manual</link></para>
<para><emphasis role="bold">Requirements:</emphasis></para>
<para>Operating Systems - It is recommended to use Ubuntu Server 14.04 LTS
</para>
<note><para>Older Ubuntu versions may not support Icehouse. Ubuntu Server
12.04 will support Icehouse but is out of scope for this book.
</para></note>
<itemizedlist>
<listitem>
<para>Recommended Requirements:</para>
</listitem>
</itemizedlist>
<informaltable class="c25">
<tbody>
<tr>
<td rowspan="1" colspan="1">VT Enabled PC:</td>
<td rowspan="1" colspan="1">Intel ix or AMD QuadCore</td>
</tr>
<tr>
<td rowspan="1" colspan="1">4 GB RAM:</td>
<td rowspan="1" colspan="1">DDR2/DDR3</td>
</tr>
</tbody>
</informaltable>
<itemizedlist>
<listitem>
<para>Minimum Requirements:</para>
</listitem>
</itemizedlist>
<informaltable class="c25">
<tbody>
<tr>
<td rowspan="1" colspan="1">Non-VT PC's:</td>
<td rowspan="1" colspan="1">Intel Core 2 Duo or AMD Dual
Core</td>
</tr>
<tr>
<td rowspan="1" colspan="1">2GB Ram:</td>
<td rowspan="1" colspan="1">DDR2/DDR3</td>
</tr>
</tbody>
</informaltable>
<para>To check if the processor is VT enabled, install cpu-checker as
follows:</para>
<screen>
<prompt>#</prompt> <userinput>apt-get install cpu-checker</userinput>
<prompt>#</prompt> <userinput>kvm-ok</userinput>
</screen>
<para>If your device does not support VT it will show:</para>
<screen>
<computeroutput>INFO: Your CPU does not support KVM extensions
KVM acceleration can NOT be used</computeroutput>
</screen>
<para>You will still be able to use VirtualBox but the instances
will be very slow.</para>
<para>There are many ways to configure your OpenStack Setup. In this example, we
will deploy OpenStack multi-node using OVS as the network
plug-in and QEMU/KVM as the hypervisor.</para>
<para><emphasis role="bold">Host only connections:</emphasis></para>
<itemizedlist>
<listitem>
<para>Host only connections provide an internal network
between your host and the Virtual Machine instances on your host machine. This network is not traceable
by other networks.</para>
</listitem>
<listitem>
<para>Bridged connections are not recommended.</para>
</listitem>
<listitem>
<para>The following are the host only connections that you
will be setting up later on:</para>
<orderedlist>
<listitem>
<para>vboxnet0 - OpenStack management network - host static IP
10.10.10.1</para>
</listitem>
<listitem>
<para>vboxnet1 - VM conf.network - host static IP
10.20.20.1</para>
</listitem>
<listitem>
<para>vboxnet2 - VM external network access (host
machine) 192.168.100.1</para>
</listitem>
</orderedlist>
</listitem>
</itemizedlist>
<figure>
<title>Network diagram</title>
<mediaobject>
<imageobject>
<imagedata contentwidth="5in" fileref="../figures/lab_virtual-box/image03.png"/>
</imageobject>
</mediaobject>
</figure>
<para>Vboxnet0, Vboxnet1, Vboxnet2 - are virtual networks setup
by virtual box with your host machine. This is the way your host
can communicate with the virtual machines. These networks are in
turn used by virtual box VMs for OpenStack networks, so that
OpenStacks services can communicate with each other.
For details, see the <link
xlink:href="http://www.virtualbox.org/manual/ch06.html#network_hostonly">VirtualBox
documentation</link>
</para>
<section xml:id="lab_virtualbox-basics_setup_virtualbox">
<title>Setup your VM environment</title>
<para>Before you can start configuring your environment you need to
download some of the following stuff:</para>
<orderedlist>
<listitem>
<para><link xlink:href="https://www.virtualbox.org/wiki/Downloads">
Oracle VirtualBox</link></para>
<note><para>You cannot set up an AMD64 VM on a x86 machine.</para></note>
</listitem>
<listitem>
<para><link xlink:href="http://www.ubuntu.com/download/server">
Ubuntu 12.04 Server or Ubuntu 13.04 Server</link></para>
</listitem>
</orderedlist>
<note><para>You need an x86 image for VM's if kvm-ok fails, even
though you are on an AMD64 machine.</para></note>
<note><para>Even though I'm using Ubuntu as host, the same is
applicable to Windows, Mac and other Linux hosts.</para></note>
<itemizedlist>
<listitem>
<para>If you have an i5 or i7 2nd gen processor you can have VT
technology inside VM's provided by VMware. This means that
your OpenStack nodes (which are in turn VM's) will give a
positive result on KVM-OK. (I call it - nesting of type-2
hypervisors). The rest of the configurations remain the same except
for the UI and a few other trivial differences.</para>
</listitem>
</itemizedlist>
</section>
<section xml:id="lab_virtualbox-basics_setup_virtual_networks">
<title>Configure virtual networks</title>
<itemizedlist>
<listitem>
<para>This section of the guide will help you setup your
networks for your Virtual Machine.</para>
</listitem>
<listitem>
<para>Launch VirtualBox</para>
</listitem>
</itemizedlist>
<itemizedlist>
<listitem>
<para>Click on <emphasis role="bold"
>File>Preferences</emphasis> present on the menu bar of
VirtualBox.</para>
</listitem>
<listitem>
<para>Select the <emphasis role="bold">Network
tab</emphasis>.</para>
</listitem>
<listitem>
<para>On the right side you will see an option to add
Host-Only networks.</para>
</listitem>
</itemizedlist>
<figure>
<title>Create host only networks</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image13.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
<itemizedlist>
<listitem>
<para>Create three host-only network connections. As shown
above.</para>
</listitem>
<listitem>
<para>Edit the host-only connections to have the following
settings.</para>
</listitem>
</itemizedlist>
<para><emphasis role="bold">Vboxnet0</emphasis></para>
<informaltable class="c25">
<tbody>
<tr>
<th>Option</th>
<th>Value</th>
</tr>
<tr>
<td>IPv4 Address:</td>
<td>10.10.10.1</td>
</tr>
<tr>
<td>IPv4 Network Mask:</td>
<td>255.255.255.0</td>
</tr>
<tr>
<td>IPv6 Address:</td>
<td>Can be left blank</td>
</tr>
<tr>
<td>IPv6 Network Mask Length:</td>
<td>Can be left blank</td>
</tr>
</tbody>
</informaltable>
<figure>
<title>Vboxnet0</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image19.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
<para><emphasis role="bold">Vboxnet1</emphasis></para>
<informaltable class="c25">
<tbody>
<tr>
<th rowspan="1" colspan="1">Option</th>
<th rowspan="1" colspan="1">Value</th>
</tr>
<tr>
<td rowspan="1" colspan="1">IPv4 Address:</td>
<td rowspan="1" colspan="1">10.20.20.1</td>
</tr>
<tr>
<td rowspan="1" colspan="1">IPv4 Network Mask:</td>
<td rowspan="1" colspan="1">255.255.255.0</td>
</tr>
<tr>
<td rowspan="1" colspan="1">IPv6 Address:</td>
<td rowspan="1" colspan="1">Can be Left Blank</td>
</tr>
<tr>
<td rowspan="1" colspan="1">IPv6 Network Mask Length :</td>
<td rowspan="1" colspan="1">Can be Left Blank</td>
</tr>
</tbody>
</informaltable>
<figure>
<title>Vboxnet1</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image16.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
<para><emphasis role="bold">Vboxnet2</emphasis></para>
<informaltable class="c25">
<tbody>
<tr>
<th rowspan="1" colspan="1">Option</th>
<th rowspan="1" colspan="1">Value</th>
</tr>
<tr>
<td rowspan="1" colspan="1">IPv4 Address:</td>
<td rowspan="1" colspan="1">192.168.100.1</td>
</tr>
<tr>
<td rowspan="1" colspan="1">IPv4 Network Mask:</td>
<td rowspan="1" colspan="1">255.255.255.0</td>
</tr>
<tr>
<td rowspan="1" colspan="1">IPv6 Address:</td>
<td rowspan="1" colspan="1">Can be Left Blank</td>
</tr>
<tr>
<td rowspan="1" colspan="1">IPv6 Network Mask Length :</td>
<td rowspan="1" colspan="1">Can be Left Blank</td>
</tr>
</tbody>
</informaltable>
<figure>
<title>Image: Vboxnet2</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image08.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
</section>
<section xml:id="lab_virtualbox-basics_setup_install_ssh_ftp">
<title>Install SSH and FTP</title>
<itemizedlist>
<listitem>
<para>You may benefit by installing SSH and FTP so that you
can use your remote shell to login into the machine and
use your terminal which is more convenient than using the
Virtual Machines tty through the VirtualBox's UI. You get a
few added features such as copy - paste commands into the
remote terminal, which is not possible directly on the VM.</para>
</listitem>
<listitem>
<para>FTP is for transferring files to and from your local machine
and the virtual machine. You can
also use SFTP or install FTPD on both the HOST and the VM's.</para>
</listitem>
<listitem>
<para>Installation of SSH and FTP with the configuration steps are
out of the scope of this guide.</para>
</listitem>
</itemizedlist>
<note><para>Set up the
networks from inside the VM before trying to SSH and FTP into the
machines.</para>
</note>
</section>
<section xml:id="lab_virtualbox-basics_setup_install_vm_instances">
<title>Install your VM instances</title>
<itemizedlist>
<listitem>
<para>During the installation of the operating systems you will be
asked for custom software to install. You may skip this step
by pressing the <keycap>Enter</keycap> key without selecting
any of the given options.</para>
</listitem>
</itemizedlist>
<warning><para>Please do not install any of the other packages
except for the packages that are mentioned below, unless you are
familiar with the process.</para>
</warning>
</section>
<section xml:id="lab_virtualbox-basics_setup_control_node">
<title>Control node</title>
<para>Create a new virtual machine and select Ubuntu Server.</para>
<figure>
<title>Create new virtual machine</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image11.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
<para>Select the appropriate amount of RAM. For the control node,
the minimum is 512 MB of RAM. For other settings, use the
defaults. The hard disk size can be 8 GB.</para>
<para>Configure the networks</para>
<para>(Ignore the IP Address for now, you will set it up from
inside the VM)</para>
<informaltable class="c25">
<tbody>
<tr>
<th>Network Adapter</th>
<th>Host-Only Adapter Name</th>
<th>IP Address</th>
</tr>
<tr>
<td>eth0</td>
<td>Vboxnet0</td>
<td>10.10.10.51</td>
</tr>
<tr>
<td>eth1</td>
<td>Vboxnet2</td>
<td>192.168.100.51</td>
</tr>
<tr>
<td>eth2</td>
<td>NAT</td>
<td>DHCP</td>
</tr>
</tbody>
</informaltable>
<para><emphasis role="bold">Adapter 1 (Vboxnet0)</emphasis></para>
<figure>
<title>Adapter1 - Vboxnet0</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image07.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
<para><emphasis role="bold">Adapter 2 (Vboxnet2)</emphasis></para>
<figure>
<title>Adapter2 - Vboxnet2</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image18.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
<para><emphasis role="bold">Adapter 3 (NAT)</emphasis></para>
<figure>
<title>Adapter3 - NAT</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image14.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
<para>Now install Ubuntu Server 12.04 or 13.04 on this
machine.</para>
<note><para>Install the SSH server
when asked for custom software to install. The rest of the packages
are not required and may come in the way of the OpenStack packages -
like DNS servers etc. (unless you are an advanced user).</para>
</note>
</section>
<section xml:id="lab_virtualbox-basics_setup_network_node">
<title>Network node</title>
<para>Create a new virtual machine, with the minimum RAM as
512 MB. The remainder can be left as default. The minimum HDD
space is 8 GB.</para>
<figure>
<title>Create New Virtual Machine</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image12.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
<para>Configure the networks</para>
<para>(Ignore the IP Address for now, you will set it up from
inside the VM)</para>
<informaltable class="c25">
<tbody>
<tr>
<th>Network Adapter</th>
<th>Host-Only Adapter Name</th>
<th>IP Address</th>
</tr>
<tr>
<td>eth0</td>
<td>Vboxnet0</td>
<td>10.10.10.52</td>
</tr>
<tr>
<td>eth1</td>
<td>Vboxnet1</td>
<td>10.20.20.52</td>
</tr>
<tr>
<td>eth2</td>
<td>Vboxnet2</td>
<td>192.168.100.52</td>
</tr>
<tr>
<td>eth3</td>
<td>NAT</td>
<td>DHCP</td>
</tr>
</tbody>
</informaltable>
<para><emphasis role="bold">Adapter 1 (Vboxnet0)</emphasis></para>
<figure>
<title>Adapter 1 - Vboxnet0</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image05.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
<para><emphasis role="bold">Adapter 2 (Vboxnet1)</emphasis></para>
<figure>
<title>Adapter2 - Vboxnet1</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image17.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
<para><emphasis role="bold">Adapter 3 (Vboxnet2)</emphasis></para>
<figure>
<title>Adapter3 - Vboxnet2</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image02.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
<para><emphasis role="bold">Adapter 4 (NAT)</emphasis></para>
<figure>
<title>Adapter4 - NAT</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image00.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
<para>Now install Ubuntu Server 12.04 or 13.04 on this
machine.</para>
<note><para>Install the SSH server when you are prompted for the
custom software to install. The rest of the packages are not
required and may come in the way of OpenStack packages - like DNS
servers.</para>
</note>
</section>
<section xml:id="lab_virtualbox-basics_setup_compute_node">
<title>Compute node</title>
<para>Create a virtual machine with at least 1,000 MB RAM and
8 GB HDD. For other settings, use the defaults.</para>
<figure>
<title>Create new virtual machine</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image04.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
<para>Configure the networks</para>
<para>(Ignore the IP Address for now, you will set it up from
inside the VM)</para>
<informaltable class="c25">
<tbody>
<tr>
<th>Network Adapter</th>
<th>Host-Only Adapter Name</th>
<th>IP Address</th>
</tr>
<tr>
<td>eth0</td>
<td>Vboxnet0</td>
<td>10.10.10.53</td>
</tr>
<tr>
<td>eth1</td>
<td>Vboxnet1</td>
<td>10.20.20.53</td>
</tr>
<tr>
<td>eth2</td>
<td>NAT</td>
<td>DHCP</td>
</tr>
</tbody>
</informaltable>
<para><emphasis role="bold">Adapter 1 (Vboxnet0)</emphasis></para>
<figure>
<title>Adapter1 - Vboxnet0</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image15.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
<para><emphasis role="bold">Adapter 2 (Vboxnet1)</emphasis></para>
<figure>
<title>Adapter2 - Vboxnet1</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image10.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
<para><emphasis role="bold">Adapter 3 (NAT)</emphasis></para>
<figure>
<title>Adapter3 - NAT</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/lab_virtual-box/image01.png"
contentwidth="6in"/>
</imageobject>
</mediaobject>
</figure>
<para>Now install Ubuntu Server 12.04 or 13.04 on this
machine.</para>
<note><para>Install the SSH server
when asked for custom software to install. The rest of the packages
are not required and may come in the way of OpenStack packages -
like DNS servers etc.</para>
</note>
</section>
<section xml:id="lab_virtualbox-basics_setup_warnings">
<title>Warnings and advice</title>
<para>Shutting down your Virtual Machine may lead to
malfunctioning OpenStack Services. Do not directly
shutdown your VM, in case your VM's don't have Internet connectivity.</para>
<itemizedlist>
<listitem>
<para>From your VM instance, use the <command>ping</command>
command to verify internet access.</para>
<screen><prompt>$</prompt> <userinput>ping www.google.com</userinput></screen>
</listitem>
<listitem>
<para>If its not connected, restart the networking
service:</para>
<screen><prompt>#</prompt> <userinput>service networking restart</userinput>
<prompt>#</prompt> <userinput>ping www.google.com</userinput></screen>
</listitem>
<listitem>
<para>If this doesn't work, check your network
settings from VirtualBox. Something may be missing or it may be
misconfigured.</para>
</listitem>
<listitem>
<para>This should reconnect the network a majority of the
time. If you still cannot connect, there may be another issue,
or internet access is unavailable.</para>
</listitem>
<listitem>
<para>Note: There are known bugs with the ping under NAT.
Although the latest versions of VirtualBox have better
performance, sometimes ping may not work even if the
Network is connected to the Internet.</para>
</listitem>
</itemizedlist>
<para>Congratulations! You are now setup with the infrastructure for
deploying OpenStack. Just make sure that the Ubuntu Server
is installed on the above setup VirtualBox instances. In the
next section we will go through deploying OpenStack using the
above created VirtualBox instances.</para>
</section>
</chapter>

View File

@ -1,145 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<book xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="bk000-preface">
<title>Start Here</title>
<preface xml:id="preface">
<title>Preface</title>
<?dbhtml stop-chunking?>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_dochistory.xml">
</xi:include>
</preface>
<appendix xml:id="preface_under-construction">
<title>OpenStack Training Guides Are Under Construction</title>
<para>We need your help! This is a community driven project to provide the user group community
access to OpenStack training materials. We cannot make this work without your help.</para>
<para>There are a few ways to get involved. The easiest way is to use the training guides. Look at
the end of each section and you will see the Submit a Bug link. When you find something that can
be improved or fixed, submit a bug by clicking on the link.</para>
<para>If you want to get involved with the effort around OpenStack community training, read on,
here are the options:</para>
<para>
<itemizedlist>
<listitem>
<formalpara><title>Attending a user group using the training materials</title>
<para>The OpenStack community training started at the SFBay OpenStack User Group. More
information on this user group and others using the training guides on the <link
xlink:href="https://wiki.openstack.org/wiki/OpenStackUserGroups">OpenStack User Groups
page</link>.</para>
</formalpara>
</listitem>
<listitem>
<formalpara><title>Teach / Lead a user group using the training materials</title>
<para>Awesome! Your experience will not only give you more experience with OpenStack, but
you will help some people find new jobs. We have put all the information about <link
xlink:href="https://wiki.openstack.org/wiki/OpenStackUserGroups/HowTo#Running_a_Hackathon"
>How To Run An OpenStack Hackathon</link> here.</para></formalpara>
</listitem>
<listitem>
<formalpara>
<title>Help create the training pages</title>
<para>
<itemizedlist>
<listitem>
<para>We are currently working on creating the Associate Training Guide. It is the
first of four training guides. We are using the Install Guide, Administration
Guides, Developer Documentation, and Aptira supplied content as the sources for
most of the Associate Training Guide. The basic idea is that we use XML include
statements to actually use the source content to create new pages. We aim to use
as much of the material as possible from existing documentation. By doing this
we reuse and improve the existing docs. The topics in the Associate Training
Guide are in a bunch of KanBan story board cards. Each card in the story board
represents something that an Associate trainee needs to learn. But first things
first, you need to get some basic tools and accounts installed and configured
before you can really start.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Getting Accounts and Tools:</emphasis> We can't do
this without operators and developers using and creating the content. Anyone can
contribute content. You will need the tools to get started. Go to the
<link xlink:href="http://docs.openstack.org/training-guides/content/operator-getting-started-lab.html#getting-tools-and-accounts">
Getting Tools and Accounts</link> page.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Pick a Bug:</emphasis> Once you have your tools ready
to go, you can assign some work to yourself. Go to the <link xlink:href="https://bugs.launchpad.net/openstack-training-guides">Bugs</link> and assign a bug from the list to yourself.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Create the Content:</emphasis> Each bug
from the list will be a separate chunk of content that you will
add to the openstack-manuals repository openstack-training sub-project.
<link xlink:href="http://docs.openstack.org/training-guides/content/operator-getting-started-lab.html#operator-add-training-content">
More details on creating training content here.</link></para>
</listitem>
</itemizedlist>
</para>
</formalpara>
<note>
<para>Here are more details on committing changes to OpenStack
<link xlink:href="http://docs.openstack.org/training-guides/content/operator-getting-started-lab.html#submit-doc-bug">fixing a documentation bug</link>
, <link xlink:href="http://docs.openstack.org/infra/manual/developers.html#development-workflow">OpenStack Gerrit
Workflow</link>, <link xlink:href="https://wiki.openstack.org/wiki/Documentation/HowTo">OpenStack
Documentation HowTo</link> and , <link xlink:href="http://git-scm.com/doc">Git Documentation</link></para>
</note>
</listitem>
</itemizedlist>
</para>
<para>More details on the OpenStack Training project.</para>
<para>
<orderedlist>
<listitem>
<para><link xlink:href="https://wiki.openstack.org/wiki/Training-manuals">OpenStack Training
Wiki</link> (describes the project in detail)</para>
</listitem>
<listitem>
<para><link
xlink:href="https://blueprints.launchpad.net/openstack-manuals/+spec/training-manuals"
>OpenStack Training blueprint</link>(this is the key project page)</para>
</listitem>
<listitem>
<para><link xlink:href="http://www.meetup.com/openstack/">Bi-Weekly SFBay Hackathon meetup
page</link>(we discuss project details with all team members)</para>
</listitem>
<listitem>
<para><link xlink:href="https://etherpad.openstack.org/sfbay-openstack">Bi-Weekly SFBay
Hackathon Etherpad</link>(meetup notes)</para>
</listitem>
<listitem>
<para><link xlink:href="https://wiki.openstack.org/wiki/Meetings/training-manuals">Core
Training Weekly Meeting Agenda</link>(we review project action items here)</para>
</listitem>
<listitem>
<para><link
xlink:href="https://launchpad.net/openstack-training-guides"
>Training Bugs</link></para>
</listitem>
</orderedlist>
</para>
<para><link xlink:href="https://blueprints.launchpad.net/openstack-manuals/+filebug" xlink:show="new">Submit a bug. Enter the summary as "Training, " with a few words. Be descriptive as possible in the description field. Open the tag pull-down and enter training-manuals.</link>
</para>
</appendix>
<appendix xml:id="building-training-cluster">
<title>Building the Training Cluster</title>
<?dbhtml stop-chunking?>
<section xml:id="important-terms">
<title>Important Terms</title>
<xi:include href="./basic-install-guide/lab_important-terms.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'lab_important-terms']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="virtualbox-scripted">
<title>Building the Training Cluster, Scripted</title>
<xi:include href="./training-cluster-by-script.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'training-cluster-by-script']/*[not(self::db:title)])">
</xi:include>
</section>
<section xml:id="virtualbox-manual">
<title>Building the Training Cluster, Manually</title>
<xi:include href="./basic-install-guide/lab_virtualbox-basics.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'lab_virtualbox-basics']/*[not(self::db:title)])">
</xi:include>
</section>
</appendix>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/app_support.xml"/>
</book>

View File

@ -1,14 +0,0 @@
Introduction
============
* This folder contains the XML files commonly used by all the other Training
Guides.
* If you feel that the XML files in this section can be re-used for other books
under OpenStack-Manuals, you may move them to common folder located in
OpenStack-Manuals.
* Please refer the following link to get more information about this project
https://launchpad.net/openstack-training-guides
* Please follow the following wiki to get more information about development
process of Training Guides. This should provide enough information to start
contributing to training guides
https://wiki.openstack.org/wiki/Training-guides

View File

@ -1,611 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<section xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="operator-editing-code">
<title>Editing Code</title>
<section xml:id="getting-tools-and-accounts">
<title>Get Tools and Accounts</title>
<procedure>
<note>
<para>First create a GitHub account at <link
xlink:href="http://github.com"
>github.com.</link></para>
</note>
<note>
<para>Check out <link
xlink:href="https://wiki.openstack.org/wiki/Documentation/HowTo"
>https://wiki.openstack.org/wiki/Documentation/HowTo</link>
for more extensive setup instructions.</para>
</note>
<step>
<para>Download and install Git from <link
xlink:href="http://git-scm.com/downloads"
>http://git-scm.com/downloads</link>.</para>
</step>
<step>
<para>Create your local repository directory:</para>
<screen><prompt>$</prompt> <userinput>mkdir /Users/<replaceable>username</replaceable>/code/</userinput></screen>
</step>
<step>
<title>Install SourceTree</title>
<substeps>
<step>
<para><link
xlink:href="http://www.sourcetreeapp.com/download/"
>http://www.sourcetreeapp.com/download/</link>.</para>
</step>
<step>
<para>Ignore the Atlassian Bitbucket and Stack
setup.</para>
</step>
<step>
<para>Add your GitHub username and
password.</para>
</step>
<step>
<para>Set your local repository
location.</para>
</step>
</substeps>
</step>
<step>
<title>Install an XML editor</title>
<substeps>
<step>
<para>You can download a 30 day trial of
Oxygen. The floating licenses donated by
OxygenXML have all been handed out.<link
xlink:href="http://www.oxygenxml.com/download_oxygenxml_editor.html"
>http://www.oxygenxml.com/download_oxygenxml_editor.html</link></para>
</step>
<step>
<para>AND/OR PyCharm <link
xlink:href="http://download.jetbrains.com/python/pycharm-community-3.0.1.dmg"
>http://download.jetbrains.com/python/pycharm-community-3.0.1.dmg</link></para>
</step>
<step>
<para>AND/OR You can use emacs or vi
editors.</para>
<para>Here are some great resources on DocBook
and Emacs' NXML mode:</para>
<itemizedlist>
<listitem>
<para><link
xlink:href="http://paul.frields.org/2011/02/09/xml-editing-with-emacs/"
>http://paul.frields.org/2011/02/09/xml-editing-with-emacs/</link></para>
</listitem>
<listitem>
<para><link
xlink:href="https://fedoraproject.org/wiki/How_to_use_Emacs_for_XML_editing"
>https://fedoraproject.org/wiki/How_to_use_Emacs_for_XML_editing</link></para>
</listitem>
<listitem>
<para><link
xlink:href="http://infohost.nmt.edu/tcc/help/pubs/nxml/"
>http://infohost.nmt.edu/tcc/help/pubs/nxml/</link></para>
</listitem>
</itemizedlist>
<para>If you prefer vi, there are ways to make
DocBook editing easier:</para>
<itemizedlist>
<listitem>
<para><link
xlink:href="https://fedoraproject.org/wiki/Editing_DocBook_with_Vi"
>https://fedoraproject.org/wiki/Editing_DocBook_with_Vi</link></para>
</listitem>
</itemizedlist>
</step>
</substeps>
</step>
<step>
<title>Install Maven</title>
<substeps>
<step>
<para>Create the
<filename>apache-maven</filename>
directory:</para>
<screen><prompt>#</prompt> <userinput>mkdir /usr/local/apache-maven</userinput></screen>
</step>
<step>
<para>Copy the latest stable binary from <link
xlink:href="http://maven.apache.org/download.cgi"
>http://maven.apache.org/download.cgi</link>
into
<filename>/usr/local/apache-maven</filename>.</para>
</step>
<step>
<para>Extract the distribution archive to the directory you wish to install Maven:</para>
<screen><prompt>#</prompt> <userinput>cd /usr/local/apache-maven/</userinput>
<prompt>#</prompt> <userinput>tar -xvzf apache-maven-x.x.x-bin.tar.gz</userinput></screen>
<para>The <filename>apache-maven-<replaceable>x.x.x</replaceable></filename> subdirectory is created from the archive file, where <replaceable>x.x.x</replaceable> is your Maven version.</para>
</step>
<step>
<para>Add the M2_HOME environment variable:</para>
<screen><prompt>$</prompt> <userinput>export M2_HOME=/usr/local/apache-maven/apache-maven-x.x.x</userinput></screen>
</step>
<step>
<para>Add the M2 environment variable:</para>
<screen><prompt>$</prompt> <userinput>export M2=$M2_HOME/bin</userinput></screen>
</step>
<step>
<para>Optionally, add the MAVEN_OPTS environment variable to specify JVM properties. Use this environment variable to specify extra options to Maven:</para>
<screen><prompt>$</prompt> <userinput>export MAVEN_OPTS='-Xms256m -XX:MaxPermSize=1024m -Xmx1024m'</userinput></screen>
</step>
<step>
<para>Add the M2 environment variable to your path:</para>
<screen><prompt>$</prompt> <userinput>export PATH=$M2:$PATH</userinput></screen>
</step>
<step>
<para>Make sure that JAVA_HOME is set to the location of your JDK and that $JAVA_HOME/bin is in your PATH environment variable.</para>
</step>
<step>
<para>Run the mvn command to make sure that Maven is correctly installed:</para>
<screen><prompt>$</prompt> <userinput>mvn --version</userinput></screen>
</step>
</substeps>
</step>
<!-- the next five paragraphs were lifted from https://wiki.openstack.org/wiki/Documentation/HowTo#First-time_Contributors, we should figure out how to embed instead -->
<step>
<para>Create a Launchpad account: Visit <link
xlink:href="https://login.launchpad.net/+new_account"
>
https://login.launchpad.net/+new_account</link>.
After you create this account, the follow-up page
is slightly confusing. It does not tell you that
you are done. (It gives you the opportunity to
change your -password, but you do not have
to.)</para>
</step>
<step>
<para>Add at least one SSH key to your account
profile. To do this, follow the instructions on
<link
xlink:href="https://help.launchpad.net/YourAccount/CreatingAnSSHKeyPair"
>
https://help.launchpad.net/YourAccount/CreatingAnSSHKeyPair"</link>.</para>
</step>
<step>
<para>Join The OpenStack Foundation: Visit <link
xlink:href="https://www.openstack.org/join"
>https://www.openstack.org/join</link>. Among
other privileges, this membership enables you to
vote in elections and run for elected positions in
The OpenStack Project. When you sign up for
membership, make sure to give the same e-mail
address you will use for code contributions
because the primary e-mail address in your
foundation profile must match the preferred e-mail
that you set later in your Gerrit contact
information.</para>
</step>
<step>
<para>Validate your Gerrit identity: Add your public
key to your gerrit identity by going to <link
xlink:href="https://review.openstack.org"
>https://review.openstack.org</link>, click
the <guibutton>Sign In</guibutton> link, if you
are not already logged in. At the top-right corner
of the page select settings, then add your public
ssh key under <guibutton> SSH Public
Keys</guibutton>.</para>
<para>The CLA: Every developer and contributor needs
to sign the Individual Contributor License
agreement. Visit <link
xlink:href="https://review.openstack.org/"
>https://review.openstack.org/</link> and
click the <guibutton>Sign In</guibutton> link at
the top-right corner of the page. Log in with your
Launchpad ID. You can preview the text of the
Individual CLA.</para>
</step>
<step>
<para>Add your SSH keys to your GitHub account profile
(the same one that was used in Launchpad). When
you copy and paste the SSH key, include the
ssh-rsa algorithm and computer identifier. If this
is your first time setting up git and Github, be
sure to run these steps in a Terminal
window:</para>
<screen><prompt>$</prompt> <userinput>git config --global user.name "Firstname Lastname"</userinput>
<prompt>$</prompt> <userinput>git config --global user.email "your_email@youremail.com"</userinput></screen>
</step>
<step>
<para>Install git-review. If pip is not already
installed, run <code>easy_install pip</code> as
<systemitem class="username">root</systemitem> to
install it on a Mac or Ubuntu.</para>
<screen><prompt>#</prompt> <userinput>pip install git-review</userinput></screen>
</step>
<step>
<para>Change to the directory:</para>
<screen><prompt>$</prompt> <userinput>cd /Users/<replaceable>username</replaceable>/code</userinput></screen>
</step>
<step>
<para>Clone the openstack-manuals repository:</para>
<screen><prompt>$</prompt> <userinput>git clone http://github.com/openstack/openstack-manuals.git</userinput></screen>
</step>
<step>
<para>Change directory to the pulled repository:</para>
<screen><prompt>$</prompt> <userinput>cd openstack-manuals</userinput></screen>
</step>
<step>
<para>Test the ssh key setup:</para>
<screen><prompt>$</prompt> <userinput>git review -s</userinput></screen>
<para>Then, enter your Launchpad account information.</para>
</step>
</procedure>
</section>
<section xml:id="fix-doc-bug">
<title>Fix a Documentation Bug</title>
<procedure>
<step>
<note><para>For this example, we are going to assume
bug 1188522 and change 33713</para></note>
</step>
<step>
<para>Bring up <link
xlink:href="https://bugs.launchpad.net/openstack-manuals"
>https://bugs.launchpad.net/openstack-manuals</link></para>
</step>
<step>
<para>Select an unassigned bug that you want to fix.
Start with something easy, like a syntax error.</para>
</step>
<step>
<para>Using oXygen, open the <filename>
/Users/<replaceable>username</replaceable>/code/openstack-manuals/doc/admin-guide-cloud/bk-admin-guide-cloud.xml
</filename> master page for this example. It links
together the rest of the material. Find the page
with the bug. Open the page that is referenced in
the bug description by selecting the content in
the author view. Verify you have the correct page
by visually inspecting the html page and the xml
page.</para>
</step>
<step>
<para>In the shell,</para>
<screen><prompt>$</prompt> <userinput>cd /Users/<replaceable>username</replaceable>/code/openstack-manuals/doc/admin-guide-cloud/</userinput></screen>
</step>
<step>
<para>Verify that you are on master:</para>
<screen><prompt>$</prompt> <userinput>git checkout master</userinput></screen>
</step>
<step>
<para>Create your working branch off master:</para>
<screen><prompt>$</prompt> <userinput>git checkout -b bug/1188522</userinput></screen>
</step>
<step>
<para>Verify that you have the branch open through
SourceTree</para>
</step>
<step>
<para>Correct the bug through oXygen. Toggle back and
forth through the different views at the bottom of
the editor.</para>
</step>
<step>
<para>After you fix the bug, run maven to verify that the documentation builds successfully.
To build a specific guide,
look for a <filename>pom.xml</filename> file within a subdirectory, switch to that directory,
then run the <command>mvn</command> command in that directory:</para>
<screen><prompt>$</prompt> <userinput>mvn clean generate-sources</userinput></screen>
</step>
<step>
<para>Verify that the HTML page reflects your changes
properly. You can open the file from the command
line by using the <command>open</command> command</para>
<screen><prompt>$</prompt> <userinput>open target/docbkx/webhelp/local/openstack-training/index.html</userinput></screen>
</step>
<step>
<para>Add the changes:</para>
<screen><prompt>$</prompt> <userinput>git add .</userinput></screen>
</step>
<step>
<para>Commit the changes:</para>
<screen><prompt>$</prompt> <userinput>git commit -a -m "Removed reference to volume scheduler in the computer scheduler config and admin pages, bug 1188522"</userinput></screen>
</step>
<step>
<para>Build committed changes locally by using <command>tox</command>. As part of the review process,
Jenkins runs gating scripts to check that the patch is fine. Locally,
you can use the <command>tox</command> tool to run the same checks and ensure that a patch works.
Install the tox package and run it from the top level directory which has the <filename>tox.ini</filename> file.</para>
<screen><prompt>#</prompt> <userinput>pip install tox</userinput>
<prompt>$</prompt> <userinput>tox</userinput></screen>
<para>Jenkins runs the following four checks. You can run them individually:</para>
<substeps>
<step>
<para>Niceness tests (for example, to see extra whitespaces). Verify that the niceness check succeeds.</para>
<screen><prompt>$</prompt> <userinput>tox -e checkniceness</userinput></screen>
</step>
<step>
<para>Syntax checks. Verify that the syntax check succeeds.</para>
<screen><prompt>$</prompt> <userinput>tox -e checksyntax</userinput></screen>
</step>
<step>
<para>Check that no deleted files are referenced. Verify that the check succeeds.</para>
<screen><prompt>$</prompt> <userinput>tox -e checkdeletions</userinput></screen>
</step>
<step>
<para>Build the manuals. It also generates a directory <filename>publish-docs/</filename> that contains the built files for inspection.
You can also use <filename>doc/local-files.html</filename> for looking at the manuals.
Verify that the build succeeds.</para>
<screen><prompt>$</prompt> <userinput>tox -e checkbuild</userinput></screen>
</step>
</substeps>
</step>
<step>
<para>Submit the bug fix to Gerrit:</para>
<screen><prompt>$</prompt> <userinput>git review</userinput></screen>
</step>
<step>
<para>Track the Gerrit review process at<link
xlink:href="https://review.openstack.org/#/c/33713"
>https://review.openstack.org/#/c/33713</link>.
Follow and respond inline to the Code Review
requests and comments.</para>
</step>
<step>
<para>Your change will be tested, track the Jenkins
testing process at <link
xlink:href="https://jenkins.openstack.org">
https://jenkins.openstack.org</link></para>
</step>
<step>
<para>If your change is rejected, complete the
following steps:</para>
<substeps>
<step>
<para>Respond to the inline comments if
any.</para>
</step>
<step>
<para>Update the status to work in
progress.</para>
</step>
<step>
<para>Checkout the patch from the Gerrit
change review:</para>
<screen><prompt>$</prompt> <userinput>git review -d 33713</userinput></screen>
</step>
<step>
<para>Follow the recommended tweaks to the
files.</para>
</step>
<step>
<para>Rerun:</para>
<screen><prompt>$</prompt> <userinput>mvn clean generate-sources</userinput></screen>
</step>
<step>
<para>Add your additional changes to the
change log:</para>
<screen><prompt>$</prompt> <userinput>git commit -a --amend</userinput></screen>
</step>
<step>
<para>Final commit:</para>
<screen><prompt>$</prompt> <userinput>git review</userinput></screen>
</step>
<step>
<para>Update the Jenkins status to change
completed.</para>
</step>
</substeps>
</step>
<step>
<para>Follow the jenkins build progress at <link
xlink:href="https://jenkins.openstack.org/view/Openstack-manuals/"
>
https://jenkins.openstack.org/view/Openstack-manuals/
</link>. Note if the build process fails, the
online documentation will not reflect your bug
fix.</para>
</step>
</procedure>
</section>
<section xml:id="submit-doc-bug">
<title>Submit a Documentation Bug Fix</title>
<procedure>
<step>
<para>Bring up <link
xlink:href="https://bugs.launchpad.net/openstack-manuals/+filebug"
>https://bugs.launchpad.net/openstack-manuals/+filebug</link>.</para>
</step>
<step>
<para>Give your bug a descriptive name.</para>
</step>
<step>
<para>Verify if asked that it is not a duplicate.</para>
</step>
<step>
<para>Add some more detail into the description field.</para>
</step>
<step>
<para>Once submitted, select the assigned to pane and select
"assign to me" or "sarob".</para>
</step>
<step>
<para>Follow the instructions for fixing a bug in the Fix a
Documentation Bug section.</para>
</step>
</procedure>
</section>
<section xml:id="create-branch">
<title>Create a Branch</title>
<note>
<para>This section uses the submission of this training material as the example.</para>
</note>
<procedure>
<step>
<para>Create a bp/training-manuals branch:</para>
<screen><prompt>$</prompt> <userinput>git checkout -b bp/training-manuals</userinput></screen>
</step>
<step>
<para>From the openstack-manuals repository, use
the template <filename
>user-story-includes-template.xml</filename> as
the starting point for your user story. File
<filename>bk001-ch003-associate-general.xml</filename>
has at least one other included user story that
you can use for additional help.
</para>
</step>
<step>
<para>Include the user story xml file into the <filename
>bk001-ch003-associate-general.xml</filename> file. Follow the syntax of the
existing <code>xi:include</code> statements.</para>
</step>
<step>
<para>When your editing is completed. Double check Oxygen doesn't have any errors you
are not expecting.</para>
</step>
<step>
<para>Run maven locally to verify the build will run without errors.
Look for a <filename>pom.xml</filename> file within a subdirectory, switch to that directory,
then run the <command>mvn</command> command in that directory:</para>
<screen><prompt>$</prompt> <userinput>mvn clean generate-sources</userinput></screen>
</step>
<step>
<para>Add your changes into git:</para>
<screen><prompt>$</prompt> <userinput>git add .</userinput></screen>
</step>
<step>
<para>Commit the changes with good syntax. After
entering the commit command, VI syntax applies,
use "i" to insert and Esc to break out. ":wq" to
write and quit.</para>
<screen><prompt>$</prompt> <userinput>git commit -a</userinput>
<computeroutput>my very short summary
more details go here. A few sentences would be nice.
blueprint training-manuals</computeroutput></screen>
</step>
<step>
<para>Build committed changes locally using <command>tox</command>. As part of the review process,
Jenkins runs gating scripts to check that the patch is fine. Locally,
you can use the <command>tox</command> tool to run the same checks and ensure that a patch works.
Install the tox package and run it from the top level directory which has the <filename>tox.ini</filename> file.</para>
<screen><prompt>#</prompt> <userinput>pip install tox</userinput>
<prompt>$</prompt> <userinput>tox</userinput></screen>
</step>
<step>
<para>Submit your patch for review:</para>
<screen><prompt>$</prompt> <userinput>git review</userinput></screen>
</step>
<step>
<para>One last step. Go to the review page listed after you submitted your review
and add the training core team as reviewers; Sean Roberts and Colin McNamara.</para>
</step>
<step>
<para>More details on branching can be found here under <link
xlink:href="http://docs.openstack.org/infra/manual/developers.html#development-workflow">Gerrit
Workflow</link> and the <link xlink:href="http://git-scm.com/doc">Git
docs</link>.</para>
</step>
</procedure>
</section>
<section xml:id="add-training-content">
<title>Add Content to the Training Manuals</title>
<procedure>
<step>
<para><emphasis role="bold">Getting Accounts and
Tools:</emphasis> We cannot do this without
operators and developers using and creating the
content. Anyone can contribute content. You will
need the tools to get started. Go to the <link
xlink:href="http://docs.openstack.org/trunk/openstack-training/content/getting-tools-and-accounts.html"
>Getting Tools and Accounts</link>
page.</para>
</step>
<step>
<para><emphasis role="bold">Pick a bug:</emphasis>
Once you have your tools ready to go, you can
assign a bug to yourself. Go to the <link
xlink:href="https://bugs.launchpad.net/openstack-training-guides"
>Training Bugs</link> and assign a bug from the list to yourself.</para>
</step>
<step>
<para>Open the file <emphasis role="bold"
>st-training-guides.xml</emphasis> with your
XML editor. All the content starts with the set
file <filename>st-training-guides.xml</filename>.
The XML structure follows the hierarchy Set ->
Book -> Chapter -> Section. The
<filename>st-training-guides.xml</filename>
file holds the set level. Notice the set file uses
<code>xi:include</code> statements to include
the books. We want to open the associate book.
Open the associate book and you will see the
chapter include statements. These are the chapters
that make up the Associate Training Guide
book.</para>
</step>
<step>
<para>Create a branch by using the bug number as
<emphasis role="bold"
>associate-card-<replaceable>XXX</replaceable></emphasis>
where <replaceable>XXX</replaceable> is the bug
number. Review <link
xlink:href="http://docs.openstack.org/trunk/openstack-training/content/operator-create-branch.html"
>Creating a Branch</link> again for
instructions on how to complete the branch
merge.</para>
</step>
<step>
<para>Copy the
<filename>user-story-includes-template.xml</filename>
to
<filename>associate-card-XXX.xml</filename>.</para>
</step>
<step>
<para>Open the
<filename>bk001-ch003-asssociate-general.xml</filename>
file and add <emphasis role="bold">&lt;xi:include
href="associate-card-XXX.xml"></emphasis>.</para>
</step>
<step>
<para>Side by side, open<emphasis role="bold">
associate-card-XXX.xml</emphasis> with your
XML editor and open the <citetitle>Ubuntu 12.04
Install Guide</citetitle> with your HTML
browser.</para>
</step>
<step>
<para>Find the HTML content to include. Find the XML
file that matches the HTML. Include the whole page
using a simple href like <emphasis role="bold"
>&lt;xi:include
href="associate-card-XXX.xml"></emphasis> or
include a section using xpath like <emphasis
role="bold">&lt;xi:include
href="../basic-install/src/basic-install_controller-common.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook)
xpath(//*[@xml:id =
'controller-os'])"></emphasis> . Review the
<filename>user-story-includes-template.xml</filename>
file for the whole syntax.</para>
</step>
<step>
<para>Copy in other content sources including the
Aptira content, a description of what the section
aims to teach, diagrams, and quizzes. If you
include content from another source like Aptira
content, add a paragraph that references the file
and/or HTTP address from where the content
came.</para>
</step>
<step>
<para>Verify the code is good by running <command>mvn
clean generate-sources</command> and by
reviewing the local HTML in <uri
>file:///Users/<replaceable>username</replaceable>/code/training-guides/doc/training-guides/target/docbkx/webhelp/training-guides/content/</uri>.</para>
</step>
<step>
<para>Merge the branch.</para>
</step>
<step>
<para>The bug will be completed automatically if the commit message references the bug number.</para>
</step>
</procedure>
</section>
</section>

View File

@ -1,249 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="section_block-storage">
<title>OpenStack Block Storage</title>
<para><emphasis role="bold">Block Storage and OpenStack
Compute</emphasis></para>
<para>OpenStack provides two classes of block storage, "ephemeral"
storage and persistent "volumes". Ephemeral storage exists only
for the life of an instance, it will persist across reboots of the
guest operating system but when the instance is deleted so is the
associated storage. All instances have some ephemeral storage.
Volumes are persistent virtualized block devices independent of
any particular instance. Volumes may be attached to a single
instance at a time, but may be detached or reattached to a
different instance while retaining all data, much like a USB
drive.</para>
<para><guilabel>Ephemeral Storage</guilabel></para>
<para>Ephemeral storage is associated with a single unique instance.
Its size is defined by the flavor of the instance.</para>
<para>Data on ephemeral storage ceases to exist when the instance it
is associated with is terminated. Rebooting the VM or restarting
the host server, however, will not destroy ephemeral data. In the
typical use case an instance's root filesystem is stored on
ephemeral storage. This is often an unpleasant surprise for people
unfamiliar with the cloud model of computing.</para>
<para>In addition to the ephemeral root volume all flavors except
the smallest, m1.tiny, provide an additional ephemeral block
device varying from 20G for the m1.small through 160G for the
m1.xlarge by default - these sizes are configurable. This is
presented as a raw block device with no partition table or
filesystem. Cloud aware operating system images may discover,
format, and mount this device. For example the cloud-init package
included in Ubuntu's stock cloud images will format this space as
an ext3 filesystem and mount it on /mnt. It is important to note
this a feature of the guest operating system. OpenStack only
provisions the raw storage.</para>
<para><guilabel>Volume Storage</guilabel></para>
<para>Volume storage is independent of any particular instance and
is persistent. Volumes are user created and within quota and
availability limits may be of any arbitrary size.</para>
<para>When first created volumes are raw block devices with no
partition table and no filesystem. They must be attached to an
instance to be partitioned and/or formatted. Once this is done
they may be used much like an external disk drive. Volumes may
attached to only one instance at a time, but may be detached and
reattached to either the same or different instances.</para>
<para>It is possible to configure a volume so that it is bootable
and provides a persistent virtual instance similar to traditional
non-cloud based virtualization systems. In this use case the
resulting instance may still have ephemeral storage depending on
the flavor selected, but the root filesystem (and possibly others)
will be on the persistent volume and thus state will be maintained
even if the instance is shutdown. Details of this configuration
are discussed in the<link
xlink:href="http://docs.openstack.org/user-guide/content/"
>OpenStack End User Guide</link>.</para>
<para>Volumes do not provide concurrent access from multiple
instances. For that you need either a traditional network
filesystem like NFS or CIFS or a cluster filesystem such as
GlusterFS. These may be built within an OpenStack cluster or
provisioned outside of it, but are not features provided by the
OpenStack software.</para>
<para>The OpenStack Block Storage service works via the interaction
of a series of daemon processes named cinder-* that reside
persistently on the host machine or machines. The binaries can all
be run from a single node, or spread across multiple nodes. They
can also be run on the same node as other OpenStack
services.</para>
<para><guilabel>The current services available in OpenStack Block
Storage are:</guilabel></para>
<itemizedlist>
<listitem>
<para><emphasis role="bold">cinder-api</emphasis> - The
cinder-api service is a WSGI app that authenticates and routes
requests throughout the Block Storage system. It supports the
OpenStack API's only, although there is a translation that can
be done via Nova's EC2 interface which calls in to the
cinderclient.</para>
</listitem>
</itemizedlist>
<itemizedlist>
<listitem>
<para><emphasis role="bold">cinder-scheduler</emphasis> - The
cinder-scheduler is responsible for scheduling/routing
requests to the appropriate volume service. As of Grizzly;
depending upon your configuration this may be simple
round-robin scheduling to the running volume services, or it
can be more sophisticated through the use of the Filter
Scheduler. The Filter Scheduler is the default in Grizzly and
enables filter on things like Capacity, Availability Zone,
Volume Types and Capabilities as well as custom
filters.</para>
</listitem>
</itemizedlist>
<itemizedlist>
<listitem>
<para><emphasis role="bold">cinder-volume</emphasis> - The
cinder-volume service is responsible for managing Block
Storage devices, specifically the back-end devices
themselves.</para>
</listitem>
</itemizedlist>
<itemizedlist>
<listitem>
<para><emphasis role="bold">cinder-backup</emphasis> - The
cinder-backup service provides a means to back up a Cinder
Volume to OpenStack Object Store (SWIFT).</para>
</listitem>
</itemizedlist>
<para><guilabel>Introduction to OpenStack Block
Storage</guilabel></para>
<para>OpenStack Block Storage provides persistent High Performance
Block Storage resources that can be consumed by OpenStack Compute
instances. This includes secondary attached storage similar to
Amazon's Elastic Block Storage (EBS). In addition images can be
written to a Block Storage device and specified for OpenStack
Compute to use a bootable persistent instance.</para>
<para>There are some differences from Amazon's EBS that one should
be aware of. OpenStack Block Storage is not a shared storage
solution like NFS, but currently is designed so that the device is
attached and in use by a single instance at a time.</para>
<para><guilabel>Backend Storage Devices</guilabel></para>
<para>OpenStack Block Storage requires some form of back-end storage
that the service is built on. The default implementation is to use
LVM on a local Volume Group named "cinder-volumes". In addition to
the base driver implementation, OpenStack Block Storage also
provides the means to add support for other storage devices to be
utilized such as external Raid Arrays or other Storage
appliances.</para>
<para><guilabel>Users and Tenants (Projects)</guilabel></para>
<para>The OpenStack Block Storage system is designed to be used by
many different cloud computing consumers or customers, basically
tenants on a shared system, using role-based access assignments.
Roles control the actions that a user is allowed to perform. In
the default configuration, most actions do not require a
particular role, but this is configurable by the system
administrator editing the appropriate policy.json file that
maintains the rules. A user's access to particular volumes is
limited by tenant, but the username and password are assigned per
user. Key pairs granting access to a volume are enabled per user,
but quotas to control resource consumption across available
hardware resources are per tenant.</para>
<para><guilabel>For tenants, quota controls are available to limit
the:</guilabel></para>
<itemizedlist>
<listitem>
<para>Number of volumes which may be created</para>
</listitem>
<listitem>
<para>Number of snapshots which may be created</para>
</listitem>
<listitem>
<para>Total number of Giga Bytes allowed per tenant (shared
between snapshots and volumes)</para>
</listitem>
</itemizedlist>
<para><guilabel>Volumes Snapshots and Backups</guilabel></para>
<para>This introduction provides a high level overview of the two
basic resources offered by the OpenStack Block Storage service.
The first is Volumes and the second is Snapshots which are derived
from Volumes.</para>
<para><guilabel>Volumes</guilabel></para>
<para>Volumes are allocated block storage resources that can be
attached to instances as secondary storage or they can be used as
the root store to boot instances. Volumes are persistent R/W Block
Storage devices most commonly attached to the compute node via
iSCSI.</para>
<para><guilabel>Snapshots</guilabel></para>
<para>A Snapshot in OpenStack Block Storage is a read-only point in
time copy of a Volume. The Snapshot can be created from a Volume
that is currently in use (via the use of '--force True') or in an
available state. The Snapshot can then be used to create a new
volume via create from snapshot.</para>
<para><guilabel>Backups</guilabel></para>
<para>A Backup is an archived copy of a Volume currently stored in
Object Storage (Swift).</para>
<para><guilabel>Managing Volumes</guilabel></para>
<para>Cinder is the OpenStack service that allows you to give extra
block level storage to your OpenStack Compute instances. You may
recognize this as a similar offering from Amazon EC2 known as
Elastic Block Storage (EBS). The default Cinder implementation is
an iSCSI solution that employs the use of Logical Volume Manager
(LVM) for Linux. Note that a volume may only be attached to one
instance at a time. This is not a shared storage solution like a
SAN of NFS on which multiple servers can attach to. It's also
important to note that Cinder also includes a number of drivers to
allow you to use a number of other vendor's back-end storage
devices in addition to or instead of the base LVM
implementation.</para>
<para>Here is brief walk-through of a simple create/attach sequence,
keep in mind this requires proper configuration of both OpenStack
Compute via cinder.conf and OpenStack Block Storage via
cinder.conf.</para>
<orderedlist>
<listitem>
<para>The volume is created via cinder create; which creates
an LV into the volume group (VG) "cinder-volumes"</para>
</listitem>
<listitem>
<para>The volume is attached to an instance via nova
volume-attach; which creates a unique iSCSI IQN that will be
exposed to the compute node</para>
</listitem>
<listitem>
<para>The compute node which run the concerned instance has
now an active ISCSI session; and a new local storage
(usually a /dev/sdX disk)</para>
</listitem>
<listitem>
<para>libvirt uses that local storage as a storage for the
instance; the instance get a new disk (usually a /dev/vdX
disk)</para>
</listitem>
</orderedlist>
<para><guilabel>Block Storage Capabilities</guilabel></para>
<itemizedlist>
<listitem>
<para>OpenStack provides persistent block level storage
devices for use with OpenStack compute instances.</para>
</listitem>
<listitem>
<para>The block storage system manages the creation, attaching
and detaching of the block devices to servers. Block storage
volumes are fully integrated into OpenStack Compute and the
Dashboard allowing for cloud users to manage their own
storage needs.</para>
</listitem>
<listitem>
<para>In addition to using simple Linux server storage, it has
unified storage support for numerous storage platforms
including Ceph, NetApp, Nexenta, SolidFire, and
Zadara.</para>
</listitem>
<listitem>
<para>Block storage is appropriate for performance sensitive
scenarios such as database storage, expandable file systems,
or providing a server with access to raw block level
storage.</para>
</listitem>
<listitem>
<para>Snapshot management provides powerful functionality for
backing up data stored on block storage volumes. Snapshots
can be restored or used to create a new block storage
volume.</para>
</listitem>
</itemizedlist>
</chapter>

View File

@ -1,92 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="section_brief-overview">
<title>Brief Overview</title>
<para>OpenStack is a cloud operating system that controls large
pools of compute, storage, and networking resources throughout a
datacenter. It is all managed through a dashboard called Horizon, that gives
administrators control while empowering their users to provision
resources through a web interface.</para>
<para>OpenStack is a global collaboration of developers and cloud
computing technologists, producing the ubiquitous open source cloud
computing platform for public and private clouds. The project aims
to deliver solutions for all types of clouds by being</para>
<itemizedlist>
<listitem>
<para>simple to implement</para>
</listitem>
<listitem>
<para>massively scalable</para>
</listitem>
<listitem>
<para>feature rich</para>
</listitem>
</itemizedlist>
<para>To check out more information on OpenStack visit <link
xlink:href="http://www.openstack.org/"
>http://www.openstack.org/</link></para>
<para><guilabel> OpenStack Foundation:</guilabel></para>
<para>The OpenStack Foundation, established in September of 2012, is an
independent body, providing shared resources to help achieve the
OpenStack Mission by protecting, empowering, and promoting
OpenStack software and the community around it. This includes users,
developers and the entire ecosystem. For more information visit
<link xlink:href="http://www.openstack.org/foundation"
>http://www.openstack.org/foundation</link>.</para>
<para><guilabel> Who's behind OpenStack? </guilabel></para>
<para>Founded by Rackspace Hosting and NASA, OpenStack has grown
to be a global software community of developers collaborating on
a standard and massively scalable open source cloud operating
system. The OpenStack Foundation promotes the development,
distribution and adoption of the OpenStack cloud operating
system. As the independent home for OpenStack, the Foundation
has already attracted more than 7,000 individual members from
100 countries and 850 different organizations. It has also secured more than
$10 million in funding and is ready to fulfill the OpenStack
mission of becoming the ubiquitous cloud computing platform.
Checkout <link xlink:href="http://www.openstack.org/foundation"
>http://www.openstack.org/foundation</link>for more information.</para>
<figure>
<title>Nebula (NASA)</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image23.jpg"/>
</imageobject>
</mediaobject>
</figure>
<para>The goal of the OpenStack Foundation is to serve developers,
users, and the entire ecosystem by providing a set of shared
resources to grow the footprint of public and private OpenStack
clouds, enable technology vendors targeting the platform and
assist developers in producing the best cloud software in the
industry.</para>
<para><guilabel>Who uses OpenStack?</guilabel></para>
<para>Corporations, service providers, VARS, SMBs, researchers,
and global data centers looking to deploy large-scale cloud
deployments for private or public clouds, leveraging the support
and resulting technology of a global open source community. This is just
four years into OpenStack, it's new and has immense possibilities.</para>
<para><guilabel>It's Open Source:</guilabel></para>
<para>All of the code for OpenStack is freely available under the
Apache 2.0 license. Anyone can run it, build on it, or submit
changes back to the project. This open development model is one
of the best ways to foster badly-needed cloud standards, remove
the fear of proprietary lock-in for cloud customers, and create
a large ecosystem that spans cloud providers.</para>
<para><guilabel>Who it's for:</guilabel></para>
<para>Enterprises, service providers, government and academic
institutions with physical hardware that would like to build a
public or private cloud.</para>
<para><guilabel>How it's being used today:</guilabel></para>
<para>Organizations like CERN, Cisco WebEx, DreamHost, eBay, The
Gap, HP, MercadoLibre, NASA, PayPal, Rackspace and University of
Melbourne have deployed OpenStack clouds to achieve control,
business agility and cost savings without the licensing fees and
terms of proprietary software. For complete user stories visit
<link xlink:href="http://www.openstack.org/user-stories"
>http://www.openstack.org/user-stories</link>, this should give you a good idea
about the importance of OpenStack.</para>
</chapter>

View File

@ -1,80 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="section_floating-ips">
<title>Floating IP Addresses And Security Rules</title>
<para>OpenStack Networking has the concept of Fixed IPs and
Floating IPs. Fixed IPs are assigned to an instance on
creation and stay the same until the instance is explicitly
terminated. Floating IPs are IP addresses that can be
dynamically associated with an instance. This address can be
disassociated and associated with another instance at any
time.</para>
<para>Various tasks carried out by Floating IPs as of
now.</para>
<itemizedlist>
<listitem>
<para>create IP ranges under a certain group, only
available for admin role.</para>
</listitem>
<listitem>
<para>allocate a floating IP to a certain tenant,
only available for admin role.</para>
</listitem>
<listitem>
<para>deallocate a floating IP from a certain
tenant</para>
</listitem>
<listitem>
<para>associate a floating IP to a given
instance</para>
</listitem>
<listitem>
<para>disassociate a floating IP from a certain
instance</para>
</listitem>
</itemizedlist>
<para>Just as shown by the above figure, we will have
nova-network-api to support nova client floating
commands. Nova-network-api will invoke neutron cli lib
to interact with the neutron server via API. The data
for the floating IPs will be stored in the neutron DB.
Neutron Agent, which is running on the compute host will
enforce the floating IP.</para>
<para><guilabel>Multiple Floating
IP Pools</guilabel></para>
<para>The L3 API in OpenStack Networking supports multiple
floating IP pools. In OpenStack Networking, a floating
IP pool is represented as an external network and a
floating IP is allocated from a subnet associated with
the external network. Since each L3 agent can be
associated with at most one external network, we need
to invoke multiple L3 agent to define multiple
floating IP pools. 'gateway_external_network_id'in L3
agent configuration file indicates the external
network that the L3 agent handles. You can run
multiple L3 agent instances on one host.</para>
<para>In addition, when you run multiple L3 agents, make
sure that handle_internal_only_routers is set to
True only for one L3 agent in an OpenStack Networking
deployment and set to False for all other L3 agents.
Since the default value of this parameter is True, you
need to configure it carefully.</para>
<para>Before starting L3 agents, you need to create
routers and external networks, then update the
configuration files with UUID of external networks and
start L3 agents.</para>
<para>For the first agent, invoke it with the following
l3_agent.ini where handle_internal_only_routers is
True.</para>
<programlisting>
handle_internal_only_routers = True
external_network_bridge = br-ex
</programlisting>
<programlisting>
$sudo service neutron-l3-agent restart
</programlisting>
<para>For the second (or later) agent, invoke it with the following l3_agent.ini where handle_internal_only_routers is False.</para>
</chapter>

View File

@ -1,108 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="section_intro-text">
<title>Introduction to OpenStack</title>
<para>OpenStack is a cloud operating system that controls large
pools of compute, storage, and networking resources throughout a
data center, all managed through a dashboard that gives
administrators control while empowering users to provision
resources through a web interface.</para>
<para>Cloud computing provides users with access to a shared
collection of computing resources: networks for transfer, servers
for storage, and applications or services for completing
tasks.</para>
<para>The compelling features of a cloud are:</para>
<itemizedlist>
<listitem>
<para>On-demand self-service: Users can automatically provision
needed computing capabilities, such as server time and network
storage, without requiring human interaction with each service
provider.</para>
</listitem>
<listitem>
<para>Network access: Any computing capabilities are available
over the network. Many different devices are allowed access
through standardized mechanisms.</para>
</listitem>
<listitem>
<para>Resource pooling: Multiple users can access clouds that
serve other consumers according to demand.</para>
</listitem>
<listitem>
<para>Elasticity: Provisioning is rapid and scales out or is
based on need.</para>
</listitem>
<listitem>
<para>Metered or measured service: Cloud systems can optimize
and control resource use at the level that is appropriate for
the service. Services include storage, processing, bandwidth,
and active user accounts. Monitoring and reporting of resource
usage provides transparency for both the provider and consumer
of the utilized service.</para>
</listitem>
</itemizedlist>
<para>Cloud computing offers different service models depending on
the capabilities a consumer may require.</para>
<itemizedlist>
<listitem>
<para>SaaS: Software-as-a-Service. Provides the consumer the
ability to use the software in a cloud environment, such as
web-based email for example.</para>
</listitem>
<listitem>
<para>PaaS: Platform-as-a-Service. Provides the consumer the
ability to deploy applications through a programming language
or tools supported by the cloud platform provider. An example
of Platform-as-a-service is an Eclipse/Java programming
platform provided with no downloads required.</para>
</listitem>
<listitem>
<para>IaaS: Infrastructure-as-a-Service. Provides infrastructure
such as computer instances, network connections, and storage
so that people can run any software or operating
system.</para>
</listitem>
</itemizedlist>
<para>Terms such as public cloud or private cloud refer to the
deployment model for the cloud. A private cloud operates for a
single organization, but can be managed on-premise or off-premise.
A public cloud has an infrastructure that is available to the
general public or a large industry group and is likely owned by a
cloud services company.</para>
<para>Clouds can also be described as hybrid. A hybrid cloud can be
a deployment model, as a composition of both public and private
clouds, or a hybrid model for cloud computing may involve both
virtual and physical servers.</para>
<para>Cloud computing can help with large-scale computing needs or
can lead consolidation efforts by virtualizing servers to make
more use of existing hardware and potentially release old hardware
from service. Cloud computing is also used for collaboration
because of its high availability through networked computers.
Productivity suites for word processing, number crunching, and
email communications, and more are also available through cloud
computing. Cloud computing also avails additional storage to the
cloud user, avoiding the need for additional hard drives on each
user's desktop and enabling access to huge data storage capacity
online in the cloud.</para>
<para>When you explore OpenStack and see what it means technically,
you can see its reach and impact on the entire world.</para>
<para>OpenStack is an open source software for building private and
public clouds which delivers a massively scalable cloud operating
system.</para>
<informaltable class="c20">
<tbody>
<tr>
<td rowspan="1" colspan="1">OpenStack is backed up by a global
community of technologists, developers, researchers,
corporations and cloud computing experts.</td>
<td rowspan="1" colspan="1"><inlinemediaobject>
<imageobject>
<imagedata fileref="../figures/image11.png"/>
</imageobject>
</inlinemediaobject></td>
</tr>
</tbody>
</informaltable>
</chapter>

View File

@ -1,230 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="section_keystone-arch">
<title>Keystone Architecture</title>
<!--<para>More Content To be Added ...</para>
<section xml:id="section_keystone-arch-concepts">
<title>Identity Service Concepts</title> -->
<para>The Identity service performs these
functions:</para>
<itemizedlist>
<listitem>
<para>User management: Tracks users and their
permissions.</para>
</listitem>
<listitem>
<para>Service catalog: Provides a catalog of available
services with their API endpoints.</para>
</listitem>
</itemizedlist>
<para>To understand the Identity Service, you must understand these concepts:</para>
<variablelist wordsize="10">
<varlistentry>
<term><emphasis role="bold">User</emphasis></term>
<listitem>
<para>Digital representation of a person, system, or service
who uses OpenStack cloud services. Identity authentication
services will validate that incoming requests are being
made by the user who claims to be making the call. Users
have a login and may be assigned tokens to access
resources. Users may be directly assigned to a particular
tenant and behave as if they are contained in that
tenant.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis role="bold">Credentials</emphasis></term>
<listitem>
<para>Data that is known only by a user that proves who they
are. In the Identity Service, examples are:</para>
<itemizedlist>
<listitem>
<para>Username and password</para>
</listitem>
<listitem>
<para>Username and API key</para>
</listitem>
<listitem>
<para>An authentication token provided by the Identity
Service</para>
</listitem>
</itemizedlist>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis role="bold">Authentication</emphasis></term>
<listitem>
<para>The act of confirming the identity of a user. The
Identity Service confirms an incoming request by
validating a set of credentials supplied by the user.
These credentials are initially a username and password or
a username and API key. In response to these credentials,
the Identity Service issues the user an authentication
token, which the user provides in subsequent
requests.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<emphasis role="bold">Token</emphasis></term>
<listitem>
<para>An arbitrary bit of text that is used to access
resources. Each token has a scope which describes which
resources are accessible with it. A token may be revoked
at anytime and is valid for a finite duration.</para>
<para>While the Identity Service supports token-based
authentication in this release, the intention is for it to
support additional protocols in the future. The intent is
for it to be an integration service foremost, and not
aspire to be a full-fledged identity store and management
solution.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis role="bold">Tenant</emphasis></term>
<listitem>
<para>A container used to group or isolate resources and/or
identity objects. Depending on the service operator, a
tenant may map to a customer, account, organization, or
project.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<emphasis role="bold">Service</emphasis></term>
<listitem>
<para>An OpenStack service, such as Compute (Nova), Object
Storage (Swift), or the Image Service (Glance) provides one
or more endpoints through which users can access resources
and perform operations.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis role="bold">Endpoint</emphasis></term>
<listitem>
<para>A network-accessible address, usually described by
URL, from where you access a service. If using an
extension for templates, you can create an endpoint
template, which represents the templates of all the
consumable services that are available across the
regions.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis role="bold">Role</emphasis></term>
<listitem>
<para>A personality that a user assumes which enables them to
perform a specific set of operations. A role includes a
set of rights and privileges. A user assuming that role
inherits those rights and privileges.</para>
<para>In the Identity Service, a token that is issued to a
user includes the list of roles that a user can assume.
Services that are being called by that user determine how
they interpret the set of roles a user has and which
operations or resources each role grants access to.</para>
<figure>
<title>Keystone Authentication</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image19.png" contentwidth="4in" scale="50" width="4in"/>
</imageobject>
</mediaobject>
</figure>
</listitem>
</varlistentry>
<varlistentry>
<term>
<emphasis role="bold">User management</emphasis></term>
<listitem>
<para>The main components of Identity user management
are:</para>
<itemizedlist>
<listitem>
<para>Users</para>
</listitem>
<listitem>
<para>Tenants</para>
</listitem>
<listitem>
<para>Roles</para>
</listitem>
</itemizedlist>
<para>A user represents a human user, and has associated
information such as username, password and email. This
example creates a user named "alice":</para>
<screen><prompt>$</prompt> <userinput>keystone user-create --name=alice --pass=mypassword123 --email=alice@example.com</userinput></screen>
<para>A tenant can be a project, group, or organization.
Whenever you make requests to OpenStack services, you must
specify a tenant. For example, if you query the Compute
service for a list of running instances, you get a list of
all running instances for the specified tenant. This
example creates a tenant named "acme":</para>
<screen><prompt>$</prompt> <userinput>keystone tenant-create --name=acme</userinput></screen>
<para>A role captures what operations a user is permitted to
perform in a given tenant. This example creates a role
named "compute-user":</para>
<screen><prompt>$</prompt> <userinput>keystone role-create --name=compute-user</userinput></screen>
<para>The Identity service associates a user with a tenant
and a role. To continue with our previous examples, we may
assign the "alice" user the "compute-user" role in
the "acme" tenant:</para>
<screen><prompt>$</prompt> <userinput>keystone user-list</userinput></screen>
<screen><prompt>$</prompt> <userinput>keystone user-role-add --user=892585 --role=9a764e --tenant-id=6b8fd2</userinput></screen>
<para>A user can be assigned different roles in different
tenants. For example, Alice may also have the "admin" role
in the "Cyberdyne" tenant. A user can also be assigned
multiple roles in the same tenant.</para>
<para>The
<filename>/etc/[SERVICE_CODENAME]/policy.json</filename>
file controls what users are allowed to do for a given
service. For example,
<filename>/etc/nova/policy.json</filename> specifies the
access policy for the Compute service,
<filename>/etc/glance/policy.json</filename> specifies
the access policy for the Image Service, and
<filename>/etc/keystone/policy.json</filename> specifies
the access policy for the Identity service.</para>
<para>The default policy.json files in the Compute,
Identity, and Image Service recognize only the admin role:
all operations that do not require the admin role will be
accessible by any user that has any role in a
tenant.</para>
<para>If you wish to restrict users from performing
operations in the Compute service, you need to
create a role in the Identity service and then modify
<filename>/etc/nova/policy.json</filename> so that this
role is required for Compute operations.</para>
<para>For example, this line "volume:create": [] in
<filename>/etc/cinder/policy.json</filename> specifies
that there are no restrictions on which users can create
volumes: if the user has any role in a tenant, they will
be able to create volumes in that tenant.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis role="bold">Service
Management</emphasis></term>
<listitem>
<para>The Identity Service provides the following service
management functions:</para>
<itemizedlist>
<listitem>
<para>Services</para>
</listitem>
<listitem>
<para>Endpoints</para>
</listitem>
</itemizedlist>
<para>The Identity Service also maintains a user that
corresponds to each service, such as a user named nova,
(for the Compute service) and a special service tenant,
which is called service.</para>
<para>The commands for creating services and endpoints are
described in a later section.</para>
</listitem>
</varlistentry>
</variablelist>
<!-- </section>-->
</chapter>

View File

@ -1,224 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE chapter [
<!ENTITY % openstack SYSTEM "https://raw.githubusercontent.com/openstack/openstack-manuals/master/doc/common/entities/openstack.ent">
%openstack;
]>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="section_more-concepts">
<title>A Bit More On Swift</title>
<para><guilabel>Containers and Objects</guilabel></para>
<para>A container is a storage compartment for your data and
provides a way for you to organize your data. You can
think of a container as a folder in Windows or a
directory in UNIX. The primary difference between a
container and these other file system concepts is that
containers cannot be nested. You can, however, create an
unlimited number of containers within your account. Data
must be stored in a container so you must have at least
one container defined in your account prior to uploading
data.</para>
<para>The only restrictions on container names is that they
cannot contain a forward slash (/) or an ascii null (%00)
and must be less than 257 bytes in length. Please note
that the length restriction applies to the name after it
has been URL encoded. For example, a container name of
Course Docs would be URL encoded as Course%20Docs and
therefore be 13 bytes in length rather than the expected
11.</para>
<para>An object is the basic storage entity and any optional
metadata that represents the files you store in the
OpenStack Object Storage system. When you upload data to
OpenStack Object Storage, the data is stored as-is (no
compression or encryption) and consists of a location
(container), the object's name, and any metadata
consisting of key/value pairs. For instance, you may chose
to store a backup of your digital photos and organize them
into albums. In this case, each object could be tagged
with metadata such as Album : Caribbean Cruise or Album :
Aspen Ski Trip.</para>
<para>The only restriction on object names is that they must
be less than 1024 bytes in length after URL encoding. For
example, an object name of C++final(v2).txt should be URL
encoded as C%2B%2Bfinal%28v2%29.txt and therefore be 24
bytes in length rather than the expected 16.</para>
<para>The maximum allowable size for a storage object upon
upload is 5 GB and the minimum is zero bytes.
You can use the built-in large object support and the
swift utility to retrieve objects larger than 5 GB.</para>
<para>For metadata, you should not exceed 90 individual
key/value pairs for any one object and the total byte
length of all key/value pairs should not exceed 4 KB
(4096 bytes).</para>
<para><guilabel>Language-Specific API
Bindings</guilabel></para>
<para>A set of supported API bindings in several popular
languages are available from the Rackspace Cloud Files
product, which uses OpenStack Object Storage code for its
implementation. These bindings provide a layer of
abstraction on top of the base REST API, allowing
programmers to work with a container and object model
instead of working directly with HTTP requests and
responses. These bindings are free (as in beer and as in
speech) to download, use, and modify. They are all
licensed under the MIT License as described in the COPYING
file packaged with each binding. If you do make any
improvements to an API, you are encouraged (but not
required) to submit those changes back to us.</para>
<para>The API bindings for Rackspace Cloud Files are hosted
at<link xlink:href="http://github.com/rackspace"
></link><link
xlink:href="http://github.com/rackspace"
>http://github.com/rackspace</link>. Feel free to
coordinate your changes through github or, if you prefer,
send your changes to cloudfiles@rackspacecloud.com. Just
make sure to indicate which language and version you
modified and send a unified diff.</para>
<para>Each binding includes its own documentation (either
HTML, PDF, or CHM). They also include code snippets and
examples to help you get started. The currently supported
API binding for OpenStack Object Storage are:</para>
<itemizedlist>
<listitem>
<para>PHP (requires 5.x and the modules: cURL,
FileInfo, mbstring)</para>
</listitem>
<listitem>
<para>Python (requires 2.4 or newer)</para>
</listitem>
<listitem>
<para>Java (requires JRE v1.5 or newer)</para>
</listitem>
<listitem>
<para>C#/.NET (requires .NET Framework v3.5)</para>
</listitem>
<listitem>
<para>Ruby (requires 1.8 or newer and mime-tools
module)</para>
</listitem>
</itemizedlist>
<para>There are no other supported language-specific bindings
at this time. You are welcome to create your own language
API bindings and we can help answer any questions during
development, host your code if you like, and give you full
credit for your work.</para>
<para><guilabel>Proxy Server</guilabel></para>
<para>The Proxy Server is responsible for tying together
the rest of the OpenStack Object Storage architecture.
For each request, it will look up the location of the
account, container, or object in the ring (see below)
and route the request accordingly. The public API is
also exposed through the Proxy Server.</para>
<para>A large number of failures are also handled in the
Proxy Server. For example, if a server is unavailable
for an object PUT, it will ask the ring for a hand-off
server and route there instead.</para>
<para>When objects are streamed to or from an object
server, they are streamed directly through the proxy
server to or from the user the proxy server does not
spool them.</para>
<para>You can use a proxy server with account management
enabled by configuring it in the proxy server
configuration file.</para>
<para><guilabel>Object Server</guilabel></para>
<para>The Object Server is a very simple blob storage
server that can store, retrieve and delete objects
stored on local devices. Objects are stored as binary
files on the filesystem with metadata stored in the
files extended attributes (xattrs). This requires
that the underlying filesystem choice for object
servers support xattrs on files. Some filesystems,
like ext3, have xattrs turned off by default.</para>
<para>Each object is stored using a path derived from the
object names hash and the operations timestamp. Last
write always wins, and ensures that the latest object
version will be served. A deletion is also treated as
a version of the file (a 0 byte file ending with
“.ts”, which stands for tombstone). This ensures that
deleted files are replicated correctly and older
versions dont magically reappear due to failure
scenarios.</para>
<para><guilabel>Container Server</guilabel></para>
<para>The Container Servers primary job is to handle
listings of objects. It does not know where those
objects are, just what objects are in a specific
container. The listings are stored as SQLite database
files, and replicated across the cluster similar to
how objects are. Statistics are also tracked that
include the total number of objects, and total storage
usage for that container.</para>
<para><guilabel>Account Server</guilabel></para>
<para>The Account Server is very similar to the Container
Server, excepting that it is responsible for listings
of containers rather than objects.</para>
<para><guilabel>Replication</guilabel></para>
<para>Replication is designed to keep the system in a
consistent state in the face of temporary error
conditions like network outages or drive
failures.</para>
<para>The replication processes compare local data with
each remote copy to ensure they all contain the latest
version. Object replication uses a hash list to
quickly compare subsections of each partition, and
container and account replication use a combination of
hashes and shared high water marks.</para>
<para>Replication updates are push based. For object
replication, updating is just a matter of rsyncing
files to the peer. Account and container replication
push missing records over HTTP or rsync whole database
files.</para>
<para>The replicator also ensures that data is removed
from the system. When an item (object, container, or
account) is deleted, a tombstone is set as the latest
version of the item. The replicator will see the
tombstone and ensure that the item is removed from the
entire system.</para>
<para>To separate the cluster-internal replication traffic
from client traffic, separate replication servers can
be used. These replication servers are based on the
standard storage servers, but they listen on the
replication IP and only respond to REPLICATE requests.
Storage servers can serve REPLICATE requests, so an
operator can transition to using a separate
replication network with no cluster downtime.</para>
<para>Replication IP and port information is stored in the
ring on a per-node basis. These parameters will be
used if they are present, but they are not required.
If this information does not exist or is empty for a
particular node, the node's standard IP and port will
be used for replication.</para>
<para><guilabel>Updaters</guilabel></para>
<para>There are times when container or account data can
not be immediately updated. This usually occurs during
failure scenarios or periods of high load. If an
update fails, the update is queued locally on the file
system, and the updater will process the failed
updates. This is where an eventual consistency window
will most likely come in to play. For example, suppose
a container server is under load and a new object is
put in to the system. The object will be immediately
available for reads as soon as the proxy server
responds to the client with success. However, the
container server did not update the object listing,
and so the update would be queued for a later update.
Container listings, therefore, may not immediately
contain the object.</para>
<para>In practice, the consistency window is only as large
as the frequency at which the updater runs and may not
even be noticed as the proxy server will route listing
requests to the first container server which responds.
The server under load may not be the one that serves
subsequent listing requests one of the other two
replicas may handle the listing.</para>
<para><guilabel>Auditors</guilabel></para>
<para>Auditors crawl the local server checking the
integrity of the objects, containers, and accounts. If
corruption is found (in the case of bit rot, for
example), the file is quarantined, and replication
will replace the bad file from another replica. If
other errors are found they are logged. For example,
an objects listing cannot be found on any container
server it should be.</para>
</chapter>

View File

@ -1,270 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="section_networking-in-openstack">
<title>Networking in OpenStack</title>
<para><guilabel>Networking in OpenStack</guilabel></para>
<para>OpenStack Networking provides a rich tenant-facing API
for defining network connectivity and addressing in the
cloud. The OpenStack Networking project gives operators
the ability to leverage different networking technologies
to power their cloud networking. It is a virtual network
service that provides a powerful API to define the network
connectivity and addressing used by devices from other
services, such as OpenStack Compute. It has a rich API
which consists of the following components.</para>
<itemizedlist>
<listitem>
<para><emphasis role="bold">Network:</emphasis> An
isolated L2 segment, analogous to VLAN in the physical
networking world.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Subnet:</emphasis> A block
of v4 or v6 IP addresses and associated configuration
state.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Port:</emphasis> A
connection point for attaching a single device, such
as the NIC of a virtual server, to a virtual network.
Also describes the associated network configuration,
such as the MAC and IP addresses to be used on that
port.</para>
</listitem>
</itemizedlist>
<para>You can configure rich network topologies by creating
and configuring networks and subnets, and then instructing
other OpenStack services like OpenStack Compute to attach
virtual devices to ports on these networks. In
particular, OpenStack Networking supports each tenant
having multiple private networks, and allows tenants to
choose their own IP addressing scheme, even if those IP
addresses overlap with those used by other tenants. This
enables very advanced cloud networking use cases, such as
building multi-tiered web applications and allowing
applications to be migrated to the cloud without changing
IP addresses.</para>
<para><guilabel>Plugin Architecture: Flexibility to Choose
Different Network Technologies</guilabel></para>
<para>Enhancing traditional networking solutions to provide rich
cloud networking is challenging. Traditional networking is not
designed to scale to cloud proportions or to configure
automatically.</para>
<para>The original OpenStack Compute network implementation
assumed a very basic model of performing all isolation through
Linux VLANs and IP tables. OpenStack Networking introduces the
concept of a plug-in, which is a pluggable back-end
implementation of the OpenStack Networking API. A plug-in can
use a variety of technologies to implement the logical API
requests. Some OpenStack Networking plug-ins might use basic
Linux VLANs and IP tables, while others might use more
advanced technologies, such as L2-in-L3 tunneling or OpenFlow,
to provide similar benefits.</para>
<para>The current set of plug-ins include:</para>
<itemizedlist>
<listitem>
<para><emphasis role="bold">Big Switch, Floodlight REST
Proxy:</emphasis>
<link
xlink:href="http://www.openflowhub.org/display/floodlightcontroller/Quantum+REST+Proxy+Plugin"
>http://www.openflowhub.org/display/floodlightcontroller/Quantum+REST+Proxy+Plugin</link></para>
</listitem>
<listitem>
<para><emphasis role="bold">Brocade
Plugin</emphasis></para>
</listitem>
<listitem>
<para><emphasis role="bold">Cisco:</emphasis> Documented
externally at: <link
xlink:href="http://wiki.openstack.org/cisco-quantum"
>http://wiki.openstack.org/cisco-quantum</link></para>
</listitem>
<listitem>
<para><emphasis role="bold">Hyper-V
Plugin</emphasis></para>
</listitem>
<listitem>
<para><emphasis role="bold">Linux Bridge:</emphasis>
Documentation included in this guide and <link
xlink:href="http://wiki.openstack.org/Quantum-Linux-Bridge-Plugin"
>http://wiki.openstack.org/Quantum-Linux-Bridge-Plugin</link>
</para>
</listitem>
<listitem>
<para><emphasis role="bold">Midonet
Plugin</emphasis></para>
</listitem>
<listitem>
<para><emphasis role="bold">NEC OpenFlow:</emphasis>
<link
xlink:href="http://wiki.openstack.org/Quantum-NEC-OpenFlow-Plugin"
>http://wiki.openstack.org/Quantum-NEC-OpenFlow-Plugin</link></para>
</listitem>
<listitem>
<para><emphasis role="bold">Open vSwitch:</emphasis>
Documentation included in this guide.</para>
</listitem>
<listitem>
<para><emphasis role="bold">PLUMgrid:</emphasis>
<link
xlink:href="https://wiki.openstack.org/wiki/Plumgrid-quantum"
>https://wiki.openstack.org/wiki/Plumgrid-quantum</link></para>
</listitem>
<listitem>
<para><emphasis role="bold">Ryu:</emphasis>
<link
xlink:href="https://github.com/osrg/ryu/wiki/OpenStack"
>https://github.com/osrg/ryu/wiki/OpenStack</link></para>
</listitem>
<listitem>
<!-- TODO: Update support link, when available -->
<para><emphasis role="bold">VMware NSX:</emphasis>
Documentation include in this guide, <link
xlink:href="http://www.vmware.com/products/nsx"
>NSX Product Overview </link>, and <link
xlink:href="http://www.nicira.com/support">NSX
Product Support</link>.</para>
</listitem>
</itemizedlist>
<para>Plugins can have different properties in terms of hardware
requirements, features, performance, scale, operator tools,
etc. Supporting many plug-ins enables the cloud administrator
to weigh different options and decide which networking
technology is right for the deployment.</para>
<para>Components of OpenStack Networking</para>
<para>To deploy OpenStack Networking, it is useful to understand
the different components that make up the solution and how
those components interact with each other and with other
OpenStack services.</para>
<para>OpenStack Networking is a standalone service, just like
other OpenStack services such as OpenStack Compute, OpenStack
Image Service, OpenStack Identity service, and the OpenStack
Dashboard. Like those services, a deployment of OpenStack
Networking often involves deploying several processes on a
variety of hosts.</para>
<para>The main process of the OpenStack Networking server is
quantum-server, which is a Python daemon that exposes the
OpenStack Networking API and passes user requests to the
configured OpenStack Networking plug-in for additional
processing. Typically, the plug-in requires access to a
database for persistent storage, similar to other OpenStack
services.</para>
<para>If your deployment uses a controller host to run centralized
OpenStack Compute components, you can deploy the OpenStack
Networking server on that same host. However, OpenStack
Networking is entirely standalone and can be deployed on its
own server as well. OpenStack Networking also includes
additional agents that might be required depending on your
deployment:</para>
<itemizedlist>
<listitem>
<para><emphasis role="bold">plugin agent
(quantum-*-agent):</emphasis>Runs on each
hypervisor to perform local vswitch configuration.
Agent to be run depends on which plug-in you are using,
as some plug-ins do not require an agent.</para>
</listitem>
<listitem>
<para><emphasis role="bold">dhcp agent
(quantum-dhcp-agent):</emphasis>Provides DHCP
services to tenant networks. This agent is the same
across all plug-ins.</para>
</listitem>
<listitem>
<para><emphasis role="bold">l3 agent
(quantum-l3-agent):</emphasis>Provides L3/NAT
forwarding to provide external network access for VMs
on tenant networks. This agent is the same across all
plug-ins.</para>
</listitem>
</itemizedlist>
<para>These agents interact with the main quantum-server process
in the following ways:</para>
<itemizedlist>
<listitem>
<para>Through RPC. For example, rabbitmq or qpid.</para>
</listitem>
<listitem>
<para>Through the standard OpenStack Networking
API.</para>
</listitem>
</itemizedlist>
<para>OpenStack Networking relies on the OpenStack Identity
Project (Keystone) for authentication and authorization of all
API request.</para>
<para>OpenStack Compute interacts with OpenStack Networking
through calls to its standard API. As part of creating a VM,
nova-compute communicates with the OpenStack Networking API to
plug each virtual NIC on the VM into a particular
network.</para>
<para>The OpenStack Dashboard (Horizon) has integration with the
OpenStack Networking API, allowing administrators and tenant
users, to create and manage network services through the
Horizon GUI.</para>
<para><emphasis role="bold">Place Services on Physical
Hosts</emphasis></para>
<para>Like other OpenStack services, OpenStack Networking provides
cloud administrators with significant flexibility in deciding
which individual services should run on which physical
devices. On one extreme, all service daemons can be run on a
single physical host for evaluation purposes. On the other,
each service could have its own physical hosts, and in some cases,
be replicated across multiple hosts for redundancy.</para>
<para>In this guide, we focus primarily on a standard architecture
that includes a “cloud controller” host, a “network gateway”
host, and a set of hypervisors for running VMs. The "cloud
controller" and "network gateway" can be combined in simple
deployments. If you expect VMs to send significant
amounts of traffic to or from the Internet, a dedicated
network gateway host is suggested, to avoid potential CPU
contention between packet forwarding performed by the
quantum-l3-agent and other OpenStack services.</para>
<para><emphasis role="bold">Network Connectivity for Physical
Hosts</emphasis></para>
<figure>
<title>Network Diagram</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image33.png" contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<para>A standard OpenStack Networking setup has up to four
distinct physical data center networks:</para>
<itemizedlist>
<listitem>
<para><emphasis role="bold">Management
network:</emphasis>Used for internal communication
between OpenStack Components. The IP addresses on this
network should be reachable only within the data
center.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Data network:</emphasis>Used
for VM data communication within the cloud deployment.
The IP addressing requirements of this network depend
on the OpenStack Networking plug-in in use.</para>
</listitem>
<listitem>
<para><emphasis role="bold">External
network:</emphasis>Used to provide VMs with Internet
access, in some deployment scenarios. The IP addresses
on this network should be reachable by anyone on the
Internet.</para>
</listitem>
<listitem>
<para><emphasis role="bold">API network:</emphasis>Exposes
all OpenStack APIs, including the OpenStack Networking
API, to tenants. The IP addresses on this network
should be reachable by anyone on the Internet. This
may be the same network as the external network, as it
is possible to create a subnet for the external
network that uses IP allocation ranges to use only
less than the full range of IP addresses in an IP
block.</para>
</listitem>
</itemizedlist>
</chapter>

View File

@ -1,130 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="section_neutron-use-cases">
<title>Neutron Use Cases</title>
<para>As of now you must be wondering, how to use these awesome
features that OpenStack Networking has given to us.</para>
<para><guilabel>Use Case: Single Flat Network</guilabel></para>
<para>In the simplest use case, a single OpenStack Networking
network exists. This is a "shared" network, meaning it is
visible to all tenants via the OpenStack Networking API.
Tenant VMs have a single NIC, and receive a fixed IP
address from the subnet(s) associated with that network.
This essentially maps to the FlatManager and
FlatDHCPManager models provided by OpenStack Compute.
Floating IPs are not supported.</para>
<para>It is common that an OpenStack Networking network
is a "provider network", meaning it was created by the
OpenStack administrator to map directly to an existing
physical network in the data center. This allows the
provider to use a physical router on that data center
network as the gateway for VMs to reach the outside world.
For each subnet on an external network, the gateway
configuration on the physical router must be manually
configured outside of OpenStack.</para>
<figure>
<title>Single Flat Network</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image34.png"/>
</imageobject>
</mediaobject>
</figure>
<para><guilabel>Use Case: Multiple Flat
Network</guilabel></para>
<para>This use case is very similar to the above Single Flat
Network use case, except that tenants see multiple shared
networks via the OpenStack Networking API and can choose
which network (or networks) to plug into.</para>
<figure>
<title>Multiple Flat Network</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image35.png"/>
</imageobject>
</mediaobject>
</figure>
<para><guilabel>Use Case: Mixed Flat and Private
Network</guilabel></para>
<para>This use case is an extension of the above flat network
use cases, in which tenants also optionally have access to
private per-tenant networks. In addition to seeing one or
more shared networks via the OpenStack Networking API,
tenants can create additional networks that are only
visible to users of that tenant. When creating VMs, those
VMs can have NICs on any of the shared networks and/or any
of the private networks belonging to the tenant. This
enables the creation of "multi-tier" topologies using VMs
with multiple NICs. It also supports a model where a VM
acting as a gateway can provide services such as routing,
NAT, or load balancing.</para>
<figure>
<title>Mixed Flat and Private Network</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image36.png"/>
</imageobject>
</mediaobject>
</figure>
<para><guilabel>Use Case: Provider Router with Private
Networks</guilabel></para>
<para>This use provides each tenant with one or more private
networks, which connect to the outside world via an
OpenStack Networking router. The case where each tenant
gets exactly one network in this form maps to the same
logical topology as the VlanManager in OpenStack Compute
(of course, OpenStack Networking doesn't require VLANs).
Using the OpenStack Networking API, the tenant would only
see a network for each private network assigned to that
tenant. The router object in the API is created and owned
by the cloud admin.</para>
<para>This model supports giving VMs public addresses using
"floating IPs", in which the router maps public addresses
from the external network to fixed IPs on private
networks. Hosts without floating IPs can still create
outbound connections to the external network, as the
provider router performs SNAT to the router's external IP.
The IP address of the physical router is used as the
gateway_ip of the external network subnet, so the provider
has a default router for Internet traffic.</para>
<para>The router provides L3 connectivity between private
networks, meaning that different tenants can reach each
other's instances unless additional filtering, such as
security groups, is used. Because there is only a single
router, tenant networks cannot use overlapping IPs. Thus,
it is likely that the admin would create the private
networks on behalf of tenants.</para>
<figure>
<title>Provider Router with Private Networks</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image37.png"/>
</imageobject>
</mediaobject>
</figure>
<para><guilabel>Use Case: Per-tenant Routers with Private
Networks</guilabel></para>
<para>A more advanced router scenario in which each tenant
gets at least one router, and potentially has access to
the OpenStack Networking API to create additional routers.
The tenant can create their own networks, potentially
uplinking those networks to a router. This model enables
tenant-defined multi-tier applications, with each tier
being a separate network behind the router. Since there
are multiple routers, tenant subnets can be overlapping
without conflicting, since access to external networks all
happens via SNAT or Floating IPs. Each router uplink and
floating IP is allocated from the external network
subnet.</para>
<figure>
<title>Per-tenant Routers with Private Networks</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image38.png"/>
</imageobject>
</mediaobject>
</figure>
</chapter>

View File

@ -1,638 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="section_official-programs">
<title>OpenStack Projects, History, and Releases Overview</title>
<para><guilabel>Project history and releases overview.</guilabel></para>
<para>OpenStack is a cloud computing project that provides an
Infrastructure-as-a-Service (IaaS). It is free open source
software released under the terms of the Apache License. The
project is managed by the OpenStack Foundation, a non-profit
corporate entity established in September 2012 to promote
OpenStack software and its community.</para>
<para>More than 200 companies joined the project, among which are
AMD, Brocade Communications Systems, Canonical, Cisco, Dell, EMC,
Ericsson, Groupe Bull, HP, IBM, Inktank, Intel, NEC, Rackspace
Hosting, Red Hat, SUSE Linux, VMware, and Yahoo!</para>
<para>The technology consists of a series of interrelated projects
that control pools of processing, storage, and networking
resources throughout a data center, all managed through a
dashboard that gives administrators control while empowering its
users to provision resources through a web interface.</para>
<para>The OpenStack community collaborates around a six-month,
time-based release cycle with frequent development milestones.
During the planning phase of each release, the community gathers
for the OpenStack Design Summit to facilitate developer working
sessions and assemble plans.</para>
<para>In July 2010 Rackspace Hosting and NASA jointly launched an
open-source cloud-software initiative known as OpenStack. The
OpenStack project intended to help organizations which offer
cloud-computing services running on standard hardware. The first
official release, code-named Austin, appeared four months later,
with plans to release regular updates of the software every few
months. The early code came from the NASA Nebula platform and from
the Rackspace Cloud Files platform. In July 2011, Ubuntu Linux
developers adopted OpenStack.</para>
<para><emphasis role="bold">OpenStack Releases</emphasis></para>
<informaltable class="c20">
<tbody>
<tr>
<td rowspan="1" colspan="1">Release Name</td>
<td rowspan="1" colspan="1">Release Date</td>
<td rowspan="1" colspan="1">Included Components</td>
</tr>
<tr>
<td rowspan="1" colspan="1">Austin</td>
<td rowspan="1" colspan="1">21 October 2010</td>
<td rowspan="1" colspan="1">Nova, Swift</td>
</tr>
<tr>
<td rowspan="1" colspan="1">Bexar</td>
<td rowspan="1" colspan="1">3 February 2011</td>
<td rowspan="1" colspan="1">Nova, Glance, Swift</td>
</tr>
<tr>
<td rowspan="1" colspan="1">Cactus</td>
<td rowspan="1" colspan="1">15 April 2011</td>
<td rowspan="1" colspan="1">Nova, Glance, Swift</td>
</tr>
<tr>
<td rowspan="1" colspan="1">Diablo</td>
<td rowspan="1" colspan="1">22 September 2011</td>
<td rowspan="1" colspan="1">Nova, Glance, Swift</td>
</tr>
<tr>
<td rowspan="1" colspan="1">Essex</td>
<td rowspan="1" colspan="1">5 April 2012</td>
<td rowspan="1" colspan="1">Nova, Glance, Swift,
Horizon, Keystone</td>
</tr>
<tr>
<td rowspan="1" colspan="1">Folsom</td>
<td rowspan="1" colspan="1">27 September 2012</td>
<td rowspan="1" colspan="1">Nova, Glance, Swift,
Horizon, Keystone, Quantum, Cinder</td>
</tr>
<tr>
<td rowspan="1" colspan="1">Grizzly</td>
<td rowspan="1" colspan="1">4 April 2013</td>
<td rowspan="1" colspan="1">Nova, Glance, Swift,
Horizon, Keystone, Quantum, Cinder</td>
</tr>
<tr>
<td rowspan="1" colspan="1">Havana</td>
<td rowspan="1" colspan="1">17 October 2013</td>
<td rowspan="1" colspan="1">Nova, Glance, Swift,
Horizon, Keystone, Neutron, Cinder,
Ceilometer, Heat</td>
</tr>
<tr>
<td rowspan="1" colspan="1">Icehouse</td>
<td rowspan="1" colspan="1">17 April 2014</td>
<td rowspan="1" colspan="1">Nova, Glance, Swift,
Horizon, Keystone, Neutron, Cinder,
Ceilometer, Heat, Trove</td>
</tr>
<tr>
<td rowspan="1" colspan="1">Juno</td>
<td rowspan="1" colspan="1">October 2014</td>
<td rowspan="1" colspan="1">Nova, Glance, Swift,
Horizon, Keystone, Neutron, Cinder,
Ceilometer, Heat, Trove, Sahara</td>
</tr>
<tr>
<td rowspan="1" colspan="1">Kilo</td>
<td rowspan="1" colspan="1">April 2015</td>
<td rowspan="1" colspan="1">Nova, Glance, Swift,
Horizon, Keystone, Neutron, Cinder,
Ceilometer, Heat, Trove, Sahara, Ironic</td>
</tr>
</tbody>
</informaltable>
<para>Some OpenStack users include:</para>
<itemizedlist>
<listitem>
<para>PayPal / eBay</para>
</listitem>
<listitem>
<para>NASA</para>
</listitem>
<listitem>
<para>CERN</para>
</listitem>
<listitem>
<para>Yahoo!</para>
</listitem>
<listitem>
<para>Rackspace Cloud</para>
</listitem>
<listitem>
<para>HP Public Cloud</para>
</listitem>
<listitem>
<para>MercadoLibre.com</para>
</listitem>
<listitem>
<para>AT&amp;T</para>
</listitem>
<listitem>
<para>KT (formerly Korea Telecom)</para>
</listitem>
<listitem>
<para>Deutsche Telekom</para>
</listitem>
<listitem>
<para>Wikimedia Labs</para>
</listitem>
<listitem>
<para>Hostalia of Telef nica Group</para>
</listitem>
<listitem>
<para>SUSE Cloud solution</para>
</listitem>
<listitem>
<para>Red Hat OpenShift PaaS solution</para>
</listitem>
<listitem>
<para>Zadara Storage</para>
</listitem>
<listitem>
<para>Mint Services</para>
</listitem>
<listitem>
<para>GridCentric</para>
</listitem>
</itemizedlist>
<para>OpenStack is a true and innovative open standard. For more
user stories, see <link xlink:href="http://www.openstack.org/user-stories"
>http://www.openstack.org/user-stories</link>.</para>
<para><guilabel>Release Cycle</guilabel></para>
<figure>
<title>Community Heartbeat</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image05.png"/>
</imageobject>
</mediaobject>
</figure>
<para>OpenStack is based on a coordinated 6-month release cycle
with frequent development milestones. You can find a link to the
current development release schedule <link xlink:href=
"https://wiki.openstack.org/wiki/Releases">here</link>.
The Release Cycle is made of four major stages:</para>
<figure>
<title>Various Projects under OpenStack</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image16.png"/>
</imageobject>
</mediaobject>
</figure>
<para>The creation of OpenStack took an estimated 249 years of
effort (COCOMO model).</para>
<para>In a nutshell, OpenStack has:</para>
<itemizedlist>
<listitem>
<para>64,396 commits made by 1,128 contributors, with its
first commit made in May, 2010.</para>
</listitem>
<listitem>
<para>908,491 lines of code. OpenStack is written mostly in
Python with an average number of source code comments.</para>
</listitem>
<listitem>
<para>A code base with a long source history.</para>
</listitem>
<listitem>
<para>Increasing Y-O-Y commits.</para>
</listitem>
<listitem>
<para>A very large development team comprised of people from
around the world.</para>
</listitem>
</itemizedlist>
<figure>
<title>Programming Languages used to design OpenStack</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image06.png"/>
</imageobject>
</mediaobject>
</figure>
<para>For an overview of OpenStack refer to
http://www.openstack.org. Common
questions and answers are also covered here.</para>
<para><guilabel>Official Programs Overview</guilabel></para>
<para>Let's take a dive into some of the technical aspects of
OpenStack. Its scalability and flexibility are just some of the
awesome features that make it a rock-solid cloud computing
platform. The OpenStack official programs serve the community and
its demands.</para>
<para>Being a cloud computing platform, OpenStack consists of many
official programs and incubated projects which makes it really good
as an IaaS cloud computing platform/Operating System. The
following points are the main components
necessary to call it an OpenStack
Cloud.</para>
<para><guimenu>Components of OpenStack</guimenu></para>
<para>OpenStack has a modular architecture with various code names
for its components. OpenStack has several shared services that
span the three pillars of compute, storage and networking,
making it easier to implement and operate your cloud. These
services - including identity, image management and a web
interface - integrate the OpenStack components with each other
as well as external systems to provide a unified experience for
users as they interact with different cloud resources.</para>
<para><guisubmenu>Compute (Nova)</guisubmenu></para>
<para>The OpenStack cloud operating system enables enterprises
and service providers to offer on-demand computing resources,
by provisioning and managing large networks of virtual
machines. Compute resources are accessible via APIs for
developers building cloud applications and via web interfaces
for administrators and users. The compute architecture is
designed to scale horizontally on standard hardware.</para>
<figure>
<title>OpenStack Compute: Provision and manage large networks of
virtual machines</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image03.png"/>
</imageobject>
</mediaobject>
</figure>
<para>OpenStack Compute (Nova) is a cloud computing fabric
controller (the main part of an IaaS system). It is written in
Python and uses many external libraries such as Eventlet (for
concurrent programming), Kombu (for AMQP communication), and
SQLAlchemy (for database access). Nova's architecture is
designed to scale horizontally on standard hardware with no
proprietary hardware or software requirements and provide the
ability to integrate with legacy systems and third party
technologies. It is designed to manage and automate pools of
computer resources and can work with widely available
virtualization technologies, as well as bare metal and
high-performance computing (HPC) configurations. KVM and
XenServer are available choices for hypervisor technology,
together with Hyper-V and Linux container technology such as
LXC. In addition to different hypervisors, OpenStack runs on
ARM.</para>
<para><emphasis role="bold">Popular Use Cases:</emphasis></para>
<itemizedlist>
<listitem>
<para>Service providers offering an IaaS compute platform
or services higher up the stack</para>
</listitem>
<listitem>
<para>IT departments acting as cloud service providers for
business units and project teams</para>
</listitem>
<listitem>
<para>Processing big data with tools like Hadoop</para>
</listitem>
<listitem>
<para>Scaling compute up and down to meet demand for web
resources and applications</para>
</listitem>
<listitem>
<para>High-performance computing (HPC) environments
processing diverse and intensive workloads</para>
</listitem>
</itemizedlist>
<para><guisubmenu>Object Storage(Swift)</guisubmenu></para>
<para>In addition to traditional enterprise-class storage
technology, many organizations now have a variety of storage
needs with varying performance and price requirements.
OpenStack has support for both Object Storage and Block
Storage, with many deployment options for each depending on
the use case.</para>
<figure>
<title>OpenStack Storage: Object and Block storage for use with
servers and applications</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image17.png"/>
</imageobject>
</mediaobject>
</figure>
<para>OpenStack Object Storage (Swift) is a scalable redundant
storage system. Objects and files are written to multiple disk
drives spread throughout servers in the data center, with the
OpenStack software responsible for ensuring data replication
and integrity across the cluster. Storage clusters scale
horizontally simply by adding new servers. Should a server or
hard drive fail, OpenStack replicates its content from other
active nodes to new locations in the cluster. Because
OpenStack uses software logic to ensure data replication and
distribution across different devices, inexpensive commodity
hard drives and servers can be used.</para>
<para>Object Storage is ideal for cost effective, scale-out
storage. It provides a fully distributed, API-accessible
storage platform that can be integrated directly into
applications or used for backup, archiving and data retention.
Block Storage allows block devices to be exposed and connected
to compute instances for expanded storage, better performance
and integration with enterprise storage platforms, such as
NetApp, Nexenta and SolidFire.</para>
<para>A few details on OpenStacks Object Storage</para>
<itemizedlist>
<listitem>
<para>OpenStack provides redundant, scalable object storage using
clusters of standardized servers capable of storing
petabytes of data</para>
</listitem>
<listitem>
<para>Object Storage is not a traditional file system, but rather a
distributed storage system for static data such as
virtual machine images, photo storage, email storage,
backups and archives. Having no central "brain" or
master point of control provides greater scalability,
redundancy and durability.</para>
</listitem>
<listitem>
<para>Objects and files are written to multiple disk drives spread
throughout servers in the data center, with the
OpenStack software responsible for ensuring data
replication and integrity across the cluster.</para>
</listitem>
<listitem>
<para>Storage clusters scale horizontally simply by adding new servers.
Should a server or hard drive fail, OpenStack
replicates its content from other active nodes to new
locations in the cluster. Because OpenStack uses
software logic to ensure data replication and
distribution across different devices, inexpensive
commodity hard drives and servers can be used in lieu
of more expensive equipment.</para>
</listitem>
</itemizedlist>
<para><guisubmenu>Block Storage(Cinder)</guisubmenu></para>
<para>OpenStack Block Storage (Cinder) provides persistent block
level storage devices for use with OpenStack compute
instances. The block storage system manages the creation,
attaching and detaching of the block devices to servers. Block
storage volumes are fully integrated into OpenStack Compute
and the Dashboard allowing for cloud users to manage their own
storage needs. In addition to local Linux server storage, it
can use storage platforms including Ceph, CloudByte, Coraid,
EMC (VMAX and VNX), GlusterFS, IBM Storage (Storwize family,
SAN Volume Controller, and XIV Storage System), Linux LIO,
NetApp, Nexenta, Scality, SolidFire and HP (Store Virtual and
StoreServ 3Par families). Block storage is appropriate for
performance sensitive scenarios such as database storage,
expandable file systems, or providing a server with access to
raw block level storage. Snapshot management provides powerful
functionality for backing up data stored on block storage
volumes. Snapshots can be restored or used to create a new
block storage volume.</para>
<para><emphasis role="bold">A few points on OpenStack Block
Storage:</emphasis></para>
<itemizedlist>
<listitem>
<para>OpenStack provides persistent block level storage
devices for use with OpenStack compute instances.</para>
</listitem>
<listitem>
<para>The block storage system manages the creation,
attaching and detaching of the block devices to servers.
Block storage volumes are fully integrated into OpenStack
Compute and the Dashboard allowing for cloud users to
manage their own storage needs.</para>
</listitem>
<listitem>
<para>In addition to using simple Linux server storage, it
has unified storage support for numerous storage platforms
including Ceph, NetApp, Nexenta, SolidFire, and
Zadara.</para>
</listitem>
<listitem>
<para>Block storage is appropriate for performance sensitive
scenarios such as database storage, expandable file
systems, or providing a server with access to raw block
level storage.</para>
</listitem>
<listitem>
<para>Snapshot management provides powerful functionality
for backing up data stored on block storage volumes.
Snapshots can be restored or used to create a new block
storage volume.</para>
</listitem>
</itemizedlist>
<para><guisubmenu>Networking(Neutron)</guisubmenu></para>
<para>Today's data center networks contain more devices than
ever before. From servers, network equipment, storage systems and
security appliances, many of which are further divided into
virtual machines and virtual networks. The number of IP addresses,
routing configurations and security rules can quickly grow into
the millions. Traditional network management techniques fall short
of providing a truly scalable, automated approach to managing
these next-generation networks. At the same time, users expect
more control and flexibility with quicker provisioning.</para>
<para>OpenStack Networking is a pluggable, scalable and
API-driven system for managing networks and IP addresses. Like
other aspects of the cloud operating system, it can be used by
administrators and users to increase the value of existing data
center assets. OpenStack Networking ensures the network will not
be the bottleneck or limiting factor in a cloud deployment and
gives users real self-service, even over their network
configurations.</para>
<figure>
<title>OpenStack Networking: Pluggable, scalable, API-driven
network and IP management</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image26.png"/>
</imageobject>
</mediaobject>
</figure>
<para>OpenStack Networking (Neutron, formerly Quantum) is a
system for managing networks and IP addresses. Like other
aspects of the cloud operating system, it can be used by
administrators and users to increase the value of existing
data center assets. OpenStack Networking ensures the network
will not be the bottleneck or limiting factor in a cloud
deployment and gives users real self-service, even over their
network configurations.</para>
<para>OpenStack Neutron provides networking models for different
applications or user groups. Standard models include flat
networks or VLANs for separation of servers and traffic.
OpenStack Networking manages IP addresses, allowing for
dedicated static IPs or DHCP. Floating IPs allow traffic to be
dynamically re routed to any of your compute resources, which
allows you to redirect traffic during maintenance or in the
case of failure. Users can create their own networks, control
traffic and connect servers and devices to one or more
networks. Administrators can take advantage of
software-defined networking (SDN) technology like OpenFlow to
allow for high levels of multi-tenancy and massive scale.
OpenStack Networking has an extension framework allowing
additional network services, such as intrusion detection
systems (IDS), load balancing, firewalls and virtual private
networks (VPN) to be deployed and managed.</para>
<para>Networking Capabilities</para>
<itemizedlist>
<listitem>
<para>OpenStack provides flexible networking models to
suit the needs of different applications or user groups.
Standard models include flat networks or VLANs for
separation of servers and traffic.</para>
</listitem>
<listitem>
<para>OpenStack Networking manages IP addresses, allowing
for dedicated static IPs or DHCP. Floating IPs allow
traffic to be dynamically re-routed to any of your
compute resources, which allows you to redirect traffic
during maintenance or in the case of failure.</para>
</listitem>
<listitem>
<para>Users can create their own networks, control traffic
and connect servers and devices to one or more
networks.</para>
</listitem>
<listitem>
<para>The pluggable backend architecture lets users take
advantage of commodity gear or advanced networking
services from supported vendors.</para>
</listitem>
<listitem>
<para>Administrators can take advantage of
software-defined networking (SDN) technology like
OpenFlow to allow for high levels of multi-tenancy and
massive scale.</para>
</listitem>
<listitem>
<para>OpenStack Networking has an extension framework
allowing additional network services, such as intrusion
detection systems (IDS), load balancing, firewalls and
virtual private networks (VPN) to be deployed and
managed.</para>
</listitem>
</itemizedlist>
<para><guisubmenu>Dashboard(Horizon)</guisubmenu></para>
<para>OpenStack Dashboard (Horizon) provides administrators and
users a graphical interface to access, provision and automate
cloud-based resources. The design allows for third party products
and services, such as billing, monitoring and additional
management tools. Service providers and other commercial vendors
can customize the dashboard with their own brand.</para>
<para>The dashboard is just one way to interact with OpenStack
resources. Developers can automate access or build tools to
manage their resources using the native OpenStack API or the
EC2 compatibility API.</para>
<para><guisubmenu>Identity Service(Keystone)</guisubmenu></para>
<para>OpenStack Identity (Keystone) provides a central directory
of users mapped to the OpenStack services they can access. It acts
as a common authentication system across the cloud operating
system and can integrate with existing backend directory services
like LDAP. It supports multiple forms of authentication including
standard username and password credentials, token-based systems,
and Amazon Web Services log in credentials such as those used
for EC2.</para>
<para>Additionally, the catalog provides a query-able list of all
of the services deployed in an OpenStack cloud in a single
registry. Users and third-party tools can programmatically
determine which resources they can access.</para>
<para>The OpenStack Identity Service enables administrators
to:</para>
<itemizedlist>
<listitem>
<para>Configure centralized policies across users and
systems</para>
</listitem>
<listitem>
<para>Create users and tenants and define permissions for
compute, storage, and networking resources by using role-based
access control (RBAC) features</para>
</listitem>
<listitem>
<para>Integrate with an existing directory, like LDAP, to
provide a single source of authentication across the
enterprise</para>
</listitem>
</itemizedlist>
<para>The OpenStack Identity Service enables users to:</para>
<itemizedlist>
<listitem>
<para>List the services to which they have access</para>
</listitem>
<listitem>
<para>Make API requests</para>
</listitem>
<listitem>
<para>Log into the web dashboard to create resources owned
by their account</para>
</listitem>
</itemizedlist>
<para><guisubmenu>Image Service(Glance)</guisubmenu></para>
<para>OpenStack Image Service (Glance) provides discovery,
registration and delivery services for disk and server images.
Stored images can be used as a template. They can also be used
to store and catalog an unlimited number of backups. The Image
Service can store disk and server images in a variety of
back-ends, including OpenStack Object Storage. The Image
Service API provides a standard REST interface for querying
information about disk images and lets clients stream the
images to new servers.</para>
<para>Capabilities of the Image Service include:</para>
<itemizedlist>
<listitem>
<para>Administrators can create base templates from which
their users can start new compute instances</para>
</listitem>
<listitem>
<para>Users can choose from available images, or create
their own from existing servers</para>
</listitem>
<listitem>
<para>Snapshots can also be stored in the Image Service so
that virtual machines can be backed up quickly</para>
</listitem>
</itemizedlist>
<para>A multi-format image registry, the image service allows
uploads of private and public images in a variety of formats,
including:</para>
<itemizedlist>
<listitem>
<para>Raw</para>
</listitem>
<listitem>
<para>Machine (kernel/ramdisk outside of image, also known
as AMI)</para>
</listitem>
<listitem>
<para>VHD (Hyper-V)</para>
</listitem>
<listitem>
<para>VDI (VirtualBox)</para>
</listitem>
<listitem>
<para>qcow2 (Qemu/KVM)</para>
</listitem>
<listitem>
<para>VMDK (VMware)</para>
</listitem>
<listitem>
<para>OVF (VMware, others)</para>
</listitem>
</itemizedlist>
<para>To checkout the complete list of official programs
under OpenStack check out here :
https://wiki.openstack.org/wiki/Program</para>
<para>To checkout the complete list of official programs and
incubated projects under OpenStack check out OpenStacks Launchpad
Project Page here : https://launchpad.net/openstack/</para>
<para><guisubmenu>Amazon Web Services compatibility</guisubmenu></para>
<para>OpenStack APIs are compatible with Amazon EC2 and Amazon
S3 and thus client applications written for Amazon Web
Services can be used with OpenStack with minimal porting
effort.</para>
<para><guilabel>Governance</guilabel></para>
<para>OpenStack is governed by a non-profit foundation and its
board of directors, a technical committee and a user
committee.</para>
<para>The foundation's stated mission is by providing shared
resources to help achieve the OpenStack Mission by Protecting,
Empowering, and Promoting OpenStack software and the community
around it, including users, developers and the entire
ecosystem. Though, it has little to do with the development of
the software, which is managed by the technical committee - an
elected group that represents the contributors to the project,
and has oversight on all technical matters.</para>
</chapter>

View File

@ -1,375 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="section_openstack-architecture">
<title>OpenStack Architecture</title>
<para><guilabel>Conceptual Architecture</guilabel></para>
<para>The OpenStack project as a whole is designed to deliver a
massively scalable cloud operating system. To achieve this, each
of the constituent services are designed to work together to
provide a complete Infrastructure-as-a-Service (IaaS). This
integration is facilitated through public application
programming interfaces (APIs) that each service offers (and in
turn can consume). While these APIs allow each of the services
to use another service, it also allows an implementer to switch
out any service as long as they maintain the API. These are
(mostly) the same APIs that are available to end users of the
cloud.</para>
<para>Conceptually, you can picture the relationships between the
services as so:</para>
<figure>
<title>Conceptual Diagram</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image13.jpg"
contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<itemizedlist>
<listitem>
<para>Dashboard ("Horizon") provides a web front end to the
other OpenStack services</para>
</listitem>
<listitem>
<para>Compute ("Nova") stores and retrieves virtual disks
("images") and associated metadata in Image
("Glance")</para>
</listitem>
<listitem>
<para>Network ("Neutron") provides virtual networking for
Compute.</para>
</listitem>
<listitem>
<para>Block Storage ("Cinder") provides storage volumes for
Compute.</para>
</listitem>
<listitem>
<para>Image ("Glance") can store the actual virtual disk files
in the Object Store("Swift")</para>
</listitem>
<listitem>
<para>All the services authenticate with Identity
("Keystone")</para>
</listitem>
</itemizedlist>
<para>The conceptual diagram is a stylized and simplified view of the
architecture. It assumes that the implementer uses all services in the most
common configuration. It also shows only the operator side of the cloud; it
does not show how consumers might use the cloud. For example, many
users directly and heavily access object storage.</para>
<para><guilabel>Logical Architecture</guilabel></para>
<para>The following diagram is consistent with the conceptual architecture
as previously described:</para>
<figure>
<title>Logical diagram</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/openstack-arch-havana-logical-v1.jpg"
contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<itemizedlist>
<listitem>
<para>End users can interact through a common web interface
(Horizon) or directly to each service through their
API</para>
</listitem>
<listitem>
<para>All services authenticate through a common source
(facilitated through keystone)</para>
</listitem>
<listitem>
<para>Individual services interact with each other through
their public APIs (except where privileged administrator
commands are necessary)</para>
</listitem>
</itemizedlist>
<para>In the sections below, we'll delve into the architecture for
each of the services.</para>
<para><guilabel>Dashboard</guilabel></para>
<para>Horizon is a modular Django web application that provides
an end user and administrator interface to OpenStack
services.</para>
<figure>
<title>Horizon Dashboard</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image10.jpg"
contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<para>As with most web applications, the architecture is fairly
simple:</para>
<itemizedlist>
<listitem>
<para>Horizon is usually deployed via mod_wsgi in Apache.
The code itself is separated into a reusable python module
with most of the logic (interactions with various
OpenStack APIs) and presentation (to make it easily
customizable for different sites).</para>
</listitem>
<listitem>
<para>A database (configurable as to which one) which relies
mostly on the other services for data. It also stores very
little data of its own.</para>
</listitem>
</itemizedlist>
<para>From a network architecture point of view, this service
will need to be customer accessible as well as be able to talk
to each service's public APIs. If you wish to use the
administrator functionality (i.e. for other services), it will
also need connectivity to their Admin API endpoints (which
should be non-customer accessible).</para>
<para><guilabel>Compute</guilabel></para>
<para>Nova is the most complicated and distributed component of
OpenStack. A large number of processes cooperate to turn end
user API requests into running virtual machines. Below is a
list of these processes and their functions:</para>
<itemizedlist>
<listitem>
<para>nova-api accepts and responds to end user compute API
calls. It supports OpenStack Compute API, Amazon's EC2 API
and a special Admin API (for privileged users to perform
administrative actions). It also initiates most of the
orchestration activities (such as running an instance) as
well as enforces some policy (mostly quota checks).</para>
</listitem>
<listitem>
<para>The nova-compute process is primarily a worker daemon
that creates and terminates virtual machine instances via
hypervisor's APIs (XenAPI for XenServer/XCP, libvirt for
KVM or QEMU, VMwareAPI for VMware, etc.). The process by
which it does so is fairly complex but the basics are
simple: accept actions from the queue and then perform a
series of system commands (like launching a KVM instance)
to carry them out while updating state in the
database.</para>
</listitem>
<listitem>
<para>nova-volume manages the creation, attaching and
detaching of z volumes to compute instances, which has a similar
functionality to Amazons Elastic Block Storage. It can
use volumes from a variety of providers such as iSCSI or
Rados Block Device in Ceph. The OpenStack Block Storage project,
Cinder, has replaced the nova-volume functionality.</para>
</listitem>
<listitem>
<para>The nova-network worker daemon is very similar to
nova-compute and nova-volume. It accepts networking tasks
from the queue and then performs tasks to manipulate the
network (such as setting up bridging interfaces or
changing iptables rules). This functionality is being
migrated to Neutron, a separate OpenStack project. In the
Icehouse release, the functionality is duplicated between nova-network and Neutron.</para>
</listitem>
<listitem>
<para>The nova-schedule process is conceptually the simplest
piece of code in OpenStack Nova: it takes a virtual machine
instance request from the queue and determines where it
should run (specifically, which compute server host it
should run on).</para>
</listitem>
<listitem>
<para>The queue provides a central hub for passing messages
between daemons. This is usually implemented with RabbitMQ
today, but could be any AMQP message queue (such as Apache
Qpid and ZeroMQ).</para>
</listitem>
<listitem>
<para>The SQL database stores most of the build-time and
runtime state for a cloud infrastructure. This includes
the instance types that are available for use, instances
in use, networks available and projects. Theoretically,
OpenStack Nova can support any database supported by
SQL-Alchemy but the only databases currently being widely
used are SQLite3 (only appropriate for test and
development work), MySQL and PostgreSQL.</para>
</listitem>
<listitem>
<para>Nova also provides console services to allow end users
to access their virtual instance's console through a
proxy. This involves several daemons (nova-console,
nova-novncproxy and nova-consoleauth).</para>
</listitem>
</itemizedlist>
<para>Nova interacts with many other OpenStack services:
Keystone for authentication, Glance for images and Horizon for
web interface. The Glance interactions are central. The API
process can upload and query Glance while nova-compute will
download images for use in launching images.</para>
<para><guilabel>Object Store</guilabel></para>
<para>The swift architecture is very distributed to prevent any
single point of failure as well as to scale horizontally. It
includes the following components:</para>
<itemizedlist>
<listitem>
<para>Proxy server (swift-proxy-server) accepts incoming
requests via the OpenStack Object API or just raw HTTP. It
accepts files to upload, modifications to metadata or
container creation. In addition, it will also serve files
or container listing to web browsers. The proxy server may
utilize an optional cache (usually deployed with memcache)
to improve performance.</para>
</listitem>
<listitem>
<para>Account servers manage accounts defined with the
object storage service.</para>
</listitem>
<listitem>
<para>Container servers manage a mapping of containers (i.e
folders) within the object store service.</para>
</listitem>
<listitem>
<para>Object servers manage actual objects (i.e. files) on
the storage nodes.</para>
</listitem>
<listitem>
<para>There are also a number of periodic processes which run
to perform housekeeping tasks on the large data store. The
most important of these is the replication services, which
ensures consistency and availability through the cluster.
Other periodic processes include auditors, updaters and
reapers.</para>
</listitem>
</itemizedlist>
<para>Authentication is handled through configurable WSGI
middleware (which will usually be Keystone).</para>
<para><guilabel>Image Store</guilabel></para>
<para>The Glance architecture has stayed relatively stable since
the Cactus release. The biggest architectural change has been
the addition of authentication, which was added in the Diablo
release. Just as a quick reminder, Glance has four main parts
to it:</para>
<itemizedlist>
<listitem>
<para>glance-api accepts Image API calls for image
discovery, image retrieval and image storage.</para>
</listitem>
<listitem>
<para>glance-registry stores, processes and retrieves
metadata about images (size, type, etc.).</para>
</listitem>
<listitem>
<para>A database to store the image metadata. Like Nova, you
can choose your database depending on your preference (but
most people use MySQL or SQLite).</para>
</listitem>
<listitem>
<para>A storage repository for the actual image files. In
the diagram above, Swift is shown as the image repository,
but this is configurable. In addition to Swift, Glance
supports normal filesystems, RADOS block devices, Amazon
S3 and HTTP. Be aware that some of these choices are
limited to read-only usage.</para>
</listitem>
</itemizedlist>
<para>There are also a number of periodic processes which run on
Glance to support caching. The most important of these is the
replication services, which ensures consistency and
availability through the cluster. Other periodic processes
include auditors, updaters and reapers.</para>
<para>As you can see from the diagram in the Conceptual
Architecture section, Glance serves a central role to the
overall IaaS picture. It accepts API requests for images (or
image metadata) from end users or Nova components and can
store its disk files in the object storage service,
Swift.</para>
<para><guilabel>Identity</guilabel></para>
<para>Keystone provides a single point of integration for
OpenStack policy, catalog, token and authentication.</para>
<itemizedlist>
<listitem>
<para>Keystone handles API requests as well as providing
configurable catalog, policy, token and identity
services.</para>
</listitem>
<listitem>
<para>Each Keystone function has a pluggable backend which
allows different ways to use the particular service. Most
support standard backends like LDAP or SQL, as well as Key
Value Stores (KVS).</para>
</listitem>
</itemizedlist>
<para>Most people will use this as a point of customization for
their current authentication services.</para>
<para><guilabel>Network</guilabel></para>
<para>Neutron provides "network connectivity as a service"
between interface devices managed by other OpenStack services
(most likely Nova). The service works by allowing users to
create their own networks and then attach interfaces to them.
Like many of the OpenStack services, Neutron is highly
configurable due to its plug-in architecture. These plug-ins
accommodate different networking equipment and software. As
such, the architecture and deployment can vary dramatically.
In the above architecture, a simple Linux networking plug-in
is shown.</para>
<itemizedlist>
<listitem>
<para>neutron-server accepts API requests and then routes
them to the appropriate Neutron plug-in for action.</para>
</listitem>
<listitem>
<para>Neutron plug-ins and agents perform the actual actions
such as plugging and unplugging ports, creating networks
or subnets and IP addressing. These plug-ins and agents
differ depending on the vendor and technologies used in
the particular cloud. Neutron ships with plug-ins and
agents for: Cisco virtual and physical switches, NEC
OpenFlow products, Open vSwitch, Linux bridging, the Ryu
Network Operating System, and VMware NSX.</para>
</listitem>
<listitem>
<para>The common agents are L3 (layer 3), DHCP (dynamic host
IP addressing) and the specific plug-in agent.</para>
</listitem>
<listitem>
<para>Most Neutron installations will also make use of a
messaging queue to route information between the
neutron-server and various agents as well as a database to
store networking state for particular plug-ins.</para>
</listitem>
</itemizedlist>
<para>Neutron will interact mainly with Nova, where it will
provide networks and connectivity for its instances.</para>
<para><guilabel>Block Storage</guilabel></para>
<para>Cinder separates out the persistent block storage
functionality that was previously part of OpenStack Compute
(in the form of nova-volume) into its own service. The
OpenStack Block Storage API allows for manipulation of
volumes, volume types (similar to compute flavors) and volume
snapshots.</para>
<itemizedlist>
<listitem>
<para>cinder-api accepts API requests and routes them to
cinder-volume for action.</para>
</listitem>
<listitem>
<para>cinder-volume acts upon the requests by reading or
writing to the Cinder database to maintain state,
interacting with other processes (like cinder-scheduler)
through a message queue and directly upon block storage
providing hardware or software. It can interact with a
variety of storage providers through a driver
architecture. Currently, there are drivers for IBM,
SolidFire, NetApp, Nexenta, Zadara, linux iSCSI and other
storage providers.</para>
</listitem>
<listitem>
<para>Much like nova-scheduler, the cinder-scheduler daemon
picks the optimal block storage provider node to create
the volume on.</para>
</listitem>
<listitem>
<para>Cinder deployments will also make use of a messaging
queue to route information between the cinder processes as
well as a database to store volume state.</para>
</listitem>
</itemizedlist>
<para>Like Neutron, Cinder will mainly interact with Nova,
providing volumes for its instances.</para>
</chapter>

View File

@ -1,64 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="section_openstack-networking-concepts">
<title>OpenStack Networking Concepts</title>
<para><emphasis role="bold">Network Types</emphasis></para>
<para>The OpenStack Networking configuration provided by the
Rackspace Private Cloud cookbooks allows you to choose between
VLAN or GRE isolated networks, both provider and
tenant-specific. From the provider side, an administrator can
also create a flat network.</para>
<para>The type of network that is used for private tenant networks
is determined by the network_type attribute, which can be
edited in the Chef override_attributes. This attribute sets
both the default provider network type and the only type of
network that tenants are able to create. Administrators can
always create flat and VLAN networks. GRE networks of any type
require the network_type to be set to gre.</para>
<para><emphasis role="bold">Namespaces</emphasis></para>
<para>For each network you create, the Network node (or Controller
node, if combined) will have a unique network namespace
(netns) created by the DHCP and Metadata agents. The netns
hosts an interface and IP addresses for dnsmasq and the
quantum-ns-metadata-proxy. You can view the namespaces with
the ip netns [list], and can interact with the namespaces with
the ip netns exec &lt;namespace&gt; &lt;command&gt;
command.</para>
<para><emphasis role="bold">Metadata</emphasis></para>
<para>Not all networks or VMs need metadata access. Rackspace
recommends that you use metadata if you are using a single
network. If you need metadata, you may also need a default
route. (If you don't need a default route, no-gateway will
do.)</para>
<para>To communicate with the metadata IP address inside the
namespace, instances need a route for the metadata network
that points to the dnsmasq IP address on the same namespaced
interface. OpenStack Networking only injects a route when you
do not specify a gateway-ip in the subnet.</para>
<para>If you need to use a default route and provide instances
with access to the metadata route, create the subnet without
specifying a gateway IP and with a static route from 0.0.0.0/0
to your gateway IP address. Adjust the DHCP allocation pool so
that it will not assign the gateway IP. With this
configuration, dnsmasq will pass both routes to instances.
This way, metadata will be routed correctly without any
changes on the external gateway.</para>
<para><emphasis role="bold">OVS Bridges</emphasis></para>
<para>An OVS bridge for provider traffic is created and configured
on the nodes where single-network-node and single-compute are
applied. Bridges are created, but physical interfaces are not
added. An OVS bridge is not created on a Controller-only
node.</para>
<para>When creating networks, you can specify the type and
properties, such as Flat vs. VLAN, Shared vs. Tenant, or
Provider vs. Overlay. These properties identify and determine
the behavior and resources of instances attached to the
network. The cookbooks will create bridges for the
configuration that you specify, although they do not add
physical interfaces to provider bridges. For example, if you
specify a network type of GRE, a br-tun tunnel bridge will be
created to handle overlay traffic.</para>
</chapter>

File diff suppressed because it is too large Load Diff

View File

@ -1,437 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="section_queues-messaging">
<title>OpenStack Messaging and Queues</title>
<figure>
<title>Messaging in OpenStack</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image04.png" contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<para>AMQP is the messaging technology chosen by the OpenStack
cloud. The AMQP broker, either RabbitMQ or Qpid, sits between any
two Nova components and allows them to communicate in a loosely
coupled fashion. More precisely, Nova components (the compute
fabric of OpenStack) use Remote Procedure Calls (RPC hereinafter)
to communicate to one another; however such a paradigm is built
atop the publish/subscribe paradigm so that the following benefits
can be achieved:</para>
<itemizedlist>
<listitem>
<para>Decoupling between client and servant (such as the client
does not need to know where the servant reference
is).</para>
</listitem>
<listitem>
<para>Full a-synchronism between client and servant (such as the
client does not need the servant to run at the same time of
the remote call).</para>
</listitem>
<listitem>
<para>Random balancing of remote calls (such as if more servants
are up and running, one-way calls are transparently dispatched
to the first available servant).</para>
</listitem>
</itemizedlist>
<para>Nova uses direct, fanout, and topic-based exchanges. The
architecture looks like the one depicted in the figure
below:</para>
<figure>
<title>AMQP</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image24.png" contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<para>Nova implements RPC (both request+response, and one-way,
respectively nicknamed rpc.call and rpc.cast) over AMQP by
providing an adapter class which take cares of marshaling and
un-marshaling of messages into function calls. Each Nova service,
such as Compute, Scheduler, and so on, creates two queues at the
initialization time, one which accepts messages with routing keys
NODE-TYPE.NODE-ID, for example, compute.hostname, and another,
which accepts messages with routing keys as generic NODE-TYPE, for example compute. The former is used specifically when
Nova-API needs to redirect commands to a specific node like
euca-terminate instance. In this case, only the compute node
whose hosts hypervisor is running the virtual machine can kill
the instance. The API acts as a consumer when RPC calls are
request/response, otherwise it acts as publisher only.</para>
<para><guilabel>Nova RPC Mappings</guilabel></para>
<para>The figure below shows the internals of a message broker node
(referred to as a RabbitMQ node in the diagrams) when a single
instance is deployed and shared in an OpenStack cloud. Every component
within Nova connects to the message broker and, depending on its
personality, such as a compute node or a network node, may
use the queue either as an Invoker (such as API or Scheduler) or a
Worker (such as Compute or Network). Invokers and Workers do not
actually exist in the Nova object model, but in this example they are used
as an abstraction for the sake of clarity. An Invoker is a
component that sends messages in the queuing system using <command>rpc.call
</command> and <command>rpc.cast</command>. A worker is a component
that receives messages from the queuing system and replies
accordingly to rcp.call operations.</para>
<para>Figure 2 shows the following internal elements:</para>
<itemizedlist>
<listitem>
<para><emphasis role="bold">Topic Publisher:</emphasis> A Topic
Publisher comes to life when an rpc.call or an rpc.cast
operation is executed; this object is instantiated and used to
push a message to the queuing system. Every publisher connects
always to the same topic-based exchange; its life-cycle is
limited to the message delivery.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Direct Consumer:</emphasis> A Direct
Consumer comes to life if (an only if) a rpc.call operation is
executed; this object is instantiated and used to receive a
response message from the queuing system; Every consumer
connects to a unique direct-based exchange via a unique
exclusive queue; its life-cycle is limited to the message
delivery; the exchange and queue identifiers are determined by
a UUID generator, and are marshaled in the message sent by the
Topic Publisher (only rpc.call operations).</para>
</listitem>
<listitem>
<para><emphasis role="bold">Topic Consumer:</emphasis> A Topic
Consumer comes to life as soon as a Worker is instantiated and
exists throughout its life-cycle; this object is used to
receive messages from the queue and it invokes the appropriate
action as defined by the Worker role. A Topic Consumer
connects to the same topic-based exchange either via a shared
queue or via a unique exclusive queue. Every Worker has two
topic consumers, one that is addressed only during rpc.cast
operations (and it connects to a shared queue whose exchange
key is topic) and the other that is addressed only during
rpc.call operations (and it connects to a unique queue whose
exchange key is topic.host).</para>
</listitem>
<listitem>
<para><emphasis role="bold">Direct Publisher:</emphasis> A Direct
Publisher comes to life only during rpc.call operations and it
is instantiated to return the message required by the
request/response operation. The object connects to a
direct-based exchange whose identity is dictated by the
incoming message.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Topic Exchange:</emphasis> The
Exchange is a routing table that exists in the context of a
virtual host (the multi-tenancy mechanism provided by Qpid or
RabbitMQ); its type (such as topic vs. direct) determines the
routing policy; a message broker node will have only one
topic-based exchange for every topic in Nova.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Direct Exchange:</emphasis> This is a
routing table that is created during rpc.call operations;
there are many instances of this kind of exchange throughout
the life-cycle of a message broker node, one for each rpc.call
invoked.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Queue Element:</emphasis> A Queue is
a message bucket. Messages are kept in the queue until a
Consumer (either Topic or Direct Consumer) connects to the
queue and fetch it. Queues can be shared or can be exclusive.
Queues whose routing key is topic are shared amongst Workers
of the same personality.</para>
</listitem>
</itemizedlist>
<figure>
<title>RabbitMQ</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image20.png" contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<para><guilabel>RPC Calls</guilabel></para>
<para>The diagram below shows the message flow during an rp.call
operation:</para>
<orderedlist>
<listitem>
<para>A Topic Publisher is instantiated to send the message
request to the queuing system; immediately before the
publishing operation. A Direct Consumer is instantiated to
wait for the response message.</para>
</listitem>
<listitem>
<para>Once the message is dispatched by the exchange, it is
fetched by the Topic Consumer dictated by the routing key
(such as topic.host) and passed to the Worker in charge of
the task.</para>
</listitem>
<listitem>
<para>Once the task is completed, a Direct Publisher is
allocated to send the response message to the queuing
system.</para>
</listitem>
<listitem>
<para>Once the message is dispatched by the exchange, it is
fetched by the Direct Consumer dictated by the routing key
(such as msg_id) and passed to the Invoker.</para>
</listitem>
</orderedlist>
<figure>
<title>RabbitMQ</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image28.png" contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<para><guilabel>RPC Casts</guilabel></para>
<para>The diagram below the message flow during an rp.cast
operation:</para>
<orderedlist>
<listitem>
<para>A Topic Publisher is instantiated to send the message
request to the queuing system.</para>
</listitem>
<listitem>
<para>Once the message is dispatched by the exchange, it is
fetched by the Topic Consumer dictated by the routing key
(such as topic) and passed to the Worker in charge of the
task.</para>
</listitem>
</orderedlist>
<figure>
<title>RabbitMQ</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image20.png" contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<para><guilabel>AMQP Broker Load</guilabel></para>
<para>At any given time the load of a message broker node running
either Qpid or RabbitMQ is a function of the following
parameters:</para>
<itemizedlist>
<listitem>
<para>Throughput of API calls: the number of API calls (more
precisely rpc.call ops) being served by the OpenStack cloud
dictates the number of direct-based exchanges, related queues
and direct consumers connected to them.</para>
</listitem>
<listitem>
<para>Number of Workers: there is one queue shared amongst
workers with the same personality; however there are as many
exclusive queues as the number of workers; the number of
workers dictates also the number of routing keys within the
topic-based exchange, which is shared amongst all
workers.</para>
</listitem>
</itemizedlist>
<para>The figure below shows the status of a RabbitMQ node after
Nova components bootstrap in a test environment. Exchanges and
queues being created by Nova components are:</para>
<itemizedlist>
<listitem>
<para>Exchanges</para>
</listitem>
</itemizedlist>
<orderedlist>
<listitem>
<para>nova (topic exchange)</para>
</listitem>
</orderedlist>
<itemizedlist>
<listitem>
<para>Queues</para>
</listitem>
</itemizedlist>
<orderedlist>
<listitem>
<para>compute.phantom (phantom is the hostname)</para>
</listitem>
<listitem>
<para>compute</para>
</listitem>
<listitem>
<para>network.phantom (phantom is the hostname)</para>
</listitem>
<listitem>
<para>network</para>
</listitem>
<listitem>
<para>scheduler.phantom (phantom is the hostname)</para>
</listitem>
<listitem>
<para>scheduler</para>
</listitem>
</orderedlist>
<para><guilabel>RabbitMQ Gotchas</guilabel></para>
<para>Nova uses Kombu to connect to the RabbitMQ environment. Kombu
is a Python library that in turn uses AMQPLib, a library that
implements the standard AMQP 0.8 at the time of writing. When
using Kombu, Invokers and Workers need the following parameters in
order to instantiate a Connection object that connects to the
RabbitMQ server (please note that most of the following material
can be also found in the Kombu documentation; it has been
summarized and revised here for the sake of clarity):</para>
<itemizedlist>
<listitem>
<para><emphasis role="bold">Hostname:</emphasis> The hostname to
the AMQP server.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Userid:</emphasis> A valid username
used to authenticate to the server.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Password:</emphasis> The password
used to authenticate to the server.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Virtual_host:</emphasis> The name of
the virtual host to work with. This virtual host must exist on
the server, and the user must have access to it. Default is
“/”.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Port:</emphasis> The port of the
AMQP server. Default is 5672 (amqp).</para>
</listitem>
</itemizedlist>
<para>The following parameters are default:</para>
<itemizedlist>
<listitem>
<para><emphasis role="bold">Insist:</emphasis> Insist on
connecting to a server. In a configuration with multiple
load-sharing servers, the Insist option tells the server that
the client is insisting on a connection to the specified
server. Default is False.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Connect_timeout:</emphasis> The
timeout in seconds before the client gives up connecting to
the server. The default is no timeout.</para>
</listitem>
<listitem>
<para><emphasis role="bold">SSL:</emphasis> Use SSL to connect
to the server. The default is False.</para>
</listitem>
</itemizedlist>
<para>More precisely consumers need the following parameters:</para>
<itemizedlist>
<listitem>
<para><emphasis role="bold">Connection:</emphasis> The above
mentioned Connection object.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Queue:</emphasis> Name of the
queue.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Exchange:</emphasis> Name of the
exchange the queue binds to.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Routing_key:</emphasis> The
interpretation of the routing key depends on the value of the
exchange_type attribute.</para>
</listitem>
</itemizedlist>
<itemizedlist>
<listitem>
<para><emphasis role="bold">Direct exchange:</emphasis> If the
routing key property of the message and the routing_key
attribute of the queue are identical, then the message is
forwarded to the queue.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Fanout exchange:</emphasis> Messages
are forwarded to the queues bound the exchange, even if the
binding does not have a key.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Topic exchange:</emphasis> If the
routing key property of the message matches the routing key of
the key according to a primitive pattern matching scheme, then
the message is forwarded to the queue. The message routing key
then consists of words separated by dots (”.”, like domain
names), and two special characters are available; star (“”)
and hash (“#”). The star matches any word, and the hash
matches zero or more words. For example ”.stock.#” matches the
routing keys “usd.stock” and “eur.stock.db” but not
“stock.nasdaq”.</para>
</listitem>
</itemizedlist>
<itemizedlist>
<listitem>
<para><emphasis role="bold">Durable:</emphasis> This flag
determines the durability of both exchanges and queues;
durable exchanges and queues remain active when a RabbitMQ
server restarts. Non-durable exchanges/queues (transient
exchanges/queues) are purged when a server restarts. It is
worth noting that AMQP specifies that durable queues cannot
bind to transient exchanges. Default is True.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Auto_delete:</emphasis> If set, the
exchange is deleted when all queues have finished using it.
Default is False.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Exclusive:</emphasis> Exclusive
queues (such as non-shared) may only be consumed from by the
current connection. When exclusive is on, this also implies
auto_delete. Default is False.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Exchange_type:</emphasis> AMQP
defines several default exchange types (routing algorithms)
that covers most of the common messaging use cases.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Auto_ack:</emphasis> Acknowledgement
is handled automatically once messages are received. By
default auto_ack is set to False, and the receiver is required
to manually handle acknowledgment.</para>
</listitem>
<listitem>
<para><emphasis role="bold">No_ack:</emphasis> It disables
acknowledgement on the server-side. This is different from
auto_ack in that acknowledgement is turned off altogether.
This functionality increases performance but at the cost of
reliability. Messages can get lost if a client dies before it
can deliver them to the application.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Auto_declare:</emphasis> If this is
True and the exchange name is set, the exchange will be
automatically declared at instantiation. Auto declare is on by
default. Publishers specify most the parameters of consumers
(they do not specify a queue name), but they can also
specify the following:</para>
</listitem>
<listitem>
<para><emphasis role="bold">Delivery_mode:</emphasis> The default
delivery mode used for messages. The value is an integer. The
following delivery modes are supported by RabbitMQ:</para>
</listitem>
</itemizedlist>
<itemizedlist>
<listitem>
<para><emphasis role="bold">1 or “transient”:</emphasis> The
message is transient. Which means it is stored in memory only,
and is lost if the server dies or restarts.</para>
</listitem>
<listitem>
<para><emphasis role="bold">2 or “persistent”:</emphasis> The
message is persistent. Which means the message is stored both
in-memory, and on disk, and therefore preserved if the server
dies or restarts.</para>
</listitem>
</itemizedlist>
<para>The default value is 2 (persistent). During a send operation,
publishers can override the delivery mode of messages so that, for
example, transient messages can be sent over a durable
queue.</para>
</chapter>

View File

@ -1,140 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="section_security-in-neutron">
<title>Security in Neutron</title>
<para><guilabel>Security Groups</guilabel></para>
<para>Security groups and security group rules allow
administrators and tenants the ability to specify the type
of traffic and direction (ingress/egress) that is allowed
to pass through a port. A security group is a container
for security group rules.</para>
<para>When a port is created in OpenStack Networking it is
associated with a security group. If a security group is
not specified the port will be associated with a 'default'
security group. By default this group will drop all
ingress traffic and allow all egress traffic. Rules can be added
to this group in order to change this behaviour.</para>
<para>If one desires to use the OpenStack Compute security
group APIs and/or have OpenStack Compute orchestrate the
creation of new ports for instances on specific security
groups, additional configuration is needed. To enable
this, one must configure the following file
/etc/nova/nova.conf and set the config option
security_group_api=neutron on every node running
nova-compute and nova-api. After this change is made,
restart nova-api and nova-compute in order to pick up this
change. After this change is made, the user will be able to use
both the OpenStack Compute and OpenStack Network security
group API at the same time.</para>
<para><guilabel>Authentication and Authorization</guilabel></para>
<para>OpenStack Networking uses the OpenStack Identity service
(project name keystone) as the default authentication
service. When OpenStack Identity is enabled, users
submitting requests to the OpenStack Networking service
must provide an authentication token in X-Auth-Token
request header. The aforementioned token should have been
obtained by authenticating with the OpenStack Identity
endpoint. For more information concerning authentication
with OpenStack Identity, please refer to the OpenStack
Identity documentation. When OpenStack Identity is
enabled, it is not mandatory to specify tenant_id for
resources in create requests, as the tenant identifier
will be derived from the Authentication token. Please note
that the default authorization settings only allow
administrative users to create resources on behalf of a
different tenant. OpenStack Networking uses information
received from OpenStack Identity to authorize user
requests. OpenStack Networking handles two kind of
authorization policies:</para>
<itemizedlist>
<listitem>
<para><emphasis role="bold">Operation-based:</emphasis>
policies specify access criteria for specific
operations, possibly with fine-grained control over
specific attributes.</para>
</listitem>
<listitem>
<para><emphasis role="bold"
>Resource-based:</emphasis>whether access to a specific
resource might be granted or not according to the
permissions configured for the resource (currently
available only for the network resource). The actual
authorization policies enforced in OpenStack
Networking might vary from deployment to
deployment.</para>
</listitem>
</itemizedlist>
<para>The policy engine reads entries from the policy.json
file. The actual location of this file might vary from
distribution to distribution. Entries can be updated while
the system is running, and no service restart is required.
That is to say, every time the policy file is updated, the
policies will be automatically reloaded. Currently the
only way of updating such policies is to edit the policy
file. Please note that in this section we will use both
the terms "policy" and "rule" to refer to objects which
are specified in the same way in the policy file; in other
words, there are no syntax differences between a rule and
a policy. We will define a policy as something which is
matched directly from the OpenStack Networking policy
engine, whereas we will define a rule as the elements of
such policies, which are then evaluated. For instance, in
create_subnet: [["admin_or_network_owner"]], create_subnet
is regarded as a policy, whereas admin_or_network_owner is
regarded as a rule.</para>
<para>Policies are triggered by the OpenStack Networking
policy engine whenever one of them matches an OpenStack
Networking API operation or a specific attribute being
used in a given operation. For instance the create_subnet
policy is triggered every time a POST /v2.0/subnets
request is sent to the OpenStack Networking server; on the
other hand create_network:shared is triggered every time
the shared attribute is explicitly specified (and set to a
value different from its default) in a POST /v2.0/networks
request. It is also worth mentioning that policies can
also relate to specific API extensions; for instance
extension:provider_network:set will be triggered if the
attributes defined by the Provider Network extensions are
specified in an API request.</para>
<para>An authorization policy can be composed by one or more
rules. If more rules are specified, the evaluation policy will
be successful, if any of the rules evaluate successfully.
If an API operation matches multiple policies, then all
the policies must evaluate successfully. Also,
authorization rules are recursive. Once a rule is matched,
the rule(s) can be resolved to another rule, until a
terminal rule is reached.</para>
<para>The OpenStack Networking policy engine currently defines
the following kinds of terminal rules:</para>
<itemizedlist>
<listitem>
<para><emphasis role="bold">Role-based
rules:</emphasis> evaluate successfully if the
user submitting the request has the specified role.
For instance "role:admin"is successful if the user
submitting the request is an administrator.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Field-based
rules:</emphasis> evaluate successfully if a field
of the resource specified in the current request
matches a specific value. For instance,
"field:networks:shared=True" is successful if the
attribute shared of the network resource is set to
true.</para>
</listitem>
<listitem>
<para><emphasis role="bold">Generic
rules:</emphasis>compare an attribute in the resource
with an attribute extracted from the user's security
credentials and evaluates successfully if the
comparison is successful. For instance
"tenant_id:%(tenant_id)s" is successful if the tenant
identifier in the resource is equal to the tenant
identifier of the user submitting the request.</para>
</listitem>
</itemizedlist>
</chapter>

View File

@ -1,206 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="section_vm-placement">
<title>VM Placement</title>
<para>Compute uses the nova-scheduler service to determine how to
dispatch compute and volume requests. For example, the
nova-scheduler service determines which host a VM should launch
on. The term host, in the context of filters, means a physical node
that has the <systemitem class="service">nova-compute</systemitem>
service running on it. You can configure the scheduler through a
variety of options.</para>
<figure>
<title>Nova</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image29.png" contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<para>Just as shown by the above figure, nova-scheduler interacts with
other components through the queue and central database repo. For
scheduling, the queue is the essential communications hub.</para>
<para>All compute nodes (also known as hosts in terms of OpenStack)
periodically publish their status, resources available and
hardware capabilities to nova-scheduler through the queue.
Nova-scheduler then collects this data and uses it to make
decisions when a request comes in.</para>
<para>By default, the compute scheduler is configured as a filter
scheduler, as described in the next section. In the default
configuration, this scheduler considers hosts that meet all of the
following criteria:</para>
<itemizedlist>
<listitem>
<para>Are in the requested availability zone
(AvailabilityZoneFilter).</para>
</listitem>
<listitem>
<para>Have sufficient RAM available (RamFilter).</para>
</listitem>
<listitem>
<para>Are capable of servicing the request
(ComputeFilter).</para>
</listitem>
</itemizedlist>
<para><guilabel>Filter Scheduler</guilabel></para>
<para>The Filter Scheduler supports filtering and weighting to
make informed decisions on where a new instance should be created.
This Scheduler only supports working with Compute Nodes.</para>
<para><guilabel>Filtering</guilabel></para>
<figure>
<title>Filtering</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image27.png" contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<para>During its work, Filter Scheduler first makes a dictionary
of unfiltered hosts, then filters them using filter properties
and finally chooses hosts for the requested number of
instances (each time it chooses the most weighed host and
appends it to the list of selected hosts).</para>
<para>If it turns up that it cant find candidates for the next
instance, it means that there are no more appropriate hosts
where the instance could be scheduled.</para>
<para>If we speak about filtering and weighting, their work is
quite flexible in the Filter Scheduler. There are a lot of
filtering strategies for the Scheduler to support. Also you
can even implement your own algorithm of filtering.</para>
<para>There are some standard filter classes to use
(nova.scheduler.filters):</para>
<itemizedlist>
<listitem>
<para>AllHostsFilter - This filter does no
operation. It passes all the available hosts.</para>
</listitem>
<listitem>
<para>ImagePropertiesFilter - filters hosts based on
properties defined on the instances image. It passes
hosts that can support the specified image properties
contained in the instance.</para>
</listitem>
<listitem>
<para>AvailabilityZoneFilter - filters hosts by availability
zone. It passes hosts matching the availability zone
specified in the instance properties.</para>
</listitem>
<listitem>
<para>ComputeCapabilitiesFilter - checks that the
capabilities provided by the host Compute service satisfy
any extra specifications associated with the instance
type. It passes hosts that can create the specified
instance type.</para>
</listitem>
<listitem>
<para>The extra specifications can have a scope at the
beginning of the key string of a key/value pair. The scope
format is scope:key and can be nested, i.e. key_string :=
scope:key_string. Example like capabilities:cpu_info:
features is valid scope format. A key string without any :
is non-scope format. Each filter defines its valid scope,
and not all filters accept non-scope format.</para>
</listitem>
<listitem>
<para>The extra specifications can have an operator at the
beginning of the value string of a key/value pair. If
there is no operator specified, then a default operator of
s== is used. Valid operators are:</para>
</listitem>
</itemizedlist>
<para>* = (equal to or greater than as a number; same as vcpus
case)* == (equal to as a number)* != (not equal to as a
number)* &gt;= (greater than or equal to as a number)* &lt;=
(less than or equal to as a number)* s== (equal to as a
string)* s!= (not equal to as a string)* s&gt;= (greater than
or equal to as a string)* s&gt; (greater than as a string)*
s&lt;= (less than or equal to as a string)* s&lt; (less than
as a string)* &lt;in&gt; (substring)* &lt;or&gt; (find one of
these)Examples are: "&gt;= 5", "s== 2.1.0", "&lt;in&gt; gcc",
and "&lt;or&gt; fpu &lt;or&gt; gpu"</para>
<programlisting>class RamFilter(filters.BaseHostFilter):
"""Ram Filter with over subscription flag"""
def host_passes(self, host_state, filter_properties):
"""Only return hosts with sufficient available RAM."""
instance_type = filter_properties.get('instance_type')
requested_ram = instance_type['memory_mb']
free_ram_mb = host_state.free_ram_mb
total_usable_ram_mb = host_state.total_usable_ram_mb
used_ram_mb = total_usable_ram_mb - free_ram_mb
return total_usable_ram_mb * FLAGS.ram_allocation_ratio - used_ram_mb >= requested_ram</programlisting>
<para>Here ram_allocation_ratio means the virtual RAM to
physical RAM allocation ratio (it is 1.5 by default). Really,
nice and simple.</para>
<para>The next standard filter to describe is AvailabilityZoneFilter
and it isnt difficult. This filter just looks at the
availability zone of compute node and availability zone from
the properties of the request. Each Compute service has its
own availability zone, so that deployment engineers have an option
to run scheduler with availability zones support and can
configure availability zones on each compute host. This
classes method host_passes returns True if the availability zone
mentioned in the request is the same on the current compute
host.</para>
<para>The ImagePropertiesFilter filters hosts based on the
architecture, hypervisor type, and virtual machine mode
specified in the instance. E.g., an instance might require a
host that supports the arm architecture on a qemu compute
host. The ImagePropertiesFilter will only pass hosts that can
satisfy this request. These instance properties are populated
from properties defined on the instances image. E.g. an image
can be decorated with these properties using glance
image-update img-uuid --property architecture=arm --property
hypervisor_type=qemu Only hosts that satisfy these
requirements will pass the ImagePropertiesFilter.</para>
<para>ComputeCapabilitiesFilter checks if the host satisfies any
extra_specs specified on the instance type. The extra_specs
can contain key/value pairs. The key for the filter is either
non-scope format (i.e. no : contained), or scope format in
capabilities scope (i.e. capabilities:xxx:yyy). One example of
capabilities scope is capabilities:cpu_info:features, which
will match hosts cpu features capabilities. The
ComputeCapabilitiesFilter will only pass hosts whose
capabilities satisfy the requested specifications. All hosts
are passed if no extra_specs are specified.</para>
<para>ComputeFilter is quite simple and passes any host whose
Compute service is enabled and operational.</para>
<para>Now we are going to the IsolatedHostsFilter. There can be some
special hosts reserved for specific images. These hosts are
called isolated. The images to run on the isolated hosts
are also called isolated. This Scheduler checks if the
image_isolated flag named in instance specifications is the
same that the host has.</para>
<para><guilabel>Weights</guilabel></para>
<para>Filter Scheduler uses so-called weights during its
work.</para>
<para>The Filter Scheduler weighs hosts based on the config
option scheduler_weight_classes, this defaults to
nova.scheduler.weights.all_weighers, which selects the only
weigher available the RamWeigher. Hosts are then weighed and
sorted with the largest weight winning.</para>
<para>Filter Scheduler finds local list of acceptable hosts by
repeated filtering and weighing. Each time it chooses a host, it
virtually consumes resources on it, so subsequent selections can
adjust accordingly. It is useful if the customer asks for the
same large amount of instances, because weight is computed for
each instance requested.</para>
<figure>
<title>Weights</title>
<mediaobject>
<imageobject>
<imagedata fileref="https://raw.githubusercontent.com/openstack/openstack-manuals/master/doc/common/../figures/nova-weighting-hosts.png"
contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<para>In the end Filter Scheduler sorts selected hosts by their
weight and provisions instances on them.</para>
</chapter>

View File

@ -1,217 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="section_vm-provisioning-indepth">
<title>VM provisioning in-depth</title>
<!--
<para>More content to be added...</para>
-->
<para>
The request flow for provisioning an instance goes like
this:
</para>
<!-- The steps here correspond to numbers in figure
../figures/image02.png at the end of this file. Do not renumber
the steps -->
<orderedlist>
<listitem>
<!-- 1 -->
<para>The dashboard or CLI gets the user credentials and authenticates
with the Identity Service via REST API.
</para>
<para>
The Identity Service authenticates the user with the user
credentials, and then generates and sends back an auth-token
which will be used for sending the request to other components
through REST-call.
</para>
</listitem>
<listitem>
<!-- 2 -->
<para>
The dashboard or CLI converts the new instance request
specified in <guilabel>launch instance</guilabel> or
<command>nova-boot</command> form to a REST API request and
sends it to <systemitem class="service">nova-api</systemitem>.
</para>
</listitem>
<listitem>
<!-- 3 -->
<para>
<systemitem class="service">nova-api</systemitem> receives the
request and sends a request to the Identity Service for
validation of the auth-token and access permission.
</para>
<para>
The Identity Service validates the token and sends updated
authentication headers with roles and permissions.
</para>
</listitem>
<listitem>
<!-- 4 -->
<para>
<systemitem class="service">nova-api</systemitem> checks for
conflicts with <systemitem
class="service">nova-database</systemitem>.
</para>
<para>
<systemitem class="service">nova-api</systemitem> creates
initial database entry for a new instance.
</para>
</listitem>
<listitem>
<!-- 5 -->
<para>
<systemitem class="service">nova-api</systemitem> sends the
rpc.call request to <systemitem
class="service">nova-scheduler</systemitem> expecting to get
updated instance entry with host ID specified.
</para>
</listitem>
<listitem>
<!-- 6 -->
<para>
<systemitem class="service">nova-scheduler</systemitem> picks
up the request from the queue.
</para>
</listitem>
<listitem>
<!-- 7 -->
<para>
<systemitem class="service">nova-scheduler</systemitem>
interacts with <systemitem
class="service">nova-database</systemitem> to find an
appropriate host via filtering and weighing.
</para>
<para>
<systemitem class="service">nova-scheduler</systemitem>
returns the updated instance entry with the appropriate host
ID after filtering and weighing.
</para>
<para>
<systemitem class="service">nova-scheduler</systemitem> sends
the rpc.cast request to <systemitem
class="service">nova-compute</systemitem> for launching an
instance on the appropriate host.
</para>
</listitem>
<listitem>
<!-- 8 -->
<para>
<systemitem class="service">nova-compute</systemitem> picks up
the request from the queue.
</para>
</listitem>
<listitem>
<para>
<!-- 9 -->
<systemitem class="service">nova-compute</systemitem> sends the
rpc.call request to <systemitem
class="service">nova-conductor</systemitem> to fetch the
instance information such as host ID and flavor (RAM, CPU,
Disk).
</para>
</listitem>
<listitem>
<!-- 10 -->
<para>
<systemitem class="service">nova-conductor</systemitem> picks
up the request from the queue.
</para>
</listitem>
<listitem>
<!-- 11 -->
<para>
<systemitem class="service">nova-conductor</systemitem>
interacts with <systemitem
class="service">nova-database</systemitem>.
</para>
<para>
<systemitem class="service">nova-conductor</systemitem>
returns the instance information.
</para>
<para>
<systemitem class="service">nova-compute</systemitem> picks up the
instance information from the queue.
</para>
</listitem>
<listitem>
<!-- 12 -->
<para>
<systemitem class="service">nova-compute</systemitem> performs
the REST call by passing the auth-token to <systemitem
class="service">glance-api</systemitem>. Then, <systemitem
class="service">nova-compute</systemitem> uses the Image ID to
retrieve the Image URI from the Image Service, and loads the
image from the image storage.
</para>
</listitem>
<listitem>
<para>
<!-- 13 -->
<systemitem class="service">glance-api</systemitem> validates
the auth-token with keystone.
</para>
<para>
<systemitem class="service">nova-compute</systemitem> gets the
image metadata.
</para>
</listitem>
<listitem>
<para>
<!-- 14 -->
<systemitem class="service">nova-compute</systemitem> performs
the REST-call by passing the auth-token to Network API to
allocate and configure the network so that the instance gets
the IP address.
</para>
</listitem>
<listitem>
<!-- 15 -->
<para>
<systemitem class="service">neutron-server</systemitem>
validates the auth-token with keystone.
</para>
<para>
<systemitem class="service">nova-compute</systemitem>
retrieves the network info.
</para>
</listitem>
<listitem>
<para>
<!-- 16 -->
<systemitem class="service">nova-compute</systemitem> performs
the REST call by passing the auth-token to Volume API to attach
volumes to the instance.
</para>
</listitem>
<listitem>
<para>
<!-- 17 -->
<systemitem class="service">cinder-api</systemitem> validates
the auth-token with keystone.
</para>
<para>
<systemitem class="service">nova-compute</systemitem> retrieves the
block storage info.
</para>
</listitem>
<listitem>
<para>
<systemitem class="service">nova-compute</systemitem>
generates data for the hypervisor driver and executes the
request on the hypervisor (via libvirt or API).
</para>
</listitem>
</orderedlist>
<figure>
<title>Nova VM provisioning</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image02.png" contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
</chapter>

View File

@ -1,241 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="section_vm-provisioning-walk-through">
<title>VM Provisioning Walk Through</title>
<para>More Content To be Added ...</para>
<para>OpenStack Compute gives you a tool to orchestrate a cloud,
including running instances, managing networks, and controlling
access to the cloud through users and projects. The underlying
open source project's name is Nova, and it provides the software
that can control an Infrastructure-as-a-Service (IaaS) cloud
computing platform. It is similar in scope to Amazon EC2 and
Rackspace Cloud Servers. OpenStack Compute does not include any
virtualization software; rather it defines drivers that interact
with underlying virtualization mechanisms that run on your host
operating system, and exposes functionality over a web-based
API.</para>
<para><guilabel>Hypervisors</guilabel></para>
<para>OpenStack Compute requires a hypervisor and Compute controls
the hypervisors through an API server. The process for selecting
a hypervisor usually means prioritizing and making decisions
based on budget and resource constraints as well as the
inevitable list of supported features and required technical
specifications. The majority of development is done with the KVM
and Xen-based hypervisors. Refer to
<link xlink:href="http://wiki.openstack.org/HypervisorSupportMatrix"></link>
for a detailed list of features and support across the hypervisors.</para>
<para>With OpenStack Compute, you can orchestrate clouds using
multiple hypervisors in different zones. The types of
virtualization standards that may be used with Compute
include:</para>
<itemizedlist>
<listitem>
<para>KVM- Kernel-based Virtual Machine (visit <link
xlink:href="http://www.linux-kvm.org/"
>http://www.linux-kvm.org/</link>)</para>
</listitem>
<listitem>
<para>LXC- Linux Containers (through libvirt) (visit <link
xlink:href="http://linuxcontainers.org/"
>http://linuxcontainers.org/</link>)</para>
</listitem>
<listitem>
<para>QEMU- Quick EMUlator (visit <link
xlink:href="http://www.qemu.org/"
>http://www.qemu.org/</link>)</para>
</listitem>
<listitem>
<para>UML- User Mode Linux (visit <link
xlink:href="http://en.wikipedia.org/wiki/User-mode_Linux"
>http://en.wikipedia.org/wiki/User-mode_Linux</link>)</para>
</listitem>
<listitem>
<para>VMware vSphere4.1 update 1 and newer (visit <link
xlink:href="http://vmware.com/products/vsphere"
>http://vmware.com/products/vsphere</link>)</para>
</listitem>
<listitem>
<para>Xen- Xen, Citrix XenServer and Xen Cloud Platform (XCP)
(visit <link xlink:href="http://wiki.xen.org/"
>http://wiki.xen.org/</link>)</para>
</listitem>
<listitem>
<para>Bare Metal- Provisions physical hardware via pluggable
sub-drivers. (visit
<link xlink:href="https://wiki.openstack.org/wiki/GeneralBareMetalProvisioningFramework"
>Bare Metal wiki page</link>)</para>
</listitem>
</itemizedlist>
<para><guilabel>Users and Tenants (Projects)</guilabel></para>
<para>The OpenStack Compute system is designed to be used by many
different cloud computing consumers or customers, basically
tenants on a shared system, using role-based access assignments.
Roles control the actions that a user is allowed to perform. In
the default configuration, most actions do not require a
particular role, but this is configurable by the system
administrator editing the appropriate <filename>policy.json</filename>
file that
maintains the rules. For example, a rule can be defined so that
a user cannot allocate a public IP without the admin role. A
user's access to particular images is limited by tenant, but the
username and password are assigned per user. Key pairs granting
access to an instance are enabled per user, but quotas to
control resource consumption across available hardware resources
are per tenant.</para>
<para>While the original EC2 API supports users, OpenStack Compute
adds the concept of tenants. Tenants are isolated resource
containers forming the principal organizational structure within
the Compute service. They consist of a separate VLAN, volumes,
instances, images, keys, and users. A user can specify which
tenant he or she wishes to be known as by appending :project_id
to his or her access key. If no tenant is specified in the API
request, Compute attempts to use a tenant with the same ID as
the user</para>
<para>For tenants, quota controls are available to limit
the:</para>
<itemizedlist>
<listitem>
<para>Number of volumes which may be created</para>
</listitem>
<listitem>
<para>Total size of all volumes within a project as measured
in GB</para>
</listitem>
<listitem>
<para>Number of instances which may be launched</para>
</listitem>
<listitem>
<para>Number of processor cores which may be allocated</para>
</listitem>
<listitem>
<para>Floating IP addresses (assigned to any instance when it
launches so the instance has the same publicly accessible IP
addresses)</para>
</listitem>
<listitem>
<para>Fixed IP addresses (assigned to the same instance each
time it boots, publicly or privately accessible, typically
private for management purposes)</para>
</listitem>
</itemizedlist>
<para><guilabel>Images and Instances</guilabel></para>
<para>This introduction provides a high level overview of what
images and instances are and description of the life-cycle of a
typical virtual system within the cloud. There are many ways to
configure the details of an OpenStack cloud and many ways to
implement a virtual system within that cloud. These
configuration details as well as the specific command-line
utilities and API calls to perform the actions described are
presented in the Image Management and Volume
Management chapters.</para>
<para>Images are disk images which are templates for virtual
machine file systems. The OpenStack Image Service is responsible
for the storage and management of images within
OpenStack.</para>
<para>Instances are the individual virtual machines running on
physical compute nodes. The OpenStack Compute service manages
instances. Any number of instances may be started from the same
image. Each instance is run from a copy of the base image so
runtime changes made by an instance do not change the image it
is based on. Snapshots of running instances may be taken which
create a new image based on the current disk state of a
particular instance.</para>
<para>When starting an instance, a set of virtual resources known
as a flavor must be selected. Flavors define how many virtual
CPUs an instance has and the amount of RAM and size of its
ephemeral disks. OpenStack provides a number of predefined
flavors which cloud administrators may edit or add to. Users
must select from the set of available flavors defined on their
cloud.</para>
<para>Additional resources such as persistent volume storage and a
public IP address may be added to and removed from running
instances. The examples below show the cinder-volume service
which provide persistent block storage as opposed to the
ephemeral storage provided by the instance flavor.</para>
<para>Here is an example of the life cycle of a typical virtual
system within an OpenStack cloud to illustrate these
concepts.</para>
<para><guilabel>Initial State</guilabel></para>
<para><guilabel>Images and Instances</guilabel></para>
<para>The following diagram shows the system state prior to
launching an instance. The image store fronted by the Image
Service has some number of predefined images. In the
cloud, there is an available compute node with available vCPU,
memory and local disk resources. Plus there are a number of
predefined volumes in the
<systemitem class="service">cinder-volume</systemitem> service.
</para>
<para>Figure 2.1. Base image state with no running
instances</para>
<figure>
<title>Initial State</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image21.png" contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<para><guilabel>Launching an instance</guilabel></para>
<para>To launch an instance, the user selects an image, a flavor,
and other optional attributes. In this case the selected
flavor provides a root volume (as all flavors do). Let us assume that the
root volume is labelled as 'vda' and additional ephemeral storage labelled
as 'vdb'. The user has also opted to map a volume from the
<systemitem class="service">cinder-volume</systemitem>
store to the third virtual disk, vdc, on this instance.</para>
<para>Figure 2.2. Instance creation from image and run time
state</para>
<figure>
<title>Launch VM Instance</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image09.png" contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<para>The OpenStack system copies the base image from the image
store to local disk which is used as the first disk of the
instance (vda). Having small images will result in faster start
up of your instances as less data needs to be copied across the
network. The system also creates a new empty disk image to
present as the second disk (vdb). Be aware that the second disk
is an empty disk with an ephemeral life as it is destroyed when
you delete the instance. The compute node attaches to the
requested <systemitem class="service">cinder-volume</systemitem>
using iSCSI and maps this to the third disk (vdc) as requested.
The vCPU and memory resources are provisioned and the instance is booted
from the first drive. The instance runs and changes data on the disks
highlighted in yellow in the diagram.</para>
<para>There are many possible variations in the details of the
scenario, particularly in terms of what the backing storage is
and the network protocols used to attach and move storage. One
variant worth mentioning here is that the ephemeral storage used
for volumes vda and vdb in this example may be backed by network
storage rather than local disk. The details are left for later
chapters.</para>
<para><guilabel>End State</guilabel></para>
<para>Once the instance has served its purpose and is deleted,
all state is reclaimed, except the persistent volume. The
ephemeral storage is purged. Memory and vCPU resources are
released. The image remains unchanged
throughout.</para>
<para>Figure 2.3. End state of image and volume after instance
exits</para>
<figure>
<title>End State</title>
<mediaobject>
<imageobject>
<imagedata fileref="../figures/image22.png" contentwidth="7in"/>
</imageobject>
</mediaobject>
</figure>
<para>Once you launch a VM in OpenStack, there's something more
going on in the background. To understand what's happening
behind the dashboard, lets take a deeper dive into OpenStack's
VM provisioning. For launching a VM, you can either use
the command-line interface or the OpenStack dashboard.
</para>
</chapter>

View File

@ -1,29 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<book xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="bk_developer-training-guide">
<title>Developer Training Guide</title>
<xi:include href="./ch_developer-getting-started.xml"/>
<xi:include href="./ch_developer-getting-started-lab.xml"/>
<xi:include href="./ch_developer-getting-started-quiz.xml"/>
<xi:include href="./ch_developer-apis-in-depth.xml"/>
<xi:include href="./ch_developer-apis-day-two-lab.xml"/>
<xi:include href="./ch_developer-apis-day-two-quiz.xml"/>
<xi:include href="./ch_developer-apis-day-three-lab.xml"/>
<xi:include href="./ch_developer-apis-day-three-quiz.xml"/>
<xi:include href="./ch_developer-apis-day-four-lab.xml"/>
<xi:include href="./ch_developer-apis-day-four-quiz.xml"/>
<xi:include href="./ch_developer-how-to-partipate.xml"/>
<xi:include href="./ch_developer-how-to-participate-day-five-lab.xml"/>
<xi:include href="./ch_developer-how-to-participate-day-five-quiz.xml"/>
<xi:include href="./ch_developer-how-to-participate-day-six-lab.xml"/>
<xi:include href="./ch_developer-how-to-participate-day-six-quiz.xml"/>
<xi:include href="./ch_developer-how-to-participate-day-seven-lab.xml"/>
<xi:include href="./ch_developer-how-to-participate-day-seven-quiz.xml"/>
<xi:include href="./ch_developer-how-to-participate-day-eight-lab.xml"/>
<xi:include href="./ch_developer-how-to-participate-day-eight-quiz.xml"/>
<xi:include href="./ch_developer-how-to-participate-day-nine-lab.xml"/>
<xi:include href="./ch_developer-how-to-participate-day-nine-quiz.xml"/>
<xi:include href="./ch_developer-assessment.xml"/>
<xi:include href="./ch_developer-how-to-participate-bootcamp.xml"/>
</book>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-apis-day-four-lav">
<?dbhtml stop-chunking?>
<title>Developer How To Participate Lab Day Four</title>
<section xml:id="developer-apis-day-four-lab-schedule">
<title>Day 4, 13:30 to 14:45, 15:00 to 16:30</title>
<para></para>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-apis-day-four-quiz">
<?dbhtml stop-chunking?>
<title>Developer APIs in Depth Day Four Quiz</title>
<section xml:id="developer-apis-day-four-quiz-schedule">
<title>Day 4, 16:40 to 17:00</title>
<para></para>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-apis-lab-three">
<?dbhtml stop-chunking?>
<title>Developer APIs in Depth Lab Day Three</title>
<section xml:id="developer-apis-lab-three-schedule">
<title>Day 3, 13:30 to 14:45, 15:00 to 16:30</title>
<para></para>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-apis-day-three-quiz">
<?dbhtml stop-chunking?>
<title>Developer APIs in Depth Day Three Quiz</title>
<section xml:id="developer-apis-day-three-quiz-schedule">
<title>Day 3, 16:40 to 17:00</title>
<para></para>
</section>
</chapter>

View File

@ -1,34 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-apis-lab-two">
<?dbhtml stop-chunking?>
<title>Developer APIs in Depth Lab Day Two</title>
<section xml:id="developer-apis-lab-two-schedule">
<title>Day 2, 13:30 to 14:45, 15:00 to 16:30</title>
<formalpara>
<title>Pre-Requisites</title>
<!-- Need to add more content here -->
<para>
<orderedlist>
<listitem>
<para>
<link xlink:href="http://git-scm.com/">Git Basics</link>
</para>
</listitem>
<listitem>
<para>
<link xlink:href="http://docs.openstack.org/infra/manual/developers.html#development-workflow">Gerrit Basics</link>
</para>
</listitem>
<listitem>
<para>
<link xlink:href="http://jenkins-ci.org/">Jenkins</link>
</para>
</listitem>
</orderedlist>
</para>
</formalpara>
<!-- Need to add more content here -->
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-apis-day-two-quiz">
<?dbhtml stop-chunking?>
<title>Developer APIs in Depth Day Two Quiz</title>
<section xml:id="developer-apis-day-two-quiz-schedule">
<title>Day 2, 16:40 to 17:00</title>
<para></para>
</section>
</chapter>

View File

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="developer-apis-in-depth">
<?dbhtml stop-chunking?>
<title>Developer APIs in Depth</title>
<section xml:id="developer-apis-morning-schedule">
<title>Day 2 to 4, 09:00 to 11:00, 11:15 to 12:30</title>
<para></para>
</section>
</chapter>

View File

@ -1,57 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-assessment">
<?dbhtml stop-chunking?>
<title>Assessment</title>
<section xml:id="developer-day-ten-assessment-schedule">
<title>Day 10, 9:00 to 11:00, 11:15 to 12:30, hands on lab 13:30 to 14:45, 15:00 to 17:00</title>
<para></para>
</section>
<section xml:id="developer-assessment-questions">
<title>Questions</title>
<para><table rules="all" width="1011">
<caption>Assessment Question 1</caption>
<col width="95%"/>
<col width="05%"/>
<thead>
<tr>
<th>Task</th>
<th>Completed?</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<para>Configure a ....</para>
</td>
<td>
<para/>
</td>
</tr>
</tbody>
</table>
<table rules="all" width="1011">
<caption>Assessment Question 2</caption>
<col width="95%"/>
<col width="05%"/>
<thead>
<tr>
<th>Task</th>
<th>Completed?</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<para>Configure a ....</para>
</td>
<td>
<para/>
</td>
</tr>
</tbody>
</table>
</para>
</section>
</chapter>

View File

@ -1,46 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-getting-started-lab">
<?dbhtml stop-chunking?>
<title>Getting Started Lab</title>
<section xml:id="developer-getting-started-lab-schedule">
<title>Day 1, 13:30 to 14:45, 15:00 to 17:00</title>
<para></para>
</section>
<section xml:id="developer-getting-tools-and-accounts">
<title>Getting the Tools and Accounts for Committing Code</title>
<xi:include href="../common/editing-code.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'getting-tools-and-accounts']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="developer-fix-doc-bug">
<title>Fix a Documentation Bug</title>
<xi:include href="../common/editing-code.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'fix-doc-bug']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="developer-submit-doc-bug">
<title>Submit a Documentation Bug</title>
<xi:include href="../common/editing-code.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'submit-doc-bug']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="developer-create-branch">
<title>Create a Branch</title>
<xi:include href="../common/editing-code.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'create-branch']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="developer-add-training-content">
<title>Optional: Add to the Training Guide Documentation</title>
<xi:include href="../common/editing-code.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'add-training-content']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-getting-started-quiz">
<?dbhtml stop-chunking?>
<title>Getting Started Quiz</title>
<section xml:id="developer-day-one-getting-started-quiz-schedule">
<title>Day 1, 16:40 to 17:00</title>
<para></para>
</section>
</chapter>

View File

@ -1,56 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-getting-started">
<?dbhtml stop-chunking?>
<title>Getting Started</title>
<section xml:id="developer-day-one-morning-schedule">
<title>Day 1, 09:00 to 11:00, 11:15 to 12:30</title>
<para></para>
</section>
<section xml:id="developer-getting-started-overview">
<title>Overview</title>
<para>Training would take 2.5 months self paced, (5) 2 week periods with a user group meeting, or
40 hours instructor led with 40 hours of self paced lab time.</para>
<para>Prerequisites</para>
<orderedlist>
<listitem><para>Associate guide training</para></listitem>
<listitem><para>Associate guide virtualbox scripted install completed and running</para></listitem>
</orderedlist>
</section>
<section xml:id="developer-intro-text">
<title>Review Operator Introduction</title>
<xi:include href="../common/section_intro-text.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_intro-text']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="developer-brief-overview">
<title>Review Operator Brief Overview</title>
<xi:include href="../common/section_brief-overview.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_brief-overview']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="developer-official-programs">
<title>Review Operator Official Programs</title>
<xi:include href="../common/section_official-programs.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_official-programs']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="developer-openstack-architecture">
<title>Review Operator OpenStack Architecture</title>
<xi:include href="../common/section_openstack-architecture.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_openstack-architecture']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="developer-vm-provisioning-walk-through">
<title>Review Operator Virtual Machine Provisioning Walk-Through</title>
<xi:include href="../common/section_vm-provisioning-walk-through.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_vm-provisioning-walk-through']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
</chapter>

View File

@ -1,79 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-how-to-participate-bootcamp">
<?dbhtml stop-chunking?>
<title>Developer How To Participate Bootcamp</title>
<section xml:id="developer-how-to-participate-bootcamp-schedule">
<title>One Day with Focus on Contribution</title>
<para></para>
</section>
<section xml:id="developer-how-to-participate-bootcamp-overview">
<title>Overview</title>
<para>Training will take 6 hours with labs and quizzes.</para>
<para>Prerequisites</para>
<orderedlist>
<listitem><para>Some knowledge of Python and/or Perl</para></listitem>
<listitem><para>Editor on a self-supplied laptop with either Eclipse with pydev, vim, emacs, or pycharm</para></listitem>
<listitem><para>Run through the Operator Training Guide Getting Started Lab in full. This will walk each trainee through installing the accounts and tools required for the bootcamp.</para></listitem>
</orderedlist>
</section>
<section xml:id="developer-how-to-participate-bootcamp-morning-classroom">
<title>Morning Classroom 10:00 to 11:15</title>
<para>Understanding the local tools in-depth</para>
<itemizedlist>
<listitem><para>Pycharm editor</para></listitem>
<listitem><para>Git</para></listitem>
<listitem><para>Sourcetree</para></listitem>
<listitem><para>Maven</para></listitem>
</itemizedlist>
<para>Understanding the remote tools in-depth</para>
<itemizedlist>
<listitem><para>git-review</para></listitem>
<listitem><para>github</para></listitem>
<listitem><para>gerrit</para></listitem>
<listitem><para>jenkins</para></listitem>
<listitem><para>gearman</para></listitem>
<listitem><para>jeepy</para></listitem>
<listitem><para>zuul</para></listitem>
<listitem><para>launchpad</para></listitem>
</itemizedlist>
<para>CI Pipeline Workflow Overview</para>
<itemizedlist>
<listitem><para>Understanding the submission process in-depth</para></listitem>
<listitem><para>Review submission syntax</para></listitem>
<listitem><para>Gerrit etiquette</para></listitem>
<listitem><para>Resubmission</para></listitem>
</itemizedlist>
</section>
<section xml:id="developer-how-to-participate-bootcamp-morning-lab">
<title>Morning Lab 11:30 to 12:30</title>
<para>TBD</para>
</section>
<section xml:id="developer-how-to-participate-bootcamp-morning-quiz">
<title>Morning Quiz 12:30 to 12:50</title>
<para>Online moodle test for theory, bit of syntax and terms, retake until 100%</para>
<para>Content TBD</para>
</section>
<section xml:id="developer-how-to-participate-bootcamp-afternoon-classroom">
<title>Afternoon Classroom 13:30 to 14:45</title>
<para>Understanding the CI Pipeline in-depth</para>
<itemizedlist>
<listitem><para>Gerrit Workflow</para></listitem>
<listitem><para>Common jenkins tests</para></listitem>
<listitem><para>Reviewing and understanding zuul</para></listitem>
<listitem><para>Understanding jenkins output</para></listitem>
<listitem><para>Understanding jenkins system manual (devstack)</para></listitem>
<listitem><para>automated (tempest) integration tests</para></listitem>
</itemizedlist>
</section>
<section xml:id="developer-how-to-participate-bootcamp-afternoon-lab-schedule">
<title>Afternoon Lab 15:00 to 17:00</title>
<para>TBD</para>
</section>
<section xml:id="developer-how-to-participate-bootcamp-afternoon-quiz-schedule">
<title>Afternoon Quiz 17:00 to 17:20</title>
<para>Online moodle test for theory, bit of syntax and terms, retake until 100%</para>
<para>Content TBD</para>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-how-to-participate-lab-eight">
<?dbhtml stop-chunking?>
<title>Developer How To Participate Lab Day Eight</title>
<section xml:id="developer-how-to-participate-lab-eight-schedule">
<title>Day 8, 13:30 to 14:45, 15:00 to 16:30</title>
<para></para>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-how-to-participate-day-eight-quiz">
<?dbhtml stop-chunking?>
<title>Developer How To Participate Day Eight Quiz</title>
<section xml:id="developer-how-to-participate-day-eight-quiz-schedule">
<title>Day 8, 16:40 to 17:00</title>
<para></para>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-how-to-participate-lab-five">
<?dbhtml stop-chunking?>
<title>Developer How To Participate Lab Day Five</title>
<section xml:id="developer-how-to-participate-lab-five-schedule">
<title>Day 5, 13:30 to 14:45, 15:00 to 16:30</title>
<para></para>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-how-to-participate-day-five-quiz">
<?dbhtml stop-chunking?>
<title>Developer How To Participate Day Five Quiz</title>
<section xml:id="developer-how-to-participate-day-five-quiz-schedule">
<title>Day 5, 16:40 to 17:00</title>
<para></para>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-how-to-participate-lab-nine">
<?dbhtml stop-chunking?>
<title>Developer How To Participate Lab Day Nine</title>
<section xml:id="developer-how-to-participate-lab-nine-schedule">
<title>Day 9, 13:30 to 14:45, 15:00 to 16:30</title>
<para></para>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-how-to-participate-day-nine-quiz">
<?dbhtml stop-chunking?>
<title>Developer How To Participate Day Nine Quiz</title>
<section xml:id="developer-how-to-participate-day-nine-quiz-schedule">
<title>Day 9, 16:40 to 17:00</title>
<para></para>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-how-to-participate-lab-seven">
<?dbhtml stop-chunking?>
<title>Developer How To Participate Lab Day Seven</title>
<section xml:id="developer-how-to-participate-lab-seven-schedule">
<title>Day 7, 13:30 to 14:45, 15:00 to 16:30</title>
<para></para>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-how-to-participate-day-seven-quiz">
<?dbhtml stop-chunking?>
<title>Developer How To Participate Day Seven Quiz</title>
<section xml:id="developer-how-to-participate-day-seven-quiz-schedule">
<title>Day 7, 16:40 to 17:00</title>
<para></para>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-how-to-participate-lab-six">
<?dbhtml stop-chunking?>
<title>Developer How To Participate Lab Day Six</title>
<section xml:id="developer-how-to-participate-lab-six-schedule">
<title>Day 6, 13:30 to 14:45, 15:00 to 16:30</title>
<para></para>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="developer-how-to-participate-day-six-quiz">
<?dbhtml stop-chunking?>
<title>Developer How To Participate Day Six Quiz</title>
<section xml:id="developer-how-to-participate-day-six-quiz-schedule">
<title>Day 6, 16:40 to 17:00</title>
<para></para>
</section>
</chapter>

View File

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="developer-how-to-participate">
<?dbhtml stop-chunking?>
<title>Developer How To Participate</title>
<section xml:id="developer-how-to-participate-schedule">
<title>Day 5 to 9, 09:00 to 11:00, 11:15 to 12:30</title>
<para></para>
</section>
</chapter>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<book xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="bk_operator-training-guide">
<title>Operator Training Guide</title>
<xi:include href="./ch_operator-getting-started.xml"/>
<xi:include href="./ch_operator-getting-started-lab.xml"/>
<xi:include href="./ch_operator-getting-started-quiz.xml"/>
<xi:include href="./ch_operator-controller-node.xml"/>
<xi:include href="./ch_operator-controller-node-lab.xml"/>
<xi:include href="./ch_operator-controller-node-quiz.xml"/>
<xi:include href="./ch_operator-network-node.xml"/>
<xi:include href="./ch_operator-network-node-lab.xml"/>
<xi:include href="./ch_operator-network-node-quiz.xml"/>
<xi:include href="./ch_operator-compute-node.xml"/>
<xi:include href="./ch_operator-compute-node-lab.xml"/>
<xi:include href="./ch_operator-compute-node-quiz.xml"/>
<!-- <xi:include href="./ch_operator-object-storage-node.xml"/> -->
<xi:include href="./ch_operator-object-storage-node-lab.xml"/>
<xi:include href="./ch_operator-object-storage-node-quiz.xml"/>
</book>

View File

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="operator-compute-node-lab">
<?dbhtml stop-chunking?>
<title>Compute Node Lab</title>
<section xml:id="operator-compute-node-lab-schedule">
<title>Days 5 to 6, 13:30 to 14:45, 15:00 to 17:00</title>
<para></para>
</section>
<section xml:id="operator-basic-install-guide-compute-lab">
<title>Compute Node Lab</title>
<xi:include href="../basic-install-guide/lab_compute-node.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'lab_compute-node']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="operator-compute-node-quiz">
<?dbhtml stop-chunking?>
<title>Compute Node Quiz</title>
<section xml:id="operator-compute-quiz-schedule">
<title>Days 5 to 6, 16:40 to 17:00</title>
<para></para>
</section>
</chapter>

View File

@ -1,38 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="operator-computer-node">
<?dbhtml stop-chunking?>
<title>Compute Node</title>
<section xml:id="operator-day-one-afternoon-schedule">
<title>Days 5 to 6, 09:00 to 11:00, 11:15 to 12:30</title>
<para></para>
</section>
<section xml:id="operator-vm-placement">
<title>Review Associate VM Placement</title>
<xi:include href="../common/section_vm-placement.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_vm-placement']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-vm-provisioning-indepth">
<title>Review Associate VM Provisioning Indepth</title>
<xi:include href="../common/section_vm-provisioning-indepth.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_vm-provisioning-indepth']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-block-storage">
<title>Review Associate OpenStack Block Storage</title>
<xi:include href="../common/section_block-storage.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_block-storage']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-compute-node-administration-tasks">
<title>Review Associate Administration Tasks</title>
<para></para>
</section>
</chapter>

View File

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="operator-controller-node-lab">
<?dbhtml stop-chunking?>
<title>Controller Node Lab</title>
<section xml:id="operator-controller-node-lab-schedule">
<title>Days 2 to 4, 13:30 to 14:45, 15:00 to 16:30, 16:45 to 18:15</title>
<para></para>
</section>
<section xml:id="operator-basic-install-guide-controller-lab">
<title>Control Node Lab</title>
<xi:include href="../basic-install-guide/lab_control-node.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'lab_control-node.xml']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="operator-controller-node-quiz">
<?dbhtml stop-chunking?>
<title>Controller Node Quiz</title>
<section xml:id="operator-controller-quiz-schedule">
<title>Days 2 to 4, 16:40 to 17:00</title>
<para></para>
</section>
</chapter>

View File

@ -1,38 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="operator-controller-node">
<?dbhtml stop-chunking?>
<title>Controller Node</title>
<section xml:id="operator-day-one-late-morning-schedule">
<title>Day 2 to 4, 09:00 to 11:00, 11:15 to 12:30</title>
<para></para>
</section>
<section xml:id="operator-overview-horizon-cli">
<title>Review Associate Overview Horizon and OpenStack CLI</title>
<xi:include href="../common/section_overview-horizon-cli.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_overview-horizon-cli']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-keystone-arch">
<title>Review Associate Keystone Architecture</title>
<xi:include href="../common/section_keystone-arch.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_keystone-arch']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-queues-messaging">
<title>Review Associate OpenStack Messaging and Queues</title>
<xi:include href="../common/section_queues-messaging.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_queues-messaging']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-controller-node-administration-tasks">
<title>Review Associate Administration Tasks</title>
<para></para>
</section>
</chapter>

View File

@ -1,46 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="operator-getting-started-lab">
<?dbhtml stop-chunking?>
<title>Getting Started Lab</title>
<section xml:id="operator-getting-started-lab-schedule">
<title>Day 1, 13:30 to 14:45, 15:00 to 17:00</title>
<para></para>
</section>
<section xml:id="operator-getting-tools-and-accounts">
<title>Getting the Tools and Accounts for Committing Code</title>
<xi:include href="../common/editing-code.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'getting-tools-and-accounts']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-fix-doc-bug">
<title>Fix a Documentation Bug</title>
<xi:include href="../common/editing-code.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'fix-doc-bug']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-submit-doc-bug">
<title>Submit a Documentation Bug</title>
<xi:include href="../common/editing-code.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'submit-doc-bug']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-create-branch">
<title>Create a Branch</title>
<xi:include href="../common/editing-code.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'create-branch']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-add-training-content">
<title>Optional: Add to the Training Guide Documentation</title>
<xi:include href="../common/editing-code.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'add-training-content']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="operator-getting-started-quiz">
<?dbhtml stop-chunking?>
<title>Getting Started Quiz</title>
<section xml:id="operator-day-one-getting-started-quiz-schedule">
<title>Day 1, 16:40 to 17:00</title>
<para></para>
</section>
</chapter>

View File

@ -1,56 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="operator-getting-started">
<?dbhtml stop-chunking?>
<title>Getting Started</title>
<section xml:id="operator-day-one-morning-schedule">
<title>Day 1, 09:00 to 11:00, 11:15 to 12:30</title>
<para></para>
</section>
<section xml:id="operator-getting-started-overview">
<title>Overview</title>
<para>Training would take 2.5 months self paced, (5) 2 week periods with a user group meeting, or
40 hours instructor led with 40 hours of self paced lab time.</para>
<para>Prerequisites</para>
<orderedlist>
<listitem><para>Associate guide training</para></listitem>
<listitem><para>Associate guide virtualbox scripted install completed and running</para></listitem>
</orderedlist>
</section>
<section xml:id="operator-intro-text">
<title>Review Associate Introduction</title>
<xi:include href="../common/section_intro-text.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_intro-text']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-brief-overview">
<title>Review Associate Brief Overview</title>
<xi:include href="../common/section_brief-overview.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_brief-overview']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-official-programs">
<title>Review Associate Official Programs</title>
<xi:include href="../common/section_official-programs.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_official-programs']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-openstack-architecture">
<title>Review Associate OpenStack Architecture</title>
<xi:include href="../common/section_openstack-architecture.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_openstack-architecture']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-vm-provisioning-walk-through">
<title>Review Associate Virtual Machine Provisioning Walk-Through</title>
<xi:include href="../common/section_vm-provisioning-walk-through.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_vm-provisioning-walk-through']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
</chapter>

View File

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="operator-network-node-lab">
<?dbhtml stop-chunking?>
<title>Network Node Lab</title>
<section xml:id="operator-network-node-lab-schedule">
<title>Days 7 to 8, 13:30 to 14:45, 15:00 to 17:00</title>
<para></para>
</section>
<section xml:id="operator-basic-install-guide-network-lab">
<title>Network Node Lab</title>
<xi:include href="../basic-install-guide/lab_network-node.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'lab_network-node']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="operator-network-node-quiz">
<?dbhtml stop-chunking?>
<title>Network Node Quiz</title>
<section xml:id="operator-network-quiz-schedule">
<title>Days 7 to 8, 16:40 to 17:00</title>
<para></para>
</section>
</chapter>

View File

@ -1,52 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="operator-network-node">
<?dbhtml stop-chunking?>
<title>Network Node</title>
<section xml:id="operator-network-node-morning-schedule">
<title>Days 7 to 8, 09:00 to 11:00, 11:15 to 12:30</title>
<para></para>
</section>
<section xml:id="operator-networking-in-openstack">
<title>Review Associate Networking in OpenStack</title>
<xi:include href="../common/section_networking-in-openstack.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_networking-in-openstack']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-openstack-networking-concepts">
<title>Review Associate OpenStack Networking Concepts</title>
<xi:include href="../common/section_openstack-networking-concepts.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_openstack-networking-concepts']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-network-node-administration-tasks">
<title>Review Associate Administration Tasks</title>
<para>TBD</para>
</section>
<section xml:id="operator-openstack-networking-use-cases">
<title>Operator OpenStack Neutron Use Cases</title>
<xi:include href="../common/section_neutron-use-cases.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_neutron-use-cases']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-openstack-networking-security">
<title>Operator OpenStack Neutron Security</title>
<xi:include href="../common/section_security-in-neutron.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_security-in-neutron']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-openstack-networking-floating-ips">
<title>Operator OpenStack Neutron Floating IPs</title>
<xi:include href="../common/section_floating-ips.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_floating-ips']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
</chapter>

View File

@ -1,39 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="operator-object-storage-node-lab">
<?dbhtml stop-chunking?>
<title>Object Storage Node Lab</title>
<section xml:id="operator-object-storage-node-lab-schedule">
<title>Day 9, 13:30 to 14:45, 15:00 to 17:00</title>
<para></para>
</section>
<section xml:id="operator-object-lab-getting-started">
<title>Installing Object Node</title>
<xi:include href="../install-guide/object-storage/section_object-storage-install.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'general-installation-steps-swift']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-object-lab-configuring-nodes">
<title>Configuring Object Node</title>
<xi:include href="../install-guide/object-storage/section_object-storage-install-config-storage-nodes.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'installing-and-configuring-storage-nodes']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-object-lab-configuring-proxy">
<title>Configuring Object Proxy</title>
<xi:include href="../install-guide/object-storage/section_object-storage-install-config-proxy-node.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'installing-and-configuring-the-proxy-node']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
<section xml:id="operator-object-lab-start-nodes">
<title>Start Object Node Services</title>
<xi:include href="../install-guide/object-storage/section_start-storage-node-services.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'start-storage-node-services']/*[not(self::db:title)])">
<xi:fallback><para><mediaobject><imageobject><imagedata fileref="../figures/openstack-training-remote-content-not-available.png" format="PNG"/></imageobject></mediaobject>Remote content not available</para><para>image source</para><para><link xlink:href="https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing">https://docs.google.com/drawings/d/1J2LZSxmc06xKyxMgPjv5fC0blV7qK6956-AeTmFOZD4/edit?usp=sharing</link></para></xi:fallback>
</xi:include>
</section>
</chapter>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="operator-object-storage-node-quiz">
<?dbhtml stop-chunking?>
<title>Object Storage Node Quiz</title>
<section xml:id="operator-object-storage-quiz-schedule">
<title>Day 9, 16:40 to 17:00</title>
<para></para>
</section>
</chapter>

View File

@ -1,36 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="operator-object-storage-node">
<?dbhtml stop-chunking?>
<title>Object Storage Node</title>
<section xml:id="operator-object-node-morning-schedule">
<title>Day 9, 09:00 to 11:00, 11:15 to 12:30</title>
<para> </para>
</section>
<section xml:id="operator-intro-object-store">
<title>Review Associate Introduction to Object Storage</title>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_objectstorage-intro.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_objectstorage-intro']/*[not(self::db:title)])">
</xi:include>
</section>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_objectstorage-features.xml"/>
<section xml:id="operator-object-store-node-administration-tasks">
<title>Review Associate Administration Tasks</title>
<para></para>
</section>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_objectstorage-characteristics.xml"/>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_objectstorage-components.xml"/>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_objectstorage-ringbuilder.xml"/>
<section xml:id="operator-swift-more-concepts">
<title>More Swift Concepts</title>
<xi:include href="../common/section_more-concepts.xml"
xpointer="xmlns(db=http://docbook.org/ns/docbook) xpath(//*[@xml:id = 'section_more-concepts']/*[not(self::db:title)])">
</xi:include>
</section>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_objectstorage-arch.xml"/>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_objectstorage-account-reaper.xml"/>
<xi:include href="http://git.openstack.org/cgit/openstack/openstack-manuals/plain/doc/common/section_objectstorage-replication.xml"/>
</chapter>

View File

@ -1,78 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<section xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="architecture">
<title>Architecture</title>
<section xml:id="header">
<title>Header</title>
<para>
Copyright 2010-2011 United States Government as represented by the
Administrator of the National Aeronautics and Space Administration.
All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain
a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
</para>
</section>
<section xml:id="Cinder-System-Architecture">
<title>Block Storage System Architecture</title>
<para>
The OpenStack Block Storage service is intended to run on one or more nodes.
Block Storage uses a SQL-based central database that is shared by all Block Storage services in the system. The amount and depth of the data fits into a SQL database quite well. For small deployments this seems like an optimal solution. For larger deployments, and especially if security is a concern, Block Storage will be moving towards multiple data stores with some kind of aggregation system.
</para>
</section>
<section xml:id="Components">
<title>Components</title>
<para>
Below you will a brief explanation of the different components.
/- ( LDAP )
[ Auth Manager ] ---
| \- ( DB )
|
|
cinderclient |
/ \ |
[ Web Dashboard ]- -[ API ] -- [ AMQP ] -- [ scheduler ] -- [ volume ] -- ( iSCSI )
\ / |
novaclient |
|
|
|
[ REST ]
<itemizedlist>
<listitem>
<para>DB: SQL database for data storage. Used by all
components (LINKS NOT SHOWN)</para>
</listitem>
<listitem>
<para>Web Dashboard: potential external component that talks to the
API</para>
</listitem>
<listitem>
<para>API: component that receives HTTP requests, converts commands
and communicates with other components via the queue or HTTP</para>
</listitem>
<listitem>
<para>Auth Manager: component responsible for users/projects/and
roles. Can use as back-end a database or LDAP. This is not a
separate binary, but rather a python class that is used by most
components in the system.</para>
</listitem>
<listitem>
<para>scheduler: decides which host gets each volume</para>
</listitem>
<listitem>
<para>volume: manages dynamically attachable block devices.</para>
</listitem>
</itemizedlist>
</para>
</section>
</section>

View File

@ -1,145 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<section xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="development.environment">
<title>Development.Environment</title>
<section xml:id="header">
<title>Header</title>
<para>
..
Copyright 2010-2011 United States Government as represented by the
Administrator of the National Aeronautics and Space Administration.
All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain
a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
</para>
</section>
<section xml:id="Setting-Up-a-Development-Environment">
<title>Setting-Up-A-Development-Environment</title>
<para>
====================================
This page describes how to setup a working Python development
environment that can be used in developing cinder on Ubuntu, Fedora or
Mac OS X. These instructions assume you're already familiar with
git. Refer to GettingTheCode_ for additional information.
.. _GettingTheCode: http://wiki.openstack.org/GettingTheCode
Following these instructions will allow you to run the cinder unit
tests. If you want to be able to run cinder (i.e., launch VM instances),
you will also need to install libvirt and at least one of the
`supported hypervisors`_. Running cinder is currently only supported on
Linux, although you can run the unit tests on Mac OS X. See
:doc:`../quickstart` for how to get a working version of OpenStack
Compute running as quickly as possible.
.. _supported hypervisors: http://wiki.openstack.org/HypervisorSupportMatrix
</para>
</section>
<section xml:id="Virtual-environments">
<title>Virtual-Environments</title>
<para>
--------------------
Cinder development uses `virtualenv [http://pypi.python.org/pypi/virtualenv]`__ to track and manage Python
dependencies while in development and testing. This allows you to
install all of the Python package dependencies in a virtual
environment or "virtualenv" (a special subdirectory of your cinder
directory), instead of installing the packages at the system level.
.. note::
Virtualenv is useful for running the unit tests, but is not
typically used for full integration testing or production usage.
</para>
</section>
<section xml:id="Linux-Systems">
<title>Linux-Systems</title>
<para>
-------------
.. note::
This section is tested for Cinder on Ubuntu (12.04-64) and
Fedora-based (RHEL 6.1) distributions. Feel free to add notes and
change according to your experiences or operating system.
Install the prerequisite packages.
On Ubuntu::
sudo apt-get install python-dev libssl-dev python-pip git-core libmysqlclient-dev libpq-dev
On Fedora-based distributions like Fedora, RHEL, CentOS and Scientific Linux::
sudo yum install python-devel openssl-devel python-pip git libmysqlclient-dev libqp-dev
</para>
</section>
<section xml:id="Mac-OS-X-Systems">
<title>Mac-Os-X-Systems</title>
<para>
----------------
Install virtualenv::
sudo easy_install virtualenv
Check the version of OpenSSL you have installed::
openssl version
If you have installed OpenSSL 1.0.0a, which can happen when installing a
MacPorts package for OpenSSL, you will see an error when running
``cinder.tests.auth_unittest.AuthTestCase.test_209_can_generate_x509``.
The stock version of OpenSSL that ships with Mac OS X 10.6 (OpenSSL 0.9.8l)
or Mac OS X 10.7 (OpenSSL 0.9.8r) works fine with cinder.
</para>
</section>
<section xml:id="Getting-the-code">
<title>Getting-The-Code</title>
<para>
----------------
Grab the code::
git clone https://github.com/openstack/cinder.git
cd cinder
</para>
</section>
<section xml:id="Running-unit-tests">
<title>Running-Unit-Tests</title>
<para>
------------------
The unit tests will run by default inside a virtualenv in the ``.venv``
directory. Run the unit tests by doing::
./run_tests.sh
The first time you run them, you will be asked if you want to create a virtual
environment (hit "y")::
No virtual environment found...create one? (Y/n)
See :doc:`unit_tests` for more details.
.. _virtualenv:
</para>
</section>
<section xml:id="Manually-installing-and-using-the-virtualenv">
<title>Manually-Installing-And-Using-The-Virtualenv</title>
<para>
--------------------------------------------
You can manually install the virtual environment instead of having
``run_tests.sh`` do it for you::
python tools/install_venv.py
This will install all of the Python packages listed in the
``requirements.txt`` file into your virtualenv. There will also be some
additional packages (pip, setuptools) that are installed
by the ``tools/install_venv.py`` file into the virutalenv.
If all goes well, you should get a message something like this::
Cinder development environment setup is complete.
To activate the Cinder virtualenv for the extent of your current shell session
you can run::
$ source .venv/bin/activate
Or, if you prefer, you can run commands in the virtualenv on a case by case
basis by running::
$ tools/with_venv.sh [your command]
</para>
</section>
<section xml:id="Contributing-Your-Work">
<title>Contributing-Your-Work</title>
<para>
----------------------
Once your work is complete you may wish to contribute it to the project. Add
your name and email address to the ``Authors`` file, and also to the ``.mailmap``
file if you use multiple email addresses. Your contributions can not be merged
into trunk unless you are listed in the Authors file. Cinder uses the Gerrit
code review system. For information on how to submit your branch to Gerrit,
see GerritWorkflow_.
</para>
</section>
</section>

View File

@ -1,113 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<section xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="drivers">
<title>Drivers</title>
<!--<section xml:id="header">
<title>Header</title>
<para>
..
Copyright (c) 2013 OpenStack Foundation
All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain
a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
</para>
</section>
<section xml:id="Drivers">
<title>Drivers</title>-->
<para>Cinder exposes an API to enable users to interact with
different storage back-end solutions. The following standards are
required across all drivers for Cinder services to properly
interact with a driver.</para>
<para>Minimum features are enforced to avoid having a grid of which
features are supported by which drivers in which releases. Cinder
core requires that all drivers implement the following minimum
features.</para>
<section xml:id="havana">
<title>Havana</title>
<para>
<itemizedlist>
<listitem>
<para>Volume Create/Delete</para>
</listitem>
<listitem>
<para>Volume Attach/Detach</para>
</listitem>
<listitem>
<para>Snapshot Create/Delete</para>
</listitem>
<listitem>
<para>Create Volume from Snapshot</para>
</listitem>
<listitem>
<para>Get Volume Stats</para>
</listitem>
<listitem>
<para>Copy Image to Volume</para>
</listitem>
<listitem>
<para>Copy Volume to Image</para>
</listitem>
<listitem>
<para>Clone Volume</para>
</listitem>
</itemizedlist>
</para>
</section>
<section xml:id="Icehouse">
<title>Icehouse</title>
<para>
<itemizedlist>
<listitem>
<para>All of the above plus</para>
</listitem>
<listitem>
<para>Extend Volume</para>
</listitem>
</itemizedlist>
</para>
</section>
<section xml:id="Volume-Stats">
<title>Volume-Stats</title>
<para>Volume stats are used by the different schedulers for the
drivers to provide a report on their current state of the back
end. A driver must provide these stats:</para>
<itemizedlist>
<listitem>
<para>driver_version</para>
</listitem>
<listitem>
<para>free_capacity_gb</para>
</listitem>
<listitem>
<para>reserved_percentage</para>
</listitem>
<listitem>
<para>storage_protocol</para>
</listitem>
<listitem>
<para>total_capacity_gb</para>
</listitem>
<listitem>
<para>vendor_name</para>
</listitem>
<listitem>
<para>volume_backend_name</para>
</listitem>
</itemizedlist>
<para>If the driver cannot provide a value for
<literal>free_capacity_gb</literal> or
<literal>total_capacity_gb</literal>, the driver can provide
keywords instead. If the array cannot report the value, use
<literal>unknown</literal>. If the array has no upper limit,
use <literal>infinite</literal>.</para>
</section>
</section>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<section xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="threading">
<title>Threading</title>
<section xml:id="header">
<title>Header</title>
<para>
</para>
</section>
<section xml:id="Threading-model">
<title>Threading-Model</title>
<para>
===============
<itemizedlist>
<listitem><para>model of threading, implemented</para></listitem>
</itemizedlist>
through using the Python `eventlet [http://eventlet.net/]`_ and
`greenlet [http://packages.python.org/greenlet/]`_ libraries.
Green threads use a cooperative model of threading: thread context
switches can only occur when specific eventlet or greenlet library calls are
made. For example, sleep and certain I/O calls. From the operating system's point of
view, each OpenStack service runs in a single thread.
The use of green threads reduces the likelihood of race conditions, but does
not completely eliminate them. In some cases, you may need to use the
``@utils.synchronized(...)`` decorator to avoid races.
In addition, since there is only one operating system thread, a call that
blocks that main thread will block the entire process.
</para>
</section>
<section xml:id="Yielding-the-thread-in-long-running-tasks">
<title>Yielding-The-Thread-In-Long-Running-Tasks</title>
<para>
-----------------------------------------
If a code path takes a long time to execute and does not contain any methods
that trigger an eventlet context switch, the long-running thread will block
any pending threads.
This scenario can be avoided by adding calls to the eventlet sleep method
in the long-running code path. The sleep call will trigger a context switch
if there are pending threads, and using an argument of 0 will avoid introducing
delays in the case that there is only a single green thread::
from eventlet import greenthread
...
greenthread.sleep(0)
</para>
</section>
<section xml:id="MySQL-access-and-eventlet">
<title>Mysql-Access-And-Eventlet</title>
<para>
-------------------------
Queries to the MySQL database will block the main thread of a service. This is
because OpenStack services use an external C library for accessing the MySQL
database. Since eventlet cannot use monkey-patching to intercept blocking
calls in a C library, the resulting database query blocks the thread.
The Diablo release contained a thread-pooling implementation that did not
block, but this implementation resulted in a `bug`_ and was removed.
See this `mailing list thread`_ for a discussion of this issue, including
a discussion of the `impact on performance`_.
.. _bug: https://bugs.launchpad.net/cinder/+bug/838581
.. _mailing list thread: https://lists.launchpad.net/openstack/msg08118.html
</para>
</section>
</section>

View File

@ -1,149 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<section xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="5.0"
xml:id="unit_tests">
<title>Unit_Tests</title>
<section xml:id="header">
<title>Header</title>
<para>
</para>
</section>
<section xml:id="Unit-Tests">
<title>Unit-Tests</title>
<para>
==========
Cinder contains a suite of unit tests, in the cinder/tests directory.
Any proposed code change will be automatically rejected by the OpenStack
Jenkins server [#f1]_ if the change causes unit test failures.
</para>
</section>
<section xml:id="Running-the-tests">
<title>Running-The-Tests</title>
<para>
-----------------
Run the unit tests by doing::
./run_tests.sh
This script is a wrapper around the `nose`_ testrunner and the `pep8`_ checker.
.. _nose: http://code.google.com/p/python-nose/
.. _pep8: https://github.com/jcrocholl/pep8
Flags
-----
The ``run_tests.sh`` script supports several flags. You can view a list of
flags by doing::
run_tests.sh -h
This will show the following help information::
Usage: ./run_tests.sh [OPTION]...
Run Cinder's test suite(s)
-V, --virtual-env Always use virtualenv. Install automatically if not present
-N, --no-virtual-env Don't use virtualenv. Run tests in local environment
-s, --no-site-packages Isolate the virtualenv from the global Python environment
-r, --recreate-db Recreate the test database (deprecated, as this is now the default).
-n, --no-recreate-db Don't recreate the test database.
-x, --stop Stop running tests after the first error or failure.
-f, --force Force a clean re-build of the virtual environment. Useful when dependencies have been added.
-p, --pep8 Just run pep8
-P, --no-pep8 Don't run pep8
-c, --coverage Generate coverage report
-h, --help Print this usage message
--hide-elapsed Don't print the elapsed time for each test along with slow test list
Because ``run_tests.sh`` is a wrapper around nose, it also accepts the same
flags as nosetests. See the `nose options documentation`_ for details about
these additional flags.
.. _nose options documentation: http://readthedocs.org/docs/nose/en/latest/usage.html#options
</para>
</section>
<section xml:id="Running-a-subset-of-tests">
<title>Running-A-Subset-Of-Tests</title>
<para>
-------------------------
Instead of running all tests, you can specify an individual directory, file,
class, or method that contains test code.
To run the tests in the ``cinder/tests/scheduler`` directory::
./run_tests.sh scheduler
To run the tests in the ``cinder/tests/test_libvirt.py`` file::
./run_tests.sh test_libvirt
To run the tests in the `HostStateTestCase` class in
``cinder/tests/test_libvirt.py``::
./run_tests.sh test_libvirt:HostStateTestCase
To run the `ToPrimitiveTestCase.test_dict` test method in
``cinder/tests/test_utils.py``::
./run_tests.sh test_utils:ToPrimitiveTestCase.test_dict
</para>
</section>
<section xml:id="Suppressing-logging-output-when-tests-fail">
<title>Suppressing-Logging-Output-When-Tests-Fail</title>
<para>
------------------------------------------
By default, when one or more unit test fails, all of the data sent to the
logger during the failed tests will appear on standard output, which typically
consists of many lines of text. The logging output can make it difficult to
identify which specific tests have failed, unless your terminal has a large
scrollback buffer or you have redirected output to a file.
You can suppress the logging output by calling ``run_tests.sh`` with the nose
flag::
--nologcapture
</para>
</section>
<section xml:id="Virtualenv">
<title>Virtualenv</title>
<para>
----------
By default, the tests use the Python packages installed inside a
virtualenv [#f2]_. (This is equivalent to using the ``-V, --virtualenv`` flag).
If the virtualenv does not exist, it will be created the first time the tests are run.
If you wish to recreate the virtualenv, call ``run_tests.sh`` with the flag::
-f, --force
Recreating the virtualenv is useful if the package dependencies have changed
since the virtualenv was last created. If the ``requirements.txt`` or
``tools/install_venv.py`` files have changed, it's a good idea to recreate the
virtualenv.
By default, the unit tests will see both the packages in the virtualenv and
the packages that have been installed in the Python global environment. In
some cases, the packages in the Python global environment may cause a conflict
with the packages in the virtualenv. If this occurs, you can isolate the
virtualenv from the global environment by using the flag::
-s, --no-site packages
If you do not wish to use a virtualenv at all, use the flag::
-N, --no-virtual-env
</para>
</section>
<section xml:id="Database">
<title>Database</title>
<para>
--------
Some of the unit tests make queries against a SQLite database [#f3]_. By
default, the test database (``tests.sqlite``) is deleted and recreated each
time ``run_tests.sh`` is invoked (This is equivalent to using the
``-r, --recreate-db`` flag). To reduce testing time if a database already
exists it can be reused by using the flag::
-n, --no-recreate-db
Reusing an existing database may cause tests to fail if the schema has
changed. If any files in the ``cinder/db/sqlalchemy`` have changed, it's a good
idea to recreate the test database.
</para>
</section>
<section xml:id="Gotchas">
<title>Gotchas</title>
<para>
-------
<itemizedlist>
<listitem><para></para></listitem>
</itemizedlist>
If you are running the unit tests from a shared folder, you may see tests start
to fail or stop completely as a result of Python lockfile issues [#f4]_. You
can get around this by manually setting or updating the following line in
``cinder/tests/conf_fixture.py``::
CONF['lock_path'].SetDefault('/tmp')
Note that you may use any location (not just ``/tmp``!) as long as it is not
a shared folder.
.. rubric:: Footnotes
.. [#f1] See :doc:`jenkins`.
.. [#f2] See :doc:`development.environment` for more details about the use of
virtualenv.
.. [#f3] There is an effort underway to use a fake DB implementation for the
unit tests. See https://lists.launchpad.net/openstack/msg05604.html
</para>
</section>
</section>

View File

@ -1,220 +0,0 @@
# Copyright 2013 Yahoo! Inc. All Rights Reserved
# Copyright 2013 OpenStack Foundation
# Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
'''
The code must executed within ./openstack-manuals/doc/training-manuals/sources/.
The code will automagically create the 7 'core' openstack repositories and convert the
rst docs to xml.
'''
import os
import re
import sys
def create_repo(directory):
#clone remote to local repo root, ignore error if exist
for x in directory:
os.system("git clone https://git.openstack.org/openstack/" + x + ".git")
def pull_repo_updates(directory):
#pull remote repo updates
for x in directory:
os.chdir("./" + x)
os.system("git pull origin master")
os.chdir("../")
def patternmatch(directory, docs_location, rstfile):
#simple pattern matching source rst to output docbook5.0 xml
good_file = {"addmethod.openstackapi", "architecture",
"development.environment", "drivers", "threading", "unit_tests"}
try:
#open the file to convert
infile = open(directory + docs_location + rstfile)
except IOError:
#if file is a directory then recurse
print("patternmatch:in IOError:directory:" + directory + ", docs_location: " + docs_location + ", rstfile: " + rstfile)
os.mkdir(os.path.expanduser("./openstack-manuals/doc/training-guides/sources/" + directory + rstfile))
walkdirectories(directory + docs_location, rstfile +"/")
#docs_location and rstfile are both directories in this case
return
outfilenamepart = infile.name.split(".rst")
outfilename = outfilenamepart[0].split("/")
matchslash = re.search(r'(.*/.*/.*/.*)', directory)
if matchslash:
#if recursion match is good
print("patternmatch:matchslash:directory:" + directory + ", docs_location: " + docs_location + ", rstfile: " + rstfile)
try:
if outfilenamepart[-1]:
#TODO if not rst file, then copy image files
return
except:
pass
directory = directory.split("/")
good_file_found = "false"
for filename in good_file:
#check for good file name, else skip to next file
if filename == outfilename[-1]:
good_file_found = "true"
continue
if good_file_found == "false":
#jump out of called routine
return
outfile = open("./openstack-manuals/doc/training-guides/sources/" +
directory[0] + "/" + docs_location + outfilename[-1] + ".xml", "w+")
print(directory[0] + "/" + docs_location + outfilename[-1] + ".xml")
else:
print("patternmatch:not matchslash:directory:" + directory + ", docs_location: " + docs_location + ", rstfile: " + rstfile)
try:
if outfilenamepart[-1]:
#TODO if not rst file, then copy image files
#createfile(directory, docs_location, outfilename)
return
except:
pass
good_file_found = "false"
for filename in good_file:
#check for good file name, else skip to next file
if filename == outfilename[-1]:
good_file_found = "true"
continue
if good_file_found == "false":
#jump out of called routine
return
outfile = open("./openstack-manuals/doc/training-guides/sources/" +
directory + outfilename[-1] + ".xml", "w+")
print(directory + outfilename[-1] + ".xml")
#header of new xml file
outfile.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
outfile.write(" <section xmlns=\"http://docbook.org/ns/docbook\"\n")
outfile.write(" xmlns:xi=\"http://www.w3.org/2001/XInclude\"\n")
outfile.write(" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n")
outfile.write(" version=\"5.0\"\n")
#xml_section_name = outfilename.replace(" ", "-")
outfile.write(" xml:id=\"" + outfilename[-1] + "\">\n")
outfile.write("<title>" + outfilename[-1].title() + "</title>\n")
#start header
xml_section_name = "header"
outfile.write("<section xml:id=\"" + xml_section_name.strip() + "\">\n")
outfile.write("<title>" + xml_section_name.title() + "</title>\n")
outfile.write("<para>\n")
#always read two lines at a time, once pattern match on multiple char, previous line is section id and title
prevline = "empty"
startitemizedlist = 0
for line in infile:
#match single line ahead for section titles
match1 = re.search(r'(.*)(=======)(.*)', line)
match2 = re.search(r'(.*)(-------)(.*)', line)
match3 = re.search(r'(.*)(~~~~~~~)(.*)', line)
match4 = re.search(r'(\s*)(\*\s)(.*)', prevline)
match5 = re.search(r'(\s*)(\*\s)(.*)', line)
#ignoring orderedlists for now
#match6 = re.search(r'(\s*)([0-9]\.\s)(.*)', prevline)
#match7 = re.search(r'(\s*)([0-9]\.\s)(.*)', line)
if match1 or match2 or match3:
#close previous para and section
outfile.write("</para>\n")
outfile.write("</section>\n")
#start new section and para
xml_section_name = prevline.replace(" ", "-")
xml_section_name = xml_section_name.replace("\'", "-")
xml_section_name = xml_section_name.replace("`", "-")
xml_section_name = xml_section_name.replace("\"", "-")
xml_section_name = xml_section_name.replace(":", "-")
xml_section_name = xml_section_name.replace(",", "-")
xml_section_name = xml_section_name.replace("(", "-")
xml_section_name = xml_section_name.replace(")", "-")
outfile.write("<section xml:id=\"" + xml_section_name.strip() + "\">\n")
outfile.write("<title>" + xml_section_name.strip().title() + "</title>\n")
outfile.write("<para>\n")
elif not match4 and match5:
#start itemizedlist
startitemizedlist = 1
outfile.write("<itemizedlist>\n")
listitem = match5.group(3).replace("<","[")
listitem = listitem.replace(">","]")
listitem = listitem.replace("&","-")
outfile.write("<listitem><para>" + listitem + "</para></listitem>\n")
elif match4 and match5:
#continue itemizedlist
listitem = match5.group(3).replace("<","[")
listitem = listitem.replace(">","]")
listitem = listitem.replace("&","-")
outfile.write("<listitem><para>" + listitem + "</para></listitem>\n")
elif match4 and not match5:
#close itemizedlist
startitemizedlist = 0
outfile.write("</itemizedlist>\n")
elif prevline != "empty" and not prevline.isspace():
#no match, so inside section and para
prevline = prevline.replace("<","[")
prevline = prevline.replace(">","]")
prevline = prevline.replace("&","-")
outfile.write(prevline)
#save previous line for pattern matching
prevline = line
#catch end of file, missing close itemized list
if startitemizedlist == 1:
outfile.write("</itemizedlist>\n")
#close last para and section
outfile.write("</para>\n")
outfile.write("</section>\n")
outfile.write("</section>")
def walkdirectories(projectdirectory, sourcedirectory):
#print("walkdirectories: " + projectdirectory + sourcedirectory)
print("walkdirectories:current directory is ")
os.system("pwd")
for rstfile in os.listdir(projectdirectory + sourcedirectory):
#walk files in the directory
if rstfile.startswith('.'):
#ignore hidden files
continue
patternmatch(projectdirectory, sourcedirectory, rstfile)
def convert_rst_docbook5(repository_hash):
for item in repository_hash:
print("convert_rst_docbook5:start convert rst: " + item + repository_hash[item])
os.system("rm -R ./openstack-manuals/doc/training-guides/sources/" + item)
try:
#use try for when the remove directory fails
os.mkdir("./openstack-manuals/doc/training-guides/sources/" + item)
except OSError:
pass
walkdirectories(item, repository_hash[item])
#os.chdir("../")
print("convert_rst_docbook5:completed convert rst: " + item + repository_hash[item])
repository_hash = {'cinder/':"/doc/source/devref/"}
'''
'nova/':"/doc/source/devref/",
'glance/':"/doc/source/",
'neutron/':"/doc/source/devref/",
'swift/':"/doc/source/",
'keystone/':"doc/source/",
'horizon/':"/doc/source/"}'''
os.chdir("../../../../")#root of repository directories in relation to ./training-guides/sources
create_repo(repository_hash)
pull_repo_updates(repository_hash)
convert_rst_docbook5(repository_hash)

View File

@ -1,124 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<set xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xi="http://www.w3.org/2001/XInclude"
version="5.0"
xml:id="st-training-guides">
<title>OpenStack Training Guides</title>
<?rax title.font.size="28px" subtitle.font.size="28px"?>
<?rax
status.bar.text.font.size="40px"
status.bar.text="Training Guides Icehouse"?>
<?rax subtitle.font.size="17px" title.font.size="32px"?>
<titleabbrev>OpenStack Training Guides</titleabbrev>
<info>
<copyright>
<year>2013</year>
<year>2014</year>
<holder>OpenStack Foundation</holder>
</copyright>
<productname>OpenStack Training Guides</productname>
<pubdate/>
<legalnotice role="apache2">
<annotation>
<remark>Copyright details are filled in by the
template.</remark>
</annotation>
</legalnotice>
<legalnotice role="cc-by-sa">
<annotation>
<remark>Copyright details are filled in by the
template.</remark>
</annotation>
</legalnotice>
<abstract>
<para>OpenStack™ Training Guides offer the open source
community software training for cloud administration
and management for any organization.</para>
</abstract>
<revhistory>
<!-- ... continue adding more revisions here as you change this document using the markup shown below... -->
<revision>
<date>2014-12-17</date>
<revdescription>
<itemizedlist>
<listitem>
<para>Icehouse released, adds support for automated labs installation.
</para>
</listitem>
</itemizedlist>
</revdescription>
</revision>
<revision>
<date>2014-05-29</date>
<revdescription>
<itemizedlist spacing="compact">
<listitem>
<para>migrate training guides to separate
repository</para>
</listitem>
</itemizedlist>
</revdescription>
</revision>
<revision>
<date>2013-11-04</date>
<revdescription>
<itemizedlist spacing="compact">
<listitem>
<para>major restructure of guides</para>
</listitem>
</itemizedlist>
</revdescription>
</revision>
<revision>
<date>2013-09-11</date>
<revdescription>
<itemizedlist spacing="compact">
<listitem>
<para>first training guides sprint
held</para>
</listitem>
</itemizedlist>
</revdescription>
</revision>
<revision>
<date>2013-08-07</date>
<revdescription>
<itemizedlist spacing="compact">
<listitem>
<para>rough draft published to the
web</para>
</listitem>
</itemizedlist>
</revdescription>
</revision>
<revision>
<date>2013-07-09</date>
<revdescription>
<itemizedlist spacing="compact">
<listitem>
<para>first draft released</para>
</listitem>
</itemizedlist>
</revdescription>
</revision>
<revision>
<date>2013-06-18</date>
<revdescription>
<itemizedlist spacing="compact">
<listitem>
<para>blueprint created</para>
</listitem>
</itemizedlist>
</revdescription>
</revision>
</revhistory>
</info>
<xi:include href="under-contruction-notice.xml"/>
<xi:include href="bk_preface.xml"/>
<xi:include href="associate-guide/bk_associate-training-guide.xml"/>
<xi:include href="operator-guide/bk_operator-training-guide.xml"/>
<xi:include href="developer-guide/bk_developer-training-guide.xml"/>
<xi:include href="architect-guide/bk_architect-training-guide.xml"/>
</set>

Some files were not shown because too many files have changed in this diff Show More