def test_node_affinity_with_required(self): model = _constants.pod_with_node_affinity() pod = Pod(model) config = _utils.create_config() k8s = K8sPod(config=config, name="yo") k8s.model = pod if _utils.is_reachable(config): # ensure we have enough nodes nodes = K8sNode(config=config, name="yo").list() self.assertGreaterEqual(len(nodes), 3) # tag the nodes for i in range(len(nodes)): node = nodes[i] if i == 0: node.labels.update( {'kubernetes.io/e2e-az-name': 'e2e-az1'}) if i == 1: node.labels.update( {'kubernetes.io/e2e-az-name': 'e2e-az2'}) if i == 2: node.labels.update( {'kubernetes.io/e2e-az-name': 'e2e-az3'}) node.update() nodes = K8sNode(config=config, name="yo").list() for node in nodes: self.assertIn('kubernetes.io/e2e-az-name', node.labels) # create the pod k8s.create() # untag the nodes for node in nodes: node.labels.pop('kubernetes.io/e2e-az-name', None) node.update() pass
def test_get_by_labels_nonexistent(self): name = "yopod-{0}".format(str(uuid.uuid4())) config = K8sConfig(kubeconfig=_utils.kubeconfig_fallback) if _utils.is_reachable(config): pods = K8sPod.get_by_labels(config=config, labels={'name': name}) self.assertIsInstance(pods, list) self.assertEqual(0, len(pods))
def test_get_by_labels_without_name(self): name = "yocontainer" container = _utils.create_container(name=name) name = "yopod-{0}".format(str(uuid.uuid4())) pod = _utils.create_pod(name=name) pod.add_container(container) pod.add_label("test.label", "hello") if _utils.is_reachable(pod.config): pod.create() pods = K8sPod.get_by_labels(config=pod.config, labels={'test.label': "hello"}) self.assertIsInstance(pods, list) self.assertEqual(1, len(pods)) self.assertEqual(pod, pods[0]) pods = K8sPod.get_by_labels(config=pod.config, labels={'test.label': "world"}) self.assertEqual(0, len(pods))
def test_get_by_labels_nonexistent(self): name = "yopod-{0}".format(str(uuid.uuid4())) config = K8sConfig(kubeconfig=_utils.kubeconfig_fallback) if _utils.is_reachable(config): pods = K8sPod.get_by_labels(config=config, labels={'name': name}) self.assertIsInstance(pods, list) self.assertEqual(0, len(pods))
def create_pod(config=None, name=None): if config is None: config = create_config() obj = K8sPod( config=config, name=name ) return obj
def delete(self, cascade=False): super(K8sReplicaSet, self).delete(cascade) if cascade: pods = K8sPod(config=self.config, name="yo").list(pattern=self.name) for pod in pods: pod.delete(cascade) return self
def test_update_labels(self): name = "yocontainer" container = _utils.create_container(name=name) name = "yopod-{0}".format(str(uuid.uuid4())) pod = _utils.create_pod(name=name) pod.add_container(container) if _utils.is_reachable(pod.config): pod.create() labels = pod.labels labels['yomama'] = 'sofat' pods = K8sPod.get_by_labels(config=pod.config, labels=labels) self.assertIsInstance(pods, list) self.assertEqual(0, len(pods)) pod.labels = labels pod.update() pods = K8sPod.get_by_labels(config=pod.config, labels=labels) self.assertIsInstance(pods, list) self.assertEqual(1, len(pods))
def test_update_labels(self): name = "yocontainer" container = _utils.create_container(name=name) name = "yopod-{0}".format(str(uuid.uuid4())) pod = _utils.create_pod(name=name) pod.add_container(container) if _utils.is_reachable(pod.config): pod.create() labels = pod.labels labels['yomama'] = 'sofat' pods = K8sPod.get_by_labels(config=pod.config, labels=labels) self.assertIsInstance(pods, list) self.assertEqual(0, len(pods)) pod.labels = labels pod.update() pods = K8sPod.get_by_labels(config=pod.config, labels=labels) self.assertIsInstance(pods, list) self.assertEqual(1, len(pods))
def test_get_by_labels_without_name(self): name = "yocontainer" container = _utils.create_container(name=name) name = "yopod-{0}".format(str(uuid.uuid4())) pod = _utils.create_pod(name=name) pod.add_container(container) pod.add_label("test.label", "hello") if _utils.is_reachable(pod.config): pod.create() pods = K8sPod.get_by_labels(config=pod.config, labels={'test.label': "hello"}) self.assertIsInstance(pods, list) self.assertEqual(1, len(pods)) self.assertEqual(pod, pods[0]) pods = K8sPod.get_by_labels(config=pod.config, labels={'test.label': "world"}) self.assertEqual(0, len(pods))
def delete(self, cascade=False): super(K8sReplicaSet, self).delete(cascade) if cascade: pods = K8sPod(config=self.config, name="yo").list(pattern=self.name) for pod in pods: try: pod.delete(cascade) except NotFoundException: pass return self
def test_init_no_args(self): try: K8sPod() self.fail("Should not fail.") except SyntaxError: pass except IOError: pass except Exception as err: self.fail("Unhandled exception: [ {0} ]".format( err.__class__.__name__))
def test_init_with_invalid_name(self): name = object() try: K8sPod(name=name) self.fail("Should not fail.") except SyntaxError: pass except IOError: pass except Exception as err: self.fail("Unhandled exception: [ {0} ]".format( err.__class__.__name__))
def test_get_by_name(self): name = "yocontainer" container = _utils.create_container(name=name) name = "yopod-{0}".format(str(uuid.uuid4())) pod = _utils.create_pod(name=name) pod.add_container(container) if _utils.is_reachable(pod.config): pod.create() pods = K8sPod.get_by_name(config=pod.config, name=name) self.assertIsInstance(pods, list) self.assertEqual(1, len(pods))
def test_get_by_name(self): name = "yocontainer" container = _utils.create_container(name=name) name = "yopod-{0}".format(str(uuid.uuid4())) pod = _utils.create_pod(name=name) pod.add_container(container) if _utils.is_reachable(pod.config): pod.create() pods = K8sPod.get_by_name(config=pod.config, name=name) self.assertIsInstance(pods, list) self.assertEqual(1, len(pods))
def _check_pod_readiness(self): if self.current_replicas == self.desired_replicas: pods = K8sPod.get_by_labels(config=self.config, labels=self.pod_labels) for pod in pods: try: if not pod.is_ready(): raise PodNotReadyException(pod.name) except NotFoundException: pass except PodNotReadyException: return False return True return False
def _check_pod_readiness(self): if self.current_replicas == self.desired_replicas: pods = K8sPod.get_by_labels(config=self.config, labels=self.pod_labels) for pod in pods: try: if not pod.is_ready(): raise PodNotReadyException(pod.name) except NotFoundException: pass except PodNotReadyException: return False return True return False
def test_delete_cascade(self): c_redis = _utils.create_container(name="redis", image="redis") c_nginx = _utils.create_container(name="nginx", image="nginx") name = "yodep-{0}".format(str(uuid.uuid4())) dep = _utils.create_deployment(name=name) dep.add_container(c_redis) dep.desired_replicas = 3 if _utils.is_reachable(dep.config): dep.create() dep.add_container(c_nginx) dep.update() repsets = K8sReplicaSet(config=dep.config, name="yo").list() self.assertEqual(2, len(repsets)) pods = K8sPod(config=dep.config, name="yo").list() self.assertLessEqual(3, len(pods)) # rollout burst dep.delete(cascade=True) result = dep.list() self.assertIsInstance(result, list) self.assertEqual(0, len(result)) repsets = K8sReplicaSet(config=dep.config, name="yo").list() self.assertEqual(0, len(repsets)) pods = K8sPod(config=dep.config, name="yo").list() self.assertEqual(0, len(pods))
def test_pod_affinity_no_good_nodes(self): model = _constants.pod_with_pod_affinity() pod = Pod(model) config = _utils.create_config() k8s = K8sPod(config=config, name="yo") k8s.model = pod if _utils.is_reachable(config): nodes = K8sNode(config=config, name="yo").list() # untag all nodes for node in nodes: node.labels.pop('kubernetes.io/e2e-az-name', None) node.update() with self.assertRaises(TimedOutException): # timeout because of required k8s.create()
def _pod_inventory(self): """ Returns the list of all K8sPods found on this K8sNode. :return: A list of K8sPods. """ pods = [] namespaces = K8sNamespace(config=self.config, name="yo").list() for ns in namespaces: cfg = self.config cfg.namespace = ns.name p = K8sPod(config=cfg, name="yo").list() filtered = filter(lambda x: x.node_name == self.name, p) pods += filtered return pods
def test_update_name_fails(self): name = "yocontainer" container = _utils.create_container(name=name) name1 = "yopod1" name2 = "yopod2" pod = _utils.create_pod(name=name1) pod.add_container(container) if _utils.is_reachable(pod.config): pod.create() result = K8sPod.get_by_name(config=pod.config, name=name1) self.assertIsInstance(result, list) self.assertEqual(1, len(result)) self.assertIsInstance(result[0], K8sPod) result[0].name = name2 with self.assertRaises(NotFoundException): result[0].update()
def test_pod_affinities(self): config = _utils.create_config() container = _utils.create_container(name="nginx", image="nginx:latest") pod_s1 = _utils.create_pod(config=config, name="s1") pod_s1.labels.update({'security': 'S1'}) pod_s1.node_selector = {'kubernetes.io/e2e-az-name': 'e2e-az1'} pod_s1.add_container(container) pod_s2 = _utils.create_pod(config=config, name="s2") pod_s2.labels.update({'security': 'S2'}) pod_s2.node_selector = {'kubernetes.io/e2e-az-name': 'e2e-az2'} pod_s2.add_container(container) model = _constants.pod_with_pod_affinity() pod = Pod(model) config = _utils.create_config() k8s = K8sPod(config=config, name="yo") k8s.model = pod if _utils.is_reachable(config): # ensure we have enough nodes nodes = K8sNode(config=config, name="yo").list() if len(nodes) < 3: self.skipTest(reason='Not enough nodes to perform test.') else: self.assertGreaterEqual(len(nodes), 3) # tag the nodes for i in range(len(nodes)): node = nodes[i] if i == 0: node.labels.update( {'kubernetes.io/e2e-az-name': 'e2e-az1'}) if i == 1: node.labels.update( {'kubernetes.io/e2e-az-name': 'e2e-az2'}) if i == 2: node.labels.update( {'kubernetes.io/e2e-az-name': 'e2e-az3'}) node.update() # create the pods for affinity lookup pod_s1.create() pod_s2.create() # create the pod with affinities k8s.create() pass
def test_update_name_fails(self): name = "yocontainer" container = _utils.create_container(name=name) name1 = "yopod1" name2 = "yopod2" pod = _utils.create_pod(name=name1) pod.add_container(container) if _utils.is_reachable(pod.config): pod.create() result = K8sPod.get_by_name(config=pod.config, name=name1) self.assertIsInstance(result, list) self.assertEqual(1, len(result)) self.assertIsInstance(result[0], K8sPod) result[0].name = name2 with self.assertRaises(NotFoundException): result[0].update()
def test_delete_no_cascade(self): name = "yocontainer" container = _utils.create_container(name=name) name = "yodep-{0}".format(str(uuid.uuid4())) dep = _utils.create_deployment(name=name) dep.add_container(container) dep.desired_replicas = 3 if _utils.is_reachable(dep.config): dep.create() dep.delete(cascade=False) result = dep.list() self.assertIsInstance(result, list) self.assertEqual(0, len(result)) repsets = K8sReplicaSet(config=dep.config, name="yo").list() self.assertEqual(1, len(repsets)) pods = K8sPod(config=dep.config, name="yo").list() self.assertEqual(3, len(pods))
def test_update_namespace_fails(self): name = "yocontainer" container = _utils.create_container(name=name) name = "yopod-{0}".format(str(uuid.uuid4())) nspace = "yonamespace" pod1 = _utils.create_pod(name=name) pod1.add_container(container) if _utils.is_reachable(pod1.config): pod1.create() result = K8sPod.get_by_name(config=pod1.config, name=name) self.assertIsInstance(result, list) self.assertEqual(1, len(result)) pod2 = result[0] self.assertIsInstance(pod2, K8sPod) self.assertNotEqual(pod2.namespace, nspace) self.assertEqual(pod1, pod2) pod2.namespace = nspace with self.assertRaises(BadRequestException): pod2.update()
def test_update_namespace_fails(self): name = "yocontainer" container = _utils.create_container(name=name) name = "yopod-{0}".format(str(uuid.uuid4())) nspace = "yonamespace" pod1 = _utils.create_pod(name=name) pod1.add_container(container) if _utils.is_reachable(pod1.config): pod1.create() result = K8sPod.get_by_name(config=pod1.config, name=name) self.assertIsInstance(result, list) self.assertEqual(1, len(result)) pod2 = result[0] self.assertIsInstance(pod2, K8sPod) self.assertNotEqual(pod2.namespace, nspace) self.assertEqual(pod1, pod2) pod2.namespace = nspace with self.assertRaises(BadRequestException): pod2.update()
def delete(self, cascade=False): # delete cascade on top level super(K8sDeployment, self).delete(cascade) if cascade: rsets = K8sReplicaSet(config=self.config, name="yo").list(pattern=self.name) # delete cascade on replicasets for rset in rsets: try: rset.delete(cascade=cascade) except NotFoundException: pass pods = K8sPod(config=self.config, name="yo").list(pattern=self.name) # delete cascade on pods for pod in pods: try: pod.delete(cascade=cascade) except NotFoundException: pass return self
def test_get_by_labels_none_args(self): config = _utils.create_config() with self.assertRaises(SyntaxError): K8sPod.get_by_labels(config=config)
def test_get_by_labels_invalid_args(self): name = object() config = _utils.create_config() with self.assertRaises(SyntaxError): K8sPod.get_by_labels(config=config, labels=name)
def test_get_by_labels_none_args(self): config = _utils.create_config() with self.assertRaises(SyntaxError): K8sPod.get_by_labels(config=config)
def test_get_by_labels_invalid_args(self): name = object() config = _utils.create_config() with self.assertRaises(SyntaxError): K8sPod.get_by_labels(config=config, labels=name)
def get_pods(self): pods = K8sPod.get_by_labels(config=self.config, labels=self.pod_labels) return pods
def _get_pods(self, name=None, labels=None): if labels is None: return K8sPod.get_by_name(config=self.config, name=name) else: return K8sPod.get_by_labels(config=self.config, labels=labels)
def pod(self): podspec = self.model.spec.job_template.spec.template.spec name = "{}-{}".format(self.name, int(time.time())) pod = K8sPod(config=self.config, name=name) pod.model.spec = podspec return pod
def get_pods(self): pods = K8sPod.get_by_labels(config=self.config, labels=self.pod_labels) return pods