Showing posts with label Floating IP. Show all posts
Showing posts with label Floating IP. Show all posts

Monday, October 9, 2017

Creation of a Nova Instance using the HEAT API Openstack Ocata and use Neutron API to associate a Floating IP

Creation of a Nova Instance using the HEAT API Openstack Ocata and use Neutron API to associate a Floating IP


# get an auth tokem
curl -d '
   {"auth": {
      "tenantName": "admin",
      "passwordCredentials": {
        "username": "admin",
        "password": "secretpassword"
       }
     }
   }' \
   -H "Content-type: application/json" \
   "http://11.11.1.158:5000/v2.0/tokens" | python -mjson.tool

# the above CURL command generates an AUTH token. This Auth token is used in the subsequent CURL request as needed. Please note that the Auth tokens are valid for 1 hour.
# this also generates the endpoint information to which the username (above admin) has access to

this is a string as "gAAAAABZ2dm6mYkFyY_YL2Dko47Ha8H_GPL-bowgPBfCN2Qec3N5ITRf5MwhIzsAxUtH0IQIN3BE9gUNR2fRIppAYSyiZQ09NsDsU6AdBJXTpgte6P-Rc3prhveDBU8DdwGxaBcllJwbjjy1lL3MbciXyWgX4ZIj1quMKwdqZZ57hEx_lt9FRLw"
   
# get all the stacks for the admin tenant, here the tenant ID for admin project is f4b62d0d71f44126bd22c2f04251b3f1
# the header in the CURL GET call to the HEAT API as X-Auth-Token has the AUTH key generated earlier


curl -X GET http://11.11.1.158:8004/v1/f4b62d0d71f44126bd22c2f04251b3f1/stacks -H "X-Auth-Token: gAAAAABZ2dm6mYkFyY_YL2Dko47Ha8H_GPL-bowgPBfCN2Qec3N5ITRf5MwhIzsAxUtH0IQIN3BE9gUNR2fRIppAYSyiZQ09NsDsU6AdBJXTpgte6P-Rc3prhveDBU8DdwGxaBcllJwbjjy1lL3MbciXyWgX4ZIj1quMKwdqZZ57hEx_lt9FRLw"

# CURL POST call to the HEAT API of openstack with the headers as content-type as application/json.
# there is one more header (-H) having the X-Auth-Token which has the authentication token generared previously
# Please note that in the JSON body being sent to the HEAT API you can also appropriately add the Security Group for the instance to be attached to

curl -X POST http://11.11.1.158:8004/v1/f4b62d0d71f44126bd22c2f04251b3f1/stacks -H "Content-type: application/json" -H "X-Auth-Token: gAAAAABZ2hB-tNCYYZ71ESKM_4QCU_PrrlYYb4winxKe6E-3qpUPx8eHaxWhNypwKupKSvHU3_KZpkZswd0jQ3QFIVDMqDpqbOIBwajb3CiP_Q6JVtp6Neu892n23pAYjrntk3VnuWxJX3zqjNTFxECziYtAmFoYIhp5rRFjqmR9escAOFflLFg" -d \
'{
    "stack_name": "teststack",
    "template": {
        "heat_template_version": "2017-02-24",
        "description": "Simple template to test heat commands",
        "resources": {
            "restapiheatstackservers": {
                "type": "OS::Nova::Server",
                "properties": {
                    "key_name": "key",
                    "flavor": "m1.tiny",
                    "image": "d66b73e7-cb0c-42c5-bf73-d5bbdf245da5",
                    "networks": [
                      {
                        "network": "internal0"
                      }
                     ]
                }
            }
        }
    },
    "timeout_mins": 60
}'

# Stack result of the curl command that is shown as the above CURL POST creates the stack

{"stack": {"id": "8202c7a1-3011-4b7c-87d1-93a470c34101", "links": [{"href": "http://11.11.1.158:8004/v1/f4b62d0d71f44126bd22c2f04251b3f1/stacks/teststack/8202c7a1-3011-4b7c-87d1-93a470c34101", "rel": "self"}]}}

# get the nova instance Port IP details
# This makes a CURL GET call to the NOVA API for the tenant ID. 
# Please note that the URL also contains the ID of the Nova Instance created by the previous HEAT API call
# this is to get the port_id of the instance created by the previous heat API Call

