Merge lp:~thedac/openstack-mojo-specs/updated-os-clients into lp:openstack-mojo-specs

Proposed by David Ames
Status: Merged
Merged at revision: 305
Proposed branch: lp:~thedac/openstack-mojo-specs/updated-os-clients
Merge into: lp:openstack-mojo-specs
Diff against target: 649 lines (+178/-106)
8 files modified
helper/setup/image_setup.py (+4/-2)
helper/setup/keystone_setup.py (+9/-9)
helper/setup/keystone_users.yaml (+2/-2)
helper/setup/network_setup.py (+21/-26)
helper/tests/simple_os_checks.py (+16/-10)
helper/tests/test_obj_store.py (+4/-2)
helper/utils/kiki.py (+1/-0)
helper/utils/mojo_os_utils.py (+121/-55)
To merge this branch: bzr merge lp:~thedac/openstack-mojo-specs/updated-os-clients
Reviewer Review Type Date Requested Status
Ryan Beisner Approve
Review via email: mp+322401@code.launchpad.net

Description of the change

Update mojo utilities for keystone v3 and Ocata clients

To post a comment you must log in.
308. By David Ames

Allow insecure SSL connections

309. By David Ames

Fixes for v3 Overcloud

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

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'helper/setup/image_setup.py'
2--- helper/setup/image_setup.py 2015-10-14 16:34:53 +0000
3+++ helper/setup/image_setup.py 2017-04-13 21:13:22 +0000
4@@ -8,8 +8,9 @@
5
6 def main(argv):
7 mojo_utils.setup_logging()
8- overcloud_novarc = mojo_utils.get_overcloud_auth()
9- glance_client = mojo_os_utils.get_glance_client(overcloud_novarc)
10+ session = (
11+ mojo_os_utils.get_keystone_session(mojo_utils.get_overcloud_auth()))
12+ glance_client = mojo_os_utils.get_glance_session_client(session)
13 current_images = mojo_os_utils.get_images_list(glance_client)
14 image_config = mojo_utils.get_mojo_config('images.yaml')
15 cache_dir = '/tmp/img_cache'
16@@ -32,5 +33,6 @@
17 image_config[image]['disk_format'],
18 image_config[image]['container_format'])
19
20+
21 if __name__ == "__main__":
22 sys.exit(main(sys.argv))
23
24=== modified file 'helper/setup/keystone_setup.py'
25--- helper/setup/keystone_setup.py 2016-03-31 07:58:12 +0000
26+++ helper/setup/keystone_setup.py 2017-04-13 21:13:22 +0000
27@@ -8,21 +8,21 @@
28 mojo_utils.setup_logging()
29 overcloud_novarc = mojo_utils.get_overcloud_auth()
30 user_config = mojo_utils.get_mojo_config('keystone_users.yaml')
31+ keystone_session = mojo_os_utils.get_keystone_session(overcloud_novarc)
32+ keystone_client = (
33+ mojo_os_utils.get_keystone_session_client(keystone_session))
34 if overcloud_novarc.get('API_VERSION', 2) == 2:
35- keystone_client = mojo_os_utils.get_keystone_client(overcloud_novarc)
36- tenants = [user['tenant'] for user in user_config]
37- mojo_os_utils.tenant_create(keystone_client, tenants)
38+ projects = [user['project'] for user in user_config]
39+ mojo_os_utils.project_create(keystone_client, projects)
40 mojo_os_utils.user_create_v2(keystone_client, user_config)
41- mojo_os_utils.add_users_to_roles(keystone_client, user_config)
42+ # TODO validate this works without adding roles
43+ # mojo_os_utils.add_users_to_roles(keystone_client, user_config)
44 else:
45- keystone_session = mojo_os_utils.get_keystone_session(overcloud_novarc)
46- keystone_client = mojo_os_utils.get_keystone_session_client(
47- keystone_session)
48 for user in user_config:
49 mojo_os_utils.domain_create(keystone_client, [user['domain']])
50- mojo_os_utils.project_create(keystone_client, [user['tenant']],
51+ mojo_os_utils.project_create(keystone_client, [user['project']],
52 user['domain'])
53- mojo_os_utils.user_create_v3(keystone_client, user_config)
54+ mojo_os_utils.user_create_v3(keystone_client, user_config)
55
56
57 if __name__ == "__main__":
58
59=== modified file 'helper/setup/keystone_users.yaml'
60--- helper/setup/keystone_users.yaml 2016-03-31 07:44:24 +0000
61+++ helper/setup/keystone_users.yaml 2017-04-13 21:13:22 +0000
62@@ -1,14 +1,14 @@
63 - email: demo@dev.null
64 password: pass
65 roles: [_member_]
66- tenant: demo
67+ project: demo
68 username: demo
69 domain: norwich
70 scope: project
71 - email: alt_demo@dev.null
72 password: secret
73 roles: [_member_]
74- tenant: alt_demo
75+ project: alt_demo
76 username: alt_demo
77 domain: leeds
78 scope: project
79
80=== modified file 'helper/setup/network_setup.py'
81--- helper/setup/network_setup.py 2016-07-22 09:24:59 +0000
82+++ helper/setup/network_setup.py 2017-04-13 21:13:22 +0000
83@@ -8,18 +8,11 @@
84
85 def setup_sdn(net_topology, net_info):
86 overcloud_novarc = mojo_utils.get_overcloud_auth()
87- # Get os clients
88- if overcloud_novarc.get('API_VERSION', 2) == 2:
89- # V2 explicitly, or assume V2 if not defined
90- keystonec = mojo_os_utils.get_keystone_client(overcloud_novarc)
91- neutronc = mojo_os_utils.get_neutron_client(overcloud_novarc)
92- else:
93- # Not V2
94- keystone_session = mojo_os_utils.get_keystone_session(overcloud_novarc)
95- keystonec = mojo_os_utils.get_keystone_session_client(keystone_session)
96- neutronc = mojo_os_utils.get_neutron_session_client(keystone_session)
97- # Resolve the tenant name from the overcloud novarc into a tenant id
98- tenant_id = mojo_os_utils.get_tenant_id(
99+ keystone_session = mojo_os_utils.get_keystone_session(overcloud_novarc)
100+ keystonec = mojo_os_utils.get_keystone_session_client(keystone_session)
101+ neutronc = mojo_os_utils.get_neutron_session_client(keystone_session)
102+ # Resolve the project name from the overcloud novarc into a project id
103+ project_id = mojo_os_utils.get_project_id(
104 keystonec,
105 'admin',
106 api_version=overcloud_novarc['API_VERSION']
107@@ -27,42 +20,43 @@
108 # Create the external network
109 ext_network = mojo_os_utils.create_external_network(
110 neutronc,
111- tenant_id,
112+ project_id,
113 net_info.get('dvr_enabled', False),
114 net_info['external_net_name'])
115 mojo_os_utils.create_external_subnet(
116 neutronc,
117- tenant_id,
118+ project_id,
119 ext_network,
120 net_info['default_gateway'],
121 net_info['external_net_cidr'],
122 net_info['start_floating_ip'],
123 net_info['end_floating_ip'],
124 net_info['external_subnet_name'])
125- provider_router = mojo_os_utils.create_provider_router(neutronc, tenant_id)
126+ provider_router = (
127+ mojo_os_utils.create_provider_router(neutronc, project_id))
128 mojo_os_utils.plug_extnet_into_router(
129 neutronc,
130 provider_router,
131 ext_network)
132- tenant_network = mojo_os_utils.create_tenant_network(
133+ project_network = mojo_os_utils.create_project_network(
134 neutronc,
135- tenant_id,
136+ project_id,
137 shared=False,
138 network_type=net_info['network_type'])
139- tenant_subnet = mojo_os_utils.create_tenant_subnet(
140+ project_subnet = mojo_os_utils.create_project_subnet(
141 neutronc,
142- tenant_id,
143- tenant_network,
144+ project_id,
145+ project_network,
146 net_info['private_net_cidr'])
147 mojo_os_utils.update_subnet_dns(
148 neutronc,
149- tenant_subnet,
150+ project_subnet,
151 net_info['external_dns'])
152 mojo_os_utils.plug_subnet_into_router(
153 neutronc,
154 net_info['router_name'],
155- tenant_network,
156- tenant_subnet)
157+ project_network,
158+ project_subnet)
159
160
161 def main(argv):
162@@ -84,9 +78,10 @@
163 # Handle network for Openstack-on-Openstack scenarios
164 if mojo_utils.get_provider_type() == 'openstack':
165 logging.info('Configuring network for OpenStack undercloud/provider')
166- undercloud_novarc = mojo_utils.get_undercloud_auth()
167- novac = mojo_os_utils.get_nova_client(undercloud_novarc)
168- neutronc = mojo_os_utils.get_neutron_client(undercloud_novarc)
169+ session = mojo_os_utils.get_keystone_session(
170+ mojo_utils.get_undercloud_auth())
171+ novac = mojo_os_utils.get_nova_session_client(session)
172+ neutronc = mojo_os_utils.get_neutron_session_client(session)
173
174 # Add an interface to the neutron-gateway units and tell juju to use it
175 # as the external port.
176
177=== modified file 'helper/tests/simple_os_checks.py'
178--- helper/tests/simple_os_checks.py 2016-10-03 10:21:13 +0000
179+++ helper/tests/simple_os_checks.py 2017-04-13 21:13:22 +0000
180@@ -43,7 +43,7 @@
181 def main(argv):
182 mojo_utils.setup_logging()
183 parser = argparse.ArgumentParser()
184- default_machines = ["precise:m1.small:1", "cirros:m1.tiny:1"]
185+ default_machines = ["cirros:m1.tiny:1"]
186 parser.add_argument("machines", default=default_machines, nargs="*")
187 parser.add_argument("--active_wait", default=180)
188 parser.add_argument("--cloudinit_wait", default=180)
189@@ -54,22 +54,28 @@
190 cloudinit_wait = int(mojo_utils.parse_mojo_arg(options, 'cloudinit_wait'))
191 ping_wait = int(mojo_utils.parse_mojo_arg(options, 'ping_wait'))
192 overcloud_novarc = mojo_utils.get_overcloud_auth()
193- if overcloud_novarc.get('API_VERSION', 2) == 2:
194- novac = mojo_os_utils.get_nova_client(overcloud_novarc)
195- else:
196- keystone_session = mojo_os_utils.get_keystone_session(overcloud_novarc,
197- scope='PROJECT')
198- novac = mojo_os_utils.get_nova_session_client(keystone_session)
199+ keystone_session = mojo_os_utils.get_keystone_session(overcloud_novarc,
200+ scope='PROJECT')
201+ keystonec = mojo_os_utils.get_keystone_session_client(keystone_session)
202+ domain = overcloud_novarc.get('OS_PROJECT_DOMAIN_NAME')
203+ project_id = mojo_os_utils.get_project_id(
204+ keystonec,
205+ 'admin',
206+ api_version=overcloud_novarc['API_VERSION'],
207+ domain_name=domain
208+ )
209+ novac = mojo_os_utils.get_nova_session_client(keystone_session)
210+ neutronc = mojo_os_utils.get_neutron_session_client(keystone_session)
211+
212 init_flavors(novac)
213
214 priv_key = mojo_os_utils.create_keypair(novac, 'mojo')
215- mojo_os_utils.add_secgroup_rules(novac)
216- print(novac.servers.list())
217+ mojo_os_utils.add_neutron_secgroup_rules(neutronc, project_id)
218 for server in novac.servers.list():
219 novac.servers.delete(server.id)
220 for instanceset in machines:
221 image_name, flavor_name, count = instanceset.split(":")
222- mojo_os_utils.boot_and_test(novac,
223+ mojo_os_utils.boot_and_test(novac, neutronc,
224 image_name=image_name,
225 flavor_name=flavor_name,
226 number=int(count),
227
228=== modified file 'helper/tests/test_obj_store.py'
229--- helper/tests/test_obj_store.py 2016-09-22 21:25:04 +0000
230+++ helper/tests/test_obj_store.py 2017-04-13 21:13:22 +0000
231@@ -47,8 +47,9 @@
232 self.failures += 1
233
234 def get_swiftclient(self):
235- overcloud_novarc = mojo_utils.get_overcloud_auth()
236- swift_client = mojo_os_utils.get_swift_client(overcloud_novarc)
237+ keystone_session = mojo_os_utils.get_keystone_session(
238+ mojo_utils.get_overcloud_auth())
239+ swift_client = mojo_os_utils.get_swift_session_client(keystone_session)
240 return swift_client
241
242 def get_checkstring(self, fname):
243@@ -82,5 +83,6 @@
244 if thread2.failures > 0:
245 sys.exit(1)
246
247+
248 if __name__ == "__main__":
249 sys.exit(main(sys.argv))
250
251=== modified file 'helper/utils/kiki.py'
252--- helper/utils/kiki.py 2017-03-03 21:44:03 +0000
253+++ helper/utils/kiki.py 2017-04-13 21:13:22 +0000
254@@ -156,6 +156,7 @@
255 "command structure")
256 return True
257
258+
259 # Assert this is a valid version of Juju immediately
260 assert supported_juju_version()
261
262
263=== modified file 'helper/utils/mojo_os_utils.py'
264--- helper/utils/mojo_os_utils.py 2017-01-25 15:27:59 +0000
265+++ helper/utils/mojo_os_utils.py 2017-04-13 21:13:22 +0000
266@@ -1,11 +1,15 @@
267 #!/usr/bin/python
268
269+
270 import swiftclient
271 import glanceclient
272 from keystoneclient.v2_0 import client as keystoneclient_v2
273-from keystoneclient.auth.identity import v3
274 from keystoneclient.v3 import client as keystoneclient_v3
275-from keystoneclient import session
276+from keystoneauth1 import session
277+from keystoneauth1.identity import (
278+ v3,
279+ v2,
280+)
281 import mojo_utils
282 from novaclient import client as novaclient_client
283 from neutronclient.v2_0 import client as neutronclient
284@@ -23,24 +27,20 @@
285
286 # Openstack Client helpers
287 def get_nova_creds(cloud_creds):
288- auth = {
289- 'username': cloud_creds['OS_USERNAME'],
290- 'api_key': cloud_creds['OS_PASSWORD'],
291- 'auth_url': cloud_creds['OS_AUTH_URL'],
292- 'project_id': cloud_creds['OS_TENANT_NAME'],
293- 'region_name': cloud_creds['OS_REGION_NAME'],
294- }
295+ auth = get_ks_creds(cloud_creds)
296+ if os.environ.get('OS_PROJECT_ID'):
297+ auth['project_id'] = os.environ.get('OS_PROJECT_ID')
298 return auth
299
300
301-def get_ks_creds(cloud_creds, scope='DOMAIN'):
302+def get_ks_creds(cloud_creds, scope='PROJECT'):
303 if cloud_creds.get('API_VERSION', 2) == 2:
304 auth = {
305 'username': cloud_creds['OS_USERNAME'],
306 'password': cloud_creds['OS_PASSWORD'],
307 'auth_url': cloud_creds['OS_AUTH_URL'],
308- 'tenant_name': cloud_creds['OS_TENANT_NAME'],
309- 'region_name': cloud_creds['OS_REGION_NAME'],
310+ 'tenant_name': (cloud_creds.get('OS_PROJECT_NAME') or
311+ cloud_creds['OS_TENANT_NAME']),
312 }
313 else:
314 if scope == 'DOMAIN':
315@@ -95,10 +95,13 @@
316 return neutronclient.Client(session=session)
317
318
319-def get_keystone_session(novarc_creds, scope='DOMAIN'):
320+def get_keystone_session(novarc_creds, insecure=True, scope='PROJECT'):
321 keystone_creds = get_ks_creds(novarc_creds, scope=scope)
322- auth = v3.Password(**keystone_creds)
323- return session.Session(auth=auth)
324+ if novarc_creds.get('API_VERSION', 2) == 2:
325+ auth = v2.Password(**keystone_creds)
326+ else:
327+ auth = v3.Password(**keystone_creds)
328+ return session.Session(auth=auth, verify=not insecure)
329
330
331 def get_keystone_session_client(session):
332@@ -108,8 +111,8 @@
333 def get_keystone_client(novarc_creds, insecure=True):
334 keystone_creds = get_ks_creds(novarc_creds)
335 if novarc_creds.get('API_VERSION', 2) == 2:
336- keystone_creds['insecure'] = insecure
337- return keystoneclient_v2.Client(**keystone_creds)
338+ sess = v2.Password(**keystone_creds)
339+ return keystoneclient_v2.Client(session=sess)
340 else:
341 sess = v3.Password(**keystone_creds)
342 return keystoneclient_v3.Client(session=sess)
343@@ -121,6 +124,14 @@
344 return swiftclient.client.Connection(**swift_creds)
345
346
347+def get_swift_session_client(session):
348+ return swiftclient.client.Connection(session=session)
349+
350+
351+def get_glance_session_client(session):
352+ return glanceclient.Client('1', session=session)
353+
354+
355 def get_glance_client(novarc_creds, insecure=True):
356 if novarc_creds.get('API_VERSION', 2) == 2:
357 kc = get_keystone_client(novarc_creds)
358@@ -128,7 +139,6 @@
359 endpoint_type='publicURL')
360 else:
361 keystone_creds = get_ks_creds(novarc_creds, scope='PROJECT')
362- logging.info(keystone_creds)
363 kc = keystoneclient_v3.Client(**keystone_creds)
364 glance_svc_id = kc.services.find(name='glance').id
365 ep = kc.endpoints.find(service_id=glance_svc_id, interface='public')
366@@ -176,14 +186,14 @@
367 kclient.tenants.create(tenant_name=tenant)
368
369
370-def project_create(kclient, projects, domain):
371+def project_create(kclient, projects, domain=None):
372 domain_id = None
373 for dom in kclient.domains.list():
374 if dom.name == domain:
375 domain_id = dom.id
376 current_projects = []
377 for project in kclient.projects.list():
378- if project.domain_id == domain_id:
379+ if not domain_id or project.domain_id == domain_id:
380 current_projects.append(project.name)
381 for project in projects:
382 if project in current_projects:
383@@ -213,24 +223,25 @@
384 'exists' % (user['username']))
385 else:
386 logging.info('Creating user %s' % (user['username']))
387- tenant_id = get_tenant_id(kclient, user['tenant'])
388+ project_id = get_project_id(kclient, user['project'])
389 kclient.users.create(name=user['username'],
390 password=user['password'],
391 email=user['email'],
392- tenant_id=tenant_id)
393+ tenant_id=project_id)
394
395
396 def user_create_v3(kclient, users):
397 current_users = [user.name for user in kclient.users.list()]
398 for user in users:
399+ project = user.get('project') or user.get('tenant')
400 if user['username'] in current_users:
401 logging.warning('Not creating user %s it already'
402 'exists' % (user['username']))
403 else:
404 if user['scope'] == 'project':
405 logging.info('Creating user %s' % (user['username']))
406- project_id = get_tenant_id(kclient, user['tenant'],
407- api_version=3)
408+ project_id = get_project_id(kclient, project,
409+ api_version=3)
410 kclient.users.create(name=user['username'],
411 password=user['password'],
412 email=user['email'],
413@@ -247,7 +258,7 @@
414
415 def add_users_to_roles(kclient, users):
416 for user_details in users:
417- tenant_id = get_tenant_id(kclient, user_details['tenant'])
418+ tenant_id = get_project_id(kclient, user_details['project'])
419 for role_name in user_details['roles']:
420 role = kclient.roles.find(name=role_name)
421 user = kclient.users.find(name=user_details['username'])
422@@ -263,16 +274,13 @@
423 tenant_id)
424
425
426-def get_tenant_id(ks_client, tenant_name, api_version=2, domain_name=None):
427+def get_project_id(ks_client, project_name, api_version=2, domain_name=None):
428 domain_id = None
429 if domain_name:
430 domain_id = ks_client.domains.list(name=domain_name)[0].id
431- if api_version == 2:
432- all_tenants = ks_client.tenants.list()
433- else:
434- all_tenants = ks_client.projects.list(domain=domain_id)
435- for t in all_tenants:
436- if t._info['name'] == tenant_name:
437+ all_projects = ks_client.projects.list(domain=domain_id)
438+ for t in all_projects:
439+ if t._info['name'] == project_name:
440 return t._info['id']
441 return None
442
443@@ -354,7 +362,8 @@
444 "port": {
445 "admin_state_up": True,
446 "name": ext_port_name,
447- "network_id": net_id
448+ "network_id": net_id,
449+ "port_security_enabled": False,
450 }
451 }
452 port = neutronclient.create_port(body=body_value)
453@@ -394,8 +403,8 @@
454 mojo_utils.juju_wait_finished()
455
456
457-def create_tenant_network(neutron_client, tenant_id, net_name='private',
458- shared=False, network_type='gre'):
459+def create_project_network(neutron_client, project_id, net_name='private',
460+ shared=False, network_type='gre', domain=None):
461 networks = neutron_client.list_networks(name=net_name)
462 if len(networks['networks']) == 0:
463 logging.info('Creating network: %s',
464@@ -404,7 +413,7 @@
465 'network': {
466 'name': net_name,
467 'shared': shared,
468- 'tenant_id': tenant_id,
469+ 'tenant_id': project_id,
470 }
471 }
472 if network_type == 'vxlan':
473@@ -417,7 +426,7 @@
474 return network
475
476
477-def create_external_network(neutron_client, tenant_id, dvr_mode,
478+def create_external_network(neutron_client, project_id, dvr_mode,
479 net_name='ext_net'):
480 networks = neutron_client.list_networks(name=net_name)
481 if len(networks['networks']) == 0:
482@@ -425,7 +434,7 @@
483 network_msg = {
484 'name': net_name,
485 'router:external': True,
486- 'tenant_id': tenant_id,
487+ 'tenant_id': project_id,
488 }
489 if not deprecated_external_networking(dvr_mode):
490 network_msg['provider:physical_network'] = 'physnet1'
491@@ -442,8 +451,8 @@
492 return network
493
494
495-def create_tenant_subnet(neutron_client, tenant_id, network, cidr, dhcp=True,
496- subnet_name='private_subnet'):
497+def create_project_subnet(neutron_client, project_id, network, cidr, dhcp=True,
498+ subnet_name='private_subnet', domain=None):
499 # Create subnet
500 subnets = neutron_client.list_subnets(name=subnet_name)
501 if len(subnets['subnets']) == 0:
502@@ -455,7 +464,7 @@
503 'enable_dhcp': dhcp,
504 'cidr': cidr,
505 'ip_version': 4,
506- 'tenant_id': tenant_id
507+ 'tenant_id': project_id
508 }
509 }
510 subnet = neutron_client.create_subnet(subnet_msg)['subnet']
511@@ -571,11 +580,12 @@
512 return new_key.private_key
513
514
515-def boot_instance(nova_client, image_name, flavor_name, key_name):
516- image = nova_client.images.find(name=image_name)
517+def boot_instance(nova_client, neutron_client, image_name,
518+ flavor_name, key_name):
519+ image = nova_client.glance.find_image(image_name)
520 flavor = nova_client.flavors.find(name=flavor_name)
521- net = nova_client.networks.find(label="private")
522- nics = [{'net-id': net.id}]
523+ net = neutron_client.find_resource("network", "private")
524+ nics = [{'net-id': net.get('id')}]
525 # Obviously time may not produce a unique name
526 vm_name = time.strftime("%Y%m%d%H%M%S")
527 logging.info('Creating %s %s %s'
528@@ -601,7 +611,7 @@
529 logging.error('instance %s in unknown '
530 'state %s' % (instance.name, instance.status))
531 return False
532- time.sleep(10)
533+ time.sleep(1)
534 logging.error('instance %s failed to reach '
535 'active state in %is' % (instance.name, wait_time))
536 return False
537@@ -617,7 +627,7 @@
538 if bootstring in console_log:
539 logging.info('Cloudinit for %s is complete' % (vm_name))
540 return True
541- time.sleep(10)
542+ time.sleep(1)
543 logging.error('cloudinit for instance %s failed '
544 'to complete in %is' % (instance.name, wait_time))
545 return False
546@@ -644,12 +654,24 @@
547 return False
548
549
550-def assign_floating_ip(nova_client, vm_name):
551- floating_ip = nova_client.floating_ips.create()
552- logging.info('Assigning floating IP %s to %s' % (floating_ip.ip, vm_name))
553+def assign_floating_ip(nova_client, neutron_client, vm_name):
554+ ext_net_id = None
555+ instance_port = None
556+ for network in neutron_client.list_networks().get('networks'):
557+ if 'ext_net' in network.get('name'):
558+ ext_net_id = network.get('id')
559 instance = nova_client.servers.find(name=vm_name)
560- instance.add_floating_ip(floating_ip)
561- return floating_ip.ip
562+ for port in neutron_client.list_ports().get('ports'):
563+ if instance.id in port.get('device_id'):
564+ instance_port = port
565+ floating_ip = neutron_client.create_floatingip({'floatingip':
566+ {'floating_network_id':
567+ ext_net_id,
568+ 'port_id':
569+ instance_port.get('id')}})
570+ ip = floating_ip.get('floatingip').get('floating_ip_address')
571+ logging.info('Assigning floating IP %s to %s' % (ip, vm_name))
572+ return ip
573
574
575 def add_secgroup_rules(nova_client):
576@@ -675,6 +697,48 @@
577 to_port=-1)
578
579
580+def add_neutron_secgroup_rules(neutron_client, project_id):
581+ secgroup = None
582+ for group in neutron_client.list_security_groups().get('security_groups'):
583+ if (group.get('name') == 'default' and
584+ (group.get('project_id') == project_id or
585+ (group.get('tenant_id') == project_id))):
586+ secgroup = group
587+ if not secgroup:
588+ raise Exception("Failed to find default security group")
589+ # Using presence of a 22 rule to indicate whether secgroup rules
590+ # have been added
591+ port_rules = [rule['port_range_min'] for rule in
592+ secgroup.get('security_group_rules')]
593+ protocol_rules = [rule['protocol'] for rule in
594+ secgroup.get('security_group_rules')]
595+ if 22 in port_rules:
596+ logging.warn('Security group rules for ssh already added')
597+ else:
598+ logging.info('Adding ssh security group rule')
599+ neutron_client.create_security_group_rule(
600+ {'security_group_rule':
601+ {'security_group_id': secgroup.get('id'),
602+ 'protocol': 'tcp',
603+ 'port_range_min': 22,
604+ 'port_range_max': 22,
605+ 'direction': 'ingress',
606+ }
607+ })
608+
609+ if 'icmp' in protocol_rules:
610+ logging.warn('Security group rules for ping already added')
611+ else:
612+ logging.info('Adding ping security group rule')
613+ neutron_client.create_security_group_rule(
614+ {'security_group_rule':
615+ {'security_group_id': secgroup.get('id'),
616+ 'protocol': 'icmp',
617+ 'direction': 'ingress',
618+ }
619+ })
620+
621+
622 def ping(ip):
623 # Use the system ping command with count of 1 and wait time of 1.
624 ret = subprocess.call(['ping', '-c', '1', '-W', '1', ip],
625@@ -705,11 +769,13 @@
626 return False
627
628
629-def boot_and_test(nova_client, image_name, flavor_name, number, privkey,
630- active_wait=180, cloudinit_wait=180, ping_wait=180):
631+def boot_and_test(nova_client, neutron_client, image_name, flavor_name,
632+ number, privkey, active_wait=180, cloudinit_wait=180,
633+ ping_wait=180):
634 image_config = mojo_utils.get_mojo_config('images.yaml')
635 for counter in range(number):
636 instance = boot_instance(nova_client,
637+ neutron_client,
638 image_name=image_name,
639 flavor_name=flavor_name,
640 key_name='mojo')
641@@ -717,7 +783,7 @@
642 wait_for_boot(nova_client, instance.name,
643 image_config[image_name]['bootstring'], active_wait,
644 cloudinit_wait)
645- ip = assign_floating_ip(nova_client, instance.name)
646+ ip = assign_floating_ip(nova_client, neutron_client, instance.name)
647 wait_for_ping(ip, ping_wait)
648 if not wait_for_ping(ip, ping_wait):
649 raise Exception('Ping of %s failed' % (ip))

Subscribers

People subscribed via source and target branches