blob: 1fb6c339598820662c8ef3e933e3443de59c5aff [file] [log] [blame]
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +00001import pytest
2import json
Ievgeniia Zadorozhna6baf7872019-01-25 19:09:30 +03003import utils
Hanna Arhipova56eab942019-05-06 20:14:18 +03004import logging
Ievgeniia Zadorozhna6baf7872019-01-25 19:09:30 +03005
Ekaterina Chernovab4806752019-07-26 16:02:18 +03006def is_deb_in_exception(package_name, error_node_list):
7 # defines packages specific to the concrete nodes
8 inconsistency_rule = {"kvm03": ["rsync", "sysstat", "xz-utils"], "log01": ["python-elasticsearch"]}
9 short_names_in_error_nodes = [n.split('.')[0] for n in error_node_list]
10 for node, excluded_packages in inconsistency_rule.iteritems():
11 if package_name in excluded_packages and node in short_names_in_error_nodes:
12 return True
13 return False
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000014
Oleksii Zhurba5b15b9b2019-05-09 18:53:40 -050015@pytest.mark.full
Oleksii Zhurbad0ae87f2018-03-26 13:36:25 -050016def test_check_package_versions(local_salt_client, nodes_in_group):
Ekaterina Chernovab4806752019-07-26 16:02:18 +030017 """Validate package has same versions on all the nodes.
18 Steps:
19 1) Collect packages for nodes_in_group
20 "salt -C '<group_of_nodes>' cmd.run 'lowpkg.list_pkgs'"
21 2) Exclude nodes without packages and exceptions
22 3) Go through each package and save it with version from each node to the
23 list. Mark 'No version' if package is not found.
24 If pachage name in the eception list or in inconsistency_rule, ignore it.
25 4) Compare items in that list - they should be equal and match the amout of nodes
26
27 """
Hanna Arhipova8fd295c2019-03-07 13:46:43 +020028 exclude_packages = utils.get_configuration().get("skipped_packages", [])
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050029 packages_versions = local_salt_client.cmd(tgt="L@"+','.join(nodes_in_group),
30 fun='lowpkg.list_pkgs',
31 expr_form='compound')
Oleksii Zhurbadad1acc2018-03-26 14:09:38 -050032 # Let's exclude cid01 and dbs01 nodes from this check
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050033 exclude_nodes = local_salt_client.test_ping(tgt="I@galera:master or I@gerrit:client",
34 expr_form='compound').keys()
Oleksii Zhurba599801a2019-06-04 17:26:51 -050035 # PROD-30833
36 gtw01 = local_salt_client.pillar_get(
37 param='_param:openstack_gateway_node01_hostname') or 'gtw01'
38 cluster_domain = local_salt_client.pillar_get(
39 param='_param:cluster_domain') or '.local'
40 gtw01 += '.' + cluster_domain
41 if gtw01 in nodes_in_group:
42 octavia = local_salt_client.cmd(tgt="L@" + ','.join(nodes_in_group),
43 fun='pillar.get',
44 param='octavia:manager:enabled',
45 expr_form='compound')
46 gtws = [gtw for gtw in octavia.values() if gtw]
47 if len(gtws) == 1:
48 exclude_nodes.append(gtw01)
49 logging.info("gtw01 node is skipped in test_check_package_versions")
50
Ekaterina Chernovab4806752019-07-26 16:02:18 +030051 total_nodes = [i for i in nodes_in_group if i not in exclude_nodes]
Oleksii Zhurba5f768c52018-08-07 17:27:57 -050052 if len(total_nodes) < 2:
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000053 pytest.skip("Nothing to compare - only 1 node")
Ekaterina Chernovab4806752019-07-26 16:02:18 +030054 nodes_with_packages = []
55 packages_with_different_versions = []
Hanna Arhipova8fd295c2019-03-07 13:46:43 +020056 packages_names = set()
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000057
Oleksii Zhurba5f768c52018-08-07 17:27:57 -050058 for node in total_nodes:
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050059 if not packages_versions[node]:
60 # TODO: do not skip node
Hanna Arhipova56eab942019-05-06 20:14:18 +030061 logging.warning("Node {} is skipped".format(node))
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050062 continue
Ekaterina Chernovab4806752019-07-26 16:02:18 +030063 nodes_with_packages.append(node)
Hanna Arhipova8fd295c2019-03-07 13:46:43 +020064 packages_names.update(packages_versions[node].keys())
Hanna Arhipova8fd295c2019-03-07 13:46:43 +020065 for deb in packages_names:
66 if deb in exclude_packages:
67 continue
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000068 diff = []
69 row = []
Ekaterina Chernovab4806752019-07-26 16:02:18 +030070 for node in nodes_with_packages:
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050071 if not packages_versions[node]:
72 continue
Hanna Arhipova8fd295c2019-03-07 13:46:43 +020073 if deb in packages_versions[node].keys():
74 diff.append(packages_versions[node][deb])
75 row.append("{}: {}".format(node, packages_versions[node][deb]))
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000076 else:
77 row.append("{}: No package".format(node))
Ekaterina Chernovab4806752019-07-26 16:02:18 +030078
79 if diff.count(diff[0]) < len(nodes_with_packages):
80 if not is_deb_in_exception(deb, row):
81 row.sort()
82 row.insert(0, deb)
83 packages_with_different_versions.append(row)
84 assert len(packages_with_different_versions) == 0, \
Oleksii Zhurbaa32d92f2018-03-29 16:22:35 -050085 "Several problems found: {0}".format(
Ekaterina Chernovab4806752019-07-26 16:02:18 +030086 json.dumps(packages_with_different_versions, indent=4))
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000087
88
Oleksii Zhurba5b15b9b2019-05-09 18:53:40 -050089@pytest.mark.full
Ievgeniia Zadorozhna6baf7872019-01-25 19:09:30 +030090def test_packages_are_latest(local_salt_client, nodes_in_group):
91 config = utils.get_configuration()
92 skip = config.get("test_packages")["skip_test"]
93 if skip:
94 pytest.skip("Test for the latest packages is disabled")
95 skipped_pkg = config.get("test_packages")["skipped_packages"]
96 info_salt = local_salt_client.cmd(
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050097 tgt='L@' + ','.join(nodes_in_group),
98 param='apt list --upgradable 2>/dev/null | grep -v Listing',
Ievgeniia Zadorozhna6baf7872019-01-25 19:09:30 +030099 expr_form='compound')
100 for node in nodes_in_group:
101 result = []
102 if info_salt[node]:
103 upg_list = info_salt[node].split('\n')
104 for i in upg_list:
105 if i.split('/')[0] not in skipped_pkg:
106 result.append(i)
107 assert not result, "Please check not latest packages at {}:\n{}".format(
108 node, "\n".join(result))
109
110
Oleksii Zhurba5b15b9b2019-05-09 18:53:40 -0500111@pytest.mark.full
Oleksii Zhurbad0ae87f2018-03-26 13:36:25 -0500112def test_check_module_versions(local_salt_client, nodes_in_group):
Hanna Arhipova8fd295c2019-03-07 13:46:43 +0200113 exclude_modules = utils.get_configuration().get("skipped_modules", [])
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000114 pre_check = local_salt_client.cmd(
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -0500115 tgt="L@"+','.join(nodes_in_group),
116 param='dpkg -l | grep "python-pip "',
Oleksii Zhurba5f768c52018-08-07 17:27:57 -0500117 expr_form='compound')
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000118 if pre_check.values().count('') > 0:
119 pytest.skip("pip is not installed on one or more nodes")
Oleksii Zhurba5f768c52018-08-07 17:27:57 -0500120
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -0500121 exclude_nodes = local_salt_client.test_ping(tgt="I@galera:master or I@gerrit:client",
122 expr_form='compound').keys()
Oleksii Zhurba599801a2019-06-04 17:26:51 -0500123
124 # PROD-30833
125 gtw01 = local_salt_client.pillar_get(
126 param='_param:openstack_gateway_node01_hostname') or 'gtw01'
127 cluster_domain = local_salt_client.pillar_get(
128 param='_param:cluster_domain') or '.local'
129 gtw01 += '.' + cluster_domain
130 if gtw01 in nodes_in_group:
131 octavia = local_salt_client.cmd(tgt="L@" + ','.join(nodes_in_group),
132 fun='pillar.get',
133 param='octavia:manager:enabled',
134 expr_form='compound')
135 gtws = [gtw for gtw in octavia.values() if gtw]
136 if len(gtws) == 1:
137 exclude_nodes.append(gtw01)
138 logging.info("gtw01 node is skipped in test_check_module_versions")
139
Oleksii Zhurba5f768c52018-08-07 17:27:57 -0500140 total_nodes = [i for i in pre_check.keys() if i not in exclude_nodes]
141
142 if len(total_nodes) < 2:
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000143 pytest.skip("Nothing to compare - only 1 node")
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -0500144 list_of_pip_packages = local_salt_client.cmd(tgt="L@"+','.join(nodes_in_group),
Oleksii Zhurba075cc7a2019-05-17 14:04:28 -0500145 fun='pip.freeze', expr_form='compound')
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000146
147 nodes = []
Oleksii Zhurbaa32d92f2018-03-29 16:22:35 -0500148
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000149 pkts_data = []
Hanna Arhipova8fd295c2019-03-07 13:46:43 +0200150 packages_names = set()
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000151
Oleksii Zhurba5f768c52018-08-07 17:27:57 -0500152 for node in total_nodes:
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000153 nodes.append(node)
Hanna Arhipova8fd295c2019-03-07 13:46:43 +0200154 packages_names.update([x.split("=")[0] for x in list_of_pip_packages[node]])
155 list_of_pip_packages[node] = dict([x.split("==") for x in list_of_pip_packages[node]])
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000156
Hanna Arhipova8fd295c2019-03-07 13:46:43 +0200157 for deb in packages_names:
158 if deb in exclude_modules:
159 continue
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000160 diff = []
161 row = []
162 for node in nodes:
Hanna Arhipova8fd295c2019-03-07 13:46:43 +0200163 if deb in list_of_pip_packages[node].keys():
164 diff.append(list_of_pip_packages[node][deb])
165 row.append("{}: {}".format(node, list_of_pip_packages[node][deb]))
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +0000166 else:
167 row.append("{}: No module".format(node))
168 if diff.count(diff[0]) < len(nodes):
169 row.sort()
170 row.insert(0, deb)
171 pkts_data.append(row)
172 assert len(pkts_data) <= 1, \
Oleksii Zhurbaa32d92f2018-03-29 16:22:35 -0500173 "Several problems found: {0}".format(
Oleksii Zhurba599801a2019-06-04 17:26:51 -0500174 json.dumps(pkts_data, indent=4))
175