blob: abcd13d7138fcd668b82904dbe8362e52df67a8b [file] [log] [blame]
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +03001import pytest
2import json
3import utils
Hanna Arhipova1eef8312019-05-06 20:14:18 +03004import logging
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +03005
Ekaterina Chernova9c232f92019-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
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030014
Oleksii Zhurba23c18332019-05-09 18:53:40 -050015@pytest.mark.full
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030016def test_check_package_versions(local_salt_client, nodes_in_group):
Ekaterina Chernova9c232f92019-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 Arhipovae6ed8e42019-05-15 16:27:08 +030028 exclude_packages = utils.get_configuration().get("skipped_packages", [])
29 packages_versions = local_salt_client.cmd(tgt="L@"+','.join(nodes_in_group),
30 fun='lowpkg.list_pkgs',
31 expr_form='compound')
32 # Let's exclude cid01 and dbs01 nodes from this check
33 exclude_nodes = local_salt_client.test_ping(tgt="I@galera:master or I@gerrit:client",
34 expr_form='compound').keys()
Oleksii Zhurbaa3e79ce2019-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:
Oleksii Zhurba29baebd2019-06-12 16:11:40 -050042 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:
Oleksii Zhurbaa3e79ce2019-06-04 17:26:51 -050048 exclude_nodes.append(gtw01)
49 logging.info("gtw01 node is skipped in test_check_package_versions")
50
Ekaterina Chernova9c232f92019-07-26 16:02:18 +030051 total_nodes = [i for i in nodes_in_group if i not in exclude_nodes]
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030052 if len(total_nodes) < 2:
53 pytest.skip("Nothing to compare - only 1 node")
Ekaterina Chernova9c232f92019-07-26 16:02:18 +030054 nodes_with_packages = []
55 packages_with_different_versions = []
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030056 packages_names = set()
57
58 for node in total_nodes:
59 if not packages_versions[node]:
60 # TODO: do not skip node
Hanna Arhipova1eef8312019-05-06 20:14:18 +030061 logging.warning("Node {} is skipped".format(node))
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030062 continue
Ekaterina Chernova9c232f92019-07-26 16:02:18 +030063 nodes_with_packages.append(node)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030064 packages_names.update(packages_versions[node].keys())
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030065 for deb in packages_names:
66 if deb in exclude_packages:
67 continue
68 diff = []
69 row = []
Ekaterina Chernova9c232f92019-07-26 16:02:18 +030070 for node in nodes_with_packages:
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030071 if not packages_versions[node]:
72 continue
73 if deb in packages_versions[node].keys():
74 diff.append(packages_versions[node][deb])
75 row.append("{}: {}".format(node, packages_versions[node][deb]))
76 else:
77 row.append("{}: No package".format(node))
Ekaterina Chernova9c232f92019-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, \
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030085 "Several problems found: {0}".format(
Ekaterina Chernova9c232f92019-07-26 16:02:18 +030086 json.dumps(packages_with_different_versions, indent=4))
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030087
88
Oleksii Zhurba23c18332019-05-09 18:53:40 -050089@pytest.mark.full
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +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(
97 tgt='L@' + ','.join(nodes_in_group),
98 param='apt list --upgradable 2>/dev/null | grep -v Listing',
99 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 Zhurba23c18332019-05-09 18:53:40 -0500111@pytest.mark.full
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300112def test_check_module_versions(local_salt_client, nodes_in_group):
113 exclude_modules = utils.get_configuration().get("skipped_modules", [])
114 pre_check = local_salt_client.cmd(
115 tgt="L@"+','.join(nodes_in_group),
116 param='dpkg -l | grep "python-pip "',
117 expr_form='compound')
118 if pre_check.values().count('') > 0:
119 pytest.skip("pip is not installed on one or more nodes")
120
121 exclude_nodes = local_salt_client.test_ping(tgt="I@galera:master or I@gerrit:client",
122 expr_form='compound').keys()
Oleksii Zhurbaa3e79ce2019-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:
Oleksii Zhurba29baebd2019-06-12 16:11:40 -0500131 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:
Oleksii Zhurbaa3e79ce2019-06-04 17:26:51 -0500137 exclude_nodes.append(gtw01)
138 logging.info("gtw01 node is skipped in test_check_module_versions")
139
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300140 total_nodes = [i for i in pre_check.keys() if i not in exclude_nodes]
141
142 if len(total_nodes) < 2:
143 pytest.skip("Nothing to compare - only 1 node")
144 list_of_pip_packages = local_salt_client.cmd(tgt="L@"+','.join(nodes_in_group),
Oleksii Zhurbae01d5e82019-05-17 14:04:28 -0500145 fun='pip.freeze', expr_form='compound')
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +0300146
147 nodes = []
148
149 pkts_data = []
150 packages_names = set()
151
152 for node in total_nodes:
153 nodes.append(node)
154 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]])
156
157 for deb in packages_names:
158 if deb in exclude_modules:
159 continue
160 diff = []
161 row = []
162 for node in nodes:
163 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]))
166 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, \
173 "Several problems found: {0}".format(
Oleksii Zhurbaa3e79ce2019-06-04 17:26:51 -0500174 json.dumps(pkts_data, indent=4))