curl -X GET http://11.11.1.158:8774/v2.1/f4b62d0d71f44126bd22c2f04251b3f1/servers/94d359d4-5ea2-42ac-9d0c-afe5d58bb956/os-interface -H "X-Auth-Token: gAAAAABZ2hB-tNCYYZ71ESKM_4QCU_PrrlYYb4winxKe6E-3qpUPx8eHaxWhNypwKupKSvHU3_KZpkZswd0jQ3QFIVDMqDpqbOIBwajb3CiP_Q6JVtp6Neu892n23pAYjrntk3VnuWxJX3zqjNTFxECziYtAmFoYIhp5rRFjqmR9escAOFflLFg" | python -mjson.tool


# Associate the floating IP to the Instance port ID
# this is a CURL POST request to the Neutron API on port 9696 that is neutron port
# the header contains the -H for the content-type as application/json 
# the header also contains (the other -H option) to send the X-Auth-Token to the Neutron REST API

curl -X POST http://11.11.1.158:9696/v2.0/floatingips -H "Content-type: application/json" -H "X-Auth-Token: gAAAAABZ2hB-tNCYYZ71ESKM_4QCU_PrrlYYb4winxKe6E-3qpUPx8eHaxWhNypwKupKSvHU3_KZpkZswd0jQ3QFIVDMqDpqbOIBwajb3CiP_Q6JVtp6Neu892n23pAYjrntk3VnuWxJX3zqjNTFxECziYtAmFoYIhp5rRFjqmR9escAOFflLFg" -d \
'{
    "floatingip": {
        "floating_network_id": "27d8c6cd-f905-48db-bcc7-d36f36bfecc7",
        "port_id": "298951f4-238c-4f16-ac5b-15d42b3a2d57",
        "description": "floating ip for testing"
    }
}'


Monday, December 12, 2016

Deploying an very basic instance on OpenStack Mitaka using a simple heat orchestration template and associate a Floating IP to the simple stack

Deploying an very basic instance on OpenStack using a simple heat template


The below is a simple sample template which we will use
=========================================================
heat_template_version: 2013-05-23

description: Simple template to deploy a single compute instance

parameters:
  image:
    type: string
    label: Image name or ID
    description: Image to be used for compute instance
    default: cirros-0.3.3-x86_64
  flavor:
    type: string
    label: Flavor
    description: Type of instance (flavor) to be used
    default: m1.small
  key:
    type: string
    label: Key name
    description: Name of key-pair to be used for compute instance
    default: my_key
  private_network:
    type: string
    label: Private network name or ID
    description: Network to attach instance to.
    default: private-net

resources:
  my_instance:
    type: OS::Nova::Server
    properties:
      image: { get_param: image }
      flavor: { get_param: flavor }
      key_name: { get_param: key }
      networks:
        - network: { get_param: private_network }
      user_data: |
        #!/bin/sh
        echo "Hello, World!"
      user_data_format: RAW

outputs:
  instance_name:
    description: Name of the instance
    value: { get_attr: [my_instance, name] }
  instance_ip:
    description: IP address of the instance
    value: { get_attr: [my_instance, first_address] }



The above file has to be copied in the form of an YAML file


We will Need to specify the above in the heat template YAML file: network, instance, flavor, security keys also the instance name

Lets get the information on the resources from the existing OpenStack Setup


Source the required credentials


[root@controller ~]# . keystonerc_admin

See the available flavors
==========================
[root@controller ~(keystone_admin)]# openstack flavor list
+----+-----------+-------+------+-----------+-------+-----------+
| ID | Name      |   RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+-----------+-------+------+-----------+-------+-----------+
| 1  | m1.tiny   |   512 |    1 |         0 |     1 | True      |
| 2  | m1.small  |  2048 |   20 |         0 |     1 | True      |
| 3  | m1.medium |  4096 |   40 |         0 |     2 | True      |
| 4  | m1.large  |  8192 |   80 |         0 |     4 | True      |
| 5  | m1.xlarge | 16384 |  160 |         0 |     8 | True      |
+----+-----------+-------+------+-----------+-------+-----------+


See the available images
========================
[root@controller ~(keystone_admin)]# openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| 44bb15d9-a970-40c4-8b77-a7e71b170659 | Cirros | active |
+--------------------------------------+--------+--------+
[root@controller ~(keystone_admin)]#


