Skip to content

Commit

Permalink
WIP container restart example
Browse files Browse the repository at this point in the history
Signed-off-by: Ian Costanzo <ian@anon-solutions.ca>
  • Loading branch information
ianco committed Dec 13, 2024
1 parent c66ab4a commit d1df56b
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 41 deletions.
49 changes: 13 additions & 36 deletions scenarios/examples/simple_restart/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,45 +8,15 @@ services:
- 5433:5432
volumes:
- wallet-db-data:/var/lib/pgsql/data

alice:
image: bcgovimages/aries-cloudagent:py3.12_1.0.1
ports:
- "3001:3001"
environment:
RUST_LOG: 'aries-askar::log::target=error'
command: >
start
--label Alice
--inbound-transport http 0.0.0.0 3000
--outbound-transport http
--endpoint http://alice:3000
--admin 0.0.0.0 3001
--admin-insecure-mode
--tails-server-base-url http://tails:6543
--genesis-url http://test.bcovrin.vonx.io/genesis
--wallet-type askar
--wallet-name alice
--wallet-key insecure
--wallet-storage-type "postgres_storage"
--wallet-storage-config "{\"url\":\"wallet-db:5432\",\"max_connections\":5}"
--wallet-storage-creds "{\"account\":\"DB_USER\",\"password\":\"DB_PASSWORD\",\"admin_account\":\"DB_USER\",\"admin_password\":\"DB_PASSWORD\"}"
--auto-provision
--log-level debug
--debug-webhooks
healthcheck:
test: curl -s -o /dev/null -w '%{http_code}' "http://localhost:3001/status/live" | grep "200" > /dev/null
start_period: 30s
interval: 7s
timeout: 5s
test: ["CMD-SHELL", "pg_isready -U DB_USER"]
interval: 10s
retries: 5
depends_on:
tails:
condition: service_started
start_period: 30s
timeout: 10s

alice-upgrade:
image: acapy-test
profiles: ["upgrade-test"]
alice:
image: bcgovimages/aries-cloudagent:py3.12_1.0.1
ports:
- "3001:3001"
environment:
Expand Down Expand Up @@ -79,6 +49,8 @@ services:
depends_on:
tails:
condition: service_started
wallet-db:
condition: service_healthy

bob:
image: acapy-test
Expand Down Expand Up @@ -112,6 +84,11 @@ services:
interval: 7s
timeout: 5s
retries: 5
depends_on:
tails:
condition: service_started
wallet-db:
condition: service_healthy

tails:
image: ghcr.io/bcgov/tails-server:latest
Expand Down
62 changes: 57 additions & 5 deletions scenarios/examples/simple_restart/example.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,13 @@

import asyncio
from os import getenv
import json
import time

import docker
from docker.errors import NotFound
from docker.models.containers import Container
from docker.models.networks import Network

from acapy_controller import Controller
from acapy_controller.logging import logging_to_stdout
Expand All @@ -16,6 +21,23 @@
BOB = getenv("BOB", "http://bob:3001")


def healthy(container: Container) -> bool:
"""Check if container is healthy."""
inspect_results = container.attrs
return inspect_results["State"]["Running"] and inspect_results["State"]["Health"]["Status"] == "healthy"


def wait_until_healthy(container: Container, attempts: int = 350):
"""Wait until container is healthy."""
print((container.name, container.status))
for _ in range(attempts):
if healthy(container):
return
else:
time.sleep(1)
raise TimeoutError("Timed out waiting for container")


async def main():
"""Test Controller protocols."""
async with Controller(base_url=ALICE) as alice, Controller(base_url=BOB) as bob:
Expand All @@ -27,13 +49,43 @@ async def main():
containers = client.containers.list(all=True)
docker_containers = {}
for container in containers:
container_name = container.attrs['Config']['Labels']['com.docker.compose.service']
container_id = container.attrs['Id']
container_is_running = container.attrs['State']['Running']
docker_containers[container_name] = {'Id': container_id, 'Running': container_is_running}
print(">>> container:", container_name, docker_containers[container_name])
if 'com.docker.compose.service' in container.attrs['Config']['Labels']:
container_name = container.attrs['Config']['Labels']['com.docker.compose.service']
container_id = container.attrs['Id']
container_is_running = container.attrs['State']['Running']
docker_containers[container_name] = {'Id': container_id, 'Running': container_is_running}
print(">>> container:", container_name, docker_containers[container_name])

# try to restart a container (stop alice and start alice-upgrade)
alice_docker_container = docker_containers['alice']
alice_container = client.containers.get(alice_docker_container['Id'])
print(">>> container:", 'alice', json.dumps(alice_container.attrs))

bob_docker_container = docker_containers['bob']
bob_container = client.containers.get(bob_docker_container['Id'])
print(">>> container:", 'bob', json.dumps(bob_container.attrs))

alice_container.stop()
alice_container.remove()

print(">>> waiting for alice container to exit")
time.sleep(10)

print(">>> start new alice container")
new_alice_container = client.containers.run(
'acapy-test',
command=alice_container.attrs['Config']['Cmd'],
detach=True,
environment={'RUST_LOG': 'aries-askar::log::target=error'},
healthcheck=alice_container.attrs['Config']['Healthcheck'],
name='alice',
ports=alice_container.attrs['NetworkSettings']['Ports'],
)
print(">>> new container:", 'alice', json.dumps(new_alice_container.attrs))

wait_until_healthy(new_alice_container)

# TODO run some more tests ... alice should still be connected to bob for example ...


if __name__ == "__main__":
Expand Down

0 comments on commit d1df56b

Please sign in to comment.