| import pytest | 
 | import json | 
 |  | 
 | def test_contrail_compute_status(local_salt_client): | 
 |     probe = local_salt_client.cmd( | 
 |         'opencontrail:control', 'cmd.run', | 
 |         ['contrail-status | grep -Pv \'(==|^$|Disk|unix|support)\''], | 
 |         expr_form='pillar' | 
 |     ) | 
 |     if not probe: | 
 |         pytest.skip("Contrail is not found on this environment") | 
 |  | 
 |     cs = local_salt_client.cmd( | 
 |         'nova:compute', 'cmd.run', | 
 |         ['contrail-status | grep -Pv \'(==|^$)\''], | 
 |         expr_form='pillar' | 
 |     ) | 
 |     broken_services = [] | 
 |  | 
 |     for node in cs: | 
 |         for line in cs[node].split('\n'): | 
 |             line = line.strip() | 
 |             name, status = line.split(None, 1) | 
 |             if status not in {'active'}: | 
 |                 err_msg = "{node}:{service} - {status}".format( | 
 |                     node=node, service=name, status=status) | 
 |                 broken_services.append(err_msg) | 
 |  | 
 |     assert not broken_services, 'Broken services: {}'.format(json.dumps( | 
 |                                                              broken_services, | 
 |                                                              indent=4)) | 
 |  | 
 |  | 
 | def test_contrail_node_status(local_salt_client): | 
 |     cs = local_salt_client.cmd( | 
 |         'opencontrail:client:analytics_node', 'cmd.run', | 
 |         ['contrail-status | grep -Pv \'(==|^$|Disk|unix|support)\''], | 
 |         expr_form='pillar' | 
 |     ) | 
 |     cs.update(local_salt_client.cmd( | 
 |         'opencontrail:control', 'cmd.run', | 
 |         ['contrail-status | grep -Pv \'(==|^$|Disk|unix|support)\''], | 
 |         expr_form='pillar') | 
 |     ) | 
 |     if not cs: | 
 |         pytest.skip("Contrail is not found on this environment") | 
 |     broken_services = [] | 
 |     for node in cs: | 
 |         for line in cs[node].split('\n'): | 
 |             line = line.strip() | 
 |             if 'crashes/core.java.' not in line: | 
 |                 name, status = line.split(None, 1) | 
 |             else: | 
 |                 name, status = line,'FATAL' | 
 |             if status not in {'active', 'backup'}: | 
 |                 err_msg = "{node}:{service} - {status}".format( | 
 |                     node=node, service=name, status=status) | 
 |                 broken_services.append(err_msg) | 
 |  | 
 |     assert not broken_services, 'Broken services: {}'.format(json.dumps( | 
 |                                                              broken_services, | 
 |                                                              indent=4)) | 
 |  | 
 |  | 
 | def test_contrail_vrouter_count(local_salt_client): | 
 |     probe = local_salt_client.cmd( | 
 |         'opencontrail:control', 'cmd.run', | 
 |         ['contrail-status | grep -Pv \'(==|^$|Disk|unix|support)\''], | 
 |         expr_form='pillar' | 
 |     ) | 
 |     if not probe: | 
 |         pytest.skip("Contrail is not found on this environment") | 
 |     cs = local_salt_client.cmd( | 
 |         'nova:compute', 'cmd.run', ['contrail-status | grep -Pv \'(==|^$)\''], | 
 |         expr_form='pillar' | 
 |     ) | 
 |     # TODO: what if compute lacks these service unintentionally? | 
 |     if not cs: | 
 |         pytest.skip("Contrail services were not found on compute nodes") | 
 |  | 
 |     actual_vrouter_count = 0 | 
 |     for node in cs: | 
 |         for line in cs[node].split('\n'): | 
 |             if 'contrail-vrouter-nodemgr' in line: | 
 |                 actual_vrouter_count += 1 | 
 |  | 
 |     assert actual_vrouter_count == len(cs.keys()),\ | 
 |         'The length of vRouters {} differs' \ | 
 |         ' from the length of compute nodes {}'.format(actual_vrouter_count, | 
 |                                                       len(cs.keys())) |