Merge lp:~gnuoy/openstack-charm-testing/ksv3 into lp:openstack-charm-testing
- ksv3
- Merge into trunk
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ryan Beisner | Needs Resubmitting | ||
Review via email: mp+285693@code.launchpad.net |
Commit message
Description of the change
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 : | # |
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 |
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!