From bd191cf78b52c731f5254b72c3f8af044505648e Mon Sep 17 00:00:00 2001
From: Rajdeep Dua <dua_rajdeep@yahoo.com>
Date: Tue, 8 Apr 2014 16:44:55 +0530
Subject: [PATCH] New Samples for Networking Neutron API

Change-Id: Ibcde30e0d24ef4909f8680608a504236f1cb3080
---
 doc/user-guide/section_sdk_neutron.xml | 544 +++++++++++++++++++++----
 1 file changed, 475 insertions(+), 69 deletions(-)

diff --git a/doc/user-guide/section_sdk_neutron.xml b/doc/user-guide/section_sdk_neutron.xml
index c57698e0ed..b92598eee4 100644
--- a/doc/user-guide/section_sdk_neutron.xml
+++ b/doc/user-guide/section_sdk_neutron.xml
@@ -5,108 +5,163 @@
     xml:id="sdk_neutron_apis">
     <title>Networking</title>
     <?dbhtml stop-chunking?>
-  <para>To use the information in this section, you should
-    have a general understanding of OpenStack Networking,
-    OpenStack Compute, and the integration between the two. You
-    should also have access to a plug-in that implements the
-    Networking API v2.0.</para>
+    <para>To use the information in this section, you should have a
+        general understanding of OpenStack Networking, OpenStack
+        Compute, and the integration between the two. You should also
+        have access to a plug-in that implements the Networking API
+        v2.0.</para>
     <section xml:id="sdk_neutron_env">
-      <title>Set environment variables</title>
-      <para>Make sure that you set the relevant environment variables
-      appropriately.</para>
-    <para>As an example, see the sample shell file that sets the
-      variables used to get credentials:</para>
-      <programlisting language="bash">export OS_USERNAME="<replaceable>admin</replaceable>"
+        <title>Set environment variables</title>
+        <para>Make sure that you set the relevant environment
+            variables.</para>
+        <para>As an example, see the sample shell file that sets these
+            variables to get credentials:</para>
+        <programlisting language="bash">export OS_USERNAME="admin"
 export OS_PASSWORD="<replaceable>password</replaceable>"
 export OS_TENANT_NAME="admin"
 export OS_AUTH_URL="http://<replaceable>IPADDRESS</replaceable>/v2.0"</programlisting>
     </section>
-    <section xml:id="sdk_neutron_common_code">
-      <title>Get credentials</title>
-      <para>The examples in this section use the following common <code>get_credentials</code> method:</para>
-      <programlisting language="python">def get_credentials():
+    <section xml:id="sdk_neutron_get_credentials">
+        <title>Get credentials</title>
+        <para>The examples in this section use the
+                <code>get_credentials</code> method:</para>
+        <programlisting language="python">def get_credentials():
     d = {}
     d['username'] = os.environ['OS_USERNAME']
     d['password'] = os.environ['OS_PASSWORD']
     d['auth_url'] = os.environ['OS_AUTH_URL']
     d['tenant_name'] = os.environ['OS_TENANT_NAME']
     return d</programlisting>
-      <para>This code is assumed to exist in the <filename>credentials.py</filename> file, which all
-      samples import.</para>
+        <para>This code resides in the
+                <filename>credentials.py</filename> file, which all
+            samples import.</para>
+        <para>Use the <code>get_credentials()</code> method to
+            populate and get a dictionary:</para>
+        <programlisting language="python">credentials = get_credentials()</programlisting>
     </section>
-    <?hard-pagebreak?>
-    <section xml:id="sdk_neutron_create_network">
-      <title>Create network</title>
-      <para>The following program creates a network:</para>
-      <programlisting language="python">from neutronclient.v2_0 import client
-from credentials import get_credentials
-from utils import print_networks
+     <section xml:id="sdk_neutron_get_nova_credentials">
+        <title>Get Nova Credentials</title>
+        <para>Few examples in this section use the
+                <code>get_nova_credentials</code> method:</para>
+        <programlisting language="python">def get_nova_credentials():
+    d = {}
+    d['username'] = os.environ['OS_USERNAME']
+    d['api_key'] = os.environ['OS_PASSWORD']
+    d['auth_url'] = os.environ['OS_AUTH_URL']
+    d['project_id'] = os.environ['OS_TENANT_NAME']
+    return d</programlisting>
+        <para>This code resides in the
+                <filename>credentials.py</filename> file, which all
+            samples import.</para>
+        <para>Use the <code>get_nova_credentials()</code> method to
+            populate and get a dictionary:</para>
+        <programlisting language="python">nova_credentials = get_nova_credentials()
+        </programlisting>
+    </section>
+     <section xml:id="sdk_neutron_print_values">
+        <title>Print Values</title>
+        <para>The examples in this section use the
+            <code>print_values</code> and <code>print_values_server</code>
+            methods:</para>
+        <programlisting language="python">def print_values(val, type):
+    if type == 'ports':
+        val_list = val['ports']
+    if type == 'networks':
+        val_list = val['networks']
+    if type == 'routers':
+        val_list = val['routers']
+    for p in val_list:
+        for k, v in p.items():
+            print("%s : %s" % (k, v))
+        print('\n')
 
-network_name = "sample_network"
+
+def print_values_server(val, server_id, type):
+    if type == 'ports':
+        val_list = val['ports']
+
+    if type == 'networks':
+        val_list = val['networks']
+    for p in val_list:
+        bool = False
+        for k, v in p.items():
+            if k == 'device_id' and v == server_id:
+                bool = True
+        if bool:
+            for k, v in p.items():
+                print("%s : %s" % (k, v))
+            print('\n')</programlisting>
+        <para>This code resides in the
+        <filename>utils.py</filename> file, which all samples import.</para>
+    </section>
+    <section xml:id="sdk_neutron_create_network">
+        <title>Create network</title>
+        <para>The following program creates a network:</para>
+        <programlisting language="python">#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+from neutronclient.v2_0 import client
+from credentials import get_credentials
+
+network_name = 'sample_network'
 credentials = get_credentials()
 neutron = client.Client(**credentials)
 try:
-    body_sample = {
-        "network":
-        {
-           "name": network_name,
-           "admin_state_up": True
-        }
-       }
+    body_sample = {'network': {'name': network_name,
+                   'admin_state_up': True}}
+
     netw = neutron.create_network(body=body_sample)
     net_dict = netw['network']
     network_id = net_dict['id']
-    print "Network %s created" % network_id
+    print('Network %s created' % network_id)
 
-    body_create_subnet = {
-      "subnets":[
-          {
-             "cidr":"192.168.199.0/24",
-             "ip_version":4,
-             "network_id": network_id
-          }
-      ]
-    }
+    body_create_subnet = {'subnets': [{'cidr': '192.168.199.0/24',
+                          'ip_version': 4, 'network_id': network_id}]}
 
     subnet = neutron.create_subnet(body=body_create_subnet)
-    print "Created subnet %s" % subnet
+    print('Created subnet %s' % subnet)
 finally:
-    print "Execution completed"
-    #neutron.delete_network(network_id)
-    #print "Deleted Network %s" %network_id</programlisting>
+    print("Execution completed")</programlisting>
     </section>
     <section xml:id="sdk_neutron_list_networks">
-      <title>List networks</title>
-      <para>The following program lists networks:</para>
-      <programlisting language="python">from neutronclient.v2_0 import client
+        <title>List networks</title>
+        <para>The following program lists networks:</para>
+        <programlisting language="python">#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+from neutronclient.v2_0 import client
 from credentials import get_credentials
 from utils import print_values
 
-
 credentials = get_credentials()
 neutron = client.Client(**credentials)
 netw = neutron.list_networks()
 
 print_values(netw, 'networks')</programlisting>
+        <para>For <code>print_values</code> see <xref
+          linkend="sdk_neutron_print_values"/>.
+        </para>
     </section>
     <section xml:id="sdk_neutron_create_port">
-      <title>Create port</title>
-      <para>The following program creates a port:</para>
-      <programlisting language="python">from neutronclient.v2_0 import client
+        <title>Create ports</title>
+        <para>The following program creates a port:</para>
+        <programlisting language="python">#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+from neutronclient.v2_0 import client
 import novaclient.v1_1.client as nvclient
 from credentials import get_credentials
-from utils import print_values_server
 from credentials import get_nova_credentials
 
 credentials = get_nova_credentials()
 nova_client = nvclient.Client(**credentials)
 
-#replace with server_id and network_id from your environment
+# Replace with server_id and network_id from your environment
 
 server_id = '9a52795a-a70d-49a8-a5d0-5b38d78bd12d'
 network_id = 'ce5d204a-93f5-43ef-bd89-3ab99ad09a9a'
 server_detail = nova_client.servers.get(server_id)
-print server_detail.id
+print(server_detail.id)
 
 if server_detail != None:
     credentials = get_credentials()
@@ -121,31 +176,382 @@ if server_detail != None:
                       }
                  }
     response = neutron.create_port(body=body_value)
-    print response</programlisting>
+    print(response)</programlisting>
+    <para>For <code>get_nova_credentials</code> see <xref
+          linkend="sdk_neutron_get_nova_credentials"/>.
+    </para>
+     <para>For <code>get_credentials</code> see <xref
+          linkend="sdk_neutron_get_credentials"/>.
+     </para>
     </section>
     <section xml:id="sdk_neutron_list_ports">
-      <title>List ports</title>
-      <para>The following program lists ports:</para>
-      <programlisting language="python">from neutronclient.v2_0 import client
+        <title>List ports</title>
+        <para>The following program lists ports:</para>
+        <programlisting language="python">#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+from neutronclient.v2_0 import client
 from credentials import get_credentials
 from utils import print_values
 
 credentials = get_credentials()
 neutron = client.Client(**credentials)
 ports = neutron.list_ports()
-print print_values(ports, 'ports')</programlisting>
+print_values(ports, 'ports')</programlisting>
+    <para>For <code>get_credentials</code> see <xref
+          linkend="sdk_neutron_get_credentials"/>.
+    </para>
+    <para>For <code>print_values</code> see <xref
+          linkend="sdk_neutron_print_values"/>.
+    </para>
     </section>
     <section xml:id="sdk_neutron_list_server_ports">
-      <title>List server ports</title>
-      <para>The following program lists the ports for a server:</para>
-      <programlisting language="python">from neutronclient.v2_0 import client
-from credentials import get_credentials
-from utils import print_values
+        <title>List server ports</title>
+        <para>The following program lists the ports for a
+            server:</para>
+        <programlisting language="python">#!/usr/bin/python
+# -*- coding: utf-8 -*-
 
+from neutronclient.v2_0 import client
+import novaclient.v1_1.client as nvclient
+from credentials import get_credentials
+from credentials import get_nova_credentials
+from utils import print_values_server
+
+credentials = get_nova_credentials()
+nova_client = nvclient.Client(**credentials)
+
+# change these values according to your environment
+
+server_id = '9a52795a-a70d-49a8-a5d0-5b38d78bd12d'
+network_id = 'ce5d204a-93f5-43ef-bd89-3ab99ad09a9a'
+server_detail = nova_client.servers.get(server_id)
+print(server_detail.id)
+
+if server_detail is not None:
+    credentials = get_credentials()
+    neutron = client.Client(**credentials)
+    ports = neutron.list_ports()
+
+    print_values_server(ports, server_id, 'ports')
+    body_value = {'port': {
+        'admin_state_up': True,
+        'device_id': server_id,
+        'name': 'port1',
+        'network_id': network_id,
+        }}
+
+    response = neutron.create_port(body=body_value)
+    print(response)</programlisting>
+    </section>
+    <section xml:id="create-router-add-port-to-subnet">
+        <title>Create router and add port to subnet</title>
+        <para>This example queries OpenStack Networking to create a
+            router and add a port to a subnet.</para>
+        <procedure>
+            <title>To create a router and add a port to a
+                subnet</title>
+            <step>
+                <para>Import the following modules:</para>
+                <programlisting language="python">from neutronclient.v2_0 import client
+import novaclient.v1_1.client as nvclient
+from credentials import get_credentials
+from credentials import get_nova_credentials
+from utils import print_values_server</programlisting>
+            </step>
+            <step>
+                <para>Get Nova Credentials. See <xref
+                        linkend="sdk_neutron_get_nova_credentials"
+                    />.</para>
+            </step>
+            <step>
+                <para>Instantiate the <literal>nova_client</literal>
+                    client object by using the
+                        <literal>credentials</literal> dictionary
+                    object:</para>
+                <programlisting language="python">nova_client = nvclient.Client(**credentials)</programlisting>
+            </step>
+            <step>
+                <para>Create a router and add a port to the
+                    subnet:</para>
+                <programlisting language="python"># Replace with server_id and network_id from your environment
+
+router_id = '72cf1682-60a8-4890-b0ed-6bad7d9f5466'
+network_id = '81bf592a-9e3f-4f84-a839-ae87df188dc1'
 
 credentials = get_credentials()
 neutron = client.Client(**credentials)
