~ivoks/charms/precise/nova-cloud-controller/ncc-neutronclient

« back to all changes in this revision

Viewing changes to files/create_ext_net.py

  • Committer: Adam Gandelman
  • Date: 2012-12-07 00:21:54 UTC
  • mfrom: (46.3.13 nova-cloud-controller)
  • Revision ID: adamg@canonical.com-20121207002154-n5p31om88d767x4i
Merge Quantum networking support from James Page.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/python
 
2
 
 
3
from quantumclient.v2_0 import client
 
4
import optparse
 
5
import os
 
6
import sys
 
7
import logging
 
8
 
 
9
 
 
10
usage = """Usage: %prog [options] ext_net_name
 
11
 
 
12
For example:
 
13
 
 
14
  %prog -g 192.168.21.1 -c 192.168.21.0/25 \\
 
15
      -f 192.168.21.100:192.168.21.200 ext_net
 
16
"""
 
17
 
 
18
if __name__ == '__main__':
 
19
    parser = optparse.OptionParser(usage)
 
20
    parser.add_option("-d", "--debug",
 
21
                      help="Enable debug logging",
 
22
                      dest="debug", action="store_true", default=False)
 
23
    parser.add_option("-g", "--gateway",
 
24
                      help="Default gateway to use.",
 
25
                      dest="default_gateway", action="store", default=None)
 
26
    parser.add_option("-c", "--cidr",
 
27
                      help="CIDR of external network.",
 
28
                      dest="cidr", action="store", default=None)
 
29
    parser.add_option("-f", "--floating-range",
 
30
                      help="Range of floating IP's to use (separated by :).",
 
31
                      dest="floating_range", action="store", default=None)
 
32
    (opts, args) = parser.parse_args()
 
33
 
 
34
    if len(args) != 1:
 
35
        parser.print_help()
 
36
        sys.exit(1)
 
37
 
 
38
    if opts.debug:
 
39
        logging.basicConfig(level=logging.DEBUG)
 
40
    else:
 
41
        logging.basicConfig(level=logging.INFO)
 
42
 
 
43
    net_name = args[0]
 
44
    subnet_name = '{}_subnet'.format(net_name)
 
45
 
 
46
    if (opts.floating_range):
 
47
        (start_floating_ip, end_floating_ip) = opts.floating_range.split(':')
 
48
    else:
 
49
        start_floating_ip = None
 
50
        end_floating_ip = None
 
51
 
 
52
    quantum = client.Client(username=os.environ['OS_USERNAME'],
 
53
                            password=os.environ['OS_PASSWORD'],
 
54
                            tenant_name=os.environ['OS_TENANT_NAME'],
 
55
                            auth_url=os.environ['OS_AUTH_URL'])
 
56
 
 
57
    networks = quantum.list_networks(name=net_name)
 
58
    if len(networks['networks']) == 0:
 
59
        logging.info('Configuring external bridge')
 
60
        network_msg = {
 
61
            'name': net_name,
 
62
            'router:external': True
 
63
        }
 
64
        logging.info('Creating new external network definition: %s',
 
65
                     net_name)
 
66
        network = quantum.create_network({'network': network_msg})['network']
 
67
        logging.info('New external network created: %s', network['id'])
 
68
    else:
 
69
        logging.warning('Network %s already exists.', net_name)
 
70
        network = networks['networks'][0]
 
71
 
 
72
    subnets = quantum.list_subnets(name=subnet_name)
 
73
    if len(subnets['subnets']) == 0:
 
74
        subnet_msg = {
 
75
            'name': subnet_name,
 
76
            'network_id': network['id'],
 
77
            'enable_dhcp': False,
 
78
            'ip_version': 4
 
79
        }
 
80
 
 
81
        if opts.default_gateway:
 
82
            subnet_msg['gateway_ip'] = opts.default_gateway
 
83
        if opts.cidr:
 
84
            subnet_msg['cidr'] = opts.cidr
 
85
        if (start_floating_ip and end_floating_ip):
 
86
            subnet_msg['allocation_pools'] = [
 
87
                    {
 
88
                    'start': start_floating_ip,
 
89
                    'end': end_floating_ip
 
90
                    }
 
91
             ]
 
92
 
 
93
        logging.info('Creating new subnet for %s', net_name)
 
94
        subnet = quantum.create_subnet({'subnet': subnet_msg})['subnet']
 
95
        logging.info('New subnet created: %s', subnet['id'])
 
96
    else:
 
97
        logging.warning('Subnet %s already exists.', subnet_name)
 
98
        subnet = subnets['subnets'][0]
 
99
 
 
100
    routers = quantum.list_routers(name='provider-router')
 
101
    if len(routers['routers']) == 0:
 
102
        logging.info('Creating provider router for external network access')
 
103
        router = quantum.create_router(
 
104
                        {'router': {'name': 'provider-router'}}
 
105
                        )['router']
 
106
        logging.info('New router created: %s', (router['id']))
 
107
    else:
 
108
        logging.warning('Router provider-router already exists.')
 
109
        router = routers['routers'][0]
 
110
 
 
111
    ports = quantum.list_ports(device_owner='network:router_gateway',
 
112
                               network_id=network['id'])
 
113
    if len(ports['ports']) == 0:
 
114
        logging.info('Plugging router into ext_net')
 
115
        router = \
 
116
            quantum.add_gateway_router(
 
117
                            router=router['id'],
 
118
                            body={'network_id': network['id']}
 
119
                            )
 
120
        logging.info('Router connected to %s', net_name)
 
121
    else:
 
122
        logging.warning('Router already connect to %s', net_name)