3 from robot.libraries.BuiltIn import BuiltIn
4 from robot.libraries.String import String
5 from robot.api import logger
6 from decorators_for_robot_functionalities import *
8 from test_constants import *
10 sys.path.append(os.path.join(os.path.dirname(__file__), '..', '../libraries/common'))
11 import common_utils # noqa
14 ex = BuiltIn().get_library_instance('execute_command')
18 def tc_002_exclusive_pool_tests():
20 'step1_no_annotation',
21 'step2_with_annotation',
22 'step3_more_replicas_than_cpus',
23 'step4_request_more_than_cpus',
24 'step5_less_cpu_annotation_than_request',
25 'step6_more_cpu_annotation_than_request',
26 'step_7_allocate_all_exclusive_and_new_one_start_running_after_needed_resource_is_freed_up'
29 BuiltIn().run_keyword("tc_002_exclusive_pool_tests.Setup")
30 common_utils.keyword_runner(steps)
36 nodename = common_utils.decide_nodename()
37 cpupools = common_utils.get_cpupools()
38 logger.info("CPU pools: " + str(cpupools))
39 logger.info("Default nodename to deploy: " + nodename)
42 @pabot_lock("flannel_ip")
43 def step1_no_annotation():
45 common_utils.helm_install(chart_name="default/cpu-pooling-exclusive1", release_name="cpu-pooling",
46 values="registry_url={reg_url},nodename={node_name}".format(reg_url=reg,
48 common_utils.test_kubernetes_object_quality(kube_object=cpu_pooling_pod1,
50 filter=r'(Running)\s*[0]',
53 allowed_cpu_for_pod = common_utils.get_cpu_allowed_list_from_pod(cpu_pooling_pod1['obj_name'])
54 exclusive_cpus = cpupools[nodename]['exclusive_caas']
55 if not common_utils.allowed_cpus_is_in_cpu_pool(allowed_cpu_for_pod, exclusive_cpus):
56 raise Exception('{pod} not allocate CPU from exclusive pool!'.format(pod=cpu_pooling_pod1['obj_name']))
57 except Exception as e:
60 common_utils.helm_delete("cpu-pooling")
61 common_utils.check_kubernetes_object(kube_object=cpu_pooling_pod1,
62 tester_function=common_utils.test_kubernetes_object_not_available,
66 @pabot_lock("flannel_ip")
67 def step2_with_annotation():
69 common_utils.helm_install(chart_name="default/cpu-pooling-exclusive2", release_name="cpu-pooling",
70 values="registry_url={reg_url},nodename={node_name}".format(reg_url=reg,
72 common_utils.test_kubernetes_object_quality(kube_object=cpu_pooling_pod2,
74 filter=r'(Running)\s*[0]',
77 allowed_cpu_for_pod = common_utils.get_cpu_allowed_list_from_pod(cpu_pooling_pod2['obj_name'])
78 exclusive_cpus = cpupools[nodename]['exclusive_caas']
79 if not common_utils.allowed_cpus_is_in_cpu_pool(allowed_cpu_for_pod, exclusive_cpus):
80 raise Exception('{pod} not allocate CPU from exclusive pool!'.format(pod=cpu_pooling_pod2['obj_name']))
82 common_utils.helm_delete("cpu-pooling")
83 common_utils.check_kubernetes_object(kube_object=cpu_pooling_pod2,
84 tester_function=common_utils.test_kubernetes_object_not_available,
88 @pabot_lock("flannel_ip")
89 def step3_more_replicas_than_cpus():
90 num_of_replicas = len(cpupools[nodename]['exclusive_caas'])
92 common_utils.helm_install(chart_name="default/cpu-pooling-exclusive2", release_name="cpu-pooling",
93 values="registry_url={reg_url},nodename={node_name},replicas={cpus}"
94 .format(reg_url=reg, cpus=num_of_replicas+1, node_name=nodename))
95 cpu_pooling_pod2['obj_count'] = str(num_of_replicas)
96 common_utils.test_kubernetes_object_quality(kube_object=cpu_pooling_pod2,
98 filter=r'(Pending)\s*[0]',
101 result = ex.execute_unix_command('kubectl describe pod {podname}'.format(podname=cpu_pooling_pod2['obj_name']))
102 error = 'Insufficient nokia.k8s.io/exclusive_caas'
104 if error not in result:
105 raise Exception('Replicaset description does not contain expected error! -' + result)
109 cpu_pooling_pod2['obj_count'] = "1"
111 common_utils.helm_delete("cpu-pooling")
112 common_utils.check_kubernetes_object(kube_object=cpu_pooling_pod2,
113 tester_function=common_utils.test_kubernetes_object_not_available,
117 @pabot_lock("flannel_ip")
118 def step4_request_more_than_cpus():
119 max_exclusive_pool_size = len(cpupools[nodename]['exclusive_caas'])
121 common_utils.helm_install(chart_name="default/cpu-pooling-exclusive2", release_name="cpu-pooling",
122 values="registry_url={reg_url},nodename={node_name},proc_req={cpus},pool_req={cpus}"
123 .format(reg_url=reg, cpus=max_exclusive_pool_size+1, node_name=nodename))
124 common_utils.test_kubernetes_object_quality(kube_object=cpu_pooling_pod2,
126 filter=r'(Pending)\s*[0]',
129 result = ex.execute_unix_command('kubectl describe pod {podname}'.format(podname=cpu_pooling_pod2['obj_name']))
130 error = 'Insufficient nokia.k8s.io/exclusive_caas'
132 if error not in result:
133 raise Exception('Replicaset description does not contain expected error! -' + result)
137 common_utils.helm_delete("cpu-pooling")
138 common_utils.check_kubernetes_object(kube_object=cpu_pooling_pod2,
139 tester_function=common_utils.test_kubernetes_object_not_available,
143 @pabot_lock("flannel_ip")
144 def step5_less_cpu_annotation_than_request():
147 cpu_pooling_pod2['obj_type'] = 'replicaset'
149 common_utils.helm_install(chart_name="default/cpu-pooling-exclusive2", release_name="cpu-pooling",
150 values="registry_url={url},nodename={node_name},proc_req={proc},pool_req={req}"
151 .format(url=reg, proc=annotation_cpu, req=request_cpu, node_name=nodename))
152 common_utils.check_kubernetes_object(kube_object=cpu_pooling_pod2,
153 tester_function=common_utils.test_kubernetes_object_available,
156 result = ex.execute_unix_command('kubectl describe replicaset {0}'.format(cpu_pooling_pod2['obj_name']))
157 error = 'Exclusive CPU requests {req} do not match to annotation {proc}'.format(req=request_cpu,
160 if error not in result:
161 raise Exception('Replicaset description does not contain expected error! -' + result)
165 common_utils.helm_delete("cpu-pooling")
166 common_utils.check_kubernetes_object(kube_object=cpu_pooling_pod2,
167 tester_function=common_utils.test_kubernetes_object_not_available,
169 cpu_pooling_pod2['obj_type'] = 'pod'
172 @pabot_lock("flannel_ip")
173 def step6_more_cpu_annotation_than_request():
176 cpu_pooling_pod2['obj_type'] = 'replicaset'
178 common_utils.helm_install(chart_name="default/cpu-pooling-exclusive2", release_name="cpu-pooling",
179 values="registry_url={url},nodename={node_name},proc_req={proc},pool_req={req}"
180 .format(url=reg, proc=annotation_cpu, req=request_cpu, node_name=nodename))
181 common_utils.check_kubernetes_object(kube_object=cpu_pooling_pod2,
182 tester_function=common_utils.test_kubernetes_object_available,
185 result = ex.execute_unix_command('kubectl describe replicaset {0}'.format(cpu_pooling_pod2['obj_name']))
186 error = 'Exclusive CPU requests {req} do not match to annotation {proc}'.format(req=request_cpu,
189 if error not in result:
190 raise Exception('Replicaset description does not contain expected error! -' + result)
194 common_utils.helm_delete("cpu-pooling")
195 common_utils.check_kubernetes_object(kube_object=cpu_pooling_pod2,
196 tester_function=common_utils.test_kubernetes_object_not_available,
198 cpu_pooling_pod2['obj_type'] = 'pod'
201 @pabot_lock("flannel_ip")
202 def step_7_allocate_all_exclusive_and_new_one_start_running_after_needed_resource_is_freed_up():
203 max_exclusive_pool_size = len(cpupools[nodename]['exclusive_caas'])
205 common_utils.helm_install(chart_name="default/cpu-pooling-exclusive2", release_name="cpu-pooling1",
206 values="registry_url={reg_url},nodename={node_name},proc_req={cpus},pool_req={cpus}"
207 .format(reg_url=reg, cpus=max_exclusive_pool_size, node_name=nodename))
208 common_utils.test_kubernetes_object_quality(kube_object=cpu_pooling_pod2,
210 filter=r'(Running)\s*[0]',
212 logger.info("Allocation of all exclusive CPU successfull!")
214 common_utils.helm_install(chart_name="default/cpu-pooling-exclusive1", release_name="cpu-pooling2",
215 values="registry_url={reg_url},nodename={node_name}".format(reg_url=reg,
217 common_utils.test_kubernetes_object_quality(kube_object=cpu_pooling_pod1,
219 filter=r'(Pending)\s*[0]',
222 logger.info("Try to allocate more exclusive CPU -> Pod in Pending!")
223 common_utils.helm_delete("cpu-pooling1")
224 common_utils.check_kubernetes_object(kube_object=cpu_pooling_pod2,
225 tester_function=common_utils.test_kubernetes_object_not_available,
227 common_utils.test_kubernetes_object_quality(kube_object=cpu_pooling_pod1,
229 filter=r'(Running)\s*[0]',
233 if common_utils.helm_list("cpu-pooling1") != "0":
234 common_utils.helm_delete("cpu-pooling1")
235 common_utils.helm_delete("cpu-pooling2")
236 common_utils.check_kubernetes_object(kube_object=cpu_pooling_pod1,
237 tester_function=common_utils.test_kubernetes_object_not_available,
239 common_utils.check_kubernetes_object(kube_object=cpu_pooling_pod2,
240 tester_function=common_utils.test_kubernetes_object_not_available,
245 def get_cpu_core_of_process(pod_name, command):
246 bash_command = "ps | grep '{proc_name}' | grep -v grep | awk '{{print $1}}'".format(proc_name=command)
247 proc_id = ex.execute_unix_command("kubectl exec `kubectl get pod | grep {0} | "
248 "awk '{{print $1}}'` -- {1}".format(pod_name, bash_command))
249 bash_command = "cat /proc/{0}/stat | awk '{{print $39}}'".format(proc_id)
250 result = ex.execute_unix_command("kubectl exec `kubectl get pod | grep {0} | "
251 "awk '{{print $1}}'` -- {1}".format(pod_name, bash_command))