Merge lp:~gnuoy/openstack-charm-testing/ksv3 into lp:openstack-charm-testing

Proposed by Liam Young
Status: Rejected
Rejected by: Ryan Beisner
Proposed branch: lp:~gnuoy/openstack-charm-testing/ksv3
Merge into: lp:openstack-charm-testing
Diff against target: 487 lines (+448/-1)
6 files modified
bin/neutron-ext-net-ksv3 (+163/-0)
bin/neutron-tenant-net-ksv3 (+161/-0)
configure (+1/-1)
novarc (+13/-0)
novarcv3 (+13/-0)
profiles/defaultksv3 (+97/-0)
To merge this branch: bzr merge lp:~gnuoy/openstack-charm-testing/ksv3
Reviewer Review Type Date Requested Status
Ryan Beisner Needs Resubmitting
Review via email: mp+285693@code.launchpad.net
To post a comment you must log in.
177. By Liam Young

Add OS_AUTH_VERSION to make swift client Keystone v3 aware

Revision history for this message
Ryan Beisner (1chb1n) wrote :

I believe similar functionality was merged into o-c-t in a separate proposal. If that is not the case, please rebase and update this proposal. Thank you!

review: Needs Information
Revision history for this message
Ryan Beisner (1chb1n) wrote :

Closing MP, per previous comment, please resubmit if updates are still needed. Thank you!

review: Needs Resubmitting

Unmerged revisions

177. By Liam Young

Add OS_AUTH_VERSION to make swift client Keystone v3 aware

176. By Liam Young

Fix up novarc

175. By Liam Young

Fix router list

174. By Liam Young

