Merge lp:~thedac/openstack-mojo-specs/updated-os-clients into lp:openstack-mojo-specs
- updated-os-clients
- Merge into mojo-openstack-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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ryan Beisner | Approve | ||
Review via email:
|
Commit message
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
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
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)) |