Module: check_mk
Branch: master
Commit: e78e200533bc011e2850effabf4e2a5fcffa4a2c
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=e78e200533bc01…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Mon Feb 18 09:30:01 2019 +0100
7089 Docker container: Simplified update procedure
The update procedure of the official Check_MK containers was a bit complicated
compared to the update procedure on other servers. The root cause for this was
that the update always required both, the old and the new versions, while the
containers are only allowed to have one version installed. This made it
necessary to create an intermediate container for the update.
The werk #7088 made it possible to perform an update without having access to
the old version. Once we have this functionality it is now possible to replace
one container with a another container. In case the version has changed, the
container is performing the update during startup of the new container.
CMK-1603
Change-Id: I2472bf21f3479d71e24c17ba5c028df3eaaae610
---
.werks/7089 | 19 ++++++++++++++++++
docker/docker-entrypoint.sh | 9 +++++++++
tests/docker/test_docker.py | 49 +++++++++++++++++----------------------------
3 files changed, 46 insertions(+), 31 deletions(-)
diff --git a/.werks/7089 b/.werks/7089
new file mode 100644
index 0000000..7231cf9
--- /dev/null
+++ b/.werks/7089
@@ -0,0 +1,19 @@
+Title: Docker container: Simplified update procedure
+Level: 2
+Component: omd
+Compatible: compat
+Edition: cre
+Version: 1.6.0i1
+Date: 1550474576
+Class: feature
+
+The update procedure of the official Check_MK containers was a bit complicated
+compared to the update procedure on other servers. The root cause for this was
+that the update always required both, the old and the new versions, while the
+containers are only allowed to have one version installed. This made it
+necessary to create an intermediate container for the update.
+
+The werk #7088 made it possible to perform an update without having access to
+the old version. Once we have this functionality it is now possible to replace
+one container with a another container. In case the version has changed, the
+container is performing the update during startup of the new container.
diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh
index b17e7fa..c6b66a8 100755
--- a/docker/docker-entrypoint.sh
+++ b/docker/docker-entrypoint.sh
@@ -58,6 +58,15 @@ if [ ! -f "/omd/apache/$CMK_SITE_ID.conf" ]; then
echo "Include /omd/sites/$CMK_SITE_ID/etc/apache/mode.conf" >
"/omd/apache/$CMK_SITE_ID.conf"
fi
+# In case the version symlink is dangling we are in an update situation: The
+# volume was previously attached to a container with another Check_MK version.
+# We now have to perform the "omd update" to be able to bring the site back
+# to life.
+if [ ! -e "/omd/sites/$CMK_SITE_ID/version" ]; then
+ echo "### UPDATING SITE"
+ omd -f update --conflict=install "$CMK_SITE_ID"
+fi
+
# When a command is given via "docker run" use it instead of this script
if [ -n "$1" ]; then
exec "$@"
diff --git a/tests/docker/test_docker.py b/tests/docker/test_docker.py
index 23463dd..d42137a 100644
--- a/tests/docker/test_docker.py
+++ b/tests/docker/test_docker.py
@@ -326,41 +326,28 @@ def test_update(request, client, version):
assert c_orig.exec_run(["touch", "pre-update-marker"],
user="cmk",
workdir="/omd/sites/cmk")[0] == 0
+ # Until we have a "old version" with .version_meta directory that we can
update
+ # from produce this directory manually here.
+ # TODO: Once we update from a 1.6 version this can be dropped
+ assert c_orig.exec_run(["mkdir", ".version_meta"],
user="cmk", workdir="/omd/sites/cmk")[0] == 0
+ assert c_orig.exec_run(["cp", "-pr", "version/skel",
".version_meta/"],
+ user="cmk",
+ workdir="/omd/sites/cmk")[0] == 0
+ assert c_orig.exec_run(["cp", "-pr",
"version/share/omd/skel.permissions", ".version_meta/"],
+ user="cmk",
+ workdir="/omd/sites/cmk")[0] == 0
+ assert c_orig.exec_run(
+ ["bash", "-c", "echo '%s' >
.version_meta/version" % old_version.version],
+ user="cmk",
+ workdir="/omd/sites/cmk")[0] == 0
+
# 2. stop the container
c_orig.stop()
- # 3. start intermediate container in the background and keep it running.
- # Don't use the regular startup procedure (which would start the site). Use
- # read to wait for termination of the container
- image, _build_logs = _build(request, client, version)
- c_tmp = client.containers.run(
- name="%s-update" % container_name,
- image=image.id,
- detach=True,
- command=["bash", "-c", "echo HI ; read"],
- stdin_open=True,
- volumes_from=c_orig.id,
- )
- request.addfinalizer(lambda: c_tmp.remove(force=True))
- testlib.wait_until(lambda: "HI" in c_tmp.logs(), timeout=30)
-
- # 4. Copy old version to intermediate container
- stream = c_orig.get_archive("/omd/versions/%s" %
old_version.omd_version())[0]
- c_tmp.put_archive(path="/omd/versions", data=stream)
-
- # 5. update volume in intermediate container
- exit_code, output = c_tmp.exec_run(["omd", "-f",
"update", "--conflict=install"], user="cmk")
- assert "Finished update." in output
- assert exit_code == 0
-
- # Verify result and stop the temporary container
- c_tmp.exec_run(["omd", "version"],
user="cmk")[1].endswith("%s\n" % version.omd_version())
- c_tmp.stop()
-
- # 6. rename old container
+ # 3. rename old container
c_orig.rename("%s-old" % container_name)
- # 7. create new container
+ # 4. create new container
c_new = _start(
request,
client,
@@ -369,7 +356,7 @@ def test_update(request, client, version):
name=container_name,
volumes_from=c_orig.id)
- # 8. verify result
+ # 5. verify result
c_new.exec_run(["omd", "version"],
user="cmk")[1].endswith("%s\n" % version.omd_version())
assert c_new.exec_run(["test", "-f",
"pre-update-marker"], user="cmk",
workdir="/omd/sites/cmk")[0] == 0