-ports = neutron.list_ports()
-print print_values(ports, 'ports')</programlisting>
+router = neutron.show_router(router_id)
+print(router)
+body_value = {'port': {
+    'admin_state_up': True,
+    'device_id': router_id,
+    'name': 'port1',
+    'network_id': network_id,
+    }}
+
+response = neutron.create_port(body=body_value)
+print(response)
+print("Execution Completed")</programlisting>
+            </step>
+        </procedure>
+        <example>
+            <title>Create router: complete code listing</title>
+            <programlisting language="python">#!/usr/bin/python
+# -*- coding: utf-8 -*-
+from neutronclient.v2_0 import client
+import novaclient.v1_1.client as nvclient
+from credentials import get_credentials
+from credentials import get_nova_credentials
+from utils import print_values_server
+
+credentials = get_nova_credentials()
+nova_client = nvclient.Client(**credentials)
+
+# Replace with server_id and network_id from your environment
+
+router_id = '72cf1682-60a8-4890-b0ed-6bad7d9f5466'
+network_id = '81bf592a-9e3f-4f84-a839-ae87df188dc1'
+try:
+    credentials = get_credentials()
+    neutron = client.Client(**credentials)
+    router = neutron.show_router(router_id)
+    print(router)
+    body_value = {'port': {
+        'admin_state_up': True,
+        'device_id': router_id,
+        'name': 'port1',
+        'network_id': network_id,
+        }}
+
+    response = neutron.create_port(body=body_value)
+    print(response)
+finally:
+    print("Execution completed")</programlisting>
+        </example>
     </section>
