def test_list_namespaces(self, mock_lnp): mock_lnp.side_effect = mock_list_namespaces kl = KubeLibrary(kube_config='test/resources/k3d') namespaces = kl.get_namespaces() self.assertTrue(len(namespaces) > 0) self.assertEqual(['default', 'kubelib-test-test-objects-chart'], namespaces)
def test_get_cron_job_details_in_namespace(self, mock_lnp): mock_lnp.side_effect = mock_read_cron_job_details_in_namespace kl = KubeLibrary(kube_config='test/resources/k3d') cron_job_details = kl.get_cron_job_details_in_namespace( 'hello', 'default') self.assertEqual('mytestlabel', cron_job_details.items.metadata.labels.TestLabel)
def test_get_daemonset_details_in_namespace(self, mock_lnp): mock_lnp.side_effect = mock_read_daemonset_details_in_namespace kl = KubeLibrary(kube_config='test/resources/k3d') daemonset_details = kl.get_daemonset_details_in_namespace( 'fluentd-elasticsearch', 'default') self.assertEqual('mytestlabel', daemonset_details.items.metadata.labels.TestLabel)
def test_filter_pods_containers_statuses_by_name(self, mock_lnp): mock_lnp.side_effect = mock_list_namespaced_pod kl = KubeLibrary(kube_config='test/resources/k3d') pods = kl.list_namespaced_pod_by_pattern('octopus.*', 'default') self.assertEqual( 0, kl.filter_pods_containers_statuses_by_name(pods, '.*')[0].restart_count)
def test_read_namespaced_endpoints(self, mock_lnp): mock_lnp.side_effect = mock_read_namespaced_endpoints kl = KubeLibrary(kube_config='test/resources/k3d') endpoints = kl.read_namespaced_endpoints('.*', 'default') endpoints2 = kl.get_endpoints_in_namespace('.*', 'default') self.assertEqual(endpoints.items[0].metadata.name, endpoints2.items[0].metadata.name) self.assertEqual('my-service', endpoints.items[0].metadata.name)
def test_filter_containers_images(self, mock_lnp): mock_lnp.side_effect = mock_list_namespaced_pod kl = KubeLibrary(kube_config='test/resources/k3d') pods = kl.list_namespaced_pod_by_pattern('octopus.*', 'default') containers = kl.filter_pods_containers_by_name(pods, '.*') self.assertEqual( ['eu.gcr.io/kyma-project/incubator/develop/octopus:dc5dc284'], kl.filter_containers_images(containers))
def test_filter_containers_resources(self, mock_lnp): mock_lnp.side_effect = mock_list_namespaced_pod kl = KubeLibrary(kube_config='test/resources/k3d') pods = kl.list_namespaced_pod_by_pattern('octopus.*', 'default') containers = kl.filter_pods_containers_by_name(pods, '.*') self.assertEqual( '100m', kl.filter_containers_resources(containers)[0].limits.cpu)
def test_evaluate_callable_from_k8s_client(self): configmap = KubeLibrary.evaluate_callable_from_k8s_client( attr_name="V1ConfigMap", data={"msg": "Mock"}, api_version="v1", kind="ConfigMap", metadata=KubeLibrary.evaluate_callable_from_k8s_client( attr_name="V1ObjectMeta", name="Mock")) self.assertIsNotNone(configmap) self.assertEqual(configmap.metadata.name, "Mock")
def test_get_namespaced_exec_without_container(self, mock_stream): test_string = "This is test String!" mock_stream.return_value = test_string kl = KubeLibrary(kube_config='test/resources/k3d') stdout = kl.get_namespaced_pod_exec( name="pod_name", namespace="default", argv_cmd=["/bin/bash", "-c", f"echo {test_string}"]) self.assertFalse("container" in mock_stream.call_args.kwargs.keys()) self.assertEqual(stdout, test_string)
def test_read_namespaced_service(self, mock_lnp): mock_lnp.side_effect = mock_read_service_details_in_namespace kl = KubeLibrary(kube_config='test/resources/k3d') service_details = kl.read_namespaced_service('minimal-ingress', 'default') service_details2 = kl.get_service_details_in_namespace( 'minimal-ingress', 'default') self.assertEqual(service_details.items.metadata.labels.Test, service_details2.items.metadata.labels.Test) self.assertEqual('mytest', service_details.items.metadata.labels.Test)
def test_read_namespaced_ingress(self, mock_lnp): mock_lnp.side_effect = mock_read_ingress_details_in_namespace kl = KubeLibrary(kube_config='test/resources/k3d') ingress_details = kl.read_namespaced_ingress('max-ingress', 'default') ingress_details2 = kl.get_ingress_details_in_namespace( 'max-ingress', 'default') self.assertEqual(ingress_details.items.metadata.labels.TestLabel, ingress_details2.items.metadata.labels.TestLabel) self.assertEqual('mytestlabel', ingress_details.items.metadata.labels.TestLabel)
def test_read_namespaced_horizontal_pod_autoscaler(self, mock_lnp): mock_lnp.side_effect = mock_read_hpa_details_in_namespace kl = KubeLibrary(kube_config='test/resources/k3d') hpa_details = kl.read_namespaced_horizontal_pod_autoscaler( 'kubelib-test-test-objects-chart', 'default') hpa_details2 = kl.get_hpa_details_in_namespace( 'kubelib-test-test-objects-chart', 'default') self.assertEqual(hpa_details.items.spec.scaleTargetRef.name, hpa_details2.items.spec.scaleTargetRef.name) self.assertEqual('kubelib-test-test-objects-chart', hpa_details.items.spec.scaleTargetRef.name)
def test_get_namespaced_exec_not_argv_and_list(self, mock_stream): test_string = "This is test String!" ex = f"argv_cmd parameter should be a list and contains values like " \ f"[\"/bin/bash\", \"-c\", \"ls\"] not echo {test_string}" mock_stream.return_value = test_string kl = KubeLibrary(kube_config='test/resources/k3d') with self.assertRaises(TypeError) as cm: kl.get_namespaced_pod_exec(name="pod_name", namespace="default", container="manager", argv_cmd=f"echo {test_string}") self.assertEqual(str(cm.exception), ex)
def test_KubeLibrary_inits_with_bearer_token(self): kl = KubeLibrary(api_url=k8s_api_url, bearer_token=bearer_token) for api in TestKubeLibrary.apis: target = getattr(kl, api) self.assertEqual(kl.api_client.configuration.api_key, target.api_client.configuration.api_key) self.assertEqual(kl.api_client.configuration.ssl_ca_cert, None)
def test_inits_with_bearer_token_raises_BearerTokenWithPrefixException( self): kl = KubeLibrary(api_url=k8s_api_url, bearer_token=bearer_token) self.assertRaises(BearerTokenWithPrefixException, kl.reload_config, api_url=k8s_api_url, bearer_token='Bearer prefix should fail')
def test_KubeLibrary_inits_without_cert_validation(self): kl = KubeLibrary(kube_config='test/resources/k3d', cert_validation=False) for api in TestKubeLibrary.apis: target = getattr(kl, api) self.assertEqual( target.api_client.rest_client.pool_manager. connection_pool_kw['cert_reqs'], ssl.CERT_NONE)
def test_KubeLibrary_inits_from_kubeconfig(self): responses.add("GET", "/version", status=200) responses.add("GET", "/apis", status=200, body='{"groups": [], "kind": "Pod" }', content_type="application/json") KubeLibrary(kube_config='test/resources/k3d')
def test_KubeLibrary_dynamic_delete(self): responses.add("GET", "/version", status=200) responses.add("GET", "/apis", status=200, body='{"groups": [], "kind": "Pod" }', content_type="application/json") responses.add( "GET", "/api/v1", status=200, body= '{"resources": [{"api_version": "v1", "kind": "Pod", "name": "Mock"}], "kind": "Pod"}', content_type="application/json") responses.add("DELETE", "/api/v1/mock/Mock", status=200) kl = KubeLibrary(kube_config='test/resources/k3d') kl.delete("v1", "Pod", name="Mock")
def test_list_namespaced_pod_by_pattern(self, mock_lnp): mock_lnp.side_effect = mock_list_namespaced_pod kl = KubeLibrary(kube_config='test/resources/k3d') pods = kl.list_namespaced_pod_by_pattern('.*', 'default') pods2 = kl.get_pods_in_namespace('.*', 'default') pods3 = kl.get_pod_names_in_namespace('.*', 'default') self.assertEqual(kl.filter_names(pods), pods3) self.assertEqual(kl.filter_names(pods), kl.filter_pods_names(pods2)) self.assertEqual(['octopus-0', 'grafana-5d9895c6c4-sfsn8'], kl.filter_names(pods))
def test_list_namespaced_secret_by_pattern(self, mock_lnp): mock_lnp.side_effect = mock_list_namespaced_secrets kl = KubeLibrary(kube_config='test/resources/k3d') secrets = kl.list_namespaced_secret_by_pattern('.*', 'default') secrets2 = kl.get_secrets_in_namespace('.*', 'default') self.assertEqual(kl.filter_names(secrets), kl.filter_names(secrets2)) self.assertEqual(['grafana'], kl.filter_names(secrets))
def test_KubeLibrary_inits_with_context(self): responses.add("GET", "/version", status=200) responses.add("GET", "/apis", status=200, body='{"groups": [], "kind": "Pod" }', content_type="application/json") KubeLibrary(kube_config='test/resources/multiple_context', context='k3d-k3d-cluster2')
def test_get_configmaps_in_namespace(self, mock_lnp): mock_lnp.side_effect = mock_list_namespaced_config_map kl = KubeLibrary(kube_config='test/resources/k3d') configmaps = kl.list_namespaced_config_map_by_pattern('.*', 'default') configmaps2 = kl.get_configmaps_in_namespace('.*', 'default') self.assertEqual(kl.filter_names(configmaps), kl.filter_configmap_names(configmaps2)) self.assertEqual(['game-demo'], kl.filter_names(configmaps))
def test_list_namespaced_deployment_by_pattern(self, mock_lnp): mock_lnp.side_effect = mock_list_namespaced_deployments kl = KubeLibrary(kube_config='test/resources/k3d') deployments = kl.list_namespaced_deployment_by_pattern('.*', 'default') deployments2 = kl.get_deployments_in_namespace('.*', 'default') self.assertEqual(kl.filter_names(deployments), kl.filter_deployments_names(deployments2)) self.assertEqual(['nginx-deployment'], kl.filter_names(deployments))
def test_list_namespaced_job_by_pattern(self, mock_lnp): mock_lnp.side_effect = mock_list_namespaced_jobs kl = KubeLibrary(kube_config='test/resources/k3d') jobs = kl.list_namespaced_job_by_pattern('.*', 'default') jobs2 = kl.get_jobs_in_namespace('.*', 'default') self.assertEqual(kl.filter_names(jobs), kl.filter_names(jobs2)) self.assertEqual(['octopus-0', 'octopus-1', 'octopus-2', 'octopus-3'], kl.filter_names(jobs))
def test_inits_all_api_clients(self): responses.add("GET", "/version", status=200) responses.add("GET", "/apis", status=200, body='{"groups": [], "kind": "Pod" }', content_type="application/json") kl = KubeLibrary(kube_config='test/resources/k3d') for api in TestKubeLibrary.apis: self.assertIsNotNone(getattr(kl, api))
def test_list_namespaced_replica_set_by_pattern(self, mock_lnp): mock_lnp.side_effect = mock_list_namespaced_replicasets kl = KubeLibrary(kube_config='test/resources/k3d') replicasets = kl.list_namespaced_replica_set_by_pattern( '.*', 'test-auto') replicasets2 = kl.get_replicasets_in_namespace('.*', 'test-auto') self.assertEqual(kl.filter_names(replicasets), kl.filter_replicasets_names(replicasets2)) self.assertEqual(['nginx-proxy'], kl.filter_names(replicasets))
def test_list_namespaced_service_account_by_pattern(self, mock_lnp): mock_lnp.side_effect = mock_list_namespaced_service_accounts kl = KubeLibrary(kube_config='test/resources/k3d') sa = kl.list_namespaced_service_account_by_pattern('.*', 'default') sa2 = kl.get_service_accounts_in_namespace('.*', 'default') self.assertEqual(kl.filter_names(sa), kl.filter_service_accounts_names(sa2)) self.assertEqual(['default', 'kubelib-test-test-objects-chart'], kl.filter_names(sa))
def test_gather_pods_obejcts_to_pods_json(self): kl = KubeLibrary(kube_config='~/.kube/k3d') ret = kl.v1.list_namespaced_pod('default', watch=False) pods_str = str(ret.items).replace("'", '"') \ .replace('None', 'null') \ .replace('True', 'true') \ .replace('False', 'false') # serialize datetime into fixed timestamp pods = re.sub(r'datetime(.+?)\)\)', '1592598289', pods_str) with open('test/resources/pods.json', 'w') as outfile: json.dump(json.loads(pods), outfile, indent=4)
def test_KubeLibrary_fails_for_wrong_context(self): responses.add("GET", "/version", status=200) responses.add("GET", "/apis", status=200, body='{"groups": [], "kind": "Pod" }', content_type="application/json") kl = KubeLibrary(kube_config='test/resources/multiple_context') self.assertRaises(ConfigException, kl.reload_config, kube_config='test/resources/multiple_context', context='k3d-k3d-cluster2-wrong')
def test_assert_container_has_env_vars(self): pod = mock_list_namespaced_pod('default').items[0] kl = KubeLibrary(kube_config='~/.kube/k3d') container = kl.filter_pods_containers_by_name([pod], '.*')[0] env_vars = '{}' self.assertTrue(kl.assert_container_has_env_vars(container, env_vars)) env_vars = '{"SECRET_NAME":"webhook-server-secret"}' self.assertTrue(kl.assert_container_has_env_vars(container, env_vars)) env_vars = '{"SECRET_NAME":"wrong"}' self.assertFalse(kl.assert_container_has_env_vars(container, env_vars)) env_vars = '{"NOT_EXISTING":"wrong"}' self.assertFalse(kl.assert_container_has_env_vars(container, env_vars)) env_vars = '{"badlyformatted:}' self.assertFalse(kl.assert_container_has_env_vars(container, env_vars))