Skip to content

Commit

Permalink
Merge pull request #25 from epics-containers/simplify
Browse files Browse the repository at this point in the history
Simplify
  • Loading branch information
gilesknap authored Dec 6, 2024
2 parents 16df411 + 6a7ce4e commit c4c83bd
Show file tree
Hide file tree
Showing 17 changed files with 113 additions and 219 deletions.
24 changes: 8 additions & 16 deletions template/.devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,17 @@
"remoteEnv": {
// provides a name for epics-containers to use in bash prompt etc.
"EC_PROJECT": "${localWorkspaceFolderBasename}",
"EPICS_CA_AUTO_ADDR_LIST": "NO",
"EPICS_CA_ADDR_LIST": "127.0.0.1"
"IOC_NAME": "DEV_TEST_IOC"
},
"features": {
// add quality of life features for developers including git config integration
"ghcr.io/devcontainers/features/common-utils:2": {
// don't upgrade to make this similar to the runtime container
"upgradePackages": false
}
// add in eternal history and other bash features
"ghcr.io/diamondlightsource/devcontainer-features/bash-config:1.0.0": {}
},
// IMPORTANT for this devcontainer to work with docker EC_REMOTE_USER must be
// set to your user name. You will run with full sudo rights.
// outside of the container setup
"initializeCommand": "bash .devcontainer/initializeCommand ${devcontainerId}",
// IMPORTANT for this devcontainer to work with docker rootful
// EC_REMOTE_USER must be set to your user name. You will run with full
// sudo rights.
// For podman it should be left blank. You will run as root but host mounts
// will be owned by your user id.
"remoteUser": "${localEnv:EC_REMOTE_USER}",
Expand All @@ -35,22 +34,15 @@
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"ms-python.vscode-pylance",
"tamasfe.even-better-toml",
"redhat.vscode-yaml",
"ryanluker.vscode-coverage-gutters",
"epicsdeb.vscode-epics",
"charliermarsh.ruff"
]
}
},
// You can place any outside of the container before-launch commands here
"initializeCommand": "bash .devcontainer/initializeCommand ${devcontainerId}",
// One time global setup commands inside the container
"postCreateCommand": "bash .devcontainer/postCreateCommand ${devcontainerId}",
"runArgs": [
// IMPORTANT: this network must exist before the container is created
// source compose/environment.sh to create it before first use
"--network=channel_access_devcontainer",
// Make sure SELinux does not disable write access to host filesystems like tmp
"--security-opt=label=disable"
],
Expand Down
15 changes: 9 additions & 6 deletions template/.devcontainer/initializeCommand
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@
# custom initialization goes here - runs outside of the dev container
# just before the container is launched but after the container is created

FOLDER=$(dirname $(readlink -f $0))
echo "initializeCommand for devcontainerID ${1}"
set -xe

echo "devcontainerID ${1}"
# make the config folder for the shared bash-config feature
mkdir -p ${HOME}/.config/bash-config
# make a folder for auto-generated opi screens
mkdir -p ./opi/auto-generated

# ensure local container users can access X11 server
xhost +SI:localuser:$(id -un)

# make sure the shared network is created
# TODO this would be better done with compose but compose and podman
# in devcontainers is not currently stable.
source $FOLDER/../compose/environment.sh
2 changes: 1 addition & 1 deletion template/.devcontainer/postCreateCommand
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ echo 'source <(ibek --show-completion bash)' >> $HOME/.bashrc
echo 'source <(ibek --show-completion zsh)' >> $HOME/.zshrc

# pick theme and RPS1 with no unicode chars to avoid completion corruption in zsh
sed -i $HOME/.zshrc -e 's/ZSH_THEME="devcontainers"/ZSH_THEME="dst"/' -e '/^RPS1=/d'
sed -i $HOME/.zshrc -e 's/^ZSH_THEME.*$/ZSH_THEME="dst"/' -e '/^RPS1=/d'
# override the response PS - this shows the last exit code in red only
# echo "RPS1=$'%(?..%{\C-[[01;31m%}%? %{\C-[[00m%})'" >> $HOME/.zshrc

Expand Down
3 changes: 1 addition & 2 deletions template/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ ibek
# config folder is a container mount at /epics/ioc/config
ioc/config
# the opi folder is also mounted into the container at /epics/ioc/opi
opi/auto-generated/*
!opi/auto-generated/.placeholder
opi/auto-generated

# podman may leave this around in aborted builds
.build.swp
Expand Down
13 changes: 5 additions & 8 deletions template/README.md.jinja
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Generic IOC Template Repository {{name}}
# Generic IOC {{name}}

## Description
{{description}}
Expand All @@ -21,14 +21,11 @@ copier update -a --trust .

This repository includes a developer container configuration for Visual Studio Code. This allows you to run the Generic IOC locally and debug it. See https://epics-containers.github.io/main/tutorials/dev_container.html.

### IMPORTANT: First Time Preparation
## Channel Access

The devcontainer uses a docker network that it can share with a ca-gateway in order that your PVs are accessible from your host machine. We arrange to create this network once and as long as you don't delete it or reset docker it will be available for all your devcontainers going forward.

To create the network run the following commands:
The vscode developer container auto forwards the channel access ports on the loopback interface. If you have channel access clients running on the host machine, you can connect to the IOC by setting the `EPICS_CA_NAME_SERVERS` environment variable as follows:

```bash
cd ioc-adsimdetector
source ./compose/environment.sh
export EPICS_CA_NAME_SERVERS=127.0.0.1:5064
caget IOCNAME:PVNAME
```

21 changes: 13 additions & 8 deletions template/build
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,21 @@ fi

cd $(dirname ${0})

# use docker if available else use podman
if ! docker version &>/dev/null; then docker=podman; else docker=docker; fi
if $docker buildx version &>/dev/null; then buildx=buildx; load=--load ; fi
if [[ $DOCKER_BUILDKIT == "0" ]]; then buildx=; load=; fi
# make sure the ioc binaries and config symlink are cleaned up
git clean -fdx ioc

# prefer docker but use podman if USE_PODMAN is set
if docker version &> /dev/null && [[ -z $USE_PODMAN ]]
then docker=docker
else docker=podman
fi

# make sure new repos get their submodule ibek-support
if [ ! -d ibek-support/_global ] ; then git submodule update --init ; fi

# build and developer images
# build runtime or developer image
set -x
$docker $buildx build -t ${TAG} "${@}" $load \
--build-arg IMAGE_EXT=$IMAGE_EXT \
$runtime --target $TARGET .
$docker build -t ${TAG} "${@}" --build-arg IMAGE_EXT=$IMAGE_EXT \
--build-arg BUILDKIT_INLINE_CACHE=1 \
--build-arg EPICS_TARGET_ARCH=$T_A \
--load --target $TARGET .
11 changes: 0 additions & 11 deletions template/compose/compose.yaml

This file was deleted.

57 changes: 0 additions & 57 deletions template/compose/environment.sh

This file was deleted.

54 changes: 0 additions & 54 deletions template/compose/services/gateway/compose.yml

This file was deleted.

6 changes: 0 additions & 6 deletions template/compose/services/gateway/config/access

This file was deleted.

7 changes: 0 additions & 7 deletions template/compose/services/gateway/config/pvlist

This file was deleted.

34 changes: 0 additions & 34 deletions template/compose/services/phoebus/compose.yml

This file was deleted.

4 changes: 0 additions & 4 deletions template/compose/services/phoebus/config/settings.ini

This file was deleted.

Empty file.
57 changes: 57 additions & 0 deletions template/opi/phoebus-launch.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#!/bin/bash

# A launcher for the phoebus to view the generated OPIs

thisdir=$(realpath $(dirname $0))
workspace=$(realpath ${thisdir}/..)

# update settings.ini with CA and PVA ports
cat ${workspace}/opi/settings.ini |
sed -r \
-e "s|5064|${EPICS_CA_SERVER_PORT:-5064}|" \
-e "s|5075|${EPICS_PVA_SERVER_PORT:-5075}|" \
-e "s|5065|${EPICS_CA_REPEATER_PORT:-5065}|" > /tmp/settings.ini

settings="
-resource ${workspace}/opi/auto-generated/index.bob
-settings /tmp/settings.ini
"

if which phoebus.sh &>/dev/null ; then
echo "Using phoebus.sh from PATH"
set -x
phoebus.sh ${settings} "${@}"

elif module load phoebus 2>/dev/null; then
echo "Using phoebus module"
set -x
phoebus.sh ${settings} "${@}"

else
echo "No local phoebus install found, using a container"

# prefer podman but use docker if USE_DOCKER is set
if podman version &> /dev/null && [[ -z $USE_DOCKER ]]
then docker=podman; UIDGID=0:0
else docker=docker; UIDGID=$(id -u):$(id -g)
fi
echo "Using $docker as container runtime"

# ensure local container users can access X11 server
xhost +SI:localuser:$(id -un)

# settings for container launch
x11="-e DISPLAY --net host"
args="--rm -it --security-opt=label=none --user ${UIDGID}"
mounts="-v=/tmp:/tmp -v=${workspace}:/workspace -v=${workspace}/..:/workspaces"
image="ghcr.io/epics-containers/ec-phoebus:latest"

settings="
-resource /workspace/opi/auto-generated/index.bob
-settings /tmp/settings.ini
"

set -x
$docker run ${mounts} ${args} ${x11} ${image} ${settings} "${@}"

fi
12 changes: 12 additions & 0 deletions template/opi/settings.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# NOTE: port numbers are defaults only
# this script to be processed with sed to replace port numbers
# see phoebus-launch.sh

# point at local host for channel access
org.phoebus.pv.ca/addr_list=127.0.0.1
org.phoebus.pv.ca/server_port=5064
org.phoebus.pv.ca/repeater_port=5065
org.phoebus.pv.ca/name_servers=127.0.0.1:5064
# point at local host for pvAccess name server
org.phoebus.pv.pva/epics_pva_name_servers=127.0.0.1:5075
org.phoebus.pv.pva/server_port=5075
Loading

0 comments on commit c4c83bd

Please sign in to comment.