Added ksv3 setup scripts

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'bin/neutron-ext-net-ksv3'
2--- bin/neutron-ext-net-ksv3 1970-01-01 00:00:00 +0000
3+++ bin/neutron-ext-net-ksv3 2016-02-12 13:19:26 +0000
4@@ -0,0 +1,163 @@
5+#!/usr/bin/python
6+
7+from keystoneclient.auth import identity
8+from keystoneclient import session, v3
9+from neutronclient.v2_0 import client
10+import optparse
11+import os
12+import sys
13+import logging
14+
15+
16+usage = """Usage: %prog [options] ext_net_name
17+
18+For example:
19+
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
22+"""
23+
24+if __name__ == '__main__':
25+ parser = optparse.OptionParser(usage)
26+ parser.add_option('-p', '--project',
27+ help='Project name to create network for',
28+ dest='project', action='store',
29+ default=None)
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",
43+ help="Network type.",
44+ dest="network_type", action="store", default='gre')
45+ (opts, args) = parser.parse_args()
46+
47+ if len(args) != 1:
48+ parser.print_help()
49+ sys.exit(1)
50+
51+ if opts.debug:
52+ logging.basicConfig(level=logging.DEBUG)
53+ else:
54+ logging.basicConfig(level=logging.INFO)
55+
56+ net_name = args[0]
57+ subnet_name = '{}_subnet'.format(net_name)
58+
59+ if (opts.floating_range):
60+ (start_floating_ip, end_floating_ip) = opts.floating_range.split(':')
61+ else:
62+ start_floating_ip = None
63+ end_floating_ip = None
64+
65+ auth = identity.v3.Password(
66+ user_domain_name=os.environ['OS_DEFAULT_DOMAIN'],
67+ username=os.environ['OS_USERNAME'],
68+ password=os.environ['OS_PASSWORD'],
69+ project_domain_name=os.environ['OS_PROJECT_DOMAIN_NAME'],
70+ project_name=os.environ['OS_PROJECT_NAME'],
71+ auth_url=os.environ['OS_AUTH_URL'])
72+ sess = session.Session(auth=auth)
73+
74+ # Clients support sessions
75+ keystone = v3.Client(session=sess)
76+ quantum = client.Client(session=sess)
77+
78+ # Resolve tenant id
79+ project_id = None
80+ for proj in [t._info for t in keystone.projects.list()]:
81+ if (proj['name'] ==
82+ (opts.project or os.environ['OS_PROJECT_NAME'])):
83+ project_id = proj['id']
84+ break # Tenant ID found - stop looking
85+ if not project_id:
86+ logging.error("Unable to locate project id for %s.", opts.tenant)
87+ sys.exit(1)
88+
89+ networks = quantum.list_networks(name=net_name)
90+ if len(networks['networks']) == 0:
91+ logging.info("Configuring external network '%s'", net_name)
92+ network_msg = {
93+ 'network': {
94+ 'name': net_name,
95+ 'router:external': True,
96+ 'tenant_id': project_id,
97+ 'provider:network_type': opts.network_type,
98+ }
99+ }
100+
101+ if opts.network_type == 'vxlan':
102+ network_msg['network']['provider:segmentation_id'] = 1234
103+ elif opts.network_type == 'vlan':
104+ network_msg['network']['provider:segmentation_id'] = 2
105+ network_msg['network']['provider:physical_network'] = 'physnet1'
106+ else:
107+ network_msg['network']['provider:segmentation_id'] = 2
108+
109+ logging.info('Creating new external network definition: %s', net_name)
110+ network = quantum.create_network(network_msg)['network']
111+ logging.info('New external network created: %s', network['id'])
112+ else:
113+ logging.warning('Network %s already exists.', net_name)
114+ network = networks['networks'][0]
115+
116+ subnets = quantum.list_subnets(name=subnet_name)
117+ if len(subnets['subnets']) == 0:
118+ subnet_msg = {
119+ 'name': subnet_name,
120+ 'network_id': network['id'],
121+ 'enable_dhcp': False,
122+ 'ip_version': 4,
123+ 'tenant_id': project_id
124+ }
125+
126+ if opts.default_gateway:
127+ subnet_msg['gateway_ip'] = opts.default_gateway
128+ if opts.cidr:
129+ subnet_msg['cidr'] = opts.cidr
130+ if (start_floating_ip and end_floating_ip):
131+ subnet_msg['allocation_pools'] = [
132+ {
133+ 'start': start_floating_ip,
134+ 'end': end_floating_ip
135+ }
136+ ]
137+
138+ logging.info('Creating new subnet for %s', net_name)
139+ subnet = quantum.create_subnet({'subnet': subnet_msg})['subnet']
140+ logging.info('New subnet created: %s', subnet['id'])
141+ else:
142+ logging.warning('Subnet %s already exists.', subnet_name)
143+ subnet = subnets['subnets'][0]
144+
145+ routers = quantum.list_routers(name='provider-router')
146+ if len(routers['routers']) == 0:
147+ logging.info('Creating provider router for external network access')
148+ router = quantum.create_router(
149+ {'router': {'name': 'provider-router', 'tenant_id': project_id}}
150+ )['router']
151+ logging.info('New router created: %s', (router['id']))
152+ else:
153+ logging.warning('Router provider-router already exists.')
154+ router = routers['routers'][0]
155+
156+ ports = quantum.list_ports(device_owner='network:router_gateway',
157+ network_id=network['id'])
158+ if len(ports['ports']) == 0:
159+ logging.info('Plugging router into ext_net')
160+ router = \
161+ quantum.add_gateway_router(
162+ router=router['id'],
163+ body={'network_id': network['id']}
164+ )
165+ logging.info('Router connected to %s', net_name)
166+ else:
167+ logging.warning('Router already connect to %s', net_name)
168
169=== added file 'bin/neutron-tenant-net-ksv3'
170--- bin/neutron-tenant-net-ksv3 1970-01-01 00:00:00 +0000
171+++ bin/neutron-tenant-net-ksv3 2016-02-12 13:19:26 +0000
172@@ -0,0 +1,161 @@
173+#!/usr/bin/python
174+
175+from keystoneclient.auth import identity
176+from keystoneclient import session, v3
177+from neutronclient.v2_0 import client
178+import optparse
179+import os
180+import sys
181+import logging
182+
183+usage = """Usage: %prog [options] name cidr
184+
185+For example:
186+
187+ %prog -t admin -r provider-router admin_net 10.5.5.0/24
188+
189+will create a new network for the admin tenant called 'admin_net' with a
190+default gateway of 10.5.5.1 and a dhcp allocation range of
191+10.5.5.2->10.5.5.254
192+"""
193+
194+if __name__ == '__main__':
195+ parser = optparse.OptionParser(usage)
196+ parser.add_option('-p', '--project',
197+ help='Project name to create network for',
198+ dest='project', action='store',
199+ default=None)
200+ parser.add_option('-s', '--shared',
201+ help='Create a shared rather than private network',
202+ dest='shared', action='store_true', default=False)
203+ parser.add_option('-r', '--router',
204+ help='Router to plug new network into',
205+ dest='router', action='store', default=None)
206+ parser.add_option("-d", "--debug",
207+ help="Enable debug logging",
208+ dest="debug", action="store_true", default=False)
209+ parser.add_option("-D", "--disable-dhcp",
210+ help="Disable dhcp on network",
211+ dest="dhcp", action="store_false", default=True)
212+ parser.add_option("-N", "--dns-nameservers",
213+ help="Comma separated list of dns servers to use.",
214+ dest="dns_servers", action="store", default=None)
215+ parser.add_option("--network-type",
216+ help="Network type.",
217+ dest="network_type", action="store", default='gre')
218+ (opts, args) = parser.parse_args()
219+
220+ if len(args) != 2:
221+ parser.print_help()
222+ sys.exit(1)
223+
224+ if opts.debug:
225+ logging.basicConfig(level=logging.DEBUG)
226+ else:
227+ logging.basicConfig(level=logging.INFO)
228+
229+ net_name = args[0]
230+ subnet_name = "{}_subnet".format(net_name)
231+ cidr = args[1]
232+
233+
234+ auth = identity.v3.Password(
235+ user_domain_name=os.environ['OS_DEFAULT_DOMAIN'],
236+ username=os.environ['OS_USERNAME'],
237+ password=os.environ['OS_PASSWORD'],
238+ project_domain_name=os.environ['OS_PROJECT_DOMAIN_NAME'],
239+ project_name=os.environ['OS_PROJECT_NAME'],
240+ auth_url=os.environ['OS_AUTH_URL'])
241+ sess = session.Session(auth=auth)
242+
243+ # Clients support sessions
244+ keystone = v3.Client(session=sess)
245+ quantum = client.Client(session=sess)
246+
247+ # Resolve tenant id
248+ project_id = None
249+ for proj in [t._info for t in keystone.projects.list()]:
250+ if (proj['name'] ==
251+ (opts.project or os.environ['OS_PROJECT_NAME'])):
252+ project_id = proj['id']
253+ break # Tenant ID found - stop looking
254+ if not project_id:
255+ logging.error("Unable to locate project id for %s.", opts.tenant)
256+ sys.exit(1)
257+
258+ # Create network
259+ networks = quantum.list_networks(name=net_name)
260+ if len(networks['networks']) == 0:
261+ logging.info('Creating tenant network: %s', net_name)
262+ network_msg = {
263+ 'network': {
264+ 'name': net_name,
265+ 'shared': opts.shared,
266+ 'tenant_id': project_id,
267+ 'provider:network_type': opts.network_type,
268+ }
269+ }
270+
271+ if opts.network_type == 'vxlan':
272+ network_msg['network']['provider:segmentation_id'] = 1233
273+ elif opts.network_type == 'vlan':
274+ network_msg['network']['provider:segmentation_id'] = 5
275+ network_msg['network']['provider:physical_network'] = 'physnet1'
276+ else:
277+ network_msg['network']['provider:segmentation_id'] = 5
278+
279+ network = quantum.create_network(network_msg)['network']
280+ else:
281+ logging.warning('Network %s already exists.', net_name)
282+ network = networks['networks'][0]
283+
284+ # Create subnet
285+ subnets = quantum.list_subnets(name=subnet_name)
286+ if len(subnets['subnets']) == 0:
287+ logging.info('Creating subnet for %s',
288+ net_name)
289+ subnet_msg = {
290+ 'subnet': {
291+ 'name': subnet_name,
292+ 'network_id': network['id'],
293+ 'enable_dhcp': opts.dhcp,
294+ 'cidr': cidr,
295+ 'ip_version': 4,
296+ 'tenant_id': project_id
297+ }
298+ }
299+ subnet = quantum.create_subnet(subnet_msg)['subnet']
300+ else:
301+ logging.warning('Subnet %s already exists.', subnet_name)
302+ subnet = subnets['subnets'][0]
303+
304+ # Update dns_nameservers
305+ if opts.dns_servers:
306+ msg = {
307+ 'subnet': {
308+ 'dns_nameservers': opts.dns_servers.split(',')
309+ }
310+ }
311+ logging.info('Updating dns_nameservers (%s) for subnet %s',
312+ opts.dns_servers,
313+ subnet_name)
314+ quantum.update_subnet(subnet['id'], msg)
315+
316+ # Plug subnet into router if provided
317+ if opts.router:
318+ routers = quantum.list_routers(name=opts.router)
319+ if len(routers['routers']) == 0:
320+ logging.error('Unable to locate provider router %s', opts.router)
321+ sys.exit(1)
322+ else:
323+ # Check to see if subnet already plugged into router
324+ ports = quantum.list_ports(device_owner='network:router_interface',
325+ network_id=network['id'])
326+ if len(ports['ports']) == 0:
327+ logging.info('Adding interface from %s to %s',
328+ opts.router, subnet_name)
329+ router = routers['routers'][0]
330+ quantum.add_interface_router(router['id'],
331+ {'subnet_id': subnet['id']})
332+ else:
333+ logging.warning('Router already connected to subnet')
334
335=== modified file 'configure'
336--- configure 2016-01-05 21:04:33 +0000
337+++ configure 2016-02-12 13:19:26 +0000
338@@ -1,6 +1,6 @@
339 #!/bin/sh
340
341-valid="default stsstack dellstack kernelstack ppc64el powerkvm lxd multihypervisor"
342+valid="default defaultksv3 stsstack dellstack kernelstack ppc64el powerkvm lxd multihypervisor"
343
344 usage() {
345 echo "$0 <profile>"
346
347=== modified file 'novarc'
348--- novarc 2014-02-27 15:35:17 +0000
349+++ novarc 2016-02-12 13:19:26 +0000
350@@ -1,4 +1,17 @@
351 #!/bin/bash
352+
353+# Stop Keystone v3 env polluting v2 env
354+unset OS_REGION_NAME
355+unset OS_DEFAULT_DOMAIN
356+unset OS_USER_DOMAIN_ID
357+unset OS_PROJECT_NAME
358+unset OS_IDENTITY_API_VERSION
359+unset OS_PASSWORD
360+unset OS_AUTH_URL
361+unset OS_USERNAME
362+unset OS_PROJECT_DOMAIN_NAME
363+unset OS_AUTH_VERSION
364+
365 export OS_USERNAME=admin
366 export OS_PASSWORD=openstack
367 export OS_TENANT_NAME=admin
368
369=== added file 'novarcv3'
370--- novarcv3 1970-01-01 00:00:00 +0000
371+++ novarcv3 2016-02-12 13:19:26 +0000
372@@ -0,0 +1,13 @@
373+#!/bin/bash
374+
375+export OS_USERNAME=admin
376+export OS_PASSWORD=openstack
377+export OS_REGION_NAME=RegionOne
378+export OS_AUTH_URL=${OS_AUTH_PROTOCOL:-http}://`juju-deployer -f keystone`:5000/v3
379+export OS_DEFAULT_DOMAIN=default
380+export OS_PROJECT_NAME=admin
381+export OS_PROJECT_DOMAIN_NAME=default
382+export OS_IDENTITY_API_VERSION=3
383+export export OS_USER_DOMAIN_ID=default
384+# Swift needs this:
385+export OS_AUTH_VERSION=3
386
387=== added file 'profiles/defaultksv3'
388--- profiles/defaultksv3 1970-01-01 00:00:00 +0000
389+++ profiles/defaultksv3 2016-02-12 13:19:26 +0000
390@@ -0,0 +1,97 @@
391+#!/bin/bash
392+
393+set -e
394+
395+function upload_image {
396+ src=$1
397+ image_name=$2
398+ image_file=$3
399+ case "$src" in
400+ swift) http_root="http://$SWIFT_IP:80/swift/v1/images";;
401+ cloudimages) http_root="http://cloud-images.ubuntu.com/${image_name}/current";;
402+ esac
403+ [ -f ~/images/$image_file ] || {
404+ wget -O ~/images/$image_file ${http_root}/${image_file}
405+ }
406+ openstack image show $image_name || {
407+ openstack image create --container-format=bare --disk-format=qcow2 --file=${HOME}/images/$image_file $image_name
408+ }
409+}
410+
411+# Install dependencies and CLI tools
412+# See also requirements.txt in tempest (probably need to sudo pip install -r requirements.txt)
413+sudo apt-get install git testrepository subunit python-nose python-lxml python-boto \
414+ python-junitxml python-subunit python-testresources python-oslotest python-stevedore \
415+ python-cinderclient python-glanceclient python-heatclient python-keystoneclient \
416+ python-neutronclient python-novaclient python-swiftclient python-ceilometerclient \
417+ openvswitch-test openvswitch-common -y
418+
419+# Set serverstack defaults, if not already set.
420+[[ -z "$GATEWAY" ]] && export GATEWAY="10.5.0.1"
421+[[ -z "$CIDR_EXT" ]] && export CIDR_EXT="10.5.0.0/16"
422+[[ -z "$FIP_RANGE" ]] && export FIP_RANGE="10.5.150.0:10.5.200.254"
423+[[ -z "$NAMESERVER" ]] && export NAMESERVER="10.245.160.2"
424+[[ -z "$CIDR_PRIV" ]] && export CIDR_PRIV="192.168.21.0/24"
425+[[ -z "$SWIFT_IP" ]] && export SWIFT_IP="10.245.161.162"
426+
427+# Accept network type as first parameter, assume gre if unspecified
428+net_type=${1:-"gre"}
429+
430+# If not on bare metal, add extra port to overcloud neutron-gateway and configure charm to use it
431+if [[ "${BARE_METAL^^}" != "TRUE" ]]; then
432+ unset OS_DEFAULT_DOMAIN OS_PROJECT_NAME OS_IDENTITY_API_VERSION OS_PROJECT_DOMAIN_NAME
433+ source ~/novarc
434+ ./bin/post-deploy-config neutron-gateway
435+fi
436+# Configure neutron networking on overcloud
437+source novarcv3
438+./bin/neutron-ext-net-ksv3 --network-type $net_type -g $GATEWAY -c $CIDR_EXT -f $FIP_RANGE ext_net
439+./bin/neutron-tenant-net-ksv3 --network-type $net_type -p admin -r provider-router -N $NAMESERVER private $CIDR_PRIV
440+
441+# Download images if not already present
442+mkdir -vp ~/images
443+upload_image cloudimages wily wily-server-cloudimg-amd64-disk1.img
444+upload_image cloudimages vivid vivid-server-cloudimg-amd64-disk1.img
445+upload_image cloudimages trusty trusty-server-cloudimg-amd64-disk1.img
446+upload_image cloudimages precise precise-server-cloudimg-amd64-disk1.img
447+upload_image swift cirros cirros-0.3.4-x86_64-disk.img
448+
449+# Create demo/testing users, tenants and flavor
450+openstack project show demo || openstack project create demo
451+openstack user show demo || openstack user create --project demo --password pass --enable --email demo@dev.null demo
452+openstack role show Member || openstack role create Member
453+openstack role add --user demo --project demo Member
454+openstack project show alt_demo || openstack project create alt_demo
455+openstack user show alt_demo || openstack user create --project alt_demo --password secret --enable --email alt_demo@dev.null alt_demo
456+openstack role add --user alt_demo --project alt_demo Member
457+
458+openstack flavor show m1.cirros || openstack flavor create --id 6 --ram 64 --disk 1 --vcpus 1 m1.cirros
459+openstack flavor show m1.tempest || openstack flavor create --id 7 --ram 256 --disk 5 --vcpus 1 m1.tempest
460+openstack flavor show m2.tempest || openstack flavor create --id 8 --ram 512 --disk 5 --vcpus 1 m2.tempest
461+exit 0
462+# Gather vars for tempest template
463+access=$(openstack ec2 credentials create --user demo --project demo | awk '/access/ {print $4}')
464+secret=$(openstack ec2 credentials show $access | awk '/secret/ {print $4}')
465+image_id=$(openstack image list | awk '/cirros/ {print $2}')
466+image_alt_id=$(openstack image list | awk '/precise/ {print $2}')
467+ext_net=$(openstack network list | awk '/ext_net/ {print $2}')
468+# This needs fixing:
469+router=$(neutron --os-user-domain-id default --os-project-domain-id default router-list | grep provider-router | awk '{ print $2}')
470+keystone=$(juju-deployer -f keystone)
471+dashboard=$(juju-deployer -f openstack-dashboard)
472+ncc=$(juju-deployer -f nova-cloud-controller)
473+http=${OS_AUTH_PROTOCOL:-http}
474+
475+# Insert vars into tempest conf
476+sed -e "s/__IMAGE_ID__/$image_id/g" -e "s/__IMAGE_ALT_ID__/$image_alt_id/g" \
477+ -e "s/__DASHBOARD__/$dashboard/g" -e "s/__KEYSTONE__/$keystone/g" \
478+ -e "s/__EXT_NET__/$ext_net/g" -e "s/__PROTO__/$http/g" \
479+ -e "s/__SWIFT__/$SWIFT_IP/g" \
480+ -e "s/__NAMESERVER__/$NAMESERVER/g" \
481+ -e "s/__CIDR_PRIV__/${CIDR_PRIV////\\/}/g" \
482+ -e "s/__NCC__/$ncc/g" -e "s/__SECRET__/$secret/g" -e "s/__ACCESS__/$access/g" \
483+ templates/tempest/tempest.conf.template > tempest.conf
484+
485+# Git tempest, place the rendered tempest template
486+[ -d tempest ] || git clone https://github.com/openstack/tempest
487+cp tempest.conf tempest/etc

Subscribers

People subscribed via source and target branches

to status/vote changes: