<p class="alert alert-error"><a class="close" data-dismiss="alert">x</a> You must enable Federated Login Before for this application.<br> <a href="http://appengine.google.com" target="_blank">Google App Engine Control Panel</a> -> Administration -> Application Settings -> Authentication Options</p><?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
>

<channel>
<title>The StackGeek Blog</title>
<description>A site for infrastructure nuts.  And dubstep.</description>
<language>en-US</language>
<copyright>Copyright 2013, StackGeek and Various Authors</copyright>
<pubDate>Sat, 07 Jun 2014 14:48:44 GMT</pubDate>
<link>http://www.stackgeek.com/blog/</link>
<ttl>30</ttl>
<sy:updatePeriod>hourly</sy:updatePeriod>
<sy:updateFrequency>1</sy:updateFrequency>
<atom:link rel="self" href="http://www.stackgeek.com/blog/feed/rss/" title="The StackGeek Blog" type="application/rss+xml"/>

<item>
<title>Installing OpenStack Icehouse on Ubuntu 14.04 LTS in 10 Minutes</title>
<link>http://www.stackgeek.com/blog/kordless/guides/gettingstarted.html</link>
<guid isPermaLink="true">http://www.stackgeek.com/blog/kordless/guides/gettingstarted.html</guid>
<pubDate>Mon, 09 Jun 2014 12:00:01 GMT</pubDate>
<description>A 10 minute guide on installing a single node cluster of OpenStack on Ubuntu 12.04 LTS.</description>
<author>kordless@stackgeek.com</author>
<content:encoded>
	<![CDATA[<p>OpenStack's technology stack consists of a series of interrelated projects which controls a given deployment of hardware providing processing, storage, and networking.  Deployments are managed using a simple UI and a flexible API which can be used by third party software.</p>

<p>Infrastructure is meant to be <a href="http://www.stackgeek.com/blog/kordless/post/a-code-of-trust">open, trustworthy and secure</a>. The best way to ensure trust in infrastructure is the use of Open Source software and <a href="http://en.wikipedia.org/wiki/Open_Compute_Project">hardware</a> exclusively at the infrastructure level.  </p>

<p>Before beginning this guide, be sure you read the introduction README in the <a href="https://github.com/stackgeek/openstackgeek/">directory above this one</a>.  Information on the project, goals, support channels and installs for other versions of OpenStack are available there.</p>

<h3>Video Guide</h3>

<p>The video for this guide is <a href="https://vimeo.com/97757352">located on Vimeo</a>.</p>

<p><a href="https://vimeo.com/97757352"><img alt="OpenStack Video" src="https://raw.github.com/StackGeek/openstackgeek/master/icehouse/openstack_icehouse.png"></a></p>

<h3>Installation</h3>

<p>Assuming a <a href="http://www.ubuntu.com/download/desktop">fresh install of Ubuntu 14.04 LTS Desktop</a>, you'll need to locally login to each rig and install the <em>openssh-server</em> to allow remote <em>ssh</em> access:</p>

<pre><code>sudo apt-get install openssh-server
</code></pre>

<p>Remotely log into your new server and install <em>git</em> with <em>aptitude</em>:</p>

<pre><code>sudo su
apt-get -y install git
</code></pre>

<p>Checkout the StackGeek OpenStack setup scripts from Github:</p>

<pre><code>git clone git://github.com/StackGeek/openstackgeek.git
cd openstackgeek/icehouse
</code></pre>

<h3>Network Interfaces</h3>

<p>You need to manually configure your ethernet interface to support a non-routable static IPv4 address and an auto configured IPv6 address.</p>

<pre><code>./openstack_networking.sh
</code></pre>

<p>The script will output a short configuration block which should be placed manually in <strong>/etc/network/interfaces</strong>.  <strong>Be sure to edit the IP adddress before you save the file!</strong>  I suggest you use an ordered set of IPs like .100, .101, .102, etc. for your rigs.</p>

<pre><code># loopback
auto lo
iface lo inet loopback

# primary interface
auto eth0
iface eth0 inet static
  address 10.0.1.100
  netmask 255.255.255.0
  gateway 10.0.1.1
  dns-nameservers 8.8.8.8

# ipv6 configuration
iface eth0 inet6 auto
</code></pre>

<p>You will also need to edit your /etc/hosts file to contain an entry for your controller and any compute rigs.  Here's an example:</p>

<pre><code>127.0.0.1   localhost
10.0.1.100  hanoman
10.0.1.101  ravana
</code></pre>

<p>Reboot the rig after saving the file.</p>

<h3>Privacy and Tracking Notice</h3>

<p>A few of these scripts contain tracking pings and are used to analyze the install process flow.  The IP address of the machine(s) you are installing will be reported to <a href="https://www.stackmonkey.com">https://www.stackmonkey.com/</a>.  No other personal information is transmitted by the tracking pings.  You may examine the Open Source code for handling the ping requests <a href="https://github.com/StackMonkey/xovio-pool/blob/master/web/handlers/apihandlers.py">here</a>.</p>

<p>You may run the following script if you would like to disable the tracking pings in these scripts:</p>

<pre><code>./openstack_disable_tracking.sh
</code></pre>

<p><em>Another Note: Please also be aware that the openstack_setup.sh script below sends your configuration file to a pastebin knockoff hosted on stackgeek.com and keeps it until you delete it (instructions below).  If you don't want this functionality, please edit the openstack_setup.sh script to your liking.</em></p>

<h3>Test and Update</h3>

<p>After editing the network, you'll need to test your rig for virtualization support:</p>

<pre><code>./openstack_server_test.sh
</code></pre>

<p>If your rig doesn't support virtualization, you will need to check your virtualization settings in bios or upgrade your hardware.  If it does support virtualization, you'll be prompted to update your Ubuntu install:</p>

<pre><code>./openstack_system_update.sh
</code></pre>

<p>The update should come back pretty quick as you've already updated the system. </p>

<h3>Setup</h3>

<p><em>Note: Be sure to take a look at the scripts before you run them.  Keep in mind the setup scripts will periodically prompt you for input, either for confirming installation of a package, or asking you for information for configuration.</em></p>

<p>Start the installation by running the setup script:</p>

<pre><code>./openstack_setup.sh
</code></pre>

<p>You will be asked whether or not this rig is to be configured as a controller.  If you answer yes, the result of the setup will be a <strong>setuprc</strong> file in the install directory.  The setup script will also output a URL which is used to copy the existing setup to a compute rig.  Here's an example URL:</p>

<pre><code>https://sgsprunge.appspot.com/I2DIkNZxJyPhhIJc
</code></pre>

<p>If you indicated the rig is not a controller node, you will be prompted for the URL spit out by the controller installation as mentioned above.  Paste this URL in and hit enter to start the compute rig install.</p>

<p><strong><em>Note: If you are installing a compute rig, you may skip to the Cinder Setup section below.</em></strong></p>

<h3>Install Splunk (Controller Only)</h3>

<p>If you would like to use Splunk for debugging and monitoring purposes, install it now:</p>

<pre><code>./openstack_splunk.sh
</code></pre>

<p>Splunk will be configured to monitor the OpenStack packages logfiles.  You may access splunk through the following URL (assuming you use the controller's correct IP address):</p>

<pre><code>http://10.0.1.100:8000
</code></pre>

<h3>Database Setup (Controller Only)</h3>

<p>The next part of the setup installs MySQL and RabbitMQ.  <strong>This is only required for the controller rig. Skip this step if you are setting up a compute rig for your cluster.</strong> Start the install on the controller rig by typing:</p>

<pre><code>./openstack_mysql.sh
</code></pre>

<p>The install script will install Rabbit and MySQL.  During the MySQL install you will be prompted for the MySQL password you entered earlier to set a password for the MySQL root user.  You'll be prompted again toward the end of the script when it creates the databases.</p>

<p><strong><em>The MySQL install script now runs the command 'mysql_secure_installation' to secure your MySQL install.  Answer the questions this script presents to you to secure your install properly.</em></strong></p>

<h3>Keystone Setup (Controller Only)</h3>

<p>Keystone is used by OpenStack to provide central authentication across all installed services.  Start the install of Keystone by typing the following:</p>

<pre><code>./openstack_keystone.sh
</code></pre>

<p>When the install is done, test Keystone by setting the environment variables using the newly created <strong>stackrc</strong> file.  <strong><em>Note: This file can be sourced any time you need to manage the OpenStack cluster from the command line.</em></strong></p>

<pre><code>. ./stackrc
keystone user-list
</code></pre>

<p>Keystone should output the current user list to the console:</p>

<pre><code>+----------------------------------+---------+---------+--------------------+
|                id                |   name  | enabled |       email        |
+----------------------------------+---------+---------+--------------------+
| 5474c43e65c840b5b371d695af72cba4 |  admin  |   True  | xxxxxxxx@gmail.com |
| dec9e0adf6af4066810b922035f24edf |  cinder |   True  | xxxxxxxx@gmail.com |
| 936e0e930553423b957d1983d0a29a62 |   demo  |   True  | xxxxxxxx@gmail.com |
| 665bc14a5da44e86bd5856c6a22866fb |  glance |   True  | xxxxxxxx@gmail.com |
| bf435eb480f643058e27520ee3737685 |   nova  |   True  | xxxxxxxx@gmail.com |
| 7fa480363a364d539278613aa7e32875 | quantum |   True  | xxxxxxxx@gmail.com |
+----------------------------------+---------+---------+--------------------+
</code></pre>

<h3>Glance Setup (Controller Only)</h3>

<p>Glance provides image services for OpenStack.  Images are comprised of prebuilt operating system images built to run on OpenStack.  There is a <a href="http://docs.openstack.org/image-guide/content/ch_obtaining_images.html">list of available images</a> on the OpenStack site.</p>

<p>Start the Glance install by typing:</p>

<pre><code>./openstack_glance.sh
</code></pre>

<p>Once the Glance install completes, you should be able to query the system for the available images:</p>

<pre><code>glance image-list
</code></pre>

<p>The output should be something like this:</p>

<pre><code>+--------------------------------------+--------------+-------------+--------+---------+--------+
| ID                                   | Name         | Disk Format | Format | Size    | Status |
+--------------------------------------+--------------+-------------+--------+-----------+--------+
| df53bace-b5a0-49ba-9b7f-4d43f249e3f3 | Cirros 0.3.0 | qcow2       | bare   | 9761280 | active |
+--------------------------------------+--------------+-------------+--------+---------+--------+
</code></pre>

<h3>Cinder Setup</h3>

<p>Cinder is used to provide additional volume attachments to running instances and snapshot space.  Start the install of Cinder by typing:</p>

<pre><code>./openstack_cinder.sh
</code></pre>

<p>Once the install of Cinder is complete, determine your space requirements and run the loopback volume creation script (keep in mind you have to create a loopback file that is at least 1GB in size):</p>

<pre><code>./openstack_loop.sh
</code></pre>

<p>You should now be able to query installed storage types:</p>

<pre><code>cinder type-list
</code></pre>

<p>You may then create a new volume to test:</p>

<pre><code>cinder create --volume-type Storage --display-name test 1
</code></pre>

<p><strong><em>Note: If you are installing a compute rig, you may skip to the *Nova Compute Setup</em> section below.*</strong></p>

<h3>Nova Setup (Controller Only)</h3>

<p>Nova provides multiple services to OpenStack for controlling networking, imaging and starting and stopping instances.  If you are installing a compute rig, please skip to the following section to install the base <em>nova-compute</em> methods needed for running a compute rig.</p>

<p>Start the controller's nova install by typing the following:</p>

<pre><code>./openstack_nova.sh
</code></pre>

<p>When the install is complete, you may query the running services by doing the following:</p>

<pre><code>nova service-list
</code></pre>

<p>You should see output that looks similar to this:</p>

<pre><code>+------------------+--------+----------+---------+-------+----------------------------+
| Binary           | Host   | Zone     | Status  | State | Updated_at                 |
+------------------+--------+----------+---------+-------+----------------------------+
| nova-cert        | tester | internal | enabled | up    | 2014-02-20T10:37:25.000000 |
| nova-conductor   | tester | internal | enabled | up    | 2014-02-20T10:37:17.000000 |
| nova-consoleauth | tester | internal | enabled | up    | 2014-02-20T10:37:25.000000 |
| nova-network     | tester | internal | enabled | up    | 2014-02-20T10:37:25.000000 |
| nova-scheduler   | tester | internal | enabled | up    | 2014-02-20T10:37:24.000000 |
+------------------+--------+----------+---------+-------+----------------------------+
</code></pre>

<h3>Nova Compute Setup (Compute Rigs Only)</h3>

<p>If you are installing a controller, this step has already been completed using the <strong>Nova Setup</strong> section above.  You may skip this if you are installing a controller rig.</p>

<p>You may run this on any number of compute rigs.  Start the Nova Compute setup on a given compute rig by typing the following:</p>

<pre><code>./openstack_nova_compute.sh
</code></pre>

<p>Once the compute rig has been configured, you may log back into the <strong>controller rig</strong> and run the nova service list command again:</p>

<pre><code>nova service-list
</code></pre>

<p>You should see new entries for the newly added compute rig:</p>

<pre><code>+------------------+---------+----------+---------+-------+----------------------------+
| Binary           | Host    | Zone     | Status  | State | Updated_at                 |
+------------------+---------+----------+---------+-------+----------------------------+
| nova-cert        | nero    | internal | enabled | up    | 2014-04-13T17:20:52.000000 |
| nova-compute     | booster | nova     | enabled | up    | 2014-04-13T17:20:55.000000 |
| nova-compute     | nero    | nova     | enabled | up    | 2014-04-13T17:20:55.000000 |
| nova-conductor   | nero    | internal | enabled | up    | 2014-04-13T17:20:52.000000 |
| nova-consoleauth | nero    | internal | enabled | up    | 2014-04-13T17:20:52.000000 |
| nova-network     | booster | internal | enabled | up    | 2014-04-13T17:20:52.000000 |
| nova-network     | nero    | internal | enabled | up    | 2014-04-13T17:20:52.000000 |
| nova-scheduler   | nero    | internal | enabled | up    | 2014-04-13T17:20:52.000000 |
+------------------+---------+----------+---------+-------+----------------------------+
</code></pre>

<h3>Flat Networking Setup for IPv4 (Controller Only)</h3>

<p>This guide completely ignores the <a href="https://wiki.openstack.org/wiki/Neutron">Neutron/Quantum project</a>.  If you are interested in Neutron, this is not the place to seek help.</p>

<p><strong><em>Note: If you want to run IPv4 + IPv6, please skip to the next section and do NOT run this section's commands.</em></strong></p>

<p>Begin by creating an IPv4 private network range which blocks out the <strong>10.0.47.0</strong> network (assuming the ethernet interface is eth0):</p>

<pre><code>nova-manage network create private --fixed_range_v4=10.0.47.0/24 --num_networks=1 --bridge=br100 --bridge_interface=eth0 --network_size=255
</code></pre>

<p>You'll need to add a route in your router to point to the new network managed by the controller (pseudo command here):</p>

<pre><code>route add 10.0.47.0 255.255.255.0 gw 10.0.1.200
</code></pre>

<p>You can view the networks by querying nova:</p>

<pre><code>nova network-list
</code></pre>

<p>Output should look like this:</p>

<pre><code>+--------------------------------------+---------+---------------+
| ID                                   | Label   | CIDR          |
+--------------------------------------+---------+---------------+
| 22aca431-14b3-43e0-a762-b02914770e6d | private | 10.0.1.224/28 |
+--------------------------------------+---------+---------------+
</code></pre>

<h3>Flat Networking Setup for IPv4 + IPv6 (Controller Only)</h3>

<p>Before you can add an IPv6 prefix to your OpenStack controller, you will need to configure your router to enable IPv6 on your provider.  Your milage may vary by router type and provider.  We've found the Asus routers + Comcast to be the easiest to configure: simply navigate to the IPv6 settings and then select 'native' or 'native with DHCP-PD' in your router's admin interface to turn on IPv6.</p>

<p><strong><em>Note: If your provider doesn't support IPv6 and you have an IPv6 capable router, you can use <a href="https://tunnelbroker.net/">Huricane Electric's Tunnel Broker</a> to enable IPv6 on your network.</em></strong></p>

<p>After configuring your router for IPv6, your router interface should show a LAN IPv6 prefix and length.  Make note of the address, as you'll use it in a minute to add a prefix to OpenStack.</p>

<p>Now configure IPv6 forwarding support on the controller:</p>

<pre><code>./openstack_ipv6.sh
</code></pre>

<p>Just in case, restart the Nova services to sync up the network:</p>

<pre><code>./openstack_restart_nova.sh
</code></pre>

<p>Create an IPv4 private network range using sample networks of <strong>10.0.47.0</strong> for IPv4 and <strong>2601:9:1380:821::/64</strong> for an IPv6 prefix (again, assuming the ethernet interface is eth0):</p>

<pre><code>nova-manage network create private --fixed_range_v4=10.0.47.0/24 --fixed_range_v6=2601:9:1380:821::/64 --num_networks=1 --bridge=br100 --bridge_interface=eth0 --network_size=255
</code></pre>

<p>You'll need to add a route in your router to point to the new network managed by the controller (pseudo command here, using 10.0.1.200 as the controller node):</p>

<pre><code>route add 10.0.47.0 255.255.255.0 gw 10.0.1.200
</code></pre>

<p>You can view the private network by querying nova:</p>

<pre><code>nova network-list
</code></pre>

<p>Output should look like this:</p>

<pre><code>+--------------------------------------+---------+---------------+
| ID                                   | Label   | CIDR          |
+--------------------------------------+---------+---------------+
| 22aca431-14b3-43e0-a762-b02914770e6d | private | 10.0.1.224/28 |
+--------------------------------------+---------+---------------+
</code></pre>

<h3>Floating IP Setup (Controller Only)</h3>

<p>If you have a block of externally routed IP addresses (public IPs) you may create a floating IP entry for OpenStack:</p>

<pre><code>nova-manage floating create 208.128.7.128/25
</code></pre>

<p>This example would allow a floating IP address to be assigned to instance from the range of <strong>208.128.7.129 to 208.128.7.254</strong>.</p>

<p>If you added it, you can view the available floating pool addresses by querying nova again:</p>

<pre><code>nova floating-ip-bulk-list
</code></pre>

<p>Output should look like this (truncated for space):</p>

<pre><code>+------------+---------------+---------------+------+-----------+
| project_id | address       | instance_uuid | pool | interface |
+------------+---------------+---------------+------+-----------+
| None       | 208.128.7.129 | None          | nova | 10.0.2.15 |
| None       | 208.128.7.130 | None          | nova | 10.0.2.15 |
+------------+---------------+---------------+------+-----------+
</code></pre>

<p>Finally, edit the <em>/etc/nova/nova.conf</em> file to enable assigning the floating IPs to newly launched instances:</p>

<pre><code>auto_assign_floating_ip=true
</code></pre>

<p><strong><em>Note: As with the private IP space added earlier, you'll need to configure your router to route the external addresses to the controller's IP address.  Your mileage will vary, depending on your current network setup.</em></strong></p>

<h3>Horizon Setup (Controller Only)</h3>

<p>Horizon provides OpenStack's managment interface.  Install Horizon by typing:</p>

<pre><code>./openstack_horizon.sh
</code></pre>

<p>Now reboot the controller rig:</p>

<pre><code>reboot
</code></pre>

<p>Once the rig comes back up, you should be able to log into your OpenStack cluster with the following URL format (changing the IP of course):</p>

<pre><code>http://10.0.1.100/horizon
</code></pre>

<p>Your user/pass combination will be <em>'admin'</em> and whatever you entered for a password earlier.  If you accidentally run this command before adding the network above, you may see errors in the UI.    </p>

<p><strong><em>Note: If you log into the dashboard and get errors regarding quotas, log out of the UI by clicking on 'sign out' at the top right and then reboot the rig.  The errors should go away when you log back in.</em></strong></p>

<h3>Install the StackMonkey Virtual Appliance</h3>

<p>StackMonkey is a pool instance of a highly distributed cloud framework.  If you elect to install the appliance, this OpenStack node will provide a small portion of its compute power to help build a highly distributed cloud.  You will earn Bitcoin doing this.</p>

<p>The virtual appliance setup can be run by typing the following command:</p>

<pre><code>./openstack_stackmonkey_va.sh
</code></pre>

<p>More information about the project can be viewed on the <a href="https://www.stackmonkey.com/appliances/new">StackMonkey pool's site</a> (requires auth to Google account).  There is also a <a href="https://vimeo.com/91805503">video guide</a> that walks you through setting up your first appliance.</p>

<h3>OpenStack Cheat Sheet</h3>

<p>An OpenStack Command Line Cheat Sheet is available on <a href="http://anystacker.com/2014/02/openstack-command-line-cheat-sheet/">Anystacker's site</a>.  Commands can be run once the <strong>setuprc</strong> file has been sourced:</p>

<pre><code>. ./setuprc
</code></pre>

<h3>Delete the Paste File</h3>

<p>The URL created for a multi-rig install is stored on an AppEngine application based on <a href="http://github.com/rupa/sprunge">Rupa's sprunge project</a>.  You should delete the paste after you are done with your setup for security's sake:</p>

<pre><code>curl -X DELETE https://sgsprunge.appspot.com/I2DIkNZxJyPhhIJc
</code></pre>

<p>If you have any questions, issues or concerns, please feel free to join IRC, post on the forum, or create a ticket!</p>]]>
</content:encoded>
</item>

<item>
<title>Low Power VLSI Design</title>
<link>http://www.stackgeek.com/blog/gharsh1208/posts/low-power-vlsi-design</link>
<guid isPermaLink="true">http://www.stackgeek.com/blog/gharsh1208/posts/low-power-vlsi-design</guid>
<pubDate>Sat, 07 Jun 2014 14:47:49 GMT</pubDate>
<description>Low Power Nanoparticles</description>
<author>harsh.gupta123@gmail.com</author>
<content:encoded>
	<![CDATA[<h1>Low Power VLSI Design</h1>

<p>Low Power Nanoparticles</p>

<h2>Emphasis</h2>

<pre><code>*italic*   **bold**
_italic_   __bold__
</code></pre>

<h2>Links</h2>

<pre><code>An [example](http://url.com/ "Title")
</code></pre>

<h2>Images</h2>

<pre><code>![alt text](/path/img.jpg "Title")
![alt text][id]
[id]: /url/to/img.jpg "Title"
</code></pre>

<h2>Headers</h2>

<pre><code>Header 1
========

Header 2
--------

# Header 1 #

## Header 2 ##

###### Header 6
</code></pre>

<h2>Lists</h2>

<pre><code>1.  Foo
2.  Bar

*   A list item.
*   Bar

*   Abacus
    * answer
*   Bubbles
    1.  bunk
    2.  bupkis
        * BELITTLER
    3. burper
*   Cunning
</code></pre>

<h2>Blockquotes</h2>

<pre><code>&gt; Email-style angle brackets
&gt; are used for blockquotes.

&gt; &gt; And, they can be nested.

&gt; #### Headers in blockquotes
&gt; 
&gt; * You can quote a list.
&gt; * Etc.
</code></pre>

<h2>Code Spans</h2>

<pre><code>`&lt;code&gt;` spans are delimited
by backticks.

You can include literal backticks
like `` `this` ``.
</code></pre>

<h2>Preformatted Code Blocks</h2>

<pre><code>This is a normal paragraph.

    This is a preformatted
    code block.
</code></pre>

<h2>Horizontal Rules</h2>

<pre><code>---

* * *

- - - -
</code></pre>

<h2>Manual Line Breaks</h2>

<pre><code>Roses are red,   
Violets are blue.
</code></pre>]]>
</content:encoded>
</item>

<item>
<title>Installing OpenStack Essex on Ubuntu 12.04</title>
<link>http://www.stackgeek.com/blog/kordless/guides/installing-openstack-essex-on-ubuntu-1204</link>
<guid isPermaLink="true">http://www.stackgeek.com/blog/kordless/guides/installing-openstack-essex-on-ubuntu-1204</guid>
<pubDate>Thu, 20 Feb 2014 15:44:00 GMT</pubDate>
<description>Older guide for installing Essex.</description>
<author>kordless@stackgeek.com</author>
<content:encoded>
	<![CDATA[<h3>NOTICE</h3>

<p>This guide is being updated with the new <a href="http://www.stackgeek.com/guides/gettingstarted.html">Installing OpenStack Grizzly in 10 Minutes</a> guide.  While the guide below mostly works for installing OpenStack Essex, it is strongly suggested you follow the other guide to install the Grizzly version of OpenStack.</p>

<h3>Requirements</h3>

<p>StackGeek provides <a href="https://github.com/StackGeek/openstackgeek">these scripts</a> and this guide which will give you a working installation of OpenStack Essex in about 10 minutes. Before you start your OpenStack setup, please read the following requirements carefully:</p>

<ol>
<li>You need a box with at least 8GB of RAM, 4 processing cores, (2) hard drives, and (1-2) ethernet cards.</li>
<li>You need a clean <a href="http://www.ubuntu.com/download/server">install of Ubuntu 12.04.1 LTS</a> 64-bit server on your box.  This guide will NOT work with Ubuntu 12.10.</li>
<li>A <a href="https://soundcloud.com/skrillex/avicii-levels-skrillex-remix">good dubstep track</a> (this is optional).</li>
</ol>

<p><code>Note:</code> Only the primary ethernet card needs to be connected to the network.  If you only have one ethernet card, you can hack the scripts to use the primary interface for your private network.</p>

<h3>Video Guide</h3>

<iframe frameborder="0" height="300" src="http://player.vimeo.com/video/42010112?byline=0&amp;portrait=0&amp;color=ff9933" width="400"></iframe>

<p>The video guide for this tutorial <a href="http://vimeo.com/42010112">is on Vimeo</a>.
<span></span></p>

<h3>Forum Discussion</h3>

<p>There is now a <a href="https://groups.google.com/forum/#!category-topic/stackgeek/openstack/zVVS4DgiJnI">forum discussion area on Google Groups</a> for posting technical questions regarding the guide.</p>

<h3>Download the Setup Scripts</h3>

<p>Login to your box and install <code>git</code> with <code>apt-get</code>.  We'll become root and do an update first.</p>

<pre>sudo su
apt-get update
apt-get install git
</pre>

<p>Now checkout the StackGeek OpenStack setup scripts from Github:</p>

<pre>git clone git://github.com/StackGeek/openstackgeek.git
cd openstackgeek/essex
</pre>

<h3>Install the Base Scripts</h3>

<p>Be sure to take a look at the scripts before you run them.  Keep in mind the setup scripts will periodically prompt you for input, either for confirming installation of a package, or asking you for information for configuration.  </p>

<p>Start the installation by running the first script:</p>

<pre>./openstack_base_1.sh
</pre>

<p>When the script finishes you'll see instructions for manually configuring your network.  You can edit the <code>interfaces</code> file by doing a:</p>

<pre>vim /etc/network/interfaces
</pre>

<p>Copy and paste the network code provided by the script into the file and then edit:</p>

<pre>auto eth0 
iface eth0 inet static
  address 10.0.1.20
  network 10.0.1.0
  netmask 255.255.255.0
  broadcast 10.0.1.255
  gateway 10.0.1.1
  dns-nameservers 8.8.8.8

auto eth1
</pre>

<p>Change the settings for your network configuration and then restart networking and run the next script:</p>

<pre>/etc/init.d/networking restart
./openstack_base_2.sh
</pre>

<p>After the second script finishes, you'll need to set up a logical volume for Nova to use for creating snapshots and volumes.  Nova is OpenStack's compute controller process.</p>

<p>Here's the output from the format and volume creation process:</p>

<pre>root@precise:/home/kord/openstackgeek# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xb39fe7af.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-62914559, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-62914559, default 62914559): 
Using default value 62914559

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
root@precise:/home/kord/openstackgeek# pvcreate -ff /dev/sdb1
  Physical volume "/dev/sdb1" successfully created
root@precise:/home/kord/openstackgeek# vgcreate nova-volumes /dev/sdb1
  Volume group "nova-volumes" successfully created
root@precise:/home/kord/openstackgeek#
</pre>

<p><code>Note:</code> Your device names may vary.</p>

<h3>Installing MySql</h3>

<p>The OpenStack components use MySQL for storing state information.  Start the install script for MySQL by entering the following:</p>

<pre>./openstack_mysql.sh
</pre>

<p>You'll be prompted for a password to be used for each of the components to talk to MySQL:</p>

<pre>Enter a password to be used for the OpenStack services to talk to MySQL (users nova, glance, keystone): f00bar
</pre>

<p>During the installation process you will be prompted for a root password for MySQL.  In our install example we use the same password, 'f00bar'.   At the end of the MySQL install you'll be prompted for your root password again.</p>

<pre>mysql start/running, process 8796
#######################################################################################
Creating OpenStack databases and users.  Use your database password when prompted.

Run './openstack_keystone.sh' when the script exits.
#######################################################################################
Enter password:
</pre>

<p>After MySQL is running, you should be able to login with any of the OpenStack users and/or the root admin account by doing the following:</p>

<pre>mysql -u root -pf00bar
mysql -u nova -pf00bar nova
mysql -u keystone -pf00bar keystone
mysql -u glance -pf00bar glance
</pre>

<h3>Installing Keystone</h3>

<p>Keystone is OpenStack's identity manager.  Start the install of Keystone by doing:</p>

<pre>./openstack_keystone.sh
</pre>

<p>You'll be prompted for a token, the password you entered for OpenStack's services, and your email address.  The email address is used to populate the user's information in the database.</p>

<pre>Enter a token for the OpenStack services to auth wth keystone: r4th3rb3t0k3n
Enter the password you used for the MySQL users (nova, glance, keystone): f00bar
Enter the email address for service accounts (nova, glance, keystone): user@foobar.com
</pre>

<p>You should be able to query Keystone at this point.  You'll need to source the <code>stackrc</code> file before you talk to Keystone:</p>

<pre>. ./stackrc
keystone user-list
</pre>

<p>Keystone should return a list of users:</p>

<pre>+----------------------------------+---------+------------------------+--------+
|                id                | enabled |         email          |  name  |
+----------------------------------+---------+------------------------+--------+
| b32b9017fb954eeeacb10bebf14aceb3 | True    | kordless@foobar222.com | demo   |
| bfcbaa1425ae4cd2b8ff1ddcf95c907a | True    | kordless@foobar222.com | glance |
| c1ca1604c38443f2856e3818c4ceb4d4 | True    | kordless@foobar222.com | nova   |
| dd183fe2daac436682e0550d3c339dde | True    | kordless@foobar222.com | admin  |
+----------------------------------+---------+------------------------+--------+
</pre>

<h3>Installing Glance</h3>

<p>Glance is OpenStack's image manager.  Start the install of Glance by doing:</p>

<pre>./openstack_glance.sh
</pre>

<p><code>Note:</code> You can safely ignore the <code>SADeprecationWarning</code> warning thrown by Glance when it starts.</p>

<p>The script will download an Ubuntu 12.04 LTS cloud image from StackGeek's S3 bucket.  Go grab some coffee while it's downloading.  Once it's done, you should be able to get a list of images:</p>

<pre>glance index
</pre>

<p>Here's the expected output:</p>

<pre>ID                                   Name                  Disk Format    Container Format   Size          
------------------------------------ --------------------- -------------- ------------------ ----------
71b8b5d5-a972-48b3-b940-98a74b85ed6a Ubuntu 12.04 LTS      qcow2          ovf                226426880
</pre>

<p>We'll cover adding images via Glance in another guide soon.</p>

<h3>Installing Nova</h3>

<p>We're almost done installing!  The last component is the most important one as well.  Nova is OpenStack's compute and network manager.  It's responsible for starting instances, creating snapshots and volumes, and managing the network.  Start the Nova install by doing:</p>

<pre>./openstack_nova.sh
</pre>

<h4>A Bit on Networking First</h4>

<p>You'll immediately be prompted for a few items, including your existing network interface's IP address, the fixed network address, and the floating pool addresses:</p>

<pre>####################################################################################################
The IP address for eth0 is probably 10.0.1.35. Keep in mind you need an eth1 for this to work.
####################################################################################################
Enter the primary ethernet interface IP: 10.0.1.35
Enter the fixed network (eg. 10.0.2.32/27): 10.0.2.32/27
Enter the fixed starting IP (eg. 10.0.2.33): 10.0.2.33
#######################################################################################
The floating range can be a subset of your current network.  Configure your DHCP server
to block out the range before you choose it here.  An example would be 10.0.1.224-255
#######################################################################################
Enter the floating network (eg. 10.0.1.224/27): 10.0.1.224/27
Enter the floating netowrk size (eg. 32): 32
</pre>

<p><code>Note:</code> The script isn't very sophisticated and doesn't use defaults, so be sure you type in things carefully!  You can rerun the script if you mess up.  There's a nice subnet calculator <a href="http://www.subnet-calculator.com/">here if you need help with network masks</a>.  For reference, the <code>/27</code> above is called the 'mask bits' in the calculator.</p>

<p>The fixed network is a set of IP addresses which will be local to the compute nodes.  Think of these addresses as being held and routed internally inside any of the compute node instances.  If you decide to use a larger network, you could use something like <code>10.0.4.0/24</code> and a starting address of <code>10.0.4.1</code>.</p>

<p>The floating network is a pool of addresses which can be assigned to the instances you are running.  For example, you could start a web server and map an external IP to it for serving a site on the Internet.  In the example above we use a private network because we're doing this at the house, but if your routing equipment/network allows it you could assign externally routed IPs to OpenStack instances.</p>

<h4>Finish Installing Nova</h4>

<p>Nova should finish installing after you enter all the network information.  When it's done, you should be able to get a list of images from Glance via Nova:</p>

<pre>nova image-list
</pre>

<p>And get the expected output we saw earlier from Glance:</p>

<pre>root@precise:/home/kord/openstackgeek# nova image-list
+--------------------------------------+------------------+--------+--------+
|                  ID                  |       Name       | Status | Server |
+--------------------------------------+------------------+--------+--------+
| 71b8b5d5-a972-48b3-b940-98a74b85ed6a | Ubuntu 12.04 LTS | ACTIVE |        |
+--------------------------------------+------------------+--------+--------+
</pre>

<h3>Installing Horizon</h3>

<p>Horizon is the UI and dashboard controller for OpenStack.  Install it by doing:</p>

<pre>./openstack_horizon.sh
</pre>

<p>When it's done installing, you'll be given a URL to access the dashboard.  You'll be able to login with the user 'admin' and whatever you entered earlier for your password.  If you've forgotten it, simply grep for it in your environment:</p>

<pre>env |grep OS_PASSWORD
</pre>

<h3>Start Launching Instances</h3>

<p>That's it!  You can now watch <a href="https://vimeo.com/41807514">the introduction video guide</a> which gives an overview of creating a new project, users, and instances.</p>

<p>Be sure to drop us a line if you have any questions or corrections for this guide!</p>]]>
</content:encoded>
</item>

<item>
<title>Awesome article</title>
<link>http://www.stackgeek.com/blog/snvandoorn/posts/awesome-article</link>
<guid isPermaLink="true">http://www.stackgeek.com/blog/snvandoorn/posts/awesome-article</guid>
<pubDate>Wed, 21 Aug 2013 21:20:13 GMT</pubDate>
<description>Some things that are magic</description>
<author>snvandoorn@googlemail.com</author>
<content:encoded>
	<![CDATA[<h1>Awesome article</h1>

<p>Some things that are magic</p>

<h2>Emphasis</h2>

<pre><code>*italic*   **bold**
_italic_   __bold__
</code></pre>

<h2>Links</h2>

<pre><code>An [example](http://url.com/ "Title")
</code></pre>

<h2>Images</h2>

<pre><code>![alt text](/path/img.jpg "Title")
![alt text][id]
[id]: /url/to/img.jpg "Title"
</code></pre>

<h2>Headers</h2>

<pre><code>Header 1
========

Header 2
--------

# Header 1 #

## Header 2 ##

###### Header 6
</code></pre>

<h2>Lists</h2>

<pre><code>1.  Foo
2.  Bar

*   A list item.
*   Bar

*   Abacus
    * answer
*   Bubbles
    1.  bunk
    2.  bupkis
        * BELITTLER
    3. burper
*   Cunning
</code></pre>

<h2>Blockquotes</h2>

<pre><code>&gt; Email-style angle brackets
&gt; are used for blockquotes.

&gt; &gt; And, they can be nested.

&gt; #### Headers in blockquotes
&gt; 
&gt; * You can quote a list.
&gt; * Etc.
</code></pre>

<h2>Code Spans</h2>

<pre><code>`&lt;code&gt;` spans are delimited
by backticks.

You can include literal backticks
like `` `this` ``.
</code></pre>

<h2>Preformatted Code Blocks</h2>

<pre><code>This is a normal paragraph.

    This is a preformatted
    code block.
</code></pre>

<h2>Horizontal Rules</h2>

<pre><code>---

* * *

- - - -
</code></pre>

<h2>Manual Line Breaks</h2>

<pre><code>Roses are red,   
Violets are blue.
</code></pre>]]>
</content:encoded>
</item>

<item>
<title>A Code of Trust</title>
<link>http://www.stackgeek.com/blog/kordless/posts/a-code-of-trust</link>
<guid isPermaLink="true">http://www.stackgeek.com/blog/kordless/posts/a-code-of-trust</guid>
<pubDate>Thu, 08 Aug 2013 23:13:42 GMT</pubDate>
<description>APIs and Trust</description>
<author>kordless@stackgeek.com</author>
<content:encoded>
	<![CDATA[<p>After Lew Moorman recruited me to advise Rackspace, I wanted to better understand Rackspace's intent and how they envisioned the future of their industry was going to pan out over the coming years. On of my first questions to Lew was <strong>"Why did you Open Source OpenStack?"</strong>. Lew replied, <strong>“We did it to ensure a robust ecosystem, drive long term innovation and to help commoditize the core operating system.”</strong></p>

<p>I’ve been thinking about what he said since, and it appears everything Rackspace wants to achieve with its Open Source strategy is actually based on <a href="http://urly.stackgeek.com/0r7">trust</a>.  All good ecosystems rely on trust, whether that’s the school you trust with your child's education, or the bank you trust with your cash or the technology bits you trust with your data.  Without trust, no ecosystem remains stable. Trust also empowers positive change and innovation. People who want their ideas to have impact must entrust other people to amplify, execute and improve on what they’ve created. That’s why the most powerful innovators <a href="http://www.wired.com/science/discoveries/news/2008/07/dayintech_0710">make ideas readily and equally available</a> to markets, governments and society.  </p>

<p>Trust is also a necessary requirement of any <a href="http://en.wikipedia.org/wiki/Commodity">commodity</a>. When you buy gold, pig iron, pork bellies or crude oil, you’ve got to trust that you’re getting what your contract says you’re going to get. You’ve got to trust that when you say “gold” and I say “gold” we’re talking about the same thing.  No more, no less.</p>

<p>To that end, an <a href="https://github.com/openstack">Open Sourced OpenStack</a> gives way to methods for trusting the underlying infrastructures that runs our code, stores our data and makes our technology startup innovation process successful. This trust in infrastructure comes about when you have access to and are able to understand all the hardware, software and services your company uses day to day.  While there will be many of us who don't choose to look behind that curtain of transparency for all the components we use to build our business, there will be a few of us who can and will.</p>

<p>At no other moment in time has trust been at such a premium. Recent <a href="http://www.nytimes.com/2013/08/08/us/broader-sifting-of-data-abroad-is-seen-by-nsa.html?pagewanted=all">revelations</a> show the NSA has its fingers in every aspect of technology in our lives, including <a href="http://www.washingtonsblog.com/2013/07/newly-leaked-nsa-slide-shows-that-nsa-is-tapping-all-data-from-main-undersea-phone-and-internet-cables.html">our phones</a>, <a href="http://www.theguardian.com/world/2013/jul/11/microsoft-nsa-collaboration-user-data">our operating systems</a>, <a href="http://gigaom.com/2013/03/19/report-the-cia-and-amazon-are-in-cahoots-over-secret-cloud/">our clouds</a>, and <a href="http://www.afr.com/p/technology/intel_chips_could_be_nsa_key_to_ymrhS1HS1633gCWKt5tFtI">even the processor chips in our computers</a>. All of these current events serve to highlight how precarious and precious the establishment of trust has become in the communications and interactions occurring between all of us.</p>

<p>It's not a surprise most communications occurring today on the Internet take place via <a href="http://en.wikipedia.org/wiki/Application_programming_interface">software APIs</a>.  These APIs are critical to establishing trust in the way we interact with each other.</p>

<h3>APIs Define Interactions</h3>

<p>APIs exist to provide programmers an easy way to 'wrap' a set of function calls which reside inside a larger set of separate files.  You can imagine these function wrappers as envelopes with a label on the outside summarizing what is on the inside of the envelope.  Inside each envelope are more envelopes with labels and/or letters, any of which you may <strong>choose</strong> to open and read, given you have the ability to open the envelopes and view the underlying code.</p>

<p>Let's take a look at a simple two file example of an API.  The first file contains code that wraps a fictitious Open Source API called <strong>MiCloud</strong>:</p>

<pre><code># clusterbuster.py - a simple "API" for snakeoi.ly site
# THIS SOFTWARE IS PROVIDED BY BUSTER KNUTS ''AS IS'' ETC. ETC.
# 
# import the multi-tenant infrastructure cloud library
import MiCloud

def build_cluster(num_servers):
  cluster = MiCloud.create_cluster("Bob")
  for x in range(num_servers):
    node = MiCloud.grab_available_node()
    instance = node.start_instance()
    ip = MiCloud.get_ip()
    instance.assign_ip(ip)
    cluster.add_instance_to_cluster(instance)
    print "instance %s started" % x
  print "cluster built"
</code></pre>

<p>The code here provides a simple loop to iterate over several MiCloud calls.  Our programmer can now write a small amount of code in a second file to start ten servers:</p>

<pre><code>import clusterbuster

# start the snakoi.ly cluster
clusterbuster.build_cluster(10)
</code></pre>

<p>This second code snippet embodies the essence of an API: <strong>It makes it easy to do powerful things with a few lines of code</strong>.  It also enables the underlying code to change the way it does things 'under the hood' without our programmer having to know or do anything different.</p>

<p>There are a <a href="http://gigaom.com/2013/07/24/is-rackspaces-amazon-api-stance-holding-openstack-back/">few</a> <a href="http://www.cloudscaling.com/blog/cloud-computing/openstack-aws/">crackpots</a> who think API parity between OpenSource software and closed/proprietary services like AWS are important.  Contrary to these individual's claims, API trust is actually a far more important topic for consideration. </p>

<h3>APIs Define Levels of Trust</h3>

<p>Let's consider a scenario where another programmer is using a similar 'cloudy' API as the one above, but isn't able to see the first file because a) the code is closed source and b) it's being hosted on a service provider's infrastructure. In this example, the first file (again, hidden from public view) has been modified slightly by a large corporation to include code which checks to see how much a customer paid the service provider last month and if it was below a certain amount, starts an instance for them on an older part of the cloud provider's infrastructure:</p>

<pre><code>  user_value = customer.last_month_invoice_amount()
  if user_value &gt; 50000 or random.random() &gt; 0.5:
    node = MiCloud.grab_available_node()
  else:
    node = MiCloud.grab_available_node_on_crappy_old_greasy_servers()
</code></pre>

<p>This decidedly evil example could present itself in the real world via <a href="https://en.wikipedia.org/wiki/Proprietary_software">proprietary software libraries</a> or <a href="http://en.wikipedia.org/wiki/Web_API">Web APIs</a>, both of which could run non-Open Sourced code and non-transparent infrastructure.</p>

<p>If you think you can assume to trust proprietary APIs and closed source code created by companies who's primary purpose is increasing revenue, think again.  Bruce Schneier's <a href="http://www.schneier.com/essay-198.html">post from 2007</a> revealed what might have been a possible backdoor in the algorithm used by Microsoft's CryptoAPI. Fast forward to today, Microsoft <a href="http://www.technobuffalo.com/2013/07/11/microsoft-gave-the-nsa-direct-backdoor-access-to-outlook-skype/">is now being accused</a> of giving the NSA a backdoor to Outlook and Skype.  They are claiming they had no choice.</p>

<p>We all <em>want</em> to trust companies to do the right thing with our data. We want to trust Microsoft writes completely secure code we can run and we want to trust Amazon gives us fair, safe and secure computing with the AWS APIs. However, there’s no basis for that trust until you can see into the source code they are running or fully understand how they build and run the services they provide.  This is especially true when companies are being forced into compromising situations by certain governments.</p>

<h3>SaaS Services Benefit from Implied Trust</h3>

<p>When <a href="http://raffy.ch/blog/">Raffy Marty</a> and I founded <a href="http://logg.ly/">Loggly</a>, I quickly realized how important our user's log data could be.  Shortly after launching Loggly, we received a request from a customer to delete their account and all the data they sent us.  It turned out one of their developers left debug statements in production code, which ended up forwarding their Loggly account all of their user's unencrypted usernames and passwords!  Whoops.  We both recalled stories of similar requests by Splunk customers struggling with purging data from their installs - for credit card numbers!  Double whoops.</p>

<p>Incidents like these serve to illustrate a broader point which I completely missed at the time, but Raffy was quick to point out:  <strong>Our customer's customers had no idea they also needed to trust Loggly with their data.</strong>  Our customers assumed they could trust <em>Loggly</em> to do the right thing with that data  because they were doing business with us, regardless of our intent or coding abilities.  Further, the implied trust chain also required all those people also trust Amazon, because Loggly used the EC2 APIs to start and run our instances.</p>

<p><img alt="" src="https://gist.github.com/kordless/6189696/raw/82ba1ba431ee4f57cc2f99376704610d09dcf1c2/dog.jpg"></p>

<p>The fact is, if I use a proprietary service provider because I don't want to run the services myself, then there really is no way to know for certain they will act responsibly with my data.  I must implicitly trust them to do the right thing, in all cases. Unfortunately, you can't really trust a service built on closed technologies because you can't see <em>inside</em> the service. The combination of desired outcomes (easy infrastructure) and risk bias (implied trust) presents itself as a dangerous one because leads to <a href="https://en.wikipedia.org/wiki/Cognitive_dissonance">cognitive dissonance</a> - literally believing two things at once: I have to <em>TRUST</em> this service because I <em>NEED</em> this service.</p>

<p>I believe, in order to achieve real trust, we have to open everything. And by everything I mean EVERYTHING on the Internet in between my brain and yours. Working together to build that trust enables better outcomes for customers, ensures there’s a sustainable innovation ecosystem and makes technology progressively more accessible to a wider and wider community. </p>

<p>A trust based initiative is worth fighting for and one I’m focused on building in the coming years.  I trust you will join me!  :)</p>]]>
</content:encoded>
</item>

<item>
<title>Handling Subdomain Routes with AppEngine</title>
<link>http://www.stackgeek.com/blog/kordless/posts/handling-subdomain-routes-with-appengine</link>
<guid isPermaLink="true">http://www.stackgeek.com/blog/kordless/posts/handling-subdomain-routes-with-appengine</guid>
<pubDate>Tue, 19 Feb 2013 20:31:02 GMT</pubDate>
<description>Short post describing setting up custom routes in GAE-Boilerplate on AppEngine.</description>
<author>kordless@stackgeek.com</author>
<content:encoded>
	<![CDATA[<p>I've been using <a href="http://github.com/coto/gae-boilerplage">GAE-Boilerplate</a> for several projects including the code here on StackGeek.  <em>GAEB</em> uses <a href="http://webapp-improved.appspot.com/">webapp2</a> for it's application framework. Recently, while trying to solve a security concern with <a href="http://utter.io/">utter.io</a>, I went in search of a way to route subdomains to different handlers.</p>

<h2>Subdomain Handling</h2>

<p>Webapp2 provides a method called DomainRoute which takes a subdomain as an argument and uses it to match a set of routes you pass to it.  Here's a snippet of that in action:</p>

<pre><code>routes = [
    # handle specific subdomain/hostname
    DomainRoute(config.subdomain_hostname, [
        Route('/', handler='handlers.PageHandler:subdomain', name='pages-subdomain'),
    ]),

    # handle other hostnames and domains
    Route('/', handler='handlers.PageHandler:root', name='pages-root'),
]
</code></pre>

<h2>Try It Out</h2>

<p>You can clone my <a href="https://github.com/kordless/webapp2-starter">example repo</a> and add it to AppEngine Launcher to test the code.  Check out the code locally by doing the following:</p>

<pre><code>git clone git://github.com/kordless/webapp2-starter.git
</code></pre>

<p>You'll also need to modify your local <em>hosts</em> file for testing.  Add the following to the bottom of your <em>/etc/hosts</em> file:</p>

<pre><code>sublocalhost 127.0.0.1
</code></pre>

<p>Add the new project by going to File..Add Existing Application and browsing to the directory where you checked it out.  Be sure to set the port to 8282 if you want to use the links I provide below.</p>

<p><img alt="screenshots" src="https://gist.github.com/kordless/4989648/raw/d4fd38fb7d5ddc06211ac6e2f6cb4c5904acec6b/launcher.png"></p>

<p>Click on <em>add</em>.  Click on the <em>run</em> button to start the app.  You should now be able to hit the following urls:</p>

<ul>
<li><a href="http://localhost:8282">http://localhost:8282</a></li>
<li><a href="http://sublocalhost:8282">http://sublocalhost:8282</a></li>
</ul>

<p>Notice you get different results for the two pages.</p>

<h2>Production Configuration</h2>

<p>For this to work in production on AppEngine, you'll need to add the full subdomain+domain to Google Apps.  In the screenshot below, I've added a subdomain <em>oi.utter.io</em> to the <em>utter.io</em> domain I configured the first time through domain setup for my AppEngine project.</p>

<p><img alt="google_apps" src="https://gist.github.com/kordless/4989648/raw/ffe76cafc2c7b1f9ee9f5dbef0915a6376e81d89/googleapps.png"></p>

<p>Now I'm in production, my config file looks like this:</p>

<pre><code># config file
if os.environ['SERVER_SOFTWARE'].startswith('Dev'):
    subdomain_hostname = 'sublocalhost'
else:
    subdomain_hostname = 'oi.utter.io'
</code></pre>

<p>With this technique I've been able to keep the code in a single repository, deployed to a single AppEngine project, yet serve two distinct subdomains.  Very handy!</p>]]>
</content:encoded>
</item>

<item>
<title>NetappNFSdriver in Folsom</title>
<link>http://www.stackgeek.com/blog/kmadac/posts/netappnfsdriver-in-folsom</link>
<guid isPermaLink="true">http://www.stackgeek.com/blog/kmadac/posts/netappnfsdriver-in-folsom</guid>
<pubDate>Sun, 17 Feb 2013 11:40:44 GMT</pubDate>
<description>Article about using and configuration of NetappNFSdriver in Cinder in OpenStack Folsom</description>
<author>kamil.madac@gmail.com</author>
<content:encoded>
	<![CDATA[<p>This article describes configuring a Netapp storage device for use with Openstack's Cinder service.  It uses the NFS protocol via a NFS driver from Netapp, which allows for storing Cinder volume snapshots directly on a NetApp storage unit.</p>

<p>There is very little documentation available describing this process.  This configuration was put together by studying the source code for the driver!</p>

<p>For this guide, OpenStack Folsom was installed on Ubuntu Server 12.04 using the Ubuntu Cloud Archive Repositories from http://ubuntu-cloud.archive.canonical.com/ubuntu.</p>

<p>The OpenStack configuration files are complex, and the configuration process for adding a NetApp box has a few caveats which are described here.</p>

<h2>Configuration Files</h2>

<p>All configuration is done in <em>/etc/cinder</em> directory.</p>

<h3>/etc/cinder/cinder.conf</h3>

<p>These are options which needs to be added to <em>cinder.conf</em> for the NetappNFS driver to work correctly:</p>

<pre><code># Make sure that you don't use nova.volume.netapp_nfs.NetAppNFSDriver
volume_driver=cinder.volume.netapp_nfs.NetAppNFSDriver

# Where the file with shares is located
nfs_shares_config=/etc/cinder/shares.conf

# Where to mount volumes
nfs_mount_point_base=/mnt/cinder-volumes

# Driver sends command to create clones and snapshots via DFM, 
# so we need to configure, it
netapp_wsdl_url=http://172.21.1.22/dfm.wsdl

netapp_login=dfmlogin
netapp_password=dfmpassword

netapp_server_hostname=172.21.1.21

# I'm not sure whether it is necessary to define
# netapp_storage_service
netapp_storage_service=Test-Cloud
</code></pre>

<h3>/etc/cinder/shares.conf</h3>

<p>This file includes Netapp volume/qtree paths on filer which will be mounted to control-node and used for cinder volume creation. Add one path per line in following format:</p>

<pre><code>filername:/vol/CINDER_VOLUMES
</code></pre>

<p>Also, there are two things to consider when editing:</p>

<ul>
<li>Assure that there is no empty line in the file, because cinder is dumb and will try to mount empty path, which ends up with error.</li>
<li>It is necessary to use hostnames of filers instead of IP addresses. These hostnames has to be same as hostnames of filers in DFM (OnCommand).</li>
</ul>

<p>Double check you use the correct hostname for the filers if you get a snapshot creation fail:</p>

<pre><code>2012-12-12 13:21:03 16643 TRACE cinder.openstack.common.rpc.amqp WebFault: Server raised fault: '(22255:EOBJECTNOTFOUND) There is no host, aggregate, volume, qtree, resource group, resource pool, or dataset named 192.168.0.2.'
</code></pre>

<h3>/etc/cinder/rootwrap.d/volume.filters</h3>

<p>Append following lines to the end of this file:</p>

<pre><code>stat: CommandFilter, /usr/bin/stat, root
mount: CommandFilter, /bin/mount, root
df: CommandFilter, /bin/df, root
truncate: CommandFilter, /usr/bin/truncate, root
chmod: CommandFilter, /bin/chmod, root
rm: CommandFilter, /bin/rm, root
</code></pre>

<h3>/etc/cinder/api-paste.ini</h3>

<p>The <em>[filter:authtoken]</em> section has to be configured as it is described in <a href="http://docs.openstack.org/trunk/openstack-compute/install/apt/content/osfolubuntu-cinder.html">cinder installation guide</a>.</p>

<p>After all that configuration you can restart cinder services:</p>

<pre><code>$ sudo service cinder-volume restart 
$ sudo service cinder-api restart 
$ sudo service cinder-scheduler restart
</code></pre>

<p>Now you can try to create volume from CLI:</p>

<pre><code>$ cinder create --display_name test 1
</code></pre>

<p>or via Dashboard/Horizon:</p>

<h2>Bugs Encountered</h2>

<p>I patched the file nova/virt/libvirt/driver.py and added the NfsDriver to the list of drivers.  There is more info on that process <a href="https://bugs.launchpad.net/nova/+bug/1087252">here</a>.</p>

<h2>Blueprint of NetappNFSDriver</h2>

<p>The blueprints for the driver are here: https://blueprints.launchpad.net/cinder/+spec/netapp-nfs-cinder-driver</p>]]>
</content:encoded>
</item>

<item>
<title>OpenStack Folsom Install guide</title>
<link>http://www.stackgeek.com/blog/bilelmsekni/guides/openstack-folsom-install-guide</link>
<guid isPermaLink="true">http://www.stackgeek.com/blog/bilelmsekni/guides/openstack-folsom-install-guide</guid>
<pubDate>Sun, 03 Feb 2013 12:40:41 GMT</pubDate>
<description>OpenStack Folsom Install Guide is an easy and tested way to create your own OpenStack plateform.</description>
<author>bilel.msekni@telecom-sudparis.eu</author>
<content:encoded>
	<![CDATA[<div class="document">
<div class="section" id="authors">
<h1>Authors</h1>
<p>Copyright (C) Bilel Msekni &lt;<a href="mailto:bilel.msekni@telecom-sudparis.eu">bilel.msekni@telecom-sudparis.eu</a>&gt;</p>
</div>
<div class="section" id="contributors">
<h1>Contributors</h1>
<table class="table table-striped table-bordered">
<colgroup>
<col width="48%">
<col width="52%">
</colgroup>
<tbody>
<tr><td>Roy Sowa &lt;<a href="mailto:Roy.Sowa@ssc-spc.gc.ca">Roy.Sowa@ssc-spc.gc.ca</a>&gt;</td>
<td>Stephen gran &lt;<a href="mailto:stephen.gran@guardian.co.uk">stephen.gran@guardian.co.uk</a>&gt;</td>
</tr>
<tr><td>Dennis E Miyoshi &lt;<a href="mailto:dennis.miyoshi@hp.com">dennis.miyoshi@hp.com</a>&gt;</td>
<td>Marco Consonni &lt;<a href="mailto:marco_consonni@hp.com">marco_consonni@hp.com</a>&gt;</td>
</tr>
<tr><td>Houssem Medhioub &lt;<a href="mailto:houssem.medhioub@it-sudparis.eu">houssem.medhioub@it-sudparis.eu</a>&gt;</td>
<td>Djamal Zeghlache &lt;<a href="mailto:djamal.zeghlache@telecom-sudparis.eu">djamal.zeghlache@telecom-sudparis.eu</a>&gt;</td>
</tr>
</tbody>
</table>
<p>Wana contribute ? Read the guide, send your contribution and get your name listed ;)</p>
</div>
<div class="section" id="table-of-contents">
<h1>Table of Contents</h1>
<pre class="literal-block">0. What is it?
1. Requirements
2. Controller Node
3. Network Node
4. Compute Node
5. Start your first VM
6. Licencing
7. Contacts
8. Acknowledgement
9. Credits
10. To do
</pre>
</div>
<div class="section" id="what-is-it">
<h1>0. What is it?</h1>
<p>OpenStack Folsom Install Guide is an easy and tested way to create your own OpenStack platform.</p>
<p>Version 3.0</p>
<p>Status: stable</p>
</div>
<div class="section" id="requirements">
<h1>1. Requirements</h1>
<table class="table table-striped table-bordered field-list">
<colgroup><col class="field-name">
<col class="field-body">
</colgroup><tbody>
<tr><th>Node Role:</th><td>NICs</td>
</tr>
<tr><th>Control Node:</th><td>eth0 (100.10.10.51), eth1 (192.168.100.51)</td>
</tr>
<tr><th>Network Node:</th><td>eth0 (100.10.10.52), eth1 (100.20.20.52), eth2 (192.168.100.52)</td>
</tr>
<tr><th>Compute Node:</th><td>eth0 (100.10.10.53), eth1 (100.20.20.53)</td>
</tr>
</tbody>
</table>
<p><strong>Note 1:</strong> If you don't have 2 NICs on controller node, you can check other branches for 2 NIC installation.</p>
<p><strong>Note 2:</strong> Compute and Controller nodes can be merged into one node.</p>
<p><strong>Note 3:</strong> If you are not interrested in Quantum, you can also use this guide but you must follow the nova section found <a href="https://github.com/mseknibilel/OpenStack-Folsom-Install-guide/blob/master/Tricks%26Ideas/install_nova-network.rst">here</a> instead of the one written in this guide.</p>
<p><strong>Note 4:</strong> This is my current network architecture, you can add as many compute node as you wish.</p>
<img alt="http://i.imgur.com/aJvZ7.jpg" src="http://i.imgur.com/aJvZ7.jpg">
</div>
<div class="section" id="controller-node">
<h1>2. Controller node</h1>
<div class="section" id="preparing-ubuntu-12-10">
<h2>2.1. Preparing Ubuntu 12.10</h2>
<ul>
<li><p>After you install Ubuntu 12.10 Server 64bits, Go to the sudo mode and don't leave it until the end of this guide:</p>
<pre class="literal-block">sudo su
</pre>
</li>
<li><p>Update your system:</p>
<pre class="literal-block">apt-get update
apt-get upgrade
apt-get dist-upgrade
</pre>
</li>
</ul>
</div>
<div class="section" id="networking">
<h2>2.2.Networking</h2>
<ul>
<li><p>Only one NIC on the controller node need internet access:</p>
<pre class="literal-block">#For Exposing OpenStack API over the internet
auto eth1
iface eth1 inet static
address 192.168.100.51
netmask 255.255.255.0
gateway 192.168.100.1
dns-nameservers 8.8.8.8

#Not internet connected(used for OpenStack management)
auto eth0
iface eth0 inet static
address 100.10.10.51
netmask 255.255.255.0
</pre>
</li>
</ul>
</div>
<div class="section" id="mysql-rabbitmq">
<h2>2.3. MySQL &amp; RabbitMQ</h2>
<ul>
<li><p>Install MySQL:</p>
<pre class="literal-block">apt-get install mysql-server python-mysqldb
</pre>
</li>
<li><p>Configure mysql to accept all incoming requests:</p>
<pre class="literal-block">sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf
service mysql restart
</pre>
</li>
<li><p>Install RabbitMQ:</p>
<pre class="literal-block">apt-get install rabbitmq-server
</pre>
</li>
</ul>
</div>
<div class="section" id="node-synchronization">
<h2>2.4. Node synchronization</h2>
<ul>
<li><p>Install other services:</p>
<pre class="literal-block">apt-get install ntp
</pre>
</li>
<li><p>Configure the NTP server to synchronize between your compute nodes and the controller node:</p>
<pre class="literal-block">sed -i 's/server ntp.ubuntu.com/server ntp.ubuntu.com\nserver 127.127.1.0\nfudge 127.127.1.0 stratum 10/g' /etc/ntp.conf
service ntp restart
</pre>
</li>
</ul>
</div>
<div class="section" id="others">
<h2>2.5. Others</h2>
<ul>
<li><p>Install other services:</p>
<pre class="literal-block">apt-get install vlan bridge-utils
</pre>
</li>
<li><p>Enable IP_Forwarding:</p>
<pre class="literal-block">sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
# To save you from rebooting, perform the following
sysctl net.ipv4.ip_forward=1
</pre>
</li>
</ul>
</div>
<div class="section" id="keystone">
<h2>2.6. Keystone</h2>
<ul>
<li><p>Start by the keystone packages:</p>
<pre class="literal-block">apt-get install keystone
</pre>
</li>
<li><p>Create a new MySQL database for keystone:</p>
<pre class="literal-block">mysql -u root -p
CREATE DATABASE keystone;
GRANT ALL ON keystone.* TO 'keystoneUser'@'%' IDENTIFIED BY 'keystonePass';
quit;
</pre>
</li>
<li><p>Adapt the connection attribute in the /etc/keystone/keystone.conf to the new database:</p>
<pre class="literal-block">connection = mysql://keystoneUser:keystonePass@100.10.10.51/keystone
</pre>
</li>
<li><p>Restart the identity service then synchronize the database:</p>
<pre class="literal-block">service keystone restart
keystone-manage db_sync
</pre>
</li>
<li><p>Fill up the keystone database using the two scripts available in the <a href="https://github.com/mseknibilel/OpenStack-Folsom-Install-guide/tree/master/Keystone_Scripts">Scripts folder</a> of this git repository. Beware that you MUST comment every part related to Quantum if you don't intend to install it otherwise you will have trouble with your dashboard later:</p>
<pre class="literal-block">#Modify the HOST_IP and HOST_IP_EXT variables before executing the scripts

chmod +x keystone_basic.sh
chmod +x keystone_endpoints_basic.sh

./keystone_basic.sh
./keystone_endpoints_basic.sh
</pre>
</li>
<li><p>Create a simple credential file and load it so you won't be bothered later:</p>
<pre class="literal-block">nano creds
#Paste the following:
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/"
# Load it:
source creds
</pre>
</li>
<li><p>To test Keystone, we use a simple curl request:</p>
<pre class="literal-block">apt-get install curl openssl
curl http://192.168.100.51:35357/v2.0/endpoints -H 'x-auth-token: ADMIN'
</pre>
</li>
</ul>
</div>
<div class="section" id="glance">
<h2>2.7. Glance</h2>
<ul>
<li><p>After installing Keystone, we continue with installing image storage service a.k.a Glance:</p>
<pre class="literal-block">apt-get install glance
</pre>
</li>
<li><p>Create a new MySQL database for Glance:</p>
<pre class="literal-block">mysql -u root -p
CREATE DATABASE glance;
GRANT ALL ON glance.* TO 'glanceUser'@'%' IDENTIFIED BY 'glancePass';
quit;
</pre>
</li>
<li><p>Update /etc/glance/glance-api-paste.ini with:</p>
<pre class="literal-block">[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
auth_host = 100.10.10.51
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = glance
admin_password = service_pass
</pre>
</li>
<li><p>Update the /etc/glance/glance-registry-paste.ini with:</p>
<pre class="literal-block">[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
auth_host = 100.10.10.51
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = glance
admin_password = service_pass
</pre>
</li>
<li><p>Update /etc/glance/glance-api.conf with:</p>
<pre class="literal-block">sql_connection = mysql://glanceUser:glancePass@100.10.10.51/glance
</pre>
</li>
<li><p>And:</p>
<pre class="literal-block">[paste_deploy]
flavor = keystone
</pre>
</li>
<li><p>Update the /etc/glance/glance-registry.conf with:</p>
<pre class="literal-block">sql_connection = mysql://glanceUser:glancePass@100.10.10.51/glance
</pre>
</li>
<li><p>And:</p>
<pre class="literal-block">[paste_deploy]
flavor = keystone
</pre>
</li>
<li><p>Restart the glance-api and glance-registry services:</p>
<pre class="literal-block">service glance-api restart; service glance-registry restart
</pre>
</li>
<li><p>Synchronize the glance database:</p>
<pre class="literal-block">glance-manage db_sync
</pre>
</li>
<li><p>Restart the services again to take into account the new modifications:</p>
<pre class="literal-block">service glance-registry restart; service glance-api restart
</pre>
</li>
<li><p>To test Glance's well installation, we upload a new image to the store. Start by downloading the cirros cloud image to your node and then uploading it to Glance:</p>
<pre class="literal-block">mkdir images
cd images
wget https://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-x86_64-disk.img
glance image-create --name myFirstImage --is-public true --container-format bare --disk-format qcow2 &lt; cirros-0.3.0-x86_64-disk.img
</pre>
</li>
<li><p>Now list the images to see what you have just uploaded:</p>
<pre class="literal-block">glance image-list
</pre>
</li>
</ul>
</div>
<div class="section" id="quantum">
<h2>2.8. Quantum</h2>
<ul>
<li><p>Install the Quantum server:</p>
<pre class="literal-block">apt-get install quantum-server quantum-plugin-openvswitch
</pre>
</li>
<li><p>Create a database:</p>
<pre class="literal-block">mysql -u root -p
CREATE DATABASE quantum;
GRANT ALL ON quantum.* TO 'quantumUser'@'%' IDENTIFIED BY 'quantumPass';
quit;
</pre>
</li>
<li><p>Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini with:</p>
<pre class="literal-block">#Under the database section
[DATABASE]
sql_connection = mysql://quantumUser:quantumPass@100.10.10.51/quantum

#Under the OVS section
[OVS]
tenant_network_type=vlan
network_vlan_ranges = physnet1:1:4094
</pre>
</li>
<li><p>Edit /etc/quantum/api-paste.ini</p>
<pre class="literal-block">[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
auth_host = 100.10.10.51
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = quantum
admin_password = service_pass
</pre>
</li>
<li><p>Restart the quantum server:</p>
<pre class="literal-block">service quantum-server restart
</pre>
</li>
</ul>
</div>
<div class="section" id="nova">
<h2>2.9. Nova</h2>
<ul>
<li><p>Start by installing nova components:</p>
<pre class="literal-block">apt-get install -y nova-api nova-cert novnc nova-consoleauth nova-scheduler nova-novncproxy
</pre>
</li>
<li><p>Prepare a Mysql database for Nova:</p>
<pre class="literal-block">mysql -u root -p
CREATE DATABASE nova;
GRANT ALL ON nova.* TO 'novaUser'@'%' IDENTIFIED BY 'novaPass';
quit;
</pre>
</li>
<li><p>Now modify authtoken section in the /etc/nova/api-paste.ini file to this:</p>
<pre class="literal-block">[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
auth_host = 100.10.10.51
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = nova
admin_password = service_pass
signing_dirname = /tmp/keystone-signing-nova
</pre>
</li>
<li><p>Modify the /etc/nova/nova.conf like this:</p>
<pre class="literal-block">[DEFAULT]
logdir=/var/log/nova
state_path=/var/lib/nova
lock_path=/run/lock/nova
verbose=True
api_paste_config=/etc/nova/api-paste.ini
scheduler_driver=nova.scheduler.simple.SimpleScheduler
s3_host=100.10.10.51
ec2_host=100.10.10.51
ec2_dmz_host=100.10.10.51
rabbit_host=100.10.10.51
cc_host=100.10.10.51
dmz_cidr=169.254.169.254/32
metadata_host=100.10.10.51
metadata_listen=0.0.0.0
nova_url=http://100.10.10.51:8774/v1.1/
sql_connection=mysql://novaUser:novaPass@100.10.10.51/nova
ec2_url=http://100.10.10.51:8773/services/Cloud
root_helper=sudo nova-rootwrap /etc/nova/rootwrap.conf

# Auth
auth_strategy=keystone
keystone_ec2_url=http://100.10.10.51:5000/v2.0/ec2tokens
# Imaging service
glance_api_servers=100.10.10.51:9292
image_service=nova.image.glance.GlanceImageService

# Vnc configuration
vnc_enabled=true
novncproxy_base_url=http://192.168.100.51:6080/vnc_auto.html
novncproxy_port=6080
vncserver_proxyclient_address=192.168.100.51
vncserver_listen=0.0.0.0

# Network settings
network_api_class=nova.network.quantumv2.api.API
quantum_url=http://100.10.10.51:9696
quantum_auth_strategy=keystone
quantum_admin_tenant_name=service
quantum_admin_username=quantum
quantum_admin_password=service_pass
quantum_admin_auth_url=http://100.10.10.51:35357/v2.0
libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver
linuxnet_interface_driver=nova.network.linux_net.LinuxOVSInterfaceDriver
firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver

# Compute #
compute_driver=libvirt.LibvirtDriver

# Cinder #
volume_api_class=nova.volume.cinder.API
osapi_volume_listen_port=5900
</pre>
</li>
<li><p>Synchronize your database:</p>
<pre class="literal-block">nova-manage db sync
</pre>
</li>
<li><p>Restart nova-* services:</p>
<pre class="literal-block">cd /etc/init.d/; for i in $( ls nova-* ); do sudo service $i restart; done
</pre>
</li>
<li><p>Check for the smiling faces on nova-* services to confirm your installation:</p>
<pre class="literal-block">nova-manage service list
</pre>
</li>
</ul>
</div>
<div class="section" id="cinder">
<h2>2.10. Cinder</h2>
<ul>
<li><p>Install the required packages:</p>
<pre class="literal-block">apt-get install cinder-api cinder-scheduler cinder-volume iscsitarget open-iscsi iscsitarget-dkms
</pre>
</li>
<li><p>Configure the iscsi services:</p>
<pre class="literal-block">sed -i 's/false/true/g' /etc/default/iscsitarget
</pre>
</li>
<li><p>Restart the services:</p>
<pre class="literal-block">service iscsitarget start
service open-iscsi start
</pre>
</li>
<li><p>Prepare a Mysql database for Cinder:</p>
<pre class="literal-block">mysql -u root -p
CREATE DATABASE cinder;
GRANT ALL ON cinder.* TO 'cinderUser'@'%' IDENTIFIED BY 'cinderPass';
quit;
</pre>
</li>
<li><p>Configure /etc/cinder/api-paste.ini like the following:</p>
<pre class="literal-block">[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
service_protocol = http
service_host = 192.168.100.51
service_port = 5000
auth_host = 100.10.10.51
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = cinder
admin_password = service_pass
</pre>
</li>
<li><p>Edit the /etc/cinder/cinder.conf to:</p>
<pre class="literal-block">[DEFAULT]
rootwrap_config=/etc/cinder/rootwrap.conf
sql_connection = mysql://cinderUser:cinderPass@100.10.10.51/cinder
api_paste_confg = /etc/cinder/api-paste.ini
iscsi_helper=ietadm
volume_name_template = volume-%s
volume_group = cinder-volumes
verbose = True
auth_strategy = keystone
#osapi_volume_listen_port=5900
</pre>
</li>
<li><p>Then, synchronize your database:</p>
<pre class="literal-block">cinder-manage db sync
</pre>
</li>
<li><p>Finally, don't forget to create a volumegroup and name it cinder-volumes:</p>
<pre class="literal-block">dd if=/dev/zero of=cinder-volumes bs=1 count=0 seek=2G
losetup /dev/loop2 cinder-volumes
fdisk /dev/loop2
#Type in the followings:
n
p
1
ENTER
ENTER
t
8e
w
</pre>
</li>
<li><p>Proceed to create the physical volume then the volume group:</p>
<pre class="literal-block">pvcreate /dev/loop2
vgcreate cinder-volumes /dev/loop2
</pre>
</li>
</ul>
<p><strong>Note:</strong> Beware that this volume group gets lost after a system reboot. (Click <a href="https://github.com/mseknibilel/OpenStack-Folsom-Install-guide/blob/master/Tricks%26Ideas/load_volume_group_after_system_reboot.rst">Here</a> to know how to load it after a reboot)</p>
<ul>
<li><p>Restart the cinder services:</p>
<pre class="literal-block">service cinder-volume restart
service cinder-api restart
</pre>
</li>
</ul>
</div>
<div class="section" id="horizon">
<h2>2.11. Horizon</h2>
<ul>
<li><p>To install horizon, proceed like this</p>
<pre class="literal-block">apt-get install openstack-dashboard memcached
</pre>
</li>
<li><p>If you don't like the OpenStack ubuntu theme, you can disabled it and go back to the default look:</p>
<pre class="literal-block">nano /etc/openstack-dashboard/local_settings.py
#Comment these lines
#Enable the Ubuntu theme if it is present.
#try:
#    from ubuntu_theme import *
#except ImportError:
#    pass
</pre>
</li>
<li><p>Reload Apache and memcached:</p>
<pre class="literal-block">service apache2 restart; service memcached restart
</pre>
</li>
</ul>
<p>You can now access your OpenStack <strong>192.168.100.51/horizon</strong> with credentials <strong>admin:admin_pass</strong>.</p>
<p><strong>Note:</strong> A reboot might be needed for a successful login</p>
</div>
</div>
<div class="section" id="network-node">
<h1>3. Network Node</h1>
<div class="section" id="preparing-the-node">
<h2>3.1. Preparing the Node</h2>
<ul>
<li><p>Update your system:</p>
<pre class="literal-block">apt-get update
apt-get upgrade
apt-get dist-upgrade
</pre>
</li>
<li><p>Install ntp service:</p>
<pre class="literal-block">apt-get install ntp
</pre>
</li>
<li><p>Configure the NTP server to follow the controller node:</p>
<pre class="literal-block">sed -i 's/server ntp.ubuntu.com/server 100.10.10.51/g' /etc/ntp.conf
service ntp restart
</pre>
</li>
<li><p>Install other services:</p>
<pre class="literal-block">apt-get install vlan bridge-utils
</pre>
</li>
<li><p>Enable IP_Forwarding:</p>
<pre class="literal-block">sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
# To save you from rebooting, perform the following
sysctl net.ipv4.ip_forward=1
</pre>
</li>
</ul>
</div>
<div class="section" id="id2">
<h2>3.2.Networking</h2>
<ul>
<li><p>3 NICs must be present:</p>
<pre class="literal-block"># VM internet Access
auto eth2
iface eth2 inet static
address 192.168.100.52
netmask 255.255.255.0
gateway 192.168.100.1
dns-nameservers 8.8.8.8

# OpenStack management
auto eth0
iface eth0 inet static
address 100.10.10.52
netmask 255.255.255.0

# VM Configuration
auto eth1
iface eth1 inet static
address 100.20.20.52
netmask 255.255.255.0
</pre>
</li>
</ul>
</div>
<div class="section" id="openvswitch">
<h2>3.4. OpenVSwitch</h2>
<ul>
<li><p>Install the openVSwitch:</p>
<pre class="literal-block">apt-get install -y openvswitch-switch openvswitch-datapath-dkms
</pre>
</li>
<li><p>Create the bridges:</p>
<pre class="literal-block">#br-int will be used for VM integration
ovs-vsctl add-br br-int

#br-eth1 will be used for VM configuration
ovs-vsctl add-br br-eth1
ovs-vsctl add-port br-eth1 eth1

#br-ex is used to make to VM accessible from the internet
ovs-vsctl add-br br-ex
ovs-vsctl add-port br-ex eth2
</pre>
</li>
</ul>
</div>
<div class="section" id="id3">
<h2>3.5. Quantum</h2>
<ul>
<li><p>Install the Quantum openvswitch agent, l3 agent and dhcp agent:</p>
<pre class="literal-block">apt-get -y install quantum-plugin-openvswitch-agent quantum-dhcp-agent quantum-l3-agent
</pre>
</li>
<li><p>Edit /etc/quantum/api-paste.ini:</p>
<pre class="literal-block">[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
auth_host = 100.10.10.51
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = quantum
admin_password = service_pass
</pre>
</li>
<li><p>Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini with:</p>
<pre class="literal-block">#Under the database section
[DATABASE]
sql_connection = mysql://quantumUser:quantumPass@100.10.10.51/quantum

#Under the OVS section
[OVS]
tenant_network_type=vlan
network_vlan_ranges = physnet1:1:4094
bridge_mappings = physnet1:br-eth1
</pre>
</li>
<li><p>In addition, update the /etc/quantum/l3_agent.ini:</p>
<pre class="literal-block">auth_url = http://100.10.10.51:35357/v2.0
auth_region = RegionOne
admin_tenant_name = service
admin_user = quantum
admin_password = service_pass
metadata_ip = 192.168.100.51
metadata_port = 8775
</pre>
</li>
<li><p>Make sure that your rabbitMQ IP in /etc/quantum/quantum.conf is set to the controller node:</p>
<pre class="literal-block">rabbit_host = 100.10.10.51
</pre>
</li>
<li><p>Restart all the services:</p>
<pre class="literal-block">service quantum-plugin-openvswitch-agent restart
service quantum-dhcp-agent restart
service quantum-l3-agent restart
</pre>
</li>
</ul>
</div>
</div>
<div class="section" id="compute-node">
<h1>4. Compute Node</h1>
<div class="section" id="id4">
<h2>4.1. Preparing the Node</h2>
<ul>
<li><p>Update your system:</p>
<pre class="literal-block">apt-get update
apt-get upgrade
apt-get dist-upgrade
</pre>
</li>
<li><p>Install ntp service:</p>
<pre class="literal-block">apt-get install ntp
</pre>
</li>
<li><p>Configure the NTP server to follow the controller node:</p>
<pre class="literal-block">sed -i 's/server ntp.ubuntu.com/server 100.10.10.51/g' /etc/ntp.conf
service ntp restart
</pre>
</li>
<li><p>Install other services:</p>
<pre class="literal-block">apt-get install vlan bridge-utils
</pre>
</li>
<li><p>Enable IP_Forwarding:</p>
<pre class="literal-block">sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
# To save you from rebooting, perform the following
sysctl net.ipv4.ip_forward=1
</pre>
</li>
</ul>
</div>
<div class="section" id="id5">
<h2>4.2.Networking</h2>
<ul>
<li><p>Perform the following:</p>
<pre class="literal-block"># OpenStack management
auto eth0
iface eth0 inet static
address 100.10.10.53
netmask 255.255.255.0

# VM Configuration
auto eth1
iface eth1 inet static
address 100.20.20.53
netmask 255.255.255.0
</pre>
</li>
</ul>
</div>
<div class="section" id="kvm">
<h2>4.3 KVM</h2>
<ul>
<li><p>make sure that your hardware enables virtualization:</p>
<pre class="literal-block">apt-get install cpu-checker
kvm-ok
</pre>
</li>
<li><p>Normally you would get a good response. Now, move to install kvm and configure it:</p>
<pre class="literal-block">apt-get install -y kvm libvirt-bin pm-utils
</pre>
</li>
<li><p>Edit the cgroup_device_acl array in the /etc/libvirt/qemu.conf file to:</p>
<pre class="literal-block">cgroup_device_acl = [
"/dev/null", "/dev/full", "/dev/zero",
"/dev/random", "/dev/urandom",
"/dev/ptmx", "/dev/kvm", "/dev/kqemu",
"/dev/rtc", "/dev/hpet","/dev/net/tun"
]
</pre>
</li>
<li><p>Delete default virtual bridge</p>
<pre class="literal-block">virsh net-destroy default
virsh net-undefine default
</pre>
</li>
<li><p>Enable live migration by updating /etc/libvirt/libvirtd.conf file:</p>
<pre class="literal-block">listen_tls = 0
listen_tcp = 1
auth_tcp = "none"
</pre>
</li>
<li><p>Edit libvirtd_opts variable in /etc/init/libvirt-bin.conf file:</p>
<pre class="literal-block">env libvirtd_opts="-d -l"
</pre>
</li>
<li><p>Edit /etc/default/libvirt-bin file</p>
<pre class="literal-block">libvirtd_opts="-d -l"
</pre>
</li>
<li><p>Restart the libvirt service to load the new values:</p>
<pre class="literal-block">service libvirt-bin restart
</pre>
</li>
</ul>
</div>
<div class="section" id="id6">
<h2>4.4. OpenVSwitch</h2>
<ul>
<li><p>Install the openVSwitch:</p>
<pre class="literal-block">apt-get install -y openvswitch-switch openvswitch-datapath-dkms
</pre>
</li>
<li><p>Create the bridges:</p>
<pre class="literal-block">#br-int will be used for VM integration
ovs-vsctl add-br br-int

#br-eth1 will be used for VM configuration
ovs-vsctl add-br br-eth1
ovs-vsctl add-port br-eth1 eth1
</pre>
</li>
</ul>
</div>
<div class="section" id="id7">
<h2>4.5. Quantum</h2>
<ul>
<li><p>Install the Quantum openvswitch agent:</p>
<pre class="literal-block">apt-get -y install quantum-plugin-openvswitch-agent
</pre>
</li>
<li><p>Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini with:</p>
<pre class="literal-block">#Under the database section
[DATABASE]
sql_connection = mysql://quantumUser:quantumPass@100.10.10.51/quantum

#Under the OVS section
[OVS]
tenant_network_type=vlan
network_vlan_ranges = physnet1:1:4094
bridge_mappings = physnet1:br-eth1
</pre>
</li>
<li><p>Make sure that your rabbitMQ IP in /etc/quantum/quantum.conf is set to the controller node:</p>
<pre class="literal-block">rabbit_host = 100.10.10.51
</pre>
</li>
<li><p>Restart all the services:</p>
<pre class="literal-block">service quantum-plugin-openvswitch-agent restart
</pre>
</li>
</ul>
</div>
<div class="section" id="id8">
<h2>4.6. Nova</h2>
<ul>
<li><p>Install nova's required components for the compute node:</p>
<pre class="literal-block">apt-get install nova-compute-kvm
</pre>
</li>
<li><p>Now modify authtoken section in the /etc/nova/api-paste.ini file to this:</p>
<pre class="literal-block">[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
auth_host = 100.10.10.51
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = nova
admin_password = service_pass
signing_dirname = /tmp/keystone-signing-nova
</pre>
</li>
<li><p>Edit /etc/nova/nova-compute.conf file</p>
<pre class="literal-block">[DEFAULT]
libvirt_type=kvm
libvirt_ovs_bridge=br-int
libvirt_vif_type=ethernet
libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver
libvirt_use_virtio_for_bridges=True
</pre>
</li>
<li><p>Modify the /etc/nova/nova.conf like this:</p>
<pre class="literal-block">[DEFAULT]
logdir=/var/log/nova
state_path=/var/lib/nova
lock_path=/run/lock/nova
verbose=True
api_paste_config=/etc/nova/api-paste.ini
scheduler_driver=nova.scheduler.simple.SimpleScheduler
s3_host=100.10.10.51
ec2_host=100.10.10.51
ec2_dmz_host=100.10.10.51
rabbit_host=100.10.10.51
cc_host=100.10.10.51
dmz_cidr=169.254.169.254/32
metadata_host=100.10.10.51
metadata_listen=0.0.0.0
nova_url=http://100.10.10.51:8774/v1.1/
sql_connection=mysql://novaUser:novaPass@100.10.10.51/nova
ec2_url=http://100.10.10.51:8773/services/Cloud
root_helper=sudo nova-rootwrap /etc/nova/rootwrap.conf

# Auth
use_deprecated_auth=false
auth_strategy=keystone
keystone_ec2_url=http://100.10.10.51:5000/v2.0/ec2tokens
# Imaging service
glance_api_servers=100.10.10.51:9292
image_service=nova.image.glance.GlanceImageService

# Vnc configuration
novnc_enabled=true
novncproxy_base_url=http://192.168.100.51:6080/vnc_auto.html
novncproxy_port=6080
vncserver_proxyclient_address=100.10.10.53
vncserver_listen=0.0.0.0

# Network settings
network_api_class=nova.network.quantumv2.api.API
quantum_url=http://100.10.10.51:9696
quantum_auth_strategy=keystone
quantum_admin_tenant_name=service
quantum_admin_username=quantum
quantum_admin_password=service_pass
quantum_admin_auth_url=http://100.10.10.51:35357/v2.0
libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver
linuxnet_interface_driver=nova.network.linux_net.LinuxOVSInterfaceDriver
firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver

# Compute #
compute_driver=libvirt.LibvirtDriver

# Cinder #
volume_api_class=nova.volume.cinder.API
osapi_volume_listen_port=5900
</pre>
</li>
<li><p>Restart nova-* services:</p>
<pre class="literal-block">cd /etc/init.d/; for i in $( ls nova-* ); do sudo service $i restart; done
</pre>
</li>
<li><p>Check for the smiling faces on nova-* services to confirm your installation:</p>
<pre class="literal-block">nova-manage service list
</pre>
</li>
</ul>
</div>
</div>
<div class="section" id="your-first-vm">
<h1>5. Your First VM</h1>
<p>To start your first VM, we first need to create a new tenant, user, internal and external network. SSH to your controller node and perform the following.</p>
<ul>
<li><p>Create a new tenant</p>
<pre class="literal-block">keystone tenant-create --name project_one
</pre>
</li>
<li><p>Create a new user and assign the member role to it in the new tenant (keystone role-list to get the appropriate id):</p>
<pre class="literal-block">keystone user-create --name=user_one --pass=user_one --tenant-id $put_id_of_project_one --email=user_one@domain.com
keystone user-role-add --tenant-id $put_id_of_project_one  --user-id $put_id_of_user_one --role-id $put_id_of_member_role
</pre>
</li>
<li><p>Create a new network for the tenant:</p>
<pre class="literal-block">quantum net-create --tenant-id $put_id_of_project_one net_proj_one --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 1024
</pre>
</li>
<li><p>Create a new subnet inside the new tenant network:</p>
<pre class="literal-block">quantum subnet-create --tenant-id $put_id_of_project_one net_proj_one 50.50.1.0/24
</pre>
</li>
<li><p>Create a router for the new tenant:</p>
<pre class="literal-block">quantum router-create --tenant-id $put_id_of_project_one router_proj_one
</pre>
</li>
<li><p>Add the router to the subnet:</p>
<pre class="literal-block">quantum router-interface-add $put_router_proj_one_id_here $put_subnet_id_here
</pre>
</li>
<li><p>Create your external network with the tenant id belonging to the service tenant (keystone tenant-list to get the appropriate id)</p>
<pre class="literal-block">quantum net-create --tenant-id $put_id_of_service_tenant ext_net --router:external=True
</pre>
</li>
<li><p>Create a subnet containing your floating IPs:</p>
<pre class="literal-block">quantum subnet-create --tenant-id $put_id_of_service_tenant --allocation-pool start=192.168.100.102,end=192.168.100.126 --gateway 192.168.100.1 ext_net 192.168.100.100/24 --enable_dhcp=False
</pre>
</li>
<li><p>Set the router for the external network:</p>
<pre class="literal-block">quantum router-gateway-set $put_router_proj_one_id_here $put_id_of_ext_net_here
</pre>
</li>
</ul>
<p>VMs gain access to the metadata server locally present in the controller node via the external network. To create that necessary connection perform the following:</p>
<ul>
<li><p>Get the IP address of router proj one:</p>
<pre class="literal-block">quantum port-list -- --device_id &lt;router_proj_one_id&gt; --device_owner network:router_gateway
</pre>
</li>
<li><p>Add the following route on controller node only:</p>
<pre class="literal-block">route add -net 50.50.1.0/24 gw $router_proj_one_IP
</pre>
</li>
</ul>
<p>Unfortunatly, you can't use the dashboard to assign floating IPs to VMs so you need to get your hands a bit dirty to give your VM a public IP.</p>
<ul>
<li><p>Start by allocating a floating ip to the project one tenant:</p>
<pre class="literal-block">quantum floatingip-create --tenant-id $put_id_of_project_one ext_net
</pre>
</li>
<li><p>pick the id of the port corresponding to your VM:</p>
<pre class="literal-block">quantum port-list
</pre>
</li>
<li><p>Associate the floating IP to your VM:</p>
<pre class="literal-block">quantum floatingip-associate $put_id_floating_ip $put_id_vm_port
</pre>
</li>
</ul>
<p><strong>This is it !</strong>, You can now ping you VM and start administrating you OpenStack !</p>
<p>I Hope you enjoyed this guide, please if you have any feedbacks, don't hesitate.</p>
</div>
<div class="section" id="licensing">
<h1>6. Licensing</h1>
<p>OpenStack Folsom Install Guide by Bilel Msekni is licensed under a Creative Commons Attribution 3.0 Unported License.</p>
<img alt="http://i.imgur.com/4XWrp.png" src="http://i.imgur.com/4XWrp.png">
<p>To view a copy of this license, visit [ <a href="http://creativecommons.org/licenses/by/3.0/deed.en_US">http://creativecommons.org/licenses/by/3.0/deed.en_US</a> ].</p>
</div>
<div class="section" id="contacts">
<h1>7. Contacts</h1>
<p>Bilel Msekni: <a href="mailto:bilel.msekni@telecom-sudparis.eu">bilel.msekni@telecom-sudparis.eu</a></p>
</div>
<div class="section" id="acknowledgment">
<h1>8. Acknowledgment</h1>
<p>This work has been supported by:</p>
<ul>
<li>CompatibleOne Project (French FUI project) [<a href="http://compatibleone.org/">http://compatibleone.org/</a>]</li>
<li>Easi-Clouds (ITEA2 project) [<a href="http://easi-clouds.eu/">http://easi-clouds.eu/</a>]</li>
</ul>
</div>
<div class="section" id="credits">
<h1>9. Credits</h1>
<p>This work has been based on:</p>
<ul>
<li>Emilien Macchi's Folsom guide [<a href="https://github.com/EmilienM/openstack-folsom-guide">https://github.com/EmilienM/openstack-folsom-guide</a>]</li>
<li>OpenStack Documentation [<a href="http://docs.openstack.org/trunk/openstack-compute/install/apt/content/">http://docs.openstack.org/trunk/openstack-compute/install/apt/content/</a>]</li>
<li>OpenStack Quantum Install [<a href="http://docs.openstack.org/trunk/openstack-network/admin/content/ch_install.html">http://docs.openstack.org/trunk/openstack-network/admin/content/ch_install.html</a>]</li>
</ul>
</div>
<div class="section" id="to-do">
<h1>10. To do</h1>
<p>This guide is just a startup. Your suggestions are always welcomed.</p>
<p>Some of this guide's needs might be:</p>
<ul>
<li>Define more Quantum configurations to cover all usecases possible see <a href="http://docs.openstack.org/trunk/openstack-network/admin/content/use_cases.html">here</a>.</li>
</ul>
</div>
</div>]]>
</content:encoded>
</item>

</channel>
</rss>