Commit 622a834e authored by Xavier Thompson's avatar Xavier Thompson

software/theia: Add resiliency tests

parent 02e5acf0
<<<<<<< HEAD
# Dummy Software
A very simple SR that dumps the environment in JSON format during installation.
=======
# Resilience Dummy
A very simple SR that is entirely self contained.
It doesn't depend on any files other than those it this directory.
In particular it doesn't extent stack/slapos.cfg.
It takes very little time to compile and deploy.
>>>>>>> software/theia: Add resiliency tests
[buildout]
parts =
log-writer
eggs-directory = ${buildout:eggs-directory}
develop-eggs-directory = ${buildout:develop-eggs-directory}
offline = true
[directory]
recipe = plone.recipe.command
home = $${buildout:directory}
etc = $${:home}/etc
run = $${:etc}/run
command = mkdir -p $${:run}
[log-writer]
recipe = slapos.recipe.template:jinja2
template = inline:#!/bin/sh
echo "Hello : $(date)" >> $${directory:home}/log.log
rendered = $${directory:run}/log-writer
mode = 700
[buildout]
find-links +=
http://www.nexedi.org/static/packages/source/
http://www.nexedi.org/static/packages/source/slapos.buildout/
parts =
instance-template
plone-recipe-command
versions = versions
[plone-recipe-command]
recipe = zc.recipe.egg
eggs = plone.recipe.command
[instance-template]
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/instance.cfg.in
output = ${buildout:directory}/instance.cfg
mode = 0644
[versions]
setuptools = 44.0.0
zc.buildout = 2.7.1+slapos010
zc.recipe.egg = 2.0.3+slapos003
...@@ -34,6 +34,7 @@ import tempfile ...@@ -34,6 +34,7 @@ import tempfile
import time import time
import re import re
import json import json
import shutil
from six.moves.urllib.parse import urlparse, urljoin from six.moves.urllib.parse import urlparse, urljoin
import pexpect import pexpect
...@@ -312,3 +313,128 @@ class TestTheiaEnv(TheiaTestCase): ...@@ -312,3 +313,128 @@ class TestTheiaEnv(TheiaTestCase):
# Cleanup the theia shell process # Cleanup the theia shell process
theia_shell_process.terminate() theia_shell_process.terminate()
theia_shell_process.wait() theia_shell_process.wait()
class ResilientTheiaTestCase(TheiaTestCase):
@classmethod
def _getTypePartition(cls, software_type):
software_url = cls.getSoftwareURL()
for computer_partition in cls.slap.computer.getComputerPartitionList():
partition_url = computer_partition.getSoftwareRelease()._software_release
partition_type = computer_partition.getType()
if partition_url == software_url and partition_type == software_type:
return computer_partition
raise "Theia %s partition not found" % software_type
@classmethod
def _getTypePartitionId(cls, software_type):
return cls._getTypePartition(software_type).getId()
@classmethod
def _getTypePartitionPath(cls, software_type, *paths):
return os.path.join(cls.slap._instance_root, cls._getTypePartitionId(software_type), *paths)
@classmethod
def _getSlapos(cls, software_type='export'):
return cls._getTypePartitionPath(software_type, 'srv', 'runner', 'bin', 'slapos')
@classmethod
def _deployEmbeddedSoftware(cls, software_url, instance_name):
slapos = cls._getSlapos()
subprocess.check_call((slapos, 'supply', software_url, 'slaprunner'))
subprocess.check_call((slapos, 'node', 'software'))
subprocess.check_call((slapos, 'request', instance_name, software_url))
subprocess.check_call((slapos, 'node', 'instance'))
@classmethod
def getInstanceSoftwareType(cls):
return 'resilient'
@classmethod
def getInstanceParameterDict(cls):
return {'autorun': 'stopped'}
@classmethod
def setUpClass(cls):
super(ResilientTheiaTestCase, cls).setUpClass()
# Patch the computer root path to that of the export theia instance
cls.computer_partition_root_path = cls._getTypePartitionPath('export')
class TestTheiaResilientInterface(TestTheia, ResilientTheiaTestCase):
pass
class TestTheiaResilientWithSR(TestTheiaWithSR, ResilientTheiaTestCase):
pass
class TestTheiaExportImport(ResilientTheiaTestCase):
def _getTestSoftwareUrl(self):
try:
return self._test_software_url
except AttributeError:
# Copy ./resilience_dummy SR in export theia ~/srv/project/dummy
dummy_target_path = self._getTypePartitionPath('export', 'srv', 'project', 'dummy')
shutil.copytree('resilience_dummy', dummy_target_path)
self._test_software_url = os.path.join(dummy_target_path, 'software.cfg')
return self._test_software_url
def _getAdaptedTestSoftwareUrl(self):
return self._getTypePartitionPath('import', 'srv', 'project', 'dummy', 'software.cfg')
def test_export_import(self):
# Deploy dummy instance in export partition
test_software_url = self._getTestSoftwareUrl()
self._deployEmbeddedSoftware(test_software_url, 'dummy_instance')
# Check that dummy instance was properly deployed
log_path = self._getTypePartitionPath('export', 'srv', 'runner', 'instance', 'slappart0', 'log.log')
with open(log_path) as f:
initial_log = f.readlines()
self.assertEqual(len(initial_log), 1)
self.assertTrue(initial_log[0].startswith("Hello"), initial_log[0])
# Call export script manually
theia_export_script = self._getTypePartitionPath('export', 'bin', 'theia-export-script')
subprocess.check_call((theia_export_script,))
# Copy <export>/srv/backup/theia to <import>/srv/backup/theia manually
export_backup_path = self._getTypePartitionPath('export', 'srv', 'backup', 'theia')
import_backup_path = self._getTypePartitionPath('import', 'srv', 'backup', 'theia')
shutil.rmtree(import_backup_path)
shutil.copytree(export_backup_path, import_backup_path)
# Call the import script manually
theia_import_script = self._getTypePartitionPath('import', 'bin', 'theia-import-script')
subprocess.check_call((theia_import_script,))
# Check that the software url is correct
test_adapted_url = self._getAdaptedTestSoftwareUrl()
proxy_content = subprocess.check_output((self._getSlapos('import'), 'proxy', 'show'))
self.assertIn(test_adapted_url, proxy_content)
if test_adapted_url != test_software_url:
self.assertNotIn(test_software_url, proxy_content)
# Check that the dummy instance is not yet started
log_path = self._getTypePartitionPath('import', 'srv', 'runner', 'instance', 'slappart0', 'log.log')
with open(log_path) as f:
copied_log = f.readlines()
self.assertEqual(copied_log, initial_log)
# Start the dummy instance
subprocess.check_call((self._getSlapos('import'), 'node', 'instance'))
# Check that dummy instance was properly re-deployed
log_path = self._getTypePartitionPath('import', 'srv', 'runner', 'instance', 'slappart0', 'log.log')
with open(log_path) as f:
new_log = f.readlines()
self.assertEqual(len(new_log), 2)
self.assertEqual(new_log[0], initial_log[0])
self.assertTrue(new_log[1].startswith("Hello"), new_log[1])
class TestTheiaExportImportWebURL(TestTheiaExportImport):
def _getTestSoftwareUrl(self):
return "https://lab.nexedi.com/xavier_thompson/slapos/raw/a0f0ac90/software/theia/test/dummy/software.cfg"
_getAdaptedTestSoftwareUrl = _getTestSoftwareUrl
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment