api-site/firstapp/source/getting_started.rst
Andreas Jaeger ad81291e4c [firstapp] Use https
Use https where possible for links.

Change-Id: I764d3cf2f135bbe10b5bc514c39e5b8808e52137
2017-01-27 10:49:35 +01:00

1811 lines
58 KiB
ReStructuredText

===============
Getting started
===============
Who should read this guide
~~~~~~~~~~~~~~~~~~~~~~~~~~
This guide is for experienced software developers who want to deploy
applications to OpenStack clouds.
If you are familiar with OpenStack but have not created a cloud
application in general or an OpenStack application in particular, this
section teaches you how to program with OpenStack components.
What you will learn
~~~~~~~~~~~~~~~~~~~
Deploying applications in a cloud environment can be very different
from deploying them in a traditional IT environment. This guide
teaches you how to deploy applications on OpenStack and some best
practices for cloud application development.
A general overview
~~~~~~~~~~~~~~~~~~
This tutorial shows two applications. The first application is a simple
fractal generator that uses mathematical equations to generate beautiful
`fractal images <http://en.wikipedia.org/wiki/Fractal>`_. We show you this
application in its entirety so that you can compare it to a second, more
robust, application.
The second application is an OpenStack application that enables you to:
* Create and delete compute resources. These resources are virtual
machine instances where the Fractals application runs.
* Make cloud-related architecture decisions such as turning
functions into micro-services and modularizing them.
* Scale available resources up and down.
* Use Object and Block storage for file and database persistence.
* Use Orchestration services to automatically adjust to the environment.
* Customize networking for better performance and segregation.
* Explore and apply advanced OpenStack cloud features.
Choose your OpenStack SDK
~~~~~~~~~~~~~~~~~~~~~~~~~
Anyone with a programming background can easily read the code in this guide.
Although this guide focuses on a particular SDK, you can use other languages
and toolkits with the OpenStack cloud:
.. list-table:: OpenStack SDKs
:header-rows: 1
:widths: 10, 10, 40, 40
* - Language
- Name
- Description
- URL
* - Python
- `Libcloud <https://libcloud.apache.org>`_
- A Python-based library that the Apache Foundation manages.
Use it to work with multiple cloud types.
- https://libcloud.readthedocs.org/en/latest/compute/drivers/openstack.html
* - Python
- OpenStack SDK
- A Python-based library for OpenStack.
- https://developer.openstack.org/sdks/python/openstacksdk/
* - Python
- Shade
- A Python-based library developed by OpenStack Infra team.
Use it to operate multiple OpenStack clouds.
- https://docs.openstack.org/infra/shade/
* - Java
- `jClouds <https://jclouds.apache.org>`_
- A Java-based library that the Apache Foundation manages.
Use it to work with multiple cloud types.
- https://jclouds.apache.org/guides/openstack/
* - Ruby
- `fog <http://fog.io/>`_
- A Ruby-based SDK.
Use it to work with multiple clouds.
- https://github.com/fog/fog-openstack/blob/master/docs/getting_started.md
* - node.js
- `pkgcloud <https://github.com/pkgcloud/pkgcloud>`_
- A Node.js-based SDK.
Use it work with multiple clouds.
- https://github.com/pkgcloud/pkgcloud/tree/master/docs/providers/openstack
* - PHP
- `php-opencloud <http://php-opencloud.com/>`_
- A PHP-based library.
Use it to write PHP code that works with OpenStack clouds.
- http://php-opencloud.readthedocs.org/en/latest/getting-started-with-openstack.html
* - .NET Framework
- OpenStack SDK for Microsoft .NET
- A .NET-based library.
Use it to write C++ or C# code for Microsoft applications.
- https://www.nuget.org/packages/openstack.net
* - Go
- `gophercloud <https://github.com/gophercloud/gophercloud>`_
- A go-based SDK.
Use it to write Golang code that works with OpenStack clouds.
- http://gophercloud.io/
For a list of available SDKs, see `Software Development Kits <https://wiki.openstack.org/wiki/SDKs>`_.
Other versions of this guide show you how to use the other SDKs and languages
to complete these tasks. If you are a developer for another toolkit that you
would like this guide to include, feel free to submit code snippets. For more
information, contact
`OpenStack Documentation team <https://wiki.openstack.org/Documentation>`_ members.
What you need
-------------
We assume that you can already access an OpenStack cloud. You must have a
project, also known as a tenant, with a minimum quota of six instances.
Because the Fractals application runs in Ubuntu, Debian, Fedora-based, and
openSUSE-based distributions, you must create instances that use one of these
operating systems.
To interact with the cloud, you must also have
.. only:: dotnet
`OpenStack Cloud SDK for Microsoft .NET 1.4.0.1 or later installed
<https://www.nuget.org/packages/openstack.net>`_.
.. note::
To install the OpenStack .NET SDK, use the NeGet Package Manager that
is included with Visual Studio and Xamarin Studio. You simply add a
package named 'openstack.net' and the NeGet Package Manager
automatically installs the necessary dependencies.
.. warning::
This document has not yet been completed for the .NET SDK.
.. only:: fog
`fog 1.19 or higher installed
<http://www.fogproject.org/wiki/index.php?title=FOGUserGuide#Installing_FOG>`_
and working with ruby gems 1.9.
.. warning::
This document has not yet been completed for the fog SDK.
.. only:: jclouds
`jClouds 1.8 or higher installed <https://jclouds.apache.org/start/install>`_.
Our code samples use
`Java 8 <http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html>`_.
We have created a Maven POM file to help you get started.
If you do not know Maven then the `Maven home site <https://maven.apache.org/what-is-maven.html>`_
is a good place to learn more.
**pom.xml:**
.. literalinclude:: ../samples/jclouds/pom.xml
:language: xml
Place the above pom.xml into the root directory of your project. Then create the nested
subdirectory tree :code:`src` -> :code:`main` -> :code:`java`.
Place the Java code samples that you copy from this book into the folder named ":code:`java`".
So, for example, the file named :code:`GettingStarted.java` from the end of this chapter
would be located as follows:
.. figure:: images/jclouds/screenshot_maven_layout.png
:width: 328px
:align: center
:height: 179px
:alt: Screenshot of the Maven project directory structure
:figclass: align-center
To use Maven to compile a downloaded sample, with the command prompt located in the same
directory as the :code:`pom.xml` file, enter:
.. code-block:: bash
mvn compile
Maven will download and install any dependencies required for compilation, then execute
the Java compiler. All files in the :code:`java` subdirectory will be compiled.
To use Maven to run each downloaded sample, with the command prompt located in the same
directory as the :code:`pom.xml` file, enter:
.. code-block:: bash
# In the sample below replace GettingStarted with the name of the class you want to run
mvn exec:java -Dexec.mainClass="GettingStarted"
Maven will download and install any further dependencies required and then run the chosen
class.
.. only:: libcloud
`libcloud 0.15.1 or higher installed
<https://libcloud.apache.org/getting-started.html>`_.
.. only:: pkgcloud
`pkgcloud 1.2 or higher installed
<https://github.com/pkgcloud/pkgcloud#getting-started>`_.
.. highlight:: javascript
.. only:: openstacksdk
a recent version of `openstacksdk <http://python-openstacksdk.readthedocs.org/en/latest/users/index.html>`_
installed.
.. only:: phpopencloud
`a recent version of php-opencloud installed <http://docs.php-opencloud.com/en/latest/>`_.
.. warning::
This document has not yet been completed for the php-opencloud SDK.
.. only:: shade
`a recent version of shade library installed <https://docs.openstack.org/infra/shade/installation.html>`_.
.. note:: Before proceeding, install the latest version of shade.
.. only:: gophercloud
`a recent version of gophercloud installed <https://godoc.org/github.com/gophercloud/gophercloud>`_
Obtain the following information from your cloud provider:
* auth URL
* user name
* password
* project ID or name (projects are also known as tenants)
* cloud region
You can also download the OpenStack RC file from the OpenStack Horizon
dashboard. Log in to the dashboard and click :guilabel:`Project->Access &
Security->API Access->Download OpenStack RC file`. If you use this method, be
aware that the "auth URL" does not include the path. For example, if your
:file:`openrc.sh` file shows:
.. code-block:: bash
export OS_AUTH_URL=http://controller:5000/v2.0
The actual auth URL is:
.. code-block:: python
http://controller:5000
How you interact with OpenStack
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In this tutorial, you interact with your OpenStack cloud through the SDK that
you chose in "Choose your OpenStack SDK." This guide assumes that you know how
to run code snippets in your language of choice.
.. only:: fog
.. literalinclude:: ../samples/fog/getting_started.rb
:language: ruby
:start-after: step-1
:end-before: step-2
.. only:: libcloud
To try it, add the following code to a Python script (or use an
interactive Python shell) by calling :code:`python -i`.
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-1
:end-before: step-2
.. only:: jclouds
First provide the appropriate identity, credentials and authorization URL
for your project. Then get an instance of the Nova API interface.
.. literalinclude:: ../samples/jclouds/GettingStarted.java
:language: java
:start-after: step-1
:end-before: step-2
.. only:: openstacksdk
To try it out, add the following code to a Python script (or use an
interactive Python shell) by calling :code:`python -i`.
.. literalinclude:: ../samples/openstacksdk/getting_started.py
:start-after: step-1
:end-before: step-2
.. only:: pkgcloud
To try it, use an interactive Node.js shell by calling :code:`node` or add
the following code to a script.
.. literalinclude:: ../samples/pkgcloud/getting_started.js
:start-after: step-1
:end-before: step-2
.. only:: dotnet
To use the OpenStack .NET SDK, add the following code in the required
namespace section.
.. code-block:: c#
using net.openstack.Core.Domain;
using net.openstack.Core.Providers;
using net.openstack.Providers.Rackspace;
Because all service endpoints use the Identity Service for authentication
and authorization, place the following code in the 'void Main()'
entry-point function.
.. literalinclude:: ../samples/dotnet/getting_started.cs
:language: c#
:dedent: 3
:start-after: step-1
:end-before: step-2
.. note:: Because the tutorial reuses the :code:`conn` object,
make sure that you always have one handy.
.. only:: libcloud
.. note:: If you receive the
:code:`libcloud.common.types.InvalidCredsError: 'Invalid
credentials with the provider'` exception when you run
one of these API calls, double-check your credentials.
.. note:: If your provider does not support regions, try a
blank string ('') for the `region_name`.
.. only:: shade
Use your credentials above to specify the cloud provider name,
username, password, project_name and region_name in the file
:file:`~/.config/openstack/clouds.yml`.
.. literalinclude:: ../samples/shade/clouds.yml
:language: yaml
.. note:: If you do use a public cloud `known by shade
<http://git.openstack.org/cgit/openstack/os-client-config/tree/os_client_config/vendors>`_,
you can avoid specifying :code:`auth_url:` and instead specify
:code:`profile: $PROVIDER_NAME` in the clouds.yml file.
To configure shade using a profile, use your credentials above to specify the cloud provider
name, username, password, project name, and region name in the file
:file:`~/.config/openstack/clouds.yml`.
.. literalinclude:: ../samples/shade/shade.yml
:language: yaml
See `configure shade <http://git.openstack.org/cgit/openstack/os-client-config/tree/README.rst>`_,
to configure your cloud using a profile.
.. literalinclude:: ../samples/shade/getting_started.py
:start-after: step-1
:end-before: step-2
.. only:: openstacksdk
.. note:: If you receive the exception
:code:`openstack.exceptions.HttpException: HttpException:
401 Client Error: Unauthorized,` while trying to run one
of the following API calls please double-check your
credentials.
.. only:: gophercloud
Use environment variables to set your cloud credentials
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-1
:end-before: step-2
.. note:: The client object accesses the Compute v2.0 service and type v2.1,
so that version is in this tutorial.
Flavors and images
~~~~~~~~~~~~~~~~~~
To run your application, you must launch an instance. This instance serves as
a virtual machine.
To launch an instance, you choose a flavor and an image. The flavor represents
the size of the instance, including the number of CPUs and amount of RAM and
disk space. An image is a prepared OS installation from which you clone your
instance. When you boot instances in a public cloud, larger flavors can be
more expensive than smaller ones in terms of resources and monetary cost.
To list the images that are available in your cloud, run some API calls:
.. only:: fog
.. literalinclude:: ../samples/fog/getting_started.rb
:language: ruby
:start-after: step-2
:end-before: step-3
.. only:: libcloud
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-2
:end-before: step-3
This code returns output like this:
.. code-block:: python
<NodeImage: id=2cccbea0-cea9-4f86-a3ed-065c652adda5, name=ubuntu-14.04, driver=OpenStack ...>
<NodeImage: id=f2a8dadc-7c7b-498f-996a-b5272c715e55, name=cirros-0.3.3-x86_64, driver=OpenStack ...>
.. only:: pkgcloud
.. literalinclude:: ../samples/pkgcloud/getting_started.js
:start-after: step-2
:end-before: step-3
This code returns output like this:
.. code-block:: none
id: 6c7f5627-ca40-4781-ac34-4d9af53d4b29
name: Fedora 22 - Updated
created: 2015-08-17T03:53:17Z
updated: 2015-08-17T04:53:12Z
status: ACTIVE
...
id: 2cccbea0-cea9-4f86-a3ed-065c652adda5
name: Ubuntu 14.04
created: 2015-08-13T02:25:10Z
updated: 2015-08-13T02:43:38Z
status: ACTIVE
.. only:: dotnet
.. literalinclude:: ../samples/dotnet/getting_started.cs
:language: c#
:dedent: 3
:start-after: step-2
:end-before: step-3
This code returns output like this:
.. code-block:: none
Image Id: dce1a289-2ad5-4aaa-a7a6-fe30adc2094e - Image Name: snap1
Image Id: 97f55846-6ea5-4e9d-b437-bda97586bd0c - Image Name: cirros-0.3.4-x86_64-uec
Image Id: 3e0e8270-0da4-4fec-bfc7-eeb763604cad - Image Name: cirros-0.3.4-x86_64-uec-ramdisk
Image Id: 0b151382-d2f1-44d7-835b-6408bd523917 - Image Name: cirros-0.3.4-x86_64-uec-kernel
.. only:: shade
.. literalinclude:: ../samples/shade/getting_started.py
:language: python
:start-after: step-2
:end-before: step-3
This code returns output like this:
.. code-block:: none
checksum: 750a56555d4ec7303f5dc33b007ff632
container_format: bare
created_at: '2014-07-14T19:02:15Z'
direct_url:
rbd://7e14670e-a6f8-445b-b632-4b79bafc4781/masseffect-images/b4efbc2a-6130-4f2e-b436-55a618c4de20/snap
disk_format: raw
file: /v2/images/b4efbc2a-6130-4f2e-b436-55a618c4de20/file
id: b4efbc2a-6130-4f2e-b436-55a618c4de20
min_disk: 10
min_ram: 1024
name: Debian-7.0-Wheezy
owner: 0bacd8121bb548698f340455b38bf561
protected: false
schema: /v2/schemas/image
size: 5242880000
status: active
tags: []
updated_at: '2014-10-15T22:42:52Z'
visibility: public
.. only:: jclouds
.. literalinclude:: ../samples/jclouds/GettingStarted.java
:language: java
:start-after: step-2
:end-before: step-3
.. only:: openstacksdk
.. literalinclude:: ../samples/openstacksdk/getting_started.py
:start-after: step-2
:end-before: step-3
You should see output something like this:
.. code-block:: python
openstack.image.v1.image.Image(attrs={u'name': u'ubuntu-14.04', u'container_format': u'bare', u'disk_format': u'qcow2', u'checksum': u'6d8f1c8cf05e1fbdc8b543fda1a9fa7f', u'id': u'cb6b7936-d2c5-4901-8678-c88b3a6ed84c', u'size': 258540032}, loaded=True)
...
.. only:: gophercloud
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-2
:end-before: step-3
This code returns output like this:
.. code-block:: none
[{74e6d1ec-9a08-444c-8518-4f232446386d 2016-02-01T07:20:31Z 0 0 cirros-0.3.4-x86_64-uec 100 ACTIVE 2016-02-01T07:20:32Z}
{f70b7fb0-348a-4519-b358-0f239dc64dc5 2016-02-01T07:20:30Z 0 0 cirros-0.3.4-x86_64-uec-ramdisk 100 ACTIVE 2016-02-01T07:20:31Z}
{e92f5e17-60d2-4cb5-b893-d605b136afab 2016-02-01T07:20:29Z 0 0 cirros-0.3.4-x86_64-uec-kernel 100 ACTIVE 2016-02-01T07:20:30Z}]
You can also get information about available flavors:
.. only:: fog
.. literalinclude:: ../samples/fog/getting_started.rb
:language: ruby
:start-after: step-3
:end-before: step-4
.. only:: libcloud
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-3
:end-before: step-4
This code returns output like this:
.. code-block:: python
<OpenStackNodeSize: id=1, name=m1.tiny, ram=512, disk=1, bandwidth=None, price=0.0, driver=OpenStack, vcpus=1, ...>
<OpenStackNodeSize: id=2, name=m1.small, ram=2048, disk=20, bandwidth=None, price=0.0, driver=OpenStack, vcpus=1, ...>
<OpenStackNodeSize: id=3, name=m1.medium, ram=4096, disk=40, bandwidth=None, price=0.0, driver=OpenStack, vcpus=2, ...>
<OpenStackNodeSize: id=4, name=m1.large, ram=8192, disk=80, bandwidth=None, price=0.0, driver=OpenStack, vcpus=4, ...>
<OpenStackNodeSize: id=5, name=m1.xlarge, ram=16384, disk=160, bandwidth=None, price=0.0, driver=OpenStack, vcpus=8, ...>
.. only:: pkgcloud
.. literalinclude:: ../samples/pkgcloud/getting_started.js
:start-after: step-3
:end-before: step-4
This code returns output like this:
.. code-block:: none
id: c46104de-d5fd-4567-ab0b-3dcfd117bd99
name: m2.xlarge
ram: 49152
disk: 30
vcpus: 12
...
id: cba9ea52-8e90-468b-b8c2-777a94d81ed3
name: m1.small
ram: 2048
disk: 20
vcpus: 1
.. only:: dotnet
.. literalinclude:: ../samples/dotnet/getting_started.cs
:language: c#
:dedent: 3
:start-after: step-3
:end-before: step-4
This code returns output like this:
.. code-block:: none
Flavor Id: 1 - Flavor Name: m1.tiny
Flavor Id: 2 - Flavor Name: m1.small
Flavor Id: 3 - Flavor Name: m1.medium
Flavor Id: 4 - Flavor Name: m1.large
Flavor Id: 42 - Flavor Name: m1.nano
Flavor Id: 5 - Flavor Name: m1.xlarge
Flavor Id: 84 - Flavor Name: m1.micro
.. only:: shade
.. literalinclude:: ../samples/shade/getting_started.py
:language: python
:start-after: step-3
:end-before: step-4
This code returns output like this:
.. code-block:: none
HUMAN_ID: true
NAME_ATTR: name
OS-FLV-DISABLED:disabled: false
OS-FLV-EXT-DATA:ephemeral: 0
disk: 80
ephemeral: 0
human_id: supersonic
id: '200'
is_public: true
links:
- href:
https://compute.dream.io:8774/v2/5d013ac5962749a49af7ff18c2fb228c/flavors/200
rel: self
- href:
https://compute.dream.io:8774/5d013ac5962749a49af7ff18c2fb228c/flavors/200
rel: bookmark
name: supersonic
os-flavor-access:is_public: true
ram: 2048
swap: ''
vcpus: 1
.. only:: jclouds
.. literalinclude:: ../samples/jclouds/GettingStarted.java
:language: java
:start-after: step-3
:end-before: step-4
.. only:: openstacksdk
.. literalinclude:: ../samples/openstacksdk/getting_started.py
:start-after: step-3
:end-before: step-4
You should see output something like this:
.. code-block:: python
openstack.compute.v2.flavor.FlavorDetail(attrs={u'name': u'm1.tiny', u'links': [{u'href': u'http://controller:8774/v2/96ff6aa79e60423d9848b70d5475c415/flavors/1', u'rel': u'self'}, {u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/flavors/1', u'rel': u'bookmark'}], u'ram': 512, u'OS-FLV-DISABLED:disabled': False, u'vcpus': 1, u'swap': u'', u'os-flavor-access:is_public': True, u'rxtx_factor': 1.0, u'OS-FLV-EXT-DATA:ephemeral': 0, u'disk': 1, u'id': u'1'}, loaded=True)
openstack.compute.v2.flavor.FlavorDetail(attrs={u'name': u'm1.small', u'links': [{u'href': u'http://controller:8774/v2/96ff6aa79e60423d9848b70d5475c415/flavors/2', u'rel': u'self'}, {u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/flavors/2', u'rel': u'bookmark'}], u'ram': 2048, u'OS-FLV-DISABLED:disabled': False, u'vcpus': 1, u'swap': u'', u'os-flavor-access:is_public': True, u'rxtx_factor': 1.0, u'OS-FLV-EXT-DATA:ephemeral': 0, u'disk': 20, u'id': u'2'}, loaded=True)
openstack.compute.v2.flavor.FlavorDetail(attrs={u'name': u'm1.medium', u'links': [{u'href': u'http://controller:8774/v2/96ff6aa79e60423d9848b70d5475c415/flavors/3', u'rel': u'self'}, {u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/flavors/3', u'rel': u'bookmark'}], u'ram': 4096, u'OS-FLV-DISABLED:disabled': False, u'vcpus': 2, u'swap': u'', u'os-flavor-access:is_public': True, u'rxtx_factor': 1.0, u'OS-FLV-EXT-DATA:ephemeral': 0, u'disk': 40, u'id': u'3'}, loaded=True)
...
.. only:: gophercloud
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-3
:end-before: step-4
This code returns output like this:
.. code-block:: none
[{1 1 512 m1.tiny 1 0 1}
{2 20 2048 m1.small 1 0 1}
{3 40 4096 m1.medium 1 0 2}
...
{84 0 128 m1.micro 1 0 1}]
Your images and flavors will be different, of course.
Choose an image and flavor for your instance. You need about 1GB RAM, 1 CPU,
and a 1GB disk. This example uses the Ubuntu image with a small
flavor, which is a safe choice. In subsequent tutorial sections in
this guide, you must change the image and flavor IDs to correspond to
the image and flavor that you choose.
If the image that you want is not available in your cloud, you can usually
upload one depending on the policy settings of your cloud. For information about
how to upload images, see
`obtaining images <https://docs.openstack.org/image-guide/obtain-images.html>`_.
Set the image and size variables to appropriate values for your cloud. We will
use these variables in later sections.
First, tell the connection to get a specified image by using the ID of the
image that you picked in the previous section:
.. only:: fog
.. literalinclude:: ../samples/fog/getting_started.rb
:language: ruby
:start-after: step-4
:end-before: step-5
.. only:: libcloud
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-4
:end-before: step-5
This code returns output like this:
.. code-block:: python
<NodeImage: id=2cccbea0-cea9-4f86-a3ed-065c652adda5, name=ubuntu-14.04, driver=OpenStack ...>
.. only:: pkgcloud
.. literalinclude:: ../samples/pkgcloud/getting_started.js
:start-after: step-4
:end-before: step-5
This code returns output like this:
.. code-block:: none
id: 2cccbea0-cea9-4f86-a3ed-065c652adda5
name: Ubuntu 14.04
created: 2015-08-13T02:25:10Z
updated: 2015-08-13T02:43:38Z
status: ACTIVE
.. only:: dotnet
.. literalinclude:: ../samples/dotnet/getting_started.cs
:language: c#
:dedent: 3
:start-after: step-4
:end-before: step-5
This code returns output like this:
.. code-block:: none
Image Id: 97f55846-6ea5-4e9d-b437-bda97586bd0c - Image Name: cirros-0.3.4-x86_64-uec
.. only:: shade
.. literalinclude:: ../samples/shade/getting_started.py
:start-after: step-4
:end-before: step-5
This code returns output like this:
.. code-block:: none
checksum: da578dd59289a35a0ac7744a0bd85cf5
container_format: bare
created_at: '2014-10-27T22:05:37Z'
direct_url:
rbd://7e14670e-a6f8-445b-b632-4b79bafc4781/masseffect-images/c55094e9-699c-4da9-95b4-2e2e75f4c66e/snap
disk_format: raw
file: /v2/images/c55094e9-699c-4da9-95b4-2e2e75f4c66e/file
id: c55094e9-699c-4da9-95b4-2e2e75f4c66e
min_disk: 0
min_ram: 0
name: Ubuntu-14.04-Trusty
owner: 0bacd8121bb548698f340455b38bf561
protected: false
schema: /v2/schemas/image
size: 10737418240
status: active
tags: []
updated_at: '2014-10-27T22:08:55Z'
visibility: public
.. only:: openstacksdk
.. literalinclude:: ../samples/openstacksdk/getting_started.py
:start-after: step-4
:end-before: step-5
You should see output something like this:
.. code-block:: python
openstack.image.v1.image.Image(attrs={u'name': u'ubuntu-14.04', u'container_format': u'bare', u'disk_format': u'qcow2', u'checksum': u'6d8f1c8cf05e1fbdc8b543fda1a9fa7f', u'id': u'cb6b7936-d2c5-4901-8678-c88b3a6ed84c', u'size': 258540032}, loaded=True)
.. only:: jclouds
.. literalinclude:: ../samples/jclouds/GettingStarted.java
:language: java
:start-after: step-4
:end-before: step-5
.. only:: gophercloud
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-4
:end-before: step-5
You should see output like this:
.. code-block:: none
&{74e6d1ec-9a08-444c-8518-4f232446386d 2016-02-01T07:20:31Z 0 0 cirros-0.3.4-x86_64-uec 100 ACTIVE 2016-02-01T07:20:32Z}
Next, tell the script which flavor you want to use:
.. only:: fog
.. literalinclude:: ../samples/fog/getting_started.rb
:language: ruby
:start-after: step-5
:end-before: step-6
.. only:: libcloud
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-5
:end-before: step-6
This code returns output like this:
.. code-block:: python
<OpenStackNodeSize: id=2, name=m1.small, ram=2048, disk=20, bandwidth=None, price=0.0, driver=OpenStack, vcpus=1, ...>
.. only:: pkgcloud
.. literalinclude:: ../samples/pkgcloud/getting_started.js
:start-after: step-5
:end-before: step-6
This code returns output like this:
.. code-block:: none
id: cba9ea52-8e90-468b-b8c2-777a94d81ed3
name: m1.small
ram: 2048
disk: 20
vcpus: 1
.. only:: dotnet
.. literalinclude:: ../samples/dotnet/getting_started.cs
:language: c#
:dedent: 3
:start-after: step-5
:end-before: step-6
This code returns output like this:
.. code-block:: none
Flavor Id: 2 - Flavor Name: m1.small
.. only:: shade
Specify the flavor ID that you would like to use.
.. literalinclude:: ../samples/shade/getting_started.py
:start-after: step-5
:end-before: step-6
This code returns output like this:
.. code-block:: none
HUMAN_ID: true
NAME_ATTR: name
OS-FLV-DISABLED:disabled: false
OS-FLV-EXT-DATA:ephemeral: 0
disk: 80
ephemeral: 0
human_id: subsonic
id: '100'
is_public: true
links:
- href:
https://compute.dream.io:8774/v2/5d013ac5962749a49af7ff18c2fb228c/flavors/100
rel: self
- href:
https://compute.dream.io:8774/5d013ac5962749a49af7ff18c2fb228c/flavors/100
rel: bookmark
name: subsonic
os-flavor-access:is_public: true
ram: 1024
swap: ''
vcpus: 1
.. only:: jclouds
.. literalinclude:: ../samples/jclouds/GettingStarted.java
:language: java
:start-after: step-5
:end-before: step-6
.. only:: openstacksdk
.. literalinclude:: ../samples/openstacksdk/getting_started.py
:start-after: step-5
:end-before: step-6
You should see output something like this:
.. code-block:: python
openstack.compute.v2.flavor.Flavor(attrs={u'name': u'm1.small', u'links': [{u'href': u'http://controller:8774/v2/96ff6aa79e60423d9848b70d5475c415/flavors/2', u'rel': u'self'}, {u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/flavors/2', u'rel': u'bookmark'}], u'ram': 2048, u'OS-FLV-DISABLED:disabled': False, u'vcpus': 1, u'swap': u'', u'os-flavor-access:is_public': True, u'rxtx_factor': 1.0, u'OS-FLV-EXT-DATA:ephemeral': 0, u'disk': 20, 'id': u'2'}, loaded=True)
.. only:: gophercloud
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-5
:end-before: step-6
You should see output like this:
.. code-block:: none
&{1 1 512 m1.tiny 1 0 1}
Now, you can launch the instance.
Launch an instance
~~~~~~~~~~~~~~~~~~
Use your selected image and flavor to create an instance.
.. note:: The following instance creation example assumes that you have a
single-tenant network. If you receive the 'Exception: 400 Bad
Request Multiple possible networks found, use a Network ID to be
more specific' error, you have multiple-tenant networks. You
must add a `networks` parameter to the call that creates the
server. See :doc:`/appendix` for details.
Create the instance.
.. note:: Your SDK might call an instance a 'node' or 'server'.
.. only:: fog
.. literalinclude:: ../samples/fog/getting_started.rb
:language: ruby
:start-after: step-6
:end-before: step-7
.. only:: libcloud
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-6
:end-before: step-7
This code returns output like this:
.. code-block:: python
<Node: uuid=1242d56cac5bcd4c110c60d57ccdbff086515133, name=testing, state=PENDING, public_ips=[], private_ips=[], provider=OpenStack ...>
.. only:: jclouds
.. literalinclude:: ../samples/jclouds/GettingStarted.java
:language: java
:start-after: step-6
:end-before: step-7
.. only:: openstacksdk
.. literalinclude:: ../samples/openstacksdk/getting_started.py
:start-after: step-6
:end-before: step-7
You should see output something like:
.. code-block:: python
openstack.compute.v2.server.Server(attrs={'flavorRef': openstack.compute.v2.flavor.Flavor(attrs={u'name': u'm1.small', u'links': [{u'href': u'http://controller:8774/v2/96ff6aa79e60423d9848b70d5475c415/flavors/2', u'rel': u'self'}, {u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/flavors/2', u'rel': u'bookmark'}], u'ram': 2048, u'OS-FLV-DISABLED:disabled': False, u'vcpus': 1, u'swap': u'', u'os-flavor-access:is_public': True, u'rxtx_factor': 1.0, u'OS-FLV-EXT-DATA:ephemeral': 0, u'disk': 20, 'id': u'2'}, loaded=True), 'name': 'testing', 'imageRef': openstack.image.v1.image.Image(attrs={u'name': u'ubuntu14.04', u'container_format': u'bare', u'disk_format': u'qcow2', u'checksum': u'6d8f1c8cf05e1fbdc8b543fda1a9fa7f', u'id': u'cb6b7936-d2c5-4901-8678-c88b3a6ed84c', u'size': 258540032}, loaded=True), 'id': u'a1700b84-dc9a-434e-8f7a-40852e97781c'}, loaded=False)
.. only:: pkgcloud
.. literalinclude:: ../samples/pkgcloud/getting_started.js
:start-after: step-6
:end-before: step-7
This code returns output like this:
.. code-block:: none
0d7968dc-4bf4-4e01-b822-43c9c1080d77
.. only:: dotnet
.. literalinclude:: ../samples/dotnet/getting_started.cs
:language: c#
:dedent: 3
:start-after: step-6
:end-before: step-7
This code returns output like this:
.. code-block:: none
Instance Id: 4e480ef1-68f0-491f-b237-d9b7f500ef24 at net.openstack.Core.Domain.Link[]
.. only:: shade
.. literalinclude:: ../samples/shade/getting_started.py
:start-after: step-6
:end-before: step-7
.. only:: gophercloud
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-6
:end-before: step-7
You should see output like this:
.. code-block:: none
&{739dd964-ae88-461d-9746-f8f1139d20f6 0 map[] map[] map[] map[] ... RPUkTFM8fynn [map[name:default]]}
If you list existing instances:
.. only:: fog
.. literalinclude:: ../samples/fog/getting_started.rb
:language: ruby
:start-after: step-7
:end-before: step-8
.. only:: libcloud
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-7
:end-before: step-8
.. only:: pkgcloud
.. literalinclude:: ../samples/pkgcloud/getting_started.js
:start-after: step-7
:end-before: step-8
.. only:: dotnet
.. literalinclude:: ../samples/dotnet/getting_started.cs
:language: c#
:dedent: 3
:start-after: step-7
:end-before: step-8
.. only:: shade
.. literalinclude:: ../samples/shade/getting_started.py
:start-after: step-7
:end-before: step-8
.. only:: jclouds
.. literalinclude:: ../samples/jclouds/GettingStarted.java
:language: java
:start-after: step-7
:end-before: step-8
.. only:: openstacksdk
.. literalinclude:: ../samples/openstacksdk/getting_started.py
:start-after: step-7
:end-before: step-8
.. only:: gophercloud
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-7
:end-before: step-8
The new instance appears.
.. only:: libcloud
.. code-block:: python
<Node: uuid=1242d56cac5bcd4c110c60d57ccdbff086515133, name=testing, state=RUNNING, public_ips=[], private_ips=[], provider=OpenStack ...>
.. only:: openstacksdk
.. code-block:: python
openstack.compute.v2.server.ServerDetail(attrs={u'OS-EXT-STS:task_state': u'scheduling', u'addresses': {}, u'links': [{u'href': u'http://controller:8774/v2/96ff6aa79e60423d9848b70d5475c415/servers/a1700b84-dc9a-434e-8f7a-40852e97781c', u'rel': u'self'}, {u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/servers/a1700b84-dc9a-434e-8f7a-40852e97781c', u'rel': u'bookmark'}], u'image': {u'id': u'cb6b7936-d2c5-4901-8678-c88b3a6ed84c', u'links': [{u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/images/cb6b7936-d2c5-4901-8678-c88b3a6ed84c', u'rel': u'bookmark'}]}, u'OS-EXT-STS:vm_state': u'building', u'OS-SRV-USG:launched_at': None, u'flavor': {u'id': u'2', u'links': [{u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/flavors/2', u'rel': u'bookmark'}]}, u'id': u'a1700b84-dc9a-434e-8f7a-40852e97781c', u'user_id': u'59f76712914b44819cf311af43946079', 'imageRef': openstack.compute.v2.image.Image(attrs={u'id': u'cb6b7936-d2c5-4901-8678-c88b3a6ed84c', u'links': [{u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/images/cb6b7936-d2c5-4901-8678-c88b3a6ed84c', u'rel': u'bookmark'}]}, loaded=False), u'OS-DCF:diskConfig': u'MANUAL', u'accessIPv4': u'', u'accessIPv6': u'', u'progress': 0, u'OS-EXT-STS:power_state': 0, u'OS-EXT-AZ:availability_zone': u'nova', u'config_drive': u'', u'status': u'BUILD', u'updated': u'2015-10-12T13:45:37Z', u'hostId': u'', u'OS-SRV-USG:terminated_at': None, u'key_name': None, 'flavorRef': openstack.compute.v2.flavor.Flavor(attrs={u'id': u'2', u'links': [{u'href': u'http://controller:8774/96ff6aa79e60423d9848b70d5475c415/flavors/2', u'rel': u'bookmark'}]}, loaded=False), u'name': u'testing', u'created': u'2015-10-12T13:45:37Z', u'tenant_id': u'96ff6aa79e60423d9848b70d5475c415', u'os-extended-volumes:volumes_attached': [], u'metadata': {}}, loaded=True)
.. only:: pkgcloud
.. code-block:: none
...
id: '0d7968dc-4bf4-4e01-b822-43c9c1080d77',
name: 'testing',
status: 'PROVISIONING',
progress: 0,
imageId: '2cccbea0-cea9-4f86-a3ed-065c652adda5',
adminPass: undefined,
addresses: {},
metadata: {},
flavorId: '3',
hostId: 'b6ee757ed678e8c6589ae8cce405eeded89ac914daec73e45a5c50b8',
created: '2015-06-30T08:17:39Z',
updated: '2015-06-30T08:17:44Z',
...
.. only:: dotnet
.. code-block:: none
Instance Id: 4e480ef1-68f0-491f-b237-d9b7f500ef24 at net.openstack.Core.Domain.Link[]
.. only:: shade
.. code-block:: none
HUMAN_ID: true
NAME_ATTR: name
OS-DCF:diskConfig: MANUAL
OS-EXT-AZ:availability_zone: iad-1
OS-EXT-STS:power_state: 1
OS-EXT-STS:task_state: null
OS-EXT-STS:vm_state: active
OS-SRV-USG:launched_at: '2015-07-20T20:31:10.000000'
OS-SRV-USG:terminated_at: null
accessIPv4: ''
accessIPv6: ''
addresses:
private-network:
- OS-EXT-IPS-MAC:mac_addr: fa:16:3e:60:f5:cd
OS-EXT-IPS:type: fixed
addr: 2607:f298:6050:4e14:f816:3eff:fe60:f5cd
version: 6
- OS-EXT-IPS-MAC:mac_addr: fa:16:3e:60:f5:cd
OS-EXT-IPS:type: fixed
addr: 10.10.10.14
version: 4
config_drive: ''
created: '2015-07-20T20:30:23Z'
flavor:
id: '100'
links:
- href:
https://compute.dream.io:8774/5d013ac5962749a49af7ff18c2fb228c/flavors/100
rel: bookmark
hostId: f71865b497e6fa71063e292b11846eb64b5a41cd5c00fbb7465b6a48
human_id: testing
id: 67ecebdc-daff-4d84-bd04-bc76c67b48ec
image:
id: c55094e9-699c-4da9-95b4-2e2e75f4c66e
links:
- href:
https://compute.dream.io:8774/5d013ac5962749a49af7ff18c2fb228c/images/c55094e9-699c-4da9-95b4-2e2e75f4c66e
rel: bookmark
key_name: null
links:
- href:
https://compute.dream.io:8774/v2/5d013ac5962749a49af7ff18c2fb228c/servers/67ecebdc-daff-4d84-bd04-bc76c67b48ec
rel: self
- href:
https://compute.dream.io:8774/5d013ac5962749a49af7ff18c2fb228c/servers/67ecebdc-daff-4d84-bd04-bc76c67b48ec
rel: bookmark
metadata: {}
name: testing
networks:
private-network:
- 2607:f298:6050:4e14:f816:3eff:fe60:f5cd
- 10.10.10.14
os-extended-volumes:volumes_attached: []
progress: 0
security_groups:
- name: default
status: ACTIVE
tenant_id: 5d013ac5962749a49af7ff18c2fb228c
updated: '2015-07-20T20:31:10Z'
user_id: bfd3dbf1c8a242cd90884408de547bb9
.. only:: gophercloud
.. code-block:: none
[...
{739dd964-ae88-461d-9746-f8f1139d20f6 061fdb617b6c4bdf8694bf5b0d8eefdd bb210009e42c4b509ba75893a757c8e5 testing 2016-02-16T07:16:52Z 2016-02-16T07:16:52Z 2d2f4bba90498fd46c72e7d019dde9189c36637b73e71e1e652d75db BUILD 0 ... [map[name:default]]}
...]
Before you continue, you must do one more thing.
Destroy an instance
~~~~~~~~~~~~~~~~~~~
Cloud resources, such as running instances that you no longer use, can
cost money. To avoid unexpected expenses, destroy cloud resources.
.. only:: fog
.. literalinclude:: ../samples/fog/getting_started.rb
:language: ruby
:start-after: step-8
:end-before: step-9
.. only:: libcloud
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-8
:end-before: step-9
.. only:: pkgcloud
.. literalinclude:: ../samples/pkgcloud/getting_started.js
:start-after: step-8
:end-before: step-9
.. only:: dotnet
.. literalinclude:: ../samples/dotnet/getting_started.cs
:language: c#
:dedent: 3
:start-after: step-8
:end-before: step-9
.. only:: shade
.. literalinclude:: ../samples/shade/getting_started.py
:start-after: step-8
:end-before: step-9
.. only:: jclouds
.. literalinclude:: ../samples/jclouds/GettingStarted.java
:language: java
:start-after: step-8
:end-before: step-9
.. only:: openstacksdk
.. literalinclude:: ../samples/openstacksdk/getting_started.py
:start-after: step-8
:end-before: step-9
.. only:: gophercloud
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-8
:end-before: step-9
If you list the instances again, the instance disappears.
Leave your shell open to use it for another instance deployment in this
section.
Deploy the application to a new instance
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Now that you know how to create and delete instances, you can deploy the
sample application. The instance that you create for the application is
similar to the first instance that you created, but this time, we introduce a
few extra concepts.
.. note:: Internet connectivity from your cloud instance is required
to download the application.
When you create an instance for the application, you want to give it a bit
more information than you supplied to the bare instance that you just created
and deleted. We will go into more detail in later sections, but for now,
simply create the following resources so that you can feed them to the
instance:
* A key pair. To access your instance, you must import an SSH public key into
OpenStack to create a key pair. OpenStack installs this key pair on the new
instance. Typically, your public key is written to :code:`.ssh/id_rsa.pub`. If
you do not have an SSH public key file, follow
`these instructions <https://help.github.com/articles/generating-ssh- keys/>`_ first.
We will cover these instructions in depth in :doc:`/introduction`.
In the following example, set :code:`pub_key_file` to the location of
your public SSH key file.
.. only:: fog
.. literalinclude:: ../samples/fog/getting_started.rb
:language: ruby
:start-after: step-9
:end-before: step-10
.. only:: libcloud
.. note:: If you see an IOError, you may need to change ``~/.ssh/`` to
``/home/{USERNAME}/.ssh/``, using an absolute path.
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-9
:end-before: step-10
::
<KeyPair name=demokey fingerprint=aa:bb:cc... driver=OpenStack>
.. only:: pkgcloud
.. literalinclude:: ../samples/pkgcloud/getting_started.js
:start-after: step-9
:end-before: step-10
.. only:: shade
.. literalinclude:: ../samples/shade/getting_started.py
:start-after: step-9
:end-before: step-10
.. only:: jclouds
If a key pair of the given name is not found then one is generated.
.. literalinclude:: ../samples/jclouds/GettingStarted.java
:language: java
:start-after: step-9
:end-before: step-10
.. only:: openstacksdk
.. literalinclude:: ../samples/openstacksdk/getting_started.py
:start-after: step-9
:end-before: step-10
.. code-block:: python
openstack.compute.v2.keypair.Keypair(attrs={u'public_key': u'ssh-rsa ABAAABAQCyyzkyaPf.....', u'name': u'demokey', u'fingerprint': aa:bb:cc:... '}, loaded=True)
.. only:: gophercloud
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-9
:end-before: step-10
* Network access. By default, OpenStack filters all traffic. You must create
a security group and apply it to your instance. The security group allows HTTP
and SSH access. We will go into more detail in :doc:`/introduction`.
.. only:: fog
.. literalinclude:: ../samples/fog/getting_started.rb
:language: ruby
:start-after: step-10
:end-before: step-11
.. only:: libcloud
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-10
:end-before: step-11
.. only:: pkgcloud
.. literalinclude:: ../samples/pkgcloud/getting_started.js
:start-after: step-10
:end-before: step-11
.. only:: shade
.. literalinclude:: ../samples/shade/getting_started.py
:start-after: step-10
:end-before: step-11
.. only:: jclouds
.. literalinclude:: ../samples/jclouds/GettingStarted.java
:language: java
:start-after: step-10
:end-before: step-11
.. only:: openstacksdk
.. literalinclude:: ../samples/openstacksdk/getting_started.py
:start-after: step-10
:end-before: step-11
.. only:: gophercloud
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-10
:end-before: step-11
* Userdata. During instance creation, you can provide userdata to OpenStack to
configure instances after they boot. The cloud-init service applies the
user data to an instance. You must pre-install the cloud-init service on your
chosen image. We will go into more detail in :doc:`/introduction`.
.. only:: fog
.. literalinclude:: ../samples/fog/getting_started.rb
:language: ruby
:start-after: step-11
:end-before: step-12
.. only:: libcloud
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-11
:end-before: step-12
.. only:: pkgcloud
.. literalinclude:: ../samples/pkgcloud/getting_started.js
:start-after: step-11
:end-before: step-12
.. only:: shade
.. literalinclude:: ../samples/shade/getting_started.py
:start-after: step-11
:end-before: step-12
.. only:: jclouds
.. literalinclude:: ../samples/jclouds/GettingStarted.java
:language: java
:start-after: step-11
:end-before: step-12
.. only:: openstacksdk
.. note:: User data in openstacksdk must be encoded to Base64
.. literalinclude:: ../samples/openstacksdk/getting_started.py
:start-after: step-11
:end-before: step-12
.. only:: gophercloud
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-11
:end-before: step-12
Now, you can boot and configure the instance.
Boot and configure an instance
------------------------------
Use the image, flavor, key pair, and userdata to create an instance.
After you request the instance, wait for it to build.
.. only:: fog
.. literalinclude:: ../samples/fog/getting_started.rb
:language: ruby
:start-after: step-12
:end-before: step-13
.. only:: libcloud
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-12
:end-before: step-13
.. only:: pkgcloud
.. literalinclude:: ../samples/pkgcloud/getting_started.js
:start-after: step-12
:end-before: step-13
.. only:: shade
The shade framework can select and assign a free floating IP quickly
.. literalinclude:: ../samples/shade/getting_started.py
:start-after: step-12
:end-before: step-13
.. only:: jclouds
.. literalinclude:: ../samples/jclouds/GettingStarted.java
:language: java
:start-after: step-12
:end-before: step-13
.. only:: openstacksdk
.. literalinclude:: ../samples/openstacksdk/getting_started.py
:start-after: step-12
:end-before: step-13
.. only:: gophercloud
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-12
:end-before: step-13
When the instance boots, the `ex_userdata` variable value instructs the
instance to deploy the Fractals application.
Associate a floating IP for external connectivity
-------------------------------------------------
We cover networking in detail in :doc:`/networking`.
To see the application running, you must know where to look for it. By
default, your instance has outbound network access. To make your
instance reachable from the Internet, you need an IP address. By
default in some cases, your instance is provisioned with a publicly
rout-able IP address. In this case, you see an IP address listed
under `public_ips` or `private_ips` when you list the instances. If
not, you must create and attach a floating IP address to your
instance.
.. only:: fog
.. literalinclude:: ../samples/fog/getting_started.rb
:language: ruby
:start-after: step-13
:end-before: step-14
This gets an IP address that you can assign to your instance:
.. literalinclude:: ../samples/fog/getting_started.rb
:language: ruby
:start-after: step-14
:end-before: step-15
.. only:: libcloud
To see whether a private IP address is assigned to your instance:
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-13
:end-before: step-14
If one is assigned, users can use this address to access the instance on
some OpenStack clouds.
To determine whether a public IP address is assigned to your instance:
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-14
:end-before: step-15
If one is assigned, users can use this address to access the instance.
To create a floating IP address to use with your instance:
Use :code:`ex_list_floating_ip_pools()` and select the first floating IP
address pool. Allocate this pool to your project and use it to get a
floating IP address.
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-15
:end-before: step-16
This code returns the floating IP address:
::
<OpenStack_1_1_FloatingIpAddress: id=4536ed1e-4374-4d7f-b02c-c3be2cb09b67, ip_addr=203.0.113.101, pool=<OpenStack_1_1_FloatingIpPool: name=floating001>, driver=<libcloud.compute.drivers.openstack.OpenStack_1_1_NodeDriver object at 0x1310b50>>
Attach the floating IP address to the instance:
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-16
:end-before: step-17
.. only:: pkgcloud
Use :code:`getFloatingIps` to check for unused addresses. Select the first
available address. Otherwise, use :code:`allocateNewFloatingIp` to
allocate a floating IP to your project from the default address pool.
.. literalinclude:: ../samples/pkgcloud/getting_started.js
:start-after: step-13
:end-before: step-14
This code returns the floating IP address:
::
203.0.113.101
Attach the floating IP address to the instance:
.. literalinclude:: ../samples/pkgcloud/getting_started.js
:start-after: step-14
:end-before: step-15
.. only:: shade
.. literalinclude:: ../samples/shade/getting_started.py
:start-after: step-13
:end-before: step-14
.. only:: jclouds
Allocate the floating IP address:
.. literalinclude:: ../samples/jclouds/GettingStarted.java
:language: java
:start-after: step-13
:end-before: step-14
Then attach it to the instance:
.. literalinclude:: ../samples/jclouds/GettingStarted.java
:language: java
:start-after: step-14
:end-before: step-15
.. only:: openstacksdk
.. note:: For this example, we take a floating IP pool from the 'public'
network, which is your external network.
List all available floating IPs for this project and select the first free
one. Allocate a new floating IP if none is available.
.. literalinclude:: ../samples/openstacksdk/getting_started.py
:start-after: step-13
:end-before: step-14
This code returns the floating IP address:
.. code-block:: python
openstack.network.v2.floating_ip.FloatingIP(attrs={u'router_id': None, u'status': u'DOWN', u'tenant_id': u'96ff6aa79e60423d9848b70d5475c415', u'floating_network_id': u'0e43db46-8fd9-4ef1-8826-4cf9e809aede', u'fixed_ip_address': None, u'floating_ip_address': u'203.0.113.101', u'port_id': None, u'id': u'da890b1e-0afa-4724-9af6-0e5ab9cc33dd'}, loaded=True)
You can then attach it to the instance:
.. literalinclude:: ../samples/openstacksdk/getting_started.py
:start-after: step-14
:end-before: step-15
.. only:: gophercloud
To see whether a private IP address is assigned to your instance:
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-13
:end-before: step-14
If one is assigned, users can use this address to access the instance on
some OpenStack clouds.
To determine whether a public IP address is assigned to your instance:
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-14
:end-before: step-15
If one is assigned, users can use this address to access the instance.
To create a floating IP address to use with your instance:
Use network service client to select the first floating IP address pool.
Allocate this pool to your project and use it to get a floating IP address.
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-15
:end-before: step-16
Attach the floating IP address to the instance:
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-16
:end-before: step-17
Run the script to start the deployment.
Access the application
----------------------
Deploying application data and configuration to the instance can take some
time. Consider enjoying a cup of coffee while you wait. After the application
deploys, you can use your preferred browser to visit the awesome graphic
interface at the following link.
.. only:: fog
.. literalinclude:: ../samples/fog/getting_started.rb
:language: ruby
:start-after: step-15
.. only:: libcloud
.. literalinclude:: ../samples/libcloud/getting_started.py
:start-after: step-17
.. only:: pkgcloud
.. literalinclude:: ../samples/pkgcloud/getting_started.js
:start-after: step-15
.. only:: shade
.. literalinclude:: ../samples/shade/getting_started.py
:start-after: step-15
.. only:: jclouds
.. literalinclude:: ../samples/jclouds/GettingStarted.java
:language: java
:start-after: step-15
:end-before: step-16
.. only:: openstacksdk
.. literalinclude:: ../samples/openstacksdk/getting_started.py
:start-after: step-15
.. only:: gophercloud
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go
:start-after: step-17
.. note:: If you do not use floating IP addresses, substitute another IP
address, as appropriate.
.. figure:: images/screenshot_webinterface.png
:width: 800px
:align: center
:height: 600px
:alt: screenshot of the webinterface
:figclass: align-center
Next steps
~~~~~~~~~~
Do not worry if these concepts are not yet completely clear. In
:doc:`/introduction`, we explore these concepts in more detail.
* :doc:`/scaling_out`: Learn how to scale your application.
* :doc:`/durability`: Learn how to use Object Storage to make your application durable.
* :doc:`/block_storage`: Migrate the database to block storage, or use
the database-as-a-service component.
* :doc:`/orchestration`: Automatically orchestrate your application.
* :doc:`/networking`: Learn about complex networking.
* :doc:`/advice`: Get advice about operations.
* :doc:`/craziness`: Learn some crazy things that you might not think to do ;)
.. todo:: List the next sections here or simply reference introduction.
Complete code sample
~~~~~~~~~~~~~~~~~~~~
The following file contains all of the code from this section of the
tutorial. This comprehensive code sample lets you view and run the code
as a single script.
Before you run this script, confirm that you have set your authentication
information, the flavor ID, and image ID.
.. only:: fog
.. literalinclude:: ../samples/fog/getting_started.rb
:language: ruby
.. only:: libcloud
.. literalinclude:: ../samples/libcloud/getting_started.py
:language: python
.. only:: pkgcloud
.. literalinclude:: ../samples/pkgcloud/getting_started.js
:language: javascript
.. only:: dotnet
.. literalinclude:: ../samples/dotnet/getting_started.cs
:language: c#
.. only:: shade
.. literalinclude:: ../samples/shade/getting_started.py
:language: python
.. only:: jclouds
**GettingStarted.java:**
.. literalinclude:: ../samples/jclouds/GettingStarted.java
:language: java
.. only:: openstacksdk
.. literalinclude:: ../samples/openstacksdk/getting_started.py
:language: python
.. only:: gophercloud
.. literalinclude:: ../samples/gophercloud/getting_started.go
:language: go