Commit b83ce7f7 authored by Jérome Perrin's avatar Jérome Perrin

Fixes for testing/testcase

The main part is to address the supervisor path too long we sometimes have with theia or slaprunner tests.

Some minor fixes are also included

See merge request !242
parents 200122dd ea500a46
Pipeline #10610 failed with stage
in 0 seconds
......@@ -65,7 +65,7 @@ def getSupervisorRPC(socket):
yield s.supervisor
def _getSupervisordSocketPath(instance_root):
return os.path.join(instance_root, 'supervisord.socket')
return os.path.join(instance_root, 'sv.sock')
def _getSupervisordConfigurationFilePath(instance_root):
return os.path.join(instance_root, 'etc', 'supervisord.conf')
......
......@@ -63,6 +63,7 @@ from .slap import slap
from ..util import dumps, rmtree
from ..grid.svcbackend import getSupervisorRPC
from ..grid.svcbackend import _getSupervisordSocketPath
@zope.interface.implementer(IException)
......@@ -355,7 +356,7 @@ class StandaloneSlapOS(object):
# https://github.com/torvalds/linux/blob/3848ec5/net/unix/af_unix.c#L234-L238
# Supervisord socket name contains the pid number, which is why we add
# .xxxxxxx in this check.
if len(os.path.join(base_directory, 'supervisord.socket.xxxxxxx')) > 108:
if len(os.path.join(base_directory, 'sv.sock.xxxxxxx')) > 108:
raise PathTooDeepError(
'working directory ( {base_directory} ) is too deep'.format(
**locals()))
......@@ -400,7 +401,7 @@ class StandaloneSlapOS(object):
self._instance_pid = os.path.join(run_directory, 'slapos-node-instance.pid')
self._report_pid = os.path.join(run_directory, 'slapos-node-report.pid')
self._supervisor_socket = os.path.join(run_directory, 'supervisord.sock')
self._supervisor_socket = os.path.join(run_directory, 'sv.sock')
SupervisorConfigWriter(self).writeConfig(self._supervisor_config)
SlapOSConfigWriter(self).writeConfig(self._slapos_config)
......@@ -454,9 +455,7 @@ class StandaloneSlapOS(object):
This should be used as a context manager.
"""
return getSupervisorRPC(
# this socket path is not configurable.
os.path.join(self._instance_root, "supervisord.socket"))
return getSupervisorRPC(_getSupervisordSocketPath(self._instance_root))
def format(
self,
......
......@@ -33,6 +33,7 @@ import re
import glob
import logging
import shutil
import warnings
from six.moves.urllib.parse import urlparse
try:
......@@ -112,6 +113,23 @@ def makeModuleSetUpAndTestCaseClass(
base_directory = os.path.realpath(
os.environ.get(
'SLAPOS_TEST_WORKING_DIR', os.path.join(os.getcwd(), '.slapos')))
software_id = urlparse(software_url).path.split('/')[-2]
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - {} - %(name)s - %(levelname)s - %(message)s'.format(software_id),
filename=os.path.join(snapshot_directory or base_directory, 'testcase.log'),
)
logger = logging.getLogger()
console_handler = logging.StreamHandler()
console_handler.setLevel(
logging.DEBUG if (verbose or debug) else logging.WARNING)
logger.addHandler(console_handler)
if debug:
unittest.installHandler()
# TODO: fail if already running ?
try:
slap = StandaloneSlapOS(
......@@ -124,15 +142,13 @@ def makeModuleSetUpAndTestCaseClass(
'base directory ( {} ) is too deep, try setting '
'SLAPOS_TEST_WORKING_DIR to a shallow enough directory'.format(
base_directory))
if not snapshot_directory:
snapshot_directory = os.path.join(base_directory, "snapshots")
cls = type(
'SlapOSInstanceTestCase for {}'.format(software_url),
(SlapOSInstanceTestCase,), {
'slap': slap,
'getSoftwareURL': classmethod(lambda _cls: software_url),
'software_id': urlparse(software_url).path.split('/')[-2],
'software_id': software_id,
'_debug': debug,
'_verbose': verbose,
'_ipv4_address': ipv4_address,
......@@ -149,10 +165,6 @@ def makeModuleSetUpAndTestCaseClass(
def setUpModule():
# type: () -> None
if debug:
unittest.installHandler()
logging.basicConfig(
level=logging.DEBUG if (verbose or debug) else logging.WARNING)
installSoftwareUrlList(cls, [software_url], debug=debug)
return setUpModule, SlapOSInstanceTestCase_
......@@ -362,7 +374,9 @@ def installSoftwareUrlList(cls, software_url_list, max_retry=10, debug=False):
cls.slap.waitForSoftware(max_retry=max_retry, debug=debug)
_storeSoftwareSnapshot('setupModule')
for software_url in software_url_list:
cls.logger.debug("Checking software %s", software_url)
checkSoftware(cls.slap, software_url)
cls.logger.debug("Done checking software %s", software_url)
except BaseException as e:
if not debug:
cls.logger.exception("Error building software, removing")
......@@ -376,7 +390,7 @@ def installSoftwareUrlList(cls, software_url_list, max_retry=10, debug=False):
cls.logger.exception("Error removing software")
_storeSoftwareSnapshot('setupModule removing software')
cls._cleanup('setupModule')
raise e
raise
class SlapOSInstanceTestCase(unittest.TestCase):
......@@ -589,6 +603,9 @@ class SlapOSInstanceTestCase(unittest.TestCase):
The path are made relative to slapos root directory and
we keep the same directory structure.
"""
if not cls._test_file_snapshot_directory:
warnings.warn("No snapshot directory configured, skipping snapshot")
return
# we cannot use os.path.commonpath on python2, so implement something similar
common_path = os.path.commonprefix((source_file_name, cls._base_directory))
if not os.path.isdir(common_path):
......@@ -612,10 +629,8 @@ class SlapOSInstanceTestCase(unittest.TestCase):
with open(destination, 'w') as f:
f.write('broken symink to {}\n'.format(os.readlink(source_file_name)))
elif os.path.isfile(source_file_name):
cls.logger.debug("copy %s as %s", source_file_name, destination)
shutil.copy(source_file_name, destination)
elif os.path.isdir(source_file_name):
cls.logger.debug("copy directory %s as %s", source_file_name, destination)
# we copy symlinks as symlinks, so that this does not fail when
# we copy a directory containing broken symlinks.
shutil.copytree(source_file_name, destination, symlinks=True)
......
......@@ -151,7 +151,7 @@ class BasicMixin(object):
if getattr(self, 'master_url', None) is None:
self.master_url = 'http://127.0.0.1:80/'
self.computer_id = 'computer'
self.supervisord_socket = os.path.join(self._tempdir, 'supervisord.sock')
self.supervisord_socket = os.path.join(self._tempdir, 'sv.sock')
self.supervisord_configuration_path = os.path.join(self._tempdir,
'supervisord')
self.usage_report_periodicity = 1
......@@ -227,7 +227,7 @@ class BasicMixin(object):
def assertInstanceDirectoryListEqual(self, instance_list):
instance_list.append('etc')
instance_list.append('var')
instance_list.append('supervisord.socket')
instance_list.append('sv.sock')
six.assertCountEqual(self, os.listdir(self.instance_root), instance_list)
def tearDown(self):
......
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