Skip to content

Commit

Permalink
[service template] Starting new docker when HWSKU change is detected (#…
Browse files Browse the repository at this point in the history
…946)

Existing dockers has paths mounted according to the HWSKU. When HWSKU
changes, these dockers need to be destroyed and recreated with the
correct paths mounted.
  • Loading branch information
yxieca authored Sep 14, 2017
1 parent 2e3975d commit 56ae5ed
Showing 1 changed file with 52 additions and 20 deletions.
72 changes: 52 additions & 20 deletions files/build_templates/docker_image_ctl.j2
Original file line number Diff line number Diff line change
@@ -1,36 +1,68 @@
#!/bin/bash

# Obtain our platform and HWSKU as we will mount directories with these names in each docker
PLATFORM=`sonic-cfggen -v platform`
function getMountPoint()
{
echo $1 | python -c "import sys, json, os; mnts = [x for x in json.load(sys.stdin)[0]['Mounts'] if x['Destination'] == '/usr/share/sonic/hwsku']; print '' if len(mnts) == 0 else os.path.basename(mnts[0]['Source'])" 2>/dev/null
}

function postStartAction()
{
{%- if docker_container_name != "database" %}
:
{%- else %}
while true; do
if [[ "$(docker exec -i database redis-cli ping)" =~ PONG.* ]]; then
break
fi
sleep 1
done
{%- endif %}
}

# Obtain our platform as we will mount directories with these names in each docker
PLATFORM=`sonic-cfggen -v platform`

{%- if docker_container_name == "database" %}
# Don't mount HWSKU in {{docker_container_name}} container.
HWSKU=""
{%- else %}
# Obtain our HWSKU as we will mount directories with these names in each docker
HWSKU=`sonic-cfggen -d -v 'DEVICE_METADATA["localhost"]["hwsku"]'`
{%- endif %}

start() {
docker inspect --type container {{docker_container_name}} &>/dev/null
DOCKERCHECK=`docker inspect --type container {{docker_container_name}} 2>/dev/null`
if [ "$?" -eq "0" ]; then
docker start {{docker_container_name}}
else
DOCKERMOUNT=`getMountPoint "$DOCKERCHECK"`
if [ "$DOCKERMOUNT" == "$HWSKU" ]; then
echo "Starting existing {{docker_container_name}} container with HWSKU $HWSKU"
docker start {{docker_container_name}}
postStartAction
exit 0
fi

# docker created with a different HWSKU, remove and recreate
echo "Removing obsolete {{docker_container_name}} container with HWSKU $DOCKERMOUNT"
docker rm {{docker_container_name}}
fi

docker run -d {{docker_image_run_opt}} \
{%- if docker_container_name == "database" %}
echo "Starting new {{docker_container_name}} container"
{%- else %}
echo "Starting new {{docker_container_name}} container with HWSKU $HWSKU"
{%- endif %}
docker run -d {{docker_image_run_opt}} \
{%- if '--log-driver=json-file' in docker_image_run_opt or '--log-driver' not in docker_image_run_opt %}
--log-opt max-size=2M --log-opt max-file=5 \
--log-opt max-size=2M --log-opt max-file=5 \
{%- endif %}
-v /var/run/redis:/var/run/redis:rw \
-v /usr/share/sonic/device/$PLATFORM:/usr/share/sonic/platform:ro \
-v /var/run/redis:/var/run/redis:rw \
-v /usr/share/sonic/device/$PLATFORM:/usr/share/sonic/platform:ro \
{%- if docker_container_name != "database" %}
-v /usr/share/sonic/device/$PLATFORM/$HWSKU:/usr/share/sonic/hwsku:ro \
{%- endif %}
--name={{docker_container_name}} {{docker_image_name}}:latest
fi
{%- if docker_container_name == "database" %}
while true; do
if [[ "$(docker exec -i database redis-cli ping)" =~ PONG.* ]]; then
break
fi
sleep 1
done
-v /usr/share/sonic/device/$PLATFORM/$HWSKU:/usr/share/sonic/hwsku:ro \
{%- endif %}
--name={{docker_container_name}} {{docker_image_name}}:latest

postStartAction
}

attach() {
Expand Down

0 comments on commit 56ae5ed

Please sign in to comment.