From 059ebc5469200911b901fe41cab29447fa9a9705 Mon Sep 17 00:00:00 2001 From: Jack Lucas Date: Wed, 27 Feb 2019 11:38:13 -0500 Subject: Add k8sclient unit tests Change-Id: I4b664865618bf87822af325e2c2dd43e71c0bdac Issue-ID: DCAEGEN2-1261 Signed-off-by: Jack Lucas --- k8s/tests/test_k8sclient.py | 125 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 122 insertions(+), 3 deletions(-) (limited to 'k8s/tests/test_k8sclient.py') diff --git a/k8s/tests/test_k8sclient.py b/k8s/tests/test_k8sclient.py index e985def..2511239 100644 --- a/k8s/tests/test_k8sclient.py +++ b/k8s/tests/test_k8sclient.py @@ -102,7 +102,7 @@ def test_parse_ports(): ("9101/udp:31043", (9101, 31043, "UDP")) ] ] - + bad_ports = [ "9101", "9101:", @@ -130,10 +130,10 @@ def test_parse_ports(): (9661,"TCP") : 19661, (9661,"UDP") : 19661, (8080,"TCP") : 8080 - } + } for test_case in good_ports: - container_ports, port_map = _parse_ports([test_case["in"]]) + container_ports, port_map = _parse_ports([test_case["in"]]) (cport, hport, proto) = test_case["ex"] assert container_ports == [(cport, proto)] assert port_map == {(cport, proto) : hport} @@ -153,3 +153,122 @@ def test_create_container(): assert container.ports[0].container_port == 80 and container.ports[0].protocol == "TCP" assert container.ports[1].container_port == 53 and container.ports[1].protocol == "UDP" + +def test_create_probe(): + from k8sclient.k8sclient import _create_probe + from kubernetes import client + + http_checks = [ + {"type" : "http", "endpoint" : "/example/health"} + ] + + script_checks = [ + {"type" : "docker", "script": "/opt/app/health_check.sh"} + ] + + for hc in http_checks: + probe = _create_probe(hc, 13131) + assert probe.http_get.path == hc["endpoint"] + assert probe.http_get.scheme == hc["type"].upper() + + for hc in script_checks: + probe = _create_probe(hc, 13131) + assert probe._exec.command[0] == hc["script"] + +def test_deploy(monkeypatch): + import k8sclient.k8sclient + from kubernetes import client + + # We need to patch the kubernetes 'client' module + # Awkward because of the way it requires a function call + # to get an API object + core = client.CoreV1Api() + ext = client.ExtensionsV1beta1Api() + + def pseudo_deploy(namespace, dep): + return dep + + def pseudo_service(namespace, svc): + return svc + + # patched_core returns a CoreV1Api object with the + # create_namespaced_service method stubbed out so that there + # is no attempt to call the k8s API server + def patched_core(): + monkeypatch.setattr(core, "create_namespaced_service", pseudo_service) + return core + + # patched_ext returns an ExtensionsV1beta1Api object with the + # create_namespaced_deployment method stubbed out so that there + # is no attempt to call the k8s API server + def patched_ext(): + monkeypatch.setattr(ext,"create_namespaced_deployment", pseudo_deploy) + return ext + + def pseudo_configure(): + pass + + monkeypatch.setattr(k8sclient.k8sclient,"_configure_api", pseudo_configure) + monkeypatch.setattr(client, "CoreV1Api", patched_core) + monkeypatch.setattr(client,"ExtensionsV1beta1Api", patched_ext) + + k8s_test_config = { + "image_pull_secrets" : ["secret0", "secret1"], + "filebeat" : { + "log_path": "/var/log/onap", + "data_path": "/usr/share/filebeat/data", + "config_path": "/usr/share/filebeat/filebeat.yml", + "config_subpath": "filebeat.yml", + "image" : "filebeat-repo/filebeat:latest", + "config_map" : "dcae-filebeat-configmap" + }, + "tls" : { + "cert_path": "/opt/certs", + "image": "tlsrepo/tls-init-container:1.2.3" + } + } + + resources = { + "limits": { + "cpu" : 0.5, + "memory" : "2Gi" + }, + "requests": { + "cpu" : 0.5, + "memory" : "2Gi" + } + } + + kwargs = { + "volumes": [ + {"host":{"path": "/path/on/host"}, "container":{"bind":"/path/on/container","mode":"rw"}} + ], + "ports": ["80:0", "443:0"], + "env": {"name0": "value0", "name1": "value1"}, + "log_info": {"log_directory": "/path/to/container/log/directory"}, + "tls_info": {"use_tls": True, "cert_directory": "/path/to/container/cert/directory" }, + "readiness": {"type": "http", "endpoint" : "/ready"} + } + dep, deployment_description = k8sclient.k8sclient.deploy("k8stest","testcomponent","example.com/testcomponent:1.4.3",1,False, k8s_test_config, resources, **kwargs) + + assert deployment_description["deployment"] == "dep-testcomponent" + assert deployment_description["namespace"] == "k8stest" + assert deployment_description["services"][0] == "testcomponent" + + # For unit test purposes, we want to make sure that the deployment object + # we're passing to the k8s API is correct + app_container = dep.spec.template.spec.containers[0] + assert app_container.image == "example.com/testcomponent:1.4.3" + assert app_container.image_pull_policy == "IfNotPresent" + assert len(app_container.ports) == 2 + assert app_container.ports[0].container_port == 80 + assert app_container.ports[1].container_port == 443 + assert app_container.readiness_probe.http_get.path == "/ready" + assert app_container.readiness_probe.http_get.scheme == "HTTP" + assert len(app_container.volume_mounts) == 3 + assert app_container.volume_mounts[0].mount_path == "/path/on/container" + assert app_container.volume_mounts[1].mount_path == "/path/to/container/log/directory" + assert app_container.volume_mounts[2].mount_path == "/path/to/container/cert/directory" + + # Needs to be correctly labeled so that the Service can find it + assert dep.spec.template.metadata.labels["app"] == "testcomponent" -- cgit 1.2.3-korg