Skip to content
Snippets Groups Projects
Commit 5b898343 authored by Stewart Williams's avatar Stewart Williams
Browse files

Extract NETWORK_MODE as a configurable parameter

Add prototype 'attach' make target
parent 6273b95d
No related branches found
No related tags found
No related merge requests found
...@@ -5,11 +5,21 @@ BASEDIR := $(notdir $(patsubst %/,%,$(dir $(MAKEPATH)))) ...@@ -5,11 +5,21 @@ BASEDIR := $(notdir $(patsubst %/,%,$(dir $(MAKEPATH))))
COMPOSE_FILES := $(wildcard *.yml) COMPOSE_FILES := $(wildcard *.yml)
COMPOSE_FILE_ARGS := $(foreach yml,$(COMPOSE_FILES),-f $(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"... # If the first make argument is "start" or "stop"...
ifeq (start,$(firstword $(MAKECMDGOALS))) ifeq (start,$(firstword $(MAKECMDGOALS)))
SERVICE_TARGET = true SERVICE_TARGET = true
else ifeq (stop,$(firstword $(MAKECMDGOALS))) else ifeq (stop,$(firstword $(MAKECMDGOALS)))
SERVICE_TARGET = true 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 endif
ifdef SERVICE_TARGET ifdef SERVICE_TARGET
# .. then use the rest as arguments for the make target # .. then use the rest as arguments for the make target
...@@ -18,15 +28,26 @@ ifdef SERVICE_TARGET ...@@ -18,15 +28,26 @@ ifdef SERVICE_TARGET
$(eval $(SERVICE):;@:) $(eval $(SERVICE):;@:)
endif 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.
#
ifneq ($(CI_JOB_ID),)
NETWORK_MODE := tangonet-$(CI_JOB_ID)
CONTAINER_NAME_PREFIX := $(CI_JOB_ID)-
else
CONTAINER_NAME_PREFIX :=
endif
ifeq ($(OS),Windows_NT) ifeq ($(OS),Windows_NT)
$(error Sorry, Windows is not supported yet)
else else
UNAME_S := $(shell uname -s) UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux) ifeq ($(UNAME_S),Linux)
DISPLAY ?= :0.0 DISPLAY ?= :0.0
TANGO_HOST ?= $(shell hostname):10000 NETWORK_MODE ?= host
MYSQL_HOST ?= $(shell hostname):3306
NETWORK_MODE := host
XAUTHORITY_MOUNT := /tmp/.X11-unix:/tmp/.X11-unix XAUTHORITY_MOUNT := /tmp/.X11-unix:/tmp/.X11-unix
XAUTHORITY ?= /hosthome/.Xauthority XAUTHORITY ?= /hosthome/.Xauthority
# /bin/sh (=dash) does not evaluate 'docker network' conditionals correctly # /bin/sh (=dash) does not evaluate 'docker network' conditionals correctly
...@@ -36,17 +57,28 @@ else ...@@ -36,17 +57,28 @@ else
IF_INTERFACE := $(shell netstat -nr | awk '{ if ($$1 ~/default/) { print $$6} }') IF_INTERFACE := $(shell netstat -nr | awk '{ if ($$1 ~/default/) { print $$6} }')
DISPLAY := $(shell ifconfig $(IF_INTERFACE) | awk '{ if ($$1 ~/inet/) { print $$2} }'):0 DISPLAY := $(shell ifconfig $(IF_INTERFACE) | awk '{ if ($$1 ~/inet/) { print $$2} }'):0
# network_mode = host doesn't work on MacOS, so fix to the internal network # network_mode = host doesn't work on MacOS, so fix to the internal network
NETWORK_MODE := tangonet NETWORK_MODE ?= tangonet
TANGO_HOST := databaseds:10000 XAUTHORITY_MOUNT := $(HOME)/.Xauthority:/hosthome/.Xauthority:ro
MYSQL_HOST := tangodb:3306
XAUTHORITY_MOUNT := $(HOME):/hosthome:ro
XAUTHORITY := /hosthome/.Xauthority XAUTHORITY := /hosthome/.Xauthority
endif endif
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) \ DOCKER_COMPOSE_ARGS := DISPLAY=$(DISPLAY) XAUTHORITY=$(XAUTHORITY) TANGO_HOST=$(TANGO_HOST) \
NETWORK_MODE=$(NETWORK_MODE) XAUTHORITY_MOUNT=$(XAUTHORITY_MOUNT) MYSQL_HOST=$(MYSQL_HOST) \ NETWORK_MODE=$(NETWORK_MODE) XAUTHORITY_MOUNT=$(XAUTHORITY_MOUNT) MYSQL_HOST=$(MYSQL_HOST) \
COMPOSE_IGNORE_ORPHANS=true CONTAINER_NAME_PREFIX=$(CONTAINER_NAME_PREFIX) COMPOSE_IGNORE_ORPHANS=true
.PHONY: up down minimal start stop status clean pull help .PHONY: up down minimal start stop status clean pull help
.DEFAULT_GOAL := help .DEFAULT_GOAL := help
...@@ -59,10 +91,14 @@ up: minimal ## start the base TANGO system and prepare all services ...@@ -59,10 +91,14 @@ up: minimal ## start the base TANGO system and prepare all services
down: ## stop all services and tear down the system down: ## stop all services and tear down the system
$(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) down $(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) down
docker network inspect tangonet &> /dev/null && ([ $$? -eq 0 ] && docker network rm tangonet) || true 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 minimal: ## start the base TANGO system
docker network inspect tangonet &> /dev/null || ([ $$? -ne 0 ] && docker network create tangonet) 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 $(DOCKER_COMPOSE_ARGS) docker-compose -f tango.yml up -d
start: up ## start a service (usage: make start <servicename>) start: up ## start a service (usage: make start <servicename>)
...@@ -71,6 +107,9 @@ start: up ## start a service (usage: make start <servicename>) ...@@ -71,6 +107,9 @@ start: up ## start a service (usage: make start <servicename>)
stop: ## stop a service (usage: make stop <servicename>) stop: ## stop a service (usage: make stop <servicename>)
$(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) stop $(SERVICE) $(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 status: ## show the container status
$(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) ps $(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) ps
......
...@@ -14,10 +14,8 @@ version: '2' ...@@ -14,10 +14,8 @@ version: '2'
services: services:
astor: astor:
image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-java:latest image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-java:latest
container_name: astor container_name: ${CONTAINER_NAME_PREFIX}astor
network_mode: ${NETWORK_MODE} network_mode: ${NETWORK_MODE}
depends_on:
- databaseds
volumes: volumes:
- ${XAUTHORITY_MOUNT} - ${XAUTHORITY_MOUNT}
environment: environment:
...@@ -34,15 +32,13 @@ services: ...@@ -34,15 +32,13 @@ services:
starter-example: starter-example:
image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-starter:latest image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-starter:latest
container_name: starter-example container_name: ${CONTAINER_NAME_PREFIX}starter-example
network_mode: ${NETWORK_MODE} network_mode: ${NETWORK_MODE}
# set the hostname, otherwise duplicate device registrations result every # set the hostname, otherwise duplicate device registrations result every
# time the hostname changes as the container is restarted. # time the hostname changes as the container is restarted.
hostname: starter-example hostname: starter-example
depends_on:
- databaseds
environment: environment:
- TANGO_HOST=databaseds:10000 - TANGO_HOST=${TANGO_HOST}
entrypoint: entrypoint:
- /usr/local/bin/wait-for-it.sh - /usr/local/bin/wait-for-it.sh
- ${TANGO_HOST} - ${TANGO_HOST}
......
...@@ -15,10 +15,8 @@ version: '2' ...@@ -15,10 +15,8 @@ version: '2'
services: services:
itango: itango:
image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-itango:latest image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-itango:latest
container_name: itango container_name: ${CONTAINER_NAME_PREFIX}itango
network_mode: ${NETWORK_MODE} network_mode: ${NETWORK_MODE}
depends_on:
- databaseds
environment: environment:
- TANGO_HOST=${TANGO_HOST} - TANGO_HOST=${TANGO_HOST}
stdin_open: true stdin_open: true
......
...@@ -13,10 +13,8 @@ version: '2' ...@@ -13,10 +13,8 @@ version: '2'
services: services:
jive: jive:
image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-java:latest image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-java:latest
container_name: jive container_name: ${CONTAINER_NAME_PREFIX}jive
network_mode: ${NETWORK_MODE} network_mode: ${NETWORK_MODE}
depends_on:
- databaseds
volumes: volumes:
- ${XAUTHORITY_MOUNT} - ${XAUTHORITY_MOUNT}
environment: environment:
......
...@@ -13,10 +13,8 @@ version: '2' ...@@ -13,10 +13,8 @@ version: '2'
services: services:
logviewer: logviewer:
image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-java:latest image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-java:latest
container_name: logviewer container_name: ${CONTAINER_NAME_PREFIX}logviewer
network_mode: ${NETWORK_MODE} network_mode: ${NETWORK_MODE}
depends_on:
- databaseds
volumes: volumes:
- ${XAUTHORITY_MOUNT} - ${XAUTHORITY_MOUNT}
environment: environment:
......
...@@ -21,11 +21,11 @@ volumes: ...@@ -21,11 +21,11 @@ volumes:
services: services:
pogo: pogo:
image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-pogo:latest image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-pogo:latest
container_name: pogo container_name: ${CONTAINER_NAME_PREFIX}pogo
network_mode: ${NETWORK_MODE} network_mode: ${NETWORK_MODE}
volumes: volumes:
- pogo:/home/tango - pogo:/home/tango
- $HOME:/hosthome:rw - ${HOME}:/hosthome:rw
- ${XAUTHORITY_MOUNT} - ${XAUTHORITY_MOUNT}
environment: environment:
- XAUTHORITY=${XAUTHORITY} - XAUTHORITY=${XAUTHORITY}
......
...@@ -14,13 +14,11 @@ version: '2' ...@@ -14,13 +14,11 @@ version: '2'
services: services:
rest: rest:
image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-rest:latest image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-rest:latest
container_name: tango-rest container_name: ${CONTAINER_NAME_PREFIX}tango-rest
network_mode: ${NETWORK_MODE} network_mode: ${NETWORK_MODE}
# set the hostname, otherwise duplicate device registrations result every # set the hostname, otherwise duplicate device registrations result every
# time the hostname changes as the container is restarted. # time the hostname changes as the container is restarted.
hostname: tango-rest hostname: tango-rest
depends_on:
- databaseds
environment: environment:
- TANGO_HOST=${TANGO_HOST} - TANGO_HOST=${TANGO_HOST}
ports: ports:
......
...@@ -16,7 +16,7 @@ volumes: ...@@ -16,7 +16,7 @@ volumes:
services: services:
tangodb: tangodb:
image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-db:latest image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-db:latest
container_name: tangodb container_name: ${CONTAINER_NAME_PREFIX}tangodb
network_mode: ${NETWORK_MODE} network_mode: ${NETWORK_MODE}
environment: environment:
- MYSQL_ROOT_PASSWORD=secret - MYSQL_ROOT_PASSWORD=secret
...@@ -28,9 +28,8 @@ services: ...@@ -28,9 +28,8 @@ services:
databaseds: databaseds:
image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-cpp:latest image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-cpp:latest
container_name: databaseds container_name: ${CONTAINER_NAME_PREFIX}databaseds
network_mode: ${NETWORK_MODE} network_mode: ${NETWORK_MODE}
hostname: databaseds
depends_on: depends_on:
- tangodb - tangodb
environment: environment:
......
...@@ -12,10 +12,8 @@ version: '2' ...@@ -12,10 +12,8 @@ version: '2'
services: services:
tangotest: tangotest:
image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-java:latest image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-java:latest
container_name: tangotest container_name: ${CONTAINER_NAME_PREFIX}tangotest
network_mode: ${NETWORK_MODE} network_mode: ${NETWORK_MODE}
depends_on:
- databaseds
environment: environment:
- TANGO_HOST=${TANGO_HOST} - TANGO_HOST=${TANGO_HOST}
entrypoint: entrypoint:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment