-
-
Save cpascual/d5ea4955127d4300a94fb994ba506479 to your computer and use it in GitHub Desktop.
Run `python tangobug-371.py` to reproduce https://github.com/tango-controls/pytango/issues/371
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
DOCKER_REGISTRY_HOST=nexus.engageska-portugal.pt | |
DOCKER_REGISTRY_USER=ska-docker |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Set dir of Makefile to a variable to use later | |
MAKEPATH := $(abspath $(lastword $(MAKEFILE_LIST))) | |
BASEDIR := $(notdir $(patsubst %/,%,$(dir $(MAKEPATH)))) | |
COMPOSE_FILES := $(wildcard *.yml) | |
COMPOSE_FILE_ARGS := $(foreach yml,$(COMPOSE_FILES),-f $(yml)) | |
ATTACH_COMPOSE_FILE_ARGS := $(foreach yml,$(filter-out tango.yml,$(COMPOSE_FILES)),-f $(yml)) | |
# If the first make argument is "start" or "stop"... | |
ifeq (start,$(firstword $(MAKECMDGOALS))) | |
SERVICE_TARGET = true | |
else ifeq (stop,$(firstword $(MAKECMDGOALS))) | |
SERVICE_TARGET = true | |
else ifeq (attach,$(firstword $(MAKECMDGOALS))) | |
SERVICE_TARGET = true | |
ifndef NETWORK_MODE | |
$(error NETWORK_MODE must specify the network to attach to, e.g., make NETWORK_MODE=tangonet-powersupply ...) | |
endif | |
ifndef TANGO_HOST | |
$(error TANGO_HOST must specify the Tango database device, e.g., make TANGO_HOST=powersupply-databaseds:100000 ...) | |
endif | |
endif | |
ifdef SERVICE_TARGET | |
# .. then use the rest as arguments for the make target | |
SERVICE := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) | |
# ...and turn them into do-nothing targets | |
$(eval $(SERVICE):;@:) | |
endif | |
# | |
# Never use the network=host mode when running CI jobs, and add extra | |
# distinguishing identifiers to the network name and container names to | |
# prevent collisions with jobs from the same project running at the same | |
# time. | |
# | |
CI_JOB_ID ?= $(TRAVIS_JOB_ID) | |
ifneq ($(CI_JOB_ID),) | |
NETWORK_MODE := tangonet-$(CI_JOB_ID) | |
CONTAINER_NAME_PREFIX := $(CI_JOB_ID)- | |
else | |
CONTAINER_NAME_PREFIX := | |
$(info Network mode cannot be host for the archiver! It won't work unless you set the env var CI_JOB_ID=local) | |
endif | |
ifeq ($(OS),Windows_NT) | |
$(error Sorry, Windows is not supported yet) | |
else | |
UNAME_S := $(shell uname -s) | |
ifeq ($(UNAME_S),Linux) | |
DISPLAY ?= :0.0 | |
NETWORK_MODE ?= host | |
XAUTHORITY_MOUNT := /tmp/.X11-unix:/tmp/.X11-unix | |
XAUTHORITY ?= /hosthome/.Xauthority | |
# /bin/sh (=dash) does not evaluate 'docker network' conditionals correctly | |
SHELL := /bin/bash | |
endif | |
ifeq ($(UNAME_S),Darwin) | |
IF_INTERFACE := $(shell scutil --nwi | grep 'Network interfaces:' | cut -d' ' -f3) | |
DISPLAY := $(shell scutil --nwi | grep 'address' | cut -d':' -f2 | tr -d ' ' | head -n1):0 | |
# network_mode = host doesn't work on MacOS, so fix to the internal network | |
NETWORK_MODE ?= tangonet | |
XAUTHORITY_MOUNT := $(HOME)/.Xauthority:/hosthome/.Xauthority:ro | |
XAUTHORITY := /hosthome/.Xauthority | |
endif | |
endif | |
# | |
# When running in network=host mode, point devices at a port on the host | |
# machine rather than at the container. | |
# | |
ifeq ($(NETWORK_MODE),host) | |
TANGO_HOST := $(shell hostname):10000 | |
MYSQL_HOST := $(shell hostname):3306 | |
else | |
TANGO_HOST := $(CONTAINER_NAME_PREFIX)databaseds:10000 | |
MYSQL_HOST := $(CONTAINER_NAME_PREFIX)tangodb:3306 | |
endif | |
DOCKER_COMPOSE_ARGS := DISPLAY=$(DISPLAY) XAUTHORITY=$(XAUTHORITY) TANGO_HOST=$(TANGO_HOST) \ | |
NETWORK_MODE=$(NETWORK_MODE) XAUTHORITY_MOUNT=$(XAUTHORITY_MOUNT) MYSQL_HOST=$(MYSQL_HOST) \ | |
CONTAINER_NAME_PREFIX=$(CONTAINER_NAME_PREFIX) COMPOSE_IGNORE_ORPHANS=true | |
.PHONY: up down minimal start stop status clean pull help | |
.DEFAULT_GOAL := help | |
pull: ## pull the images from the Docker hub | |
$(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) pull | |
up: minimal ## start the base TANGO system and prepare all services | |
$(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) up --no-start | |
down: ## stop all services and tear down the system | |
$(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) down | |
ifneq ($(NETWORK_MODE),host) | |
docker network inspect $(NETWORK_MODE) &> /dev/null && ([ $$? -eq 0 ] && docker network rm $(NETWORK_MODE)) || true | |
endif | |
minimal: ## start the base TANGO system | |
ifneq ($(NETWORK_MODE),host) | |
docker network inspect $(NETWORK_MODE) &> /dev/null || ([ $$? -ne 0 ] && docker network create $(NETWORK_MODE)) | |
endif | |
$(DOCKER_COMPOSE_ARGS) docker-compose -f tango.yml up -d | |
start: up ## start a service (usage: make start <servicename>) | |
$(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) start $(SERVICE) | |
stop: ## stop a service (usage: make stop <servicename>) | |
$(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) stop $(SERVICE) | |
attach: ## attach a service to an existing Tango network | |
$(DOCKER_COMPOSE_ARGS) docker-compose $(ATTACH_COMPOSE_FILE_ARGS) up -d $(SERVICE) | |
status: ## show the container status | |
$(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) ps | |
clean: down ## clear all TANGO database entries | |
docker volume rm $(BASEDIR)_tangodb | |
help: ## show this help. | |
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
# Docker compose file for TANGO database and database device server | |
# | |
# Defines: | |
# - tangodb: MariaDB database with TANGO schema | |
# - databaseds: TANGO database device server | |
# | |
# Requires: | |
# - None | |
# | |
version: '2' | |
volumes: | |
tangodb: {} | |
services: | |
tangodb: | |
image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-db:latest | |
container_name: ${CONTAINER_NAME_PREFIX}tangodb | |
network_mode: ${NETWORK_MODE} | |
environment: | |
- MYSQL_ROOT_PASSWORD=secret | |
- MYSQL_DATABASE=tango | |
- MYSQL_USER=tango | |
- MYSQL_PASSWORD=tango | |
volumes: | |
- tangodb:/var/lib/mysql | |
restart: on-failure | |
databaseds: | |
image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-cpp:latest | |
container_name: ${CONTAINER_NAME_PREFIX}databaseds | |
network_mode: ${NETWORK_MODE} | |
ports: | |
- "10000:10000" | |
depends_on: | |
- tangodb | |
environment: | |
- MYSQL_HOST=${MYSQL_HOST} | |
- MYSQL_DATABASE=tango | |
- MYSQL_USER=tango | |
- MYSQL_PASSWORD=tango | |
- TANGO_HOST=${TANGO_HOST} | |
entrypoint: | |
- /usr/local/bin/wait-for-it.sh | |
- ${MYSQL_HOST} | |
- --timeout=30 | |
- --strict | |
- -- | |
- /usr/local/bin/DataBaseds | |
- "2" | |
- -ORBendPoint | |
- giop:tcp::10000 | |
restart: on-failure |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Automated test for https://github.com/tango-controls/pytango/issues/371 | |
It requires docker-compose to be installed. | |
To reproduce, run : `python tangobug-371.py` | |
- If the bug is not present, it finishes in after counting to 30 and | |
printing "SUCCESS!" | |
- If the bug is present, crashes (non-zero exit value) at some point of the | |
count (~15) | |
""" | |
import tango | |
import time | |
from pathlib import Path | |
import subprocess | |
def tgtest(action): | |
print("tangotest", action) | |
subprocess.run( | |
['make', action, 'tangotest'], | |
env={'CI_JOB_ID':'local'}, | |
cwd=Path(__file__).parent | |
) | |
tgtest("start") | |
time.sleep(1) | |
d = tango.DeviceProxy("tango://localhost:10000/sys/tg_test/1") | |
cb = tango.utils.EventCallback() | |
id = d.subscribe_event("ampli", tango.EventType.ATTR_CONF_EVENT, cb) | |
tgtest("stop") | |
tgtest("start") | |
d.unsubscribe_event(id) | |
for i in range(30): | |
print(i, end=' ', flush=True) | |
time.sleep(1) | |
print("\nSUCCESS!") |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
# Docker compose file for TANGO test device server. | |
# | |
# Defines: | |
# - tangotest: TANGO test device server | |
# | |
# Requires: | |
# - tango.yml | |
# | |
version: '2' | |
services: | |
tangotest: | |
image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-java:latest | |
container_name: ${CONTAINER_NAME_PREFIX}tangotest | |
network_mode: ${NETWORK_MODE} | |
environment: | |
- TANGO_HOST=${TANGO_HOST} | |
entrypoint: | |
- /usr/local/bin/wait-for-it.sh | |
- ${TANGO_HOST} | |
- --timeout=30 | |
- --strict | |
- -- | |
- /usr/local/bin/TangoTest | |
- test | |
restart: on-failure | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment