11import json
2- import unittest
32import time
4- import timeout_decorator
53import subprocess
64import warnings
7- import os
8- import yaml
95
10- from datetime import datetime
116from kubernetes import client , config
127from kubernetes .client .rest import ApiException
138
149
1510def to_selector (labels ):
16- return "," .join (["=" .join (l ) for l in labels .items ()])
11+ return "," .join (["=" .join (lbl ) for lbl in labels .items ()])
1712
1813
1914class K8sApi :
@@ -43,8 +38,8 @@ class K8s:
4338
4439 def __init__ (self , labels = 'x=y' , namespace = 'default' ):
4540 self .api = K8sApi ()
46- self .labels = labels
47- self .namespace = namespace
41+ self .labels = labels
42+ self .namespace = namespace
4843
4944 def get_pg_nodes (self , pg_cluster_name , namespace = 'default' ):
5045 master_pod_node = ''
@@ -81,7 +76,7 @@ def get_operator_pod(self):
8176 'default' , label_selector = 'name=postgres-operator'
8277 ).items
8378
84- pods = list (filter (lambda x : x .status .phase == 'Running' , pods ))
79+ pods = list (filter (lambda x : x .status .phase == 'Running' , pods ))
8580
8681 if len (pods ):
8782 return pods [0 ]
@@ -110,7 +105,6 @@ def wait_for_pod_start(self, pod_labels, namespace='default'):
110105
111106 time .sleep (self .RETRY_TIMEOUT_SEC )
112107
113-
114108 def get_service_type (self , svc_labels , namespace = 'default' ):
115109 svc_type = ''
116110 svcs = self .api .core_v1 .list_namespaced_service (namespace , label_selector = svc_labels , limit = 1 ).items
@@ -213,8 +207,8 @@ def wait_for_logical_backup_job_creation(self):
213207 self .wait_for_logical_backup_job (expected_num_of_jobs = 1 )
214208
215209 def delete_operator_pod (self , step = "Delete operator pod" ):
216- # patching the pod template in the deployment restarts the operator pod
217- self .api .apps_v1 .patch_namespaced_deployment ("postgres-operator" ,"default" , {"spec" :{"template" :{"metadata" :{"annotations" :{"step" :"{}-{}" .format (step , datetime . fromtimestamp ( time .time () ))}}}}})
210+ # patching the pod template in the deployment restarts the operator pod
211+ self .api .apps_v1 .patch_namespaced_deployment ("postgres-operator" , "default" , {"spec" : {"template" : {"metadata" : {"annotations" : {"step" : "{}-{}" .format (step , time .time ())}}}}})
218212 self .wait_for_operator_pod_start ()
219213
220214 def update_config (self , config_map_patch , step = "Updating operator deployment" ):
@@ -237,7 +231,7 @@ def exec_with_kubectl(self, pod, cmd):
237231
238232 def get_patroni_state (self , pod ):
239233 r = self .exec_with_kubectl (pod , "patronictl list -f json" )
240- if not r .returncode == 0 or not r .stdout .decode ()[0 :1 ]== "[" :
234+ if not r .returncode == 0 or not r .stdout .decode ()[0 :1 ] == "[" :
241235 return []
242236 return json .loads (r .stdout .decode ())
243237
@@ -248,7 +242,7 @@ def get_operator_state(self):
248242 pod = pod .metadata .name
249243
250244 r = self .exec_with_kubectl (pod , "curl localhost:8080/workers/all/status/" )
251- if not r .returncode == 0 or not r .stdout .decode ()[0 :1 ]== "{" :
245+ if not r .returncode == 0 or not r .stdout .decode ()[0 :1 ] == "{" :
252246 return None
253247
254248 return json .loads (r .stdout .decode ())
@@ -277,7 +271,7 @@ def get_effective_pod_image(self, pod_name, namespace='default'):
277271 '''
278272 pod = self .api .core_v1 .list_namespaced_pod (
279273 namespace , label_selector = "statefulset.kubernetes.io/pod-name=" + pod_name )
280-
274+
281275 if len (pod .items ) == 0 :
282276 return None
283277 return pod .items [0 ].spec .containers [0 ].image
@@ -305,8 +299,8 @@ class K8sBase:
305299
306300 def __init__ (self , labels = 'x=y' , namespace = 'default' ):
307301 self .api = K8sApi ()
308- self .labels = labels
309- self .namespace = namespace
302+ self .labels = labels
303+ self .namespace = namespace
310304
311305 def get_pg_nodes (self , pg_cluster_labels = 'cluster-name=acid-minimal-cluster' , namespace = 'default' ):
312306 master_pod_node = ''
@@ -434,10 +428,10 @@ def count_deployments_with_label(self, labels, namespace='default'):
434428 def count_pdbs_with_label (self , labels , namespace = 'default' ):
435429 return len (self .api .policy_v1_beta1 .list_namespaced_pod_disruption_budget (
436430 namespace , label_selector = labels ).items )
437-
431+
438432 def count_running_pods (self , labels = 'application=spilo,cluster-name=acid-minimal-cluster' , namespace = 'default' ):
439433 pods = self .api .core_v1 .list_namespaced_pod (namespace , label_selector = labels ).items
440- return len (list (filter (lambda x : x .status .phase == 'Running' , pods )))
434+ return len (list (filter (lambda x : x .status .phase == 'Running' , pods )))
441435
442436 def wait_for_pod_failover (self , failover_targets , labels , namespace = 'default' ):
443437 pod_phase = 'Failing over'
@@ -484,14 +478,14 @@ def exec_with_kubectl(self, pod, cmd):
484478
485479 def get_patroni_state (self , pod ):
486480 r = self .exec_with_kubectl (pod , "patronictl list -f json" )
487- if not r .returncode == 0 or not r .stdout .decode ()[0 :1 ]== "[" :
481+ if not r .returncode == 0 or not r .stdout .decode ()[0 :1 ] == "[" :
488482 return []
489483 return json .loads (r .stdout .decode ())
490484
491485 def get_patroni_running_members (self , pod ):
492486 result = self .get_patroni_state (pod )
493- return list (filter (lambda x : x ["State" ]== "running" , result ))
494-
487+ return list (filter (lambda x : x ["State" ] == "running" , result ))
488+
495489 def get_statefulset_image (self , label_selector = "application=spilo,cluster-name=acid-minimal-cluster" , namespace = 'default' ):
496490 ssets = self .api .apps_v1 .list_namespaced_stateful_set (namespace , label_selector = label_selector , limit = 1 )
497491 if len (ssets .items ) == 0 :
@@ -505,7 +499,7 @@ def get_effective_pod_image(self, pod_name, namespace='default'):
505499 '''
506500 pod = self .api .core_v1 .list_namespaced_pod (
507501 namespace , label_selector = "statefulset.kubernetes.io/pod-name=" + pod_name )
508-
502+
509503 if len (pod .items ) == 0 :
510504 return None
511505 return pod .items [0 ].spec .containers [0 ].image
@@ -514,10 +508,13 @@ def get_effective_pod_image(self, pod_name, namespace='default'):
514508"""
515509 Inspiriational classes towards easier writing of end to end tests with one cluster per test case
516510"""
511+
512+
517513class K8sOperator (K8sBase ):
518514 def __init__ (self , labels = "name=postgres-operator" , namespace = "default" ):
519515 super ().__init__ (labels , namespace )
520516
517+
521518class K8sPostgres (K8sBase ):
522519 def __init__ (self , labels = "cluster-name=acid-minimal-cluster" , namespace = "default" ):
523520 super ().__init__ (labels , namespace )
0 commit comments