blob: f04066e049ca7c01d5075deeedba76ca4f226887 [file] [log] [blame]
Oleksii Zhurba11de14e2017-10-23 19:13:00 +00001import pytest
2import json
Oleksii Zhurba943a0932017-11-01 22:27:53 +00003import os
Oleksii Zhurba11de14e2017-10-23 19:13:00 +00004
Oleksii Zhurba3dbed242017-10-31 19:58:53 +00005
Oleksii Zhurba11de14e2017-10-23 19:13:00 +00006def test_k8s_get_cs_status(local_salt_client):
7 result = local_salt_client.cmd(
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -05008 tgt='etcd:server',
9 param='kubectl get cs',
Oleksii Zhurba11de14e2017-10-23 19:13:00 +000010 expr_form='pillar'
11 )
12 errors = []
13 if not result:
14 pytest.skip("k8s is not found on this environment")
15 for node in result:
16 for line in result[node].split('\n'):
17 line = line.strip()
Oleksii Zhurba943a0932017-11-01 22:27:53 +000018 if 'MESSAGE' in line or 'proto' in line:
Oleksii Zhurba11de14e2017-10-23 19:13:00 +000019 continue
20 else:
21 if 'Healthy' not in line:
Oleksii Zhurba3dbed242017-10-31 19:58:53 +000022 errors.append(line)
Oleksii Zhurba11de14e2017-10-23 19:13:00 +000023 break
24 assert not errors, 'k8s is not healthy: {}'.format(json.dumps(
Oleksii Zhurba3dbed242017-10-31 19:58:53 +000025 errors,
26 indent=4))
Oleksii Zhurba11de14e2017-10-23 19:13:00 +000027
28
29def test_k8s_get_nodes_status(local_salt_client):
30 result = local_salt_client.cmd(
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050031 tgt='etcd:server',
32 param='kubectl get nodes',
Oleksii Zhurba11de14e2017-10-23 19:13:00 +000033 expr_form='pillar'
34 )
35 errors = []
36 if not result:
37 pytest.skip("k8s is not found on this environment")
38 for node in result:
39 for line in result[node].split('\n'):
40 line = line.strip()
Oleksii Zhurba943a0932017-11-01 22:27:53 +000041 if 'STATUS' in line or 'proto' in line:
Oleksii Zhurba11de14e2017-10-23 19:13:00 +000042 continue
43 else:
Oleksii Zhurbae592ed12018-06-21 18:01:09 -050044 if 'Ready' != line.split()[1]:
Oleksii Zhurba3dbed242017-10-31 19:58:53 +000045 errors.append(line)
Oleksii Zhurba11de14e2017-10-23 19:13:00 +000046 break
47 assert not errors, 'k8s is not healthy: {}'.format(json.dumps(
Oleksii Zhurba3dbed242017-10-31 19:58:53 +000048 errors,
49 indent=4))
Oleksii Zhurba943a0932017-11-01 22:27:53 +000050
51
52def test_k8s_get_calico_status(local_salt_client):
53 result = local_salt_client.cmd(
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050054 tgt='kubernetes:pool',
55 param='calicoctl node status',
Oleksii Zhurba943a0932017-11-01 22:27:53 +000056 expr_form='pillar'
57 )
58 errors = []
59 if not result:
60 pytest.skip("k8s is not found on this environment")
61 for node in result:
62 for line in result[node].split('\n'):
63 line = line.strip('|')
64 if 'STATE' in line or '| ' not in line:
65 continue
66 else:
67 if 'up' not in line or 'Established' not in line:
68 errors.append(line)
69 assert not errors, 'Calico node status is not good: {}'.format(json.dumps(
70 errors,
71 indent=4))
72
73
74def test_k8s_cluster_status(local_salt_client):
75 result = local_salt_client.cmd(
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050076 tgt='kubernetes:master',
77 param='kubectl cluster-info',
Oleksii Zhurba943a0932017-11-01 22:27:53 +000078 expr_form='pillar'
79 )
80 errors = []
81 if not result:
82 pytest.skip("k8s is not found on this environment")
83 for node in result:
84 for line in result[node].split('\n'):
85 if 'proto' in line or 'further' in line or line == '':
86 continue
87 else:
88 if 'is running' not in line:
89 errors.append(line)
90 break
91 assert not errors, 'k8s cluster info is not good: {}'.format(json.dumps(
92 errors,
93 indent=4))
94
95
96def test_k8s_kubelet_status(local_salt_client):
97 result = local_salt_client.cmd(
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050098 tgt='kubernetes:pool',
99 fun='service.status',
100 param='kubelet',
Oleksii Zhurba943a0932017-11-01 22:27:53 +0000101 expr_form='pillar'
102 )
103 errors = []
104 if not result:
105 pytest.skip("k8s is not found on this environment")
106 for node in result:
107 if not result[node]:
108 errors.append(node)
109 assert not errors, 'Kublete is not running on these nodes: {}'.format(
110 errors)
111
112
Oleksii Zhurba3eb58012017-11-02 22:01:06 +0000113def test_k8s_check_system_pods_status(local_salt_client):
114 result = local_salt_client.cmd(
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -0500115 tgt='etcd:server',
116 param='kubectl --namespace="kube-system" get pods',
Oleksii Zhurba3eb58012017-11-02 22:01:06 +0000117 expr_form='pillar'
118 )
119 errors = []
120 if not result:
121 pytest.skip("k8s is not found on this environment")
122 for node in result:
123 for line in result[node].split('\n'):
124 line = line.strip('|')
125 if 'STATUS' in line or 'proto' in line:
126 continue
127 else:
128 if 'Running' not in line:
129 errors.append(line)
130 break
131 assert not errors, 'Some system pods are not running: {}'.format(json.dumps(
132 errors,
133 indent=4))
134
135
136def test_check_k8s_image_availability(local_salt_client):
Oleksii Zhurba943a0932017-11-01 22:27:53 +0000137 # not a test actually
Oleksii Zhurba3eb58012017-11-02 22:01:06 +0000138 hostname = 'https://docker-dev-virtual.docker.mirantis.net/artifactory/webapp/'
139 response = os.system('curl -s --insecure {} > /dev/null'.format(hostname))
Oleksii Zhurba943a0932017-11-01 22:27:53 +0000140 if response == 0:
141 print '{} is AVAILABLE'.format(hostname)
142 else:
143 print '{} IS NOT AVAILABLE'.format(hostname)
Ievgeniia Zadorozhna7c5f3fd2019-02-05 18:01:33 +0300144
145
146def test_k8s_dashboard_available(local_salt_client):
Hanna Arhipovab7e866c2019-04-10 13:49:56 +0300147 """
148 # Check is kubernetes enabled on the cluster with command `salt -C 'etcd:server' cmd.run 'kubectl get svc -n kube-system'`
149 # If yes then check Dashboard addon with next command: `salt -C 'etcd:server' pillar.get kubernetes:common:addons:dashboard:enabled`
150 # If dashboard enabled get its IP from pillar `salt -C 'etcd:server' pillar.get kubernetes:common:addons:dashboard:public_ip`
151 # Check that public_ip exists
152 # Check that public_ip:8443 is accessible with curl
153 """
Ievgeniia Zadorozhna7c5f3fd2019-02-05 18:01:33 +0300154 result = local_salt_client.cmd(
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -0500155 tgt='etcd:server',
156 param='kubectl get svc -n kube-system',
Ievgeniia Zadorozhna7c5f3fd2019-02-05 18:01:33 +0300157 expr_form='pillar'
158 )
159 if not result:
160 pytest.skip("k8s is not found on this environment")
161
162 # service name 'kubernetes-dashboard' is hardcoded in kubernetes formula
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -0500163 dashboard_enabled = local_salt_client.pillar_get(
164 tgt='etcd:server',
165 param='kubernetes:common:addons:dashboard:enabled',)
Ievgeniia Zadorozhna7c5f3fd2019-02-05 18:01:33 +0300166 if not dashboard_enabled:
167 pytest.skip("Kubernetes dashboard is not enabled in the cluster.")
168
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -0500169 external_ip = local_salt_client.pillar_get(
170 tgt='etcd:server',
171 param='kubernetes:common:addons:dashboard:public_ip')
Ievgeniia Zadorozhna7c5f3fd2019-02-05 18:01:33 +0300172
Hanna Arhipovab7e866c2019-04-10 13:49:56 +0300173 assert external_ip.__len__() > 0, "Kubernetes dashboard is enabled but not defined in pillars"
Ievgeniia Zadorozhna7c5f3fd2019-02-05 18:01:33 +0300174 # dashboard port 8443 is hardcoded in kubernetes formula
175 url = "https://{}:8443".format(external_ip)
176 check = local_salt_client.cmd(
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -0500177 tgt='etcd:server',
178 param='curl {} 2>&1 | grep kubernetesDashboard'.format(url),
Ievgeniia Zadorozhna7c5f3fd2019-02-05 18:01:33 +0300179 expr_form='pillar'
180 )
181 assert len(check.values()[0]) != 0, \
182 'Kubernetes dashboard is not reachable on {} ' \
183 'from ctl nodes'.format(url)