Skip to content
/ sabotage Public

Simulates Docker container and network failures to test application resilience and fault tolerance

License

Notifications You must be signed in to change notification settings

tsv1/sabotage

Repository files navigation

sabotage

Codecov PyPI PyPI - Downloads Python Version

sabotage is a package designed to assist developers in testing the resilience and fault tolerance of applications running in Docker containers. It offers functionality to simulate failures by either temporarily stopping containers (sabotaged_container) or disconnecting them from their networks (sabotaged_network).

Installation

$ pip3 install sabotage

Usage

📦 Sabotaged Container

@asynccontextmanager
async def sabotaged_container(service_name: str,
                              project_name: Optional[str] = None,
                              *,
                              wait_timeout: float = 30.0,
                              wait_interval: float = 0.01
                              ) -> AsyncGenerator[None, None]:

Temporarily stops a specified Docker container and restarts it after performing tasks within the context. Useful for testing how applications handle Docker container failures.

Parameters:

  • service_name (str): The name of the Docker service.
  • project_name (str): (Optional) The Docker Compose project name. If not provided, it defaults to the COMPOSE_PROJECT_NAME environment variable.
  • wait_timeout (float): (Optional) The maximum time to wait for the container to become healthy upon restart.
  • wait_interval (float): (Optional) The polling interval to check the container's health status.
import asyncio
from sabotage import sabotaged_container

async def test_container_restart():
    async with sabotaged_container("app"):
        # Perform actions while the container is stopped
        print("Container is temporarily stopped.")

    # Actions after the container restarts
    print("Container has restarted.")

asyncio.run(test_container_restart())

🌐 Sabotaged Network

@asynccontextmanager
async def sabotaged_network(service_name: str,
                            project_name: Optional[str] = None
                            ) -> AsyncGenerator[None, None]:

Disconnects and reconnects a container from its networks to simulate network issues.

  • service_name (str): The name of the Docker service.
  • project_name (str): (Optional) The Docker Compose project name. If not provided, it defaults to the COMPOSE_PROJECT_NAME environment variable.
import asyncio
from sabotage import sabotaged_network

async def test_network_disruption():
    async with sabotaged_network("app"):
        # Perform actions while the network is disconnected
        print("Network is temporarily disconnected.")

    # Actions after the network is reconnected
    print("Network has been reconnected.")

asyncio.run(test_network_disruption())

About

Simulates Docker container and network failures to test application resilience and fault tolerance

Resources

License

Stars

Watchers

Forks

Packages

No packages published