cki_lib.inttests
Integration tests that require other services can be run via kind (Kubernetes in Docker).
Currently, a RabbitMQ service including certificates is implemented.
Creating an integration test
For an integration test, create a unit test in /inttests
, and derive the TestCase from
cki_lib.inttests.KubernetesIntegrationTest
. As an example, for an integration
test that needs a RabbitMQ server:
from cki_lib import inttests
@inttests.skip_without_requirements()
class TestStompClient(inttests.KubernetesIntegrationTest,
inttests.rabbitmq.RabbitMQServer):
pass
During setupClass()
, a Kubernetes cluster and any required services will be
created and configured. The services will be removed in tearDownClass()
, but
the cluster will be kept running to speed up successive tests.
API
KubernetesCluster - Kubernetes cluster running in Docker
- test case class:
inttests.cluster.KubernetesCluster
The cluster is able to run locally and in GitLab CI as long as the kind
and
docker
executables are available. This can be checked with the
@skip_without_requirements
decorator. For GitLab CI, jobs need to have the
Docker-in-Docker service configured in .gitlab-ci.yml
:
integration-tests:
services:
- docker:dind
variables:
DOCKER_HOST: 'tcp://docker:2375'
Fields provided by KubernetesCluster
cls.cluster_name: str
:kind
cluster namecls.hostname: str
: host name for all services usable locally and in GitLab CIcls.api_client: client.ApiClient
: Pythonkubernetes
API clientcls.dynamic_client: dynamic.client.DynamicClient
: Pythonkubernetes
Dynamic clientcls.core_v1: client.CoreV1Api
: Pythonkubernetes
Core v1 API
Methods provided by KubernetesCluster
cls.k8s_namespace(namespace: str)
: context manager that creates and cleans up a Kubernetes namespace.cls.k8s_apply(namespace: str, body: typing.Any)
: apply a Kubernetes resource update via server-side apply.cls.k8s_delete_all(namespace: str, resources: Iterable[str])
: delete all resources of the given types from a namespace.
KubernetesIntegrationTest - Kubernetes namespace
- test case class:
inttests.cluster.KubernetesIntegrationTest
A dedicated test namespace is created and cleaned up for each test.
Fields provided by KubernetesIntegrationTest
cls.test_namespace: str
: namespace for any custom resources needed by an integration test
RabbitMQServer - RabbitMQ server
- test case class:
inttests.rabbitmq.RabbitMQServer
The server is configured with AMQP and STOMP access with and without TLS. For
AMQP and STOMP, authentication can be done via password and client certificates
(from cert.common_name
) methods.
Ports provided by RabbitMQServer
Port | Description |
---|---|
5671 | AMQP via TLS |
5672 | AMQP |
15671 | HTTP management API via TLS |
15672 | HTTP management API |
61613 | Stomp |
61614 | Stomp via TLS |
Test environment variables provided by RabbitMQServer
Name | Description |
---|---|
RABBITMQ_HOST |
host name |
RABBITMQ_PORT |
5671 |
RABBITMQ_MANAGEMENT_PORT |
15671 |
RABBITMQ_VIRTUAL_HOST |
/ |
RABBITMQ_USER |
guest |
RABBITMQ_PASSWORD |
guest |
RABBITMQ_CAFILE |
CA certificate |
RABBITMQ_CERTFILE |
client key and certificate |
STOMP_HOST |
host name |
STOMP_PORT |
61614 |
STOMP_CERTFILE |
client key and certificate |
HashiCorpVaultServer - HashiCorp Vault server
- test case class:
inttests.vault.HashiCorpVaultServer
The server is started in dev mode.
Ports provided by HashiCorpVaultServer
Port | Description |
---|---|
8200 | HTTP API |
Test environment variables provided by HashiCorpVaultServer
Name | Description |
---|---|
VAULT_ADDR |
server URL |
VAULT_MOUNT_POINT |
mount point of the KV2 engine |
VAULT_TOKEN |
secret token ID |