-  </section>
+    <section xml:id="delete-network">
+        <title>Delete a network</title>
+        <para>This example queries OpenStack Networking to delete a
+            network.</para>
+        <procedure>
+            <title>To delete a network</title>
+            <step>
+                <para>Import the following modules:</para>
+                <programlisting language="python">from neutronclient.v2_0 import client
+from credentials import get_credentials</programlisting>
+            </step>
+            <step>
+                <para>Get credentials. See <xref
+                        linkend="sdk_neutron_get_credentials"/>.
+                </para>
+            </step>
+            <step>
+                <para>Instantiate the <literal>neutron</literal>
+                    client object by using the
+                        <literal>credentials</literal> dictionary
+                    object:</para>
+                <programlisting language="python">neutron = client.Client(**credentials)</programlisting>
+            </step>
+            <step>
+                <para>Delete the network:</para>
+                <programlisting language="python">body_sample = {'network': {'name': network_name,
+               'admin_state_up': True}}
+
+netw = neutron.create_network(body=body_sample)
+net_dict = netw['network']
+network_id = net_dict['id']
+print('Network %s created' % network_id)
+
+body_create_subnet = {'subnets': [{'cidr': '192.168.199.0/24',
+                      'ip_version': 4, 'network_id': network_id}]}
+
+subnet = neutron.create_subnet(body=body_create_subnet)
+print('Created subnet %s' % subnet)
+
+neutron.delete_network(network_id)
+print('Deleted Network %s' % network_id)
+
+print("Execution completed")</programlisting>
+            </step>
+        </procedure>
+        <example>
+            <title>Delete network: complete code listing</title>
+            <programlisting language="python">#!/usr/bin/python
+# -*- coding: utf-8 -*-
+from neutronclient.v2_0 import client
+from credentials import get_credentials
+
+network_name = 'temp_network'
+credentials = get_credentials()
+neutron = client.Client(**credentials)
+try:
+    body_sample = {'network': {'name': network_name,
+                   'admin_state_up': True}}
+
+    netw = neutron.create_network(body=body_sample)
+    net_dict = netw['network']
+    network_id = net_dict['id']
+    print('Network %s created' % network_id)
+
+    body_create_subnet = {'subnets': [{'cidr': '192.168.199.0/24',
+                          'ip_version': 4, 'network_id': network_id}]}
+
+    subnet = neutron.create_subnet(body=body_create_subnet)
+    print('Created subnet %s' % subnet)
+
+    neutron.delete_network(network_id)
+    print('Deleted Network %s' % network_id)
+finally:
+    print("Execution Completed")</programlisting>
+        </example>
+    </section>
+    <section xml:id="list_routers">
+        <title>List routers</title>
+        <para>This example queries OpenStack Networking to list all
+            routers.</para>
+        <procedure>
+            <title>To list routers</title>
+            <step>
+                <para>Import the following modules:</para>
+                <programlisting language="python">from neutronclient.v2_0 import client
+from credentials import get_credentials
+from utils import print_values</programlisting>
+            </step>
+            <step>
+                <para>Get credentials. See <xref
+                        linkend="sdk_neutron_get_credentials"
+                    />.</para>
+            </step>
+            <step>
+                <para>Instantiate the <literal>neutron</literal>
+                    client object by using the
+                        <literal>credentials</literal> dictionary
+                    object:</para>
+                <programlisting language="python">neutron = client.Client(**credentials)</programlisting>
+            </step>
+            <step>
+                <para>List the routers</para>
+                <programlisting language="python">routers_list = neutron.list_routers(retrieve_all=True)
+print_values(routers_list, 'routers')
+print("Execution completed")</programlisting>
+                <para>For <code>print_values</code> see <xref
+                        linkend="sdk_neutron_print_values"
+                    />.</para>
+            </step>
+        </procedure>
+        <example>
+            <title>List routers: complete code listing</title>
+            <programlisting language="python">#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+from neutronclient.v2_0 import client
+from credentials import get_credentials
+from utils import print_values
+
+try:
+    credentials = get_credentials()
+    neutron = client.Client(**credentials)
+    routers_list = neutron.list_routers(retrieve_all=True)
+    print_values(routers_list, 'routers')
+finally:
+    print("Execution completed")</programlisting>
+        </example>
+    </section>
+    <section xml:id="list_security_groups">
+        <title>List security groups</title>
+        <para>This example queries OpenStack Networking to list
+            security groups.</para>
+        <procedure>
+            <title>To list security groups</title>
+            <step>
+                <para>Import the following modules:</para>
+                <programlisting language="python">from neutronclient.v2_0 import client
+from credentials import get_credentials
+from utils import print_values</programlisting>
+            </step>
+            <step>
+                <para>Get credentials. See <xref
+                        linkend="sdk_neutron_get_credentials"
+                    />.</para>
+            </step>
+            <step>
+                <para>Instantiate the <literal>neutron</literal>
+                    client object by using the
+                        <literal>credentials</literal> dictionary
+                    object:</para>
+                <programlisting language="python">neutron = client.Client(**credentials)</programlisting>
+            </step>
+            <step>
+                <para>List Security groups</para>
+                <programlisting language="python">sg = neutron.list_security_groups()
+print(sg)</programlisting>
+            </step>
+        </procedure>
+        <example>
+            <title>List security groups: complete code listing</title>
+            <programlisting language="python">#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+from neutronclient.v2_0 import client
+from credentials import get_credentials
+from utils import print_values
+
+credentials = get_credentials()
+neutron = client.Client(**credentials)
+sg = neutron.list_security_groups()
+print(sg)</programlisting>
+        </example>
+        <note>
+            <para>OpenStack Networking security groups are
+                case-sensitive while the <systemitem class="service"
+                    >nova-network</systemitem> security groups are
+                case-insensitive.</para>
+        </note>
+    </section>
+    <section xml:id="list_subnets">
+        <title>List subnets</title>
+        <para>This example queries OpenStack Networking to list
+            subnets.</para>
+        <procedure>
+            <title>To list subnets</title>
+            <step>
+                <para>Import the following modules:</para>
+                <programlisting language="python">from neutronclient.v2_0 import client
+from credentials import get_credentials
+from utils import print_values</programlisting>
+            </step>
+            <step>
+                <para>Get credentials. See <xref
+                        linkend="sdk_neutron_get_credentials"
+                    />.</para>
+            </step>
+            <step>
+                <para>Instantiate the <literal>neutron</literal>
+                    client object by using the
+                        <literal>credentials</literal> dictionary
+                    object:</para>
+                <programlisting language="python">neutron = client.Client(**credentials)</programlisting>
+            </step>
+            <step>
+                <para>List subnets:</para>
+                <programlisting language="python">subnets = neutron.list_subnets()
+print(subnets)</programlisting>
+            </step>
+        </procedure>
+        <example>
+            <title>List subnets: complete code listing</title>
+            <programlisting language="python">#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+from neutronclient.v2_0 import client
+from credentials import get_credentials
+from utils import print_values
+
+credentials = get_credentials()
+neutron = client.Client(**credentials)
+subnets = neutron.list_subnets()
+print(subnets)</programlisting>
+        </example>
+    </section>
+</section>