See the available networks in neutron
=====================================
[root@controller ~(keystone_admin)]# neutron net-list
+--------------------------------------+-----------+-------------------------------------------------------+
| id                                   | name      | subnets                                               |
+--------------------------------------+-----------+-------------------------------------------------------+
| 60ca0e7b-3c40-482c-92d1-3b4da4126e9d | testnet1  | 8fd08288-a83b-44ee-ac04-f8b88fc69628 172.16.15.0/24   |
| 8649a5a8-c137-444d-950d-e0c0569e3ee4 | internal1 | bd5b5a96-eaf5-45a8-93e5-6be837e61414 172.16.16.0/24   |
| 001ac29b-1f5f-4498-a44b-de0f809d2322 | external  | cf1da694-4a75-4768-b758-859dc750a02d 192.168.205.0/24 |
+--------------------------------------+-----------+-------------------------------------------------------+


See the available subnets in the neutron
========================================
[root@controller ~(keystone_admin)]# neutron subnet-list
+--------------------------------------+--------------+------------------+--------------------------------------------------------+
| id                                   | name         | cidr             | allocation_pools                                       |
+--------------------------------------+--------------+------------------+--------------------------------------------------------+
| 8fd08288-a83b-44ee-ac04-f8b88fc69628 | testsub      | 172.16.15.0/24   | {"start": "172.16.15.2", "end": "172.16.15.254"}       |
| bd5b5a96-eaf5-45a8-93e5-6be837e61414 | internal1sub | 172.16.16.0/24   | {"start": "172.16.16.2", "end": "172.16.16.254"}       |
| cf1da694-4a75-4768-b758-859dc750a02d | extsub       | 192.168.205.0/24 | {"start": "192.168.205.101", "end": "192.168.205.254"} |
+--------------------------------------+--------------+------------------+--------------------------------------------------------+

See the available keypairs for the project
==========================================
[root@controller ~(keystone_admin)]# openstack keypair list
+------+-------------------------------------------------+
| Name | Fingerprint                                     |
+------+-------------------------------------------------+
| key1 | 2f:40:44:36:1d:b9:ab:cd:b6:57:24:c7:70:dc:8c:f7 |
+------+-------------------------------------------------+
[root@controller ~(keystone_admin)]#


Lets edit the YAML file which will look like below now

heat_template_version: 2013-05-23

description: Simple template to deploy a single compute instance

parameters:
  image:
    type: string
    label: Image name or ID
    description: Image to be used for compute instance
    default: Cirros
  flavor:
    type: string
    label: Flavor
    description: Type of instance (flavor) to be used
    default: m1.tiny
  key:
    type: string
    label: Key name
    description: Name of key-pair to be used for compute instance
    default: key1
  private_network:
    type: string
    label: Private network name or ID
    description: Network to attach instance to.
    default: internal1

resources:
  my_instance:
    type: OS::Nova::Server
    properties:
      image: { get_param: image }
      flavor: { get_param: flavor }
      key_name: { get_param: key }
      networks:
        - network: { get_param: private_network }
      user_data: |
        #!/bin/sh
        echo "Hello, World!"
      user_data_format: RAW

outputs:
  instance_name:
    description: Name of the instance
    value: { get_attr: [my_instance, name] }
  instance_ip:
    description: IP address of the instance
    value: { get_attr: [my_instance, first_address] }




Lets copy this YAML file in the OpenStack server as the file heatstack1.yaml


Create the stack syntax:

heat stack-create <Name of the Stack> -f <file containing YAML information of the stack>

heat stack-create stack1 -f heatstack1.yaml


Create the stack using the YAML file
====================================

[root@controller ~(keystone_admin)]# heat stack-create stack1 -f heatstack1.yaml
+--------------------------------------+------------+--------------------+---------------------+--------------+
| id                                   | stack_name | stack_status       | creation_time       | updated_time |
+--------------------------------------+------------+--------------------+---------------------+--------------+
| 5ab8fe95-7ea3-4530-86de-facae9f52c71 | stack1     | CREATE_IN_PROGRESS | 2016-12-07T06:31:07 | None         |
+--------------------------------------+------------+--------------------+---------------------+--------------+
[root@controller ~(keystone_admin)]#


See the list of the stacks
==========================
[root@controller ~(keystone_admin)]# heat stack-list
+--------------------------------------+------------+-----------------+---------------------+--------------+
| id                                   | stack_name | stack_status    | creation_time       | updated_time |
+--------------------------------------+------------+-----------------+---------------------+--------------+
| 5ab8fe95-7ea3-4530-86de-facae9f52c71 | stack1     | CREATE_COMPLETE | 2016-12-07T06:31:07 | None         |
+--------------------------------------+------------+-----------------+---------------------+--------------+
[root@controller ~(keystone_admin)]#
[root@controller ~(keystone_admin)]#


