3
# from charm-openstack-testing!
5
from neutronclient.v2_0 import client
7
from keystoneclient.v2_0 import client as ks_client
8
from keystoneclient.auth import identity
9
from keystoneclient import session
16
usage = """Usage: %prog [options] ext_net_name
20
%prog -g 192.168.21.1 -c 192.168.21.0/25 \\
21
-f 192.168.21.100:192.168.21.200 ext_net
24
if __name__ == '__main__':
25
parser = optparse.OptionParser(usage)
26
parser.add_option('-t', '--tenant',
27
help='Tenant name to create network for',
28
dest='tenant', action='store',
30
parser.add_option("-d", "--debug",
31
help="Enable debug logging",
32
dest="debug", action="store_true", default=False)
33
parser.add_option("-g", "--gateway",
34
help="Default gateway to use.",
35
dest="default_gateway", action="store", default=None)
36
parser.add_option("-c", "--cidr",
37
help="CIDR of external network.",
38
dest="cidr", action="store", default=None)
39
parser.add_option("-f", "--floating-range",
40
help="Range of floating IP's to use (separated by :).",
41
dest="floating_range", action="store", default=None)
42
parser.add_option("--network-type",
44
dest="network_type", action="store", default='gre')
45
(opts, args) = parser.parse_args()
52
logging.basicConfig(level=logging.DEBUG)
54
logging.basicConfig(level=logging.INFO)
57
subnet_name = '{}_subnet'.format(net_name)
59
if (opts.floating_range):
60
(start_floating_ip, end_floating_ip) = opts.floating_range.split(':')
62
start_floating_ip = None
63
end_floating_ip = None
65
# use session based authentication
66
ep = os.environ['OS_AUTH_URL']
67
if not ep.endswith('v2.0'):
68
ep = "{}/v2.0".format(ep)
69
print("ep: {}".format(ep))
70
auth = identity.v2.Password(username=os.environ['OS_USERNAME'],
71
password=os.environ['OS_PASSWORD'],
72
tenant_name=os.environ['OS_TENANT_NAME'],
74
sess = session.Session(auth=auth)
75
print("Session: {}".format(sess))
76
keystone = ks_client.Client(session=sess)
77
keystone.auth_ref = auth.get_access(sess)
78
print("Keystone: {}".format(keystone))
79
neutron_ep = keystone.service_catalog.url_for(
80
service_type='network', endpoint_type='publicURL')
81
print("neutron_ep: {}".format(neutron_ep))
82
neutron = client.Client(session=sess)
83
print("neutron: {}".format(neutron))
87
print("about to do tenants list")
88
print(keystone.tenants.list())
89
for tenant in [t._info for t in keystone.tenants.list()]:
90
if (tenant['name'] == (opts.tenant or os.environ['OS_TENANT_NAME'])):
91
tenant_id = tenant['id']
92
break # Tenant ID found - stop looking
94
logging.error("Unable to locate tenant id for %s.", opts.tenant)
96
print("tenant_id: {}".format(tenant_id))
98
networks = neutron.list_networks(name=net_name)
99
if len(networks['networks']) == 0:
100
logging.info("Configuring external network '%s'", net_name)
104
'router:external': True,
105
'tenant_id': tenant_id,
106
'provider:network_type': opts.network_type,
110
if opts.network_type == 'vxlan':
111
network_msg['network']['provider:segmentation_id'] = 1234
112
elif opts.network_type == 'vlan':
113
network_msg['network']['provider:segmentation_id'] = 2
114
network_msg['network']['provider:physical_network'] = 'physnet1'
115
elif opts.network_type == 'flat':
116
network_msg['network']['provider:physical_network'] = 'physnet1'
118
network_msg['network']['provider:segmentation_id'] = 2
120
logging.info('Creating new external network definition: %s', net_name)
121
network = neutron.create_network(network_msg)['network']
122
logging.info('New external network created: %s', network['id'])
124
logging.warning('Network %s already exists.', net_name)
125
network = networks['networks'][0]
127
subnets = neutron.list_subnets(name=subnet_name)
128
if len(subnets['subnets']) == 0:
131
'network_id': network['id'],
132
'enable_dhcp': False,
134
'tenant_id': tenant_id
137
if opts.default_gateway:
138
subnet_msg['gateway_ip'] = opts.default_gateway
140
subnet_msg['cidr'] = opts.cidr
141
if (start_floating_ip and end_floating_ip):
142
subnet_msg['allocation_pools'] = [{
143
'start': start_floating_ip,
144
'end': end_floating_ip
147
logging.info('Creating new subnet for %s', net_name)
148
subnet = neutron.create_subnet({'subnet': subnet_msg})['subnet']
149
logging.info('New subnet created: %s', subnet['id'])
151
logging.warning('Subnet %s already exists.', subnet_name)
152
subnet = subnets['subnets'][0]
154
routers = neutron.list_routers(name='provider-router')
155
if len(routers['routers']) == 0:
156
logging.info('Creating provider router for external network access')
157
router = neutron.create_router(
158
{'router': {'name': 'provider-router', 'tenant_id': tenant_id}}
160
logging.info('New router created: %s', (router['id']))
162
logging.warning('Router provider-router already exists.')
163
router = routers['routers'][0]
165
ports = neutron.list_ports(device_owner='network:router_gateway',
166
network_id=network['id'])
167
if len(ports['ports']) == 0:
168
logging.info('Plugging router into ext_net')
170
neutron.add_gateway_router(
172
body={'network_id': network['id']}))
173
logging.info('Router connected to %s', net_name)
175
logging.warning('Router already connect to %s', net_name)