#!/usr/share/ucs-test/runner python3
## desc: Test in-container updates
## tags: [docker, SKIP]
## bugs: [51847]
## exposure: dangerous
## packages:
##   - docker.io

from __future__ import print_function
from dockertest import Appcenter, App, get_app_name, get_latest_docker_appbox_image
from univention.testing.utils import fail
from univention.config_registry import ConfigRegistry
import subprocess

if __name__ == '__main__':

	with Appcenter() as appcenter:
		app_name = get_app_name()
		package_name = get_app_name()
		app1 = App(name=app_name, version='1', package_name=package_name, container_version='4.4')
		app1.set_ini_parameter(DockerImage=get_latest_docker_appbox_image())
		app1.add_script(inst='''#!/bin/bash
VERSION=1
. /usr/share/univention-appcenter/joinscripthelper.sh
joinscript_init
echo -n $VERSION > /tmp/66_app_upgrade_in_container
joinscript_save_current_version
''')
		app1.add_to_local_appcenter()

		app2 = App(name=app_name, version='2', package_name=package_name, container_version='4.4')
		app2.set_ini_parameter(DockerImage=get_latest_docker_appbox_image())
		app2.add_script(inst='''#!/bin/bash
VERSION=2
. /usr/share/univention-appcenter/joinscripthelper.sh
joinscript_init
echo -n $VERSION > /tmp/66_app_upgrade_in_container
joinscript_save_current_version
''')
		app2.add_to_local_appcenter()

		appcenter.update()

		try:
			app1.install()
			app1.verify()

			ucr = ConfigRegistry()
			ucr.load()
			container_uuid = ucr.get('appcenter/apps/%s/container' % app_name)

			if open('/tmp/66_app_upgrade_in_container').read() != '1':
				fail('Joinscript failed')

			# during the update in the container we might end up with
			# ERROR:   Not enough space in /var/cache/apt/archives, need at least 4000 MB.
			# [2019-05-23 04:16:24.077377]          This may interrupt the update and result in an inconsistent system!
			# [2019-05-23 04:16:24.077560]          If necessary you can skip this check by setting the value of the
			# [2019-05-23 04:16:24.077748]          config registry variable update43/checkfilesystems to "no".
			# [2019-05-23 04:16:24.077952]          But be aware that this is not recommended!
			# but we are willing to take risk, so ignore
			cmd = ['univention-app', 'shell', app1.app_name, 'ucr', 'set', 'update43/checkfilesystems=no']
			print('Ignore "Not enough space" warning')
			print(cmd)
			subprocess.call(cmd)

			app2.upgrade()
			app2.verify()

			ucr.load()
			container_uuid_new = ucr.get('appcenter/apps/%s/container' % app_name)
			if container_uuid != container_uuid_new:
				fail('The container UUID has been changed.')

			if open('/tmp/66_app_upgrade_in_container').read() != '2':
				fail('Joinscript failed')

		finally:
			app1.uninstall()
			app1.remove()
			app2.uninstall()
			app2.remove()