See more information on the Stack which is created
===================================================
[root@controller ~(keystone_admin)]# heat stack-show stack1
+-----------------------+----------------------------------------------------------------------------------------------------------------------------------+
| Property              | Value                                                                                                                            |
+-----------------------+----------------------------------------------------------------------------------------------------------------------------------+
| capabilities          | []                                                                                                                               |
| creation_time         | 2016-12-07T06:31:07                                                                                                              |
| description           | Simple template to deploy a single compute instance                                                                              |
| disable_rollback      | True                                                                                                                             |
| id                    | 5ab8fe95-7ea3-4530-86de-facae9f52c71                                                                                             |
| links                 | http://controller.example.com:8004/v1/f84cfac47c10472fb36c56dc149d3caa/stacks/stack1/5ab8fe95-7ea3-4530-86de-facae9f52c71 (self) |
| notification_topics   | []                                                                                                                               |
| outputs               | [                                                                                                                                |
|                       |   {                                                                                                                              |
|                       |     "output_value": "stack1-my_instance-rrmsgn57cvxy",                                                                           |
|                       |     "output_key": "instance_name",                                                                                               |
|                       |     "description": "Name of the instance"                                                                                        |
|                       |   },                                                                                                                             |
|                       |   {                                                                                                                              |
|                       |     "output_value": "172.16.16.5",                                                                                               |
|                       |     "output_key": "instance_ip",                                                                                                 |
|                       |     "description": "IP address of the instance"                                                                                  |
|                       |   }                                                                                                                              |
|                       | ]                                                                                                                                |
| parameters            | {                                                                                                                                |
|                       |   "OS::project_id": "f84cfac47c10472fb36c56dc149d3caa",                                                                          |
|                       |   "OS::stack_id": "5ab8fe95-7ea3-4530-86de-facae9f52c71",                                                                        |
|                       |   "OS::stack_name": "stack1",                                                                                                    |
|                       |   "image": "Cirros",                                                                                                             |
|                       |   "key": "key1",                                                                                                                 |
|                       |   "private_network": "internal1",                                                                                                |
|                       |   "flavor": "m1.tiny"                                                                                                            |
|                       | }                                                                                                                                |
| parent                | None                                                                                                                             |
| stack_name            | stack1                                                                                                                           |
| stack_owner           | None                                                                                                                             |
| stack_status          | CREATE_COMPLETE                                                                                                                  |
| stack_status_reason   | Stack CREATE completed successfully                                                                                              |
| stack_user_project_id | f7e5c9e4b80f4f1faf411c95880c1309                                                                                                 |
| tags                  | null                                                                                                                             |
| template_description  | Simple template to deploy a single compute instance                                                                              |
| timeout_mins          | None                                                                                                                             |
| updated_time          | None                                                                                                                             |
+-----------------------+----------------------------------------------------------------------------------------------------------------------------------+
[root@controller ~(keystone_admin)]#


Association of the floating IP to the instance
================================================
Asscoiate a floating IP to the instance. Create a floating IP if there are no free floating IPs available.

Get the information on all the networks, here the external is the external network in which the floating IP will get created.

[root@controller ~(keystone_admin)]# neutron net-list
+--------------------------------------+-----------+-------------------------------------------------------+
| id                                   | name      | subnets                                               |
+--------------------------------------+-----------+-------------------------------------------------------+
| 60ca0e7b-3c40-482c-92d1-3b4da4126e9d | testnet1  | 8fd08288-a83b-44ee-ac04-f8b88fc69628 172.16.15.0/24   |
| 8649a5a8-c137-444d-950d-e0c0569e3ee4 | internal1 | bd5b5a96-eaf5-45a8-93e5-6be837e61414 172.16.16.0/24   |
| 001ac29b-1f5f-4498-a44b-de0f809d2322 | external  | cf1da694-4a75-4768-b758-859dc750a02d 192.168.205.0/24 |
+--------------------------------------+-----------+-------------------------------------------------------+
[root@controller ~(keystone_admin)]# neutron floatingip-create externla^C
[root@controller ~(keystone_admin)]#


Create a floating IP in the external network
=============================================

[root@controller ~(keystone_admin)]# neutron floatingip-create external
Created a new floatingip:
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| description         |                                      |
| fixed_ip_address    |                                      |
| floating_ip_address | 192.168.205.105                      |
| floating_network_id | 001ac29b-1f5f-4498-a44b-de0f809d2322 |
| id                  | ab40dcbd-1082-424a-b0fb-135b8756bc91 |
| port_id             |                                      |
| router_id           |                                      |
| status              | DOWN                                 |
| tenant_id           | f84cfac47c10472fb36c56dc149d3caa     |
+---------------------+--------------------------------------+
[root@controller ~(keystone_admin)]#


Ensure the floating IP is listed and that the UUID of floating IP appears as free floating IP
===============================================================

[root@controller ~(keystone_admin)]# neutron floatingip-list
+--------------------------------------+------------------+---------------------+--------------------------------------+
| id                                   | fixed_ip_address | floating_ip_address | port_id                              |
+--------------------------------------+------------------+---------------------+--------------------------------------+
| 816e8bf9-7dec-4011-9333-f761b8b95c15 | 172.16.15.3      | 192.168.205.104     | 69d9cde5-e06d-4ecf-9f87-0f91cb06a653 |
| ab40dcbd-1082-424a-b0fb-135b8756bc91 |                  | 192.168.205.105     |                                      |
| c1e1d2a7-7f5c-4b51-938e-eb064d5d1939 | 172.16.16.3      | 192.168.205.103     | 315b610f-54e1-404c-bac3-048feb37bc23 |
+--------------------------------------+------------------+---------------------+--------------------------------------+


See information of the new instance get the Private network IP of the same.
===============================================================

[root@controller ~(keystone_admin)]# nova list
+--------------------------------------+---------------------------------+--------+------------+-------------+----------------------------------------+
| ID                                   | Name                            | Status | Task State | Power State | Networks                               |
+--------------------------------------+---------------------------------+--------+------------+-------------+----------------------------------------+
| a2c265bb-242c-40ae-ae9c-98849e459bf7 | instance1                       | ACTIVE | -          | Running     | internal1=172.16.16.3, 192.168.205.103 |
| 5d767783-933e-423d-848f-37e816fa05b3 | stack1-my_instance-rrmsgn57cvxy | ACTIVE | -          | Running     | internal1=172.16.16.5                  |
+--------------------------------------+---------------------------------+--------+------------+-------------+----------------------------------------+

Find the neutron port for the instance this information is needed to associate the floating IP to the port of the instance
===============================================================
[root@controller ~(keystone_admin)]# neutron port-list | grep -i 172.16.16.5
| 42304108-f397-4de7-8936-5f011e4be5f3 |      | fa:16:3e:ff:52:0a | {"subnet_id": "bd5b5a96-eaf5-45a8-93e5-6be837e61414", "ip_address": "172.16.16.5"}     |
[root@controller ~(keystone_admin)]#
[root@controller ~(keystone_admin)]#


Associate the floating IP
=================
[root@controller ~(keystone_admin)]# neutron floatingip-associate ab40dcbd-1082-424a-b0fb-135b8756bc91 42304108-f397-4de7-8936-5f011e4be5f3
Associated floating IP ab40dcbd-1082-424a-b0fb-135b8756bc91
[root@controller ~(keystone_admin)]#

Ensure the floating IP is seen to be associated to the instance as in the nova list
========================================================================

[root@controller ~(keystone_admin)]# nova list
+--------------------------------------+---------------------------------+--------+------------+-------------+----------------------------------------+
| ID                                   | Name                            | Status | Task State | Power State | Networks                               |
+--------------------------------------+---------------------------------+--------+------------+-------------+----------------------------------------+
| a2c265bb-242c-40ae-ae9c-98849e459bf7 | instance1                       | ACTIVE | -          | Running     | internal1=172.16.16.3, 192.168.205.103 |
| 5d767783-933e-423d-848f-37e816fa05b3 | stack1-my_instance-rrmsgn57cvxy | ACTIVE | -          | Running     | internal1=172.16.16.5, 192.168.205.105 |
+--------------------------------------+---------------------------------+--------+------------+-------------+----------------------------------------+
[root@controller ~(keystone_admin)]#


you can now use the keys and SSH to the instance.

Please note that the security group for the instance has to have the ingress SSH allowed for a successful SSH to the instance