Commit 2861a3f0 authored by Sebastien Robin's avatar Sebastien Robin

erp5testnode: more cleanup and add skeleton of test

- various cleanup and split of code to make it more testable
- start writing some tests
parent d63d40e3
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
# #
############################################################################## ##############################################################################
import os import os
import pkg_resources
import slapos.slap import slapos.slap
import subprocess import subprocess
import time import time
...@@ -35,25 +36,43 @@ import glob ...@@ -35,25 +36,43 @@ import glob
MAX_PARTIONS = 10 MAX_PARTIONS = 10
MAX_SR_RETRIES = 3 MAX_SR_RETRIES = 3
def createFolder(folder):
if not(os.path.exists(folder)):
os.mkdir(folder)
class SlapOSControler(object): class SlapOSControler(object):
def __init__(self, config, log, def __init__(self, working_directory, config, log, slapproxy_log=None,
slapproxy_log=None, process_manager=None, reset_software=False): process_manager=None, reset_software=False, software_path_list=None):
self.software_path_list = software_path_list
log('SlapOSControler, initialize, reset_software: %r' % reset_software) log('SlapOSControler, initialize, reset_software: %r' % reset_software)
self.log = log self.log = log
self.config = config self.config = config
self.process_manager = process_manager self.process_manager = process_manager
self.software_root = os.path.join(working_directory, 'soft')
self.instance_root = os.path.join(working_directory, 'inst')
self.slapos_config = os.path.join(working_directory, 'slapos.cfg')
self.proxy_database = os.path.join(working_directory, 'proxy.db')
slapos_config_dict = config.copy()
slapos_config_dict.update(software_root=self.software_root,
instance_root=self.instance_root,
proxy_database=self.proxy_database)
open(self.slapos_config, 'w').write(pkg_resources.resource_string(
'erp5.util.testnode', 'template/slapos.cfg.in') %
slapos_config_dict)
createFolder(self.software_root)
createFolder(self.instance_root)
# By erasing everything, we make sure that we are able to "update" # By erasing everything, we make sure that we are able to "update"
# existing profiles. This is quite dirty way to do updates... # existing profiles. This is quite dirty way to do updates...
if os.path.exists(config['proxy_database']): if os.path.exists(self.proxy_database):
os.unlink(config['proxy_database']) os.unlink(self.proxy_database)
kwargs = dict(close_fds=True, preexec_fn=os.setsid) kwargs = dict(close_fds=True, preexec_fn=os.setsid)
if slapproxy_log is not None: if slapproxy_log is not None:
slapproxy_log_fp = open(slapproxy_log, 'w') slapproxy_log_fp = open(slapproxy_log, 'w')
kwargs['stdout'] = slapproxy_log_fp kwargs['stdout'] = slapproxy_log_fp
kwargs['stderr'] = slapproxy_log_fp kwargs['stderr'] = slapproxy_log_fp
proxy = subprocess.Popen([config['slapproxy_binary'], proxy = subprocess.Popen([config['slapproxy_binary'],
config['slapos_config']], **kwargs) self.slapos_config], **kwargs)
process_manager.process_pid_set.add(proxy.pid) process_manager.process_pid_set.add(proxy.pid)
# XXX: dirty, giving some time for proxy to being able to accept # XXX: dirty, giving some time for proxy to being able to accept
# connections # connections
...@@ -62,8 +81,6 @@ class SlapOSControler(object): ...@@ -62,8 +81,6 @@ class SlapOSControler(object):
self.slap = slap self.slap = slap
self.slap.initializeConnection(config['master_url']) self.slap.initializeConnection(config['master_url'])
# register software profile # register software profile
self.software_path_list = config.get("software_list", [])
self.software_path_list.append(config['custom_profile_path'])
for path in self.software_path_list: for path in self.software_path_list:
slap.registerSupply().supply( slap.registerSupply().supply(
path, path,
...@@ -71,13 +88,12 @@ class SlapOSControler(object): ...@@ -71,13 +88,12 @@ class SlapOSControler(object):
computer = slap.registerComputer(config['computer_id']) computer = slap.registerComputer(config['computer_id'])
# Reset all previously generated software if needed # Reset all previously generated software if needed
if reset_software: if reset_software:
software_root = config['software_root'] log('SlapOSControler : GOING TO RESET ALL SOFTWARE : %r' % (self.software_root,))
log('SlapOSControler : GOING TO RESET ALL SOFTWARE : %r' % (software_root,)) if os.path.exists(self.software_root):
if os.path.exists(software_root): shutil.rmtree(self.software_root)
shutil.rmtree(software_root) os.mkdir(self.software_root)
os.mkdir(software_root) os.chmod(self.software_root, 0750)
os.chmod(software_root, 0750) instance_root = self.instance_root
instance_root = config['instance_root']
if os.path.exists(instance_root): if os.path.exists(instance_root):
# delete old paritions which may exists in order to not get its data # delete old paritions which may exists in order to not get its data
# (ex. MySQL db content) from previous testnode's runs # (ex. MySQL db content) from previous testnode's runs
...@@ -96,20 +112,19 @@ class SlapOSControler(object): ...@@ -96,20 +112,19 @@ class SlapOSControler(object):
os.mkdir(partition_path) os.mkdir(partition_path)
os.chmod(partition_path, 0750) os.chmod(partition_path, 0750)
computer.updateConfiguration(xml_marshaller.xml_marshaller.dumps({ computer.updateConfiguration(xml_marshaller.xml_marshaller.dumps({
'address': config['ipv4_address'], 'address': config['ipv4_address'],
'instance_root': instance_root, 'instance_root': instance_root,
'netmask': '255.255.255.255', 'netmask': '255.255.255.255',
'partition_list': [{'address_list': [{'addr': config['ipv4_address'], 'partition_list': [
'netmask': '255.255.255.255'}, {'address_list': [{'addr': config['ipv4_address'],
{'addr': config['ipv6_address'], 'netmask': '255.255.255.255'},
'netmask': 'ffff:ffff:ffff::'},], {'addr': config['ipv6_address'],
'path': partition_path, 'netmask': 'ffff:ffff:ffff::'},],
'reference': partition_reference, 'path': partition_path,
'tap': {'name': partition_reference}, 'reference': partition_reference,
} 'tap': {'name': partition_reference},}],
], 'reference': config['computer_id'],
'reference': config['computer_id'], 'software_root': self.software_root}))
'software_root': config['software_root']}))
def spawn(self, *args, **kw): def spawn(self, *args, **kw):
return self.process_manager.spawn(*args, **kw) return self.process_manager.spawn(*args, **kw)
...@@ -123,7 +138,7 @@ class SlapOSControler(object): ...@@ -123,7 +138,7 @@ class SlapOSControler(object):
# so be tolerant and run it a few times before giving up # so be tolerant and run it a few times before giving up
for runs in range(0, MAX_SR_RETRIES): for runs in range(0, MAX_SR_RETRIES):
status_dict = self.spawn(config['slapgrid_software_binary'], '-v', '-c', status_dict = self.spawn(config['slapgrid_software_binary'], '-v', '-c',
config['slapos_config'], raise_error_if_fail=False, self.slapos_config, raise_error_if_fail=False,
log_prefix='slapgrid_sr', get_output=False) log_prefix='slapgrid_sr', get_output=False)
if status_dict['status_code'] == 0: if status_dict['status_code'] == 0:
break break
...@@ -150,7 +165,7 @@ class SlapOSControler(object): ...@@ -150,7 +165,7 @@ class SlapOSControler(object):
sleep_time = 0 sleep_time = 0
for runs in range(0, MAX_PARTIONS): for runs in range(0, MAX_PARTIONS):
status_dict = self.spawn(config['slapgrid_partition_binary'], '-v', '-c', status_dict = self.spawn(config['slapgrid_partition_binary'], '-v', '-c',
config['slapos_config'], raise_error_if_fail=False, self.slapos_config, raise_error_if_fail=False,
log_prefix='slapgrid_cp', get_output=False) log_prefix='slapgrid_cp', get_output=False)
self.log('slapgrid_cp status_dict : %r' % (status_dict,)) self.log('slapgrid_cp status_dict : %r' % (status_dict,))
if status_dict['status_code'] in (0,): if status_dict['status_code'] in (0,):
......
This diff is collapsed.
from unittest import TestCase
import sys
sys.path[0:0] = [
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/eggs/slapos.cookbook-0.65-py2.7.egg',
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/eggs/zc.recipe.egg-1.3.2-py2.7.egg',
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/eggs/zc.buildout-1.6.0_dev_SlapOS_010-py2.7.egg',
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/eggs/xml_marshaller-0.9.7-py2.7.egg',
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/eggs/slapos.core-0.28.5-py2.7.egg',
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/eggs/inotifyx-0.2.0-py2.7-linux-x86_64.egg',
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/eggs/setuptools-0.6c12dev_r88846-py2.7.egg',
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/eggs/netaddr-0.7.10-py2.7.egg',
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/develop-eggs/lxml-2.3.6-py2.7-linux-x86_64.egg',
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/eggs/PyXML-0.8.4-py2.7-linux-x86_64.egg',
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/eggs/zope.interface-4.0.1-py2.7-linux-x86_64.egg',
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/eggs/supervisor-3.0a12-py2.7.egg',
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/eggs/netifaces-0.8-py2.7-linux-x86_64.egg',
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/eggs/Flask-0.9-py2.7.egg',
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/eggs/meld3-0.6.8-py2.7.egg',
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/eggs/Jinja2-2.6-py2.7.egg',
'/srv/slapgrid/slappart80/srv/runner/software/ba1e09f3364989dc92da955b64e72f8d/eggs/Werkzeug-0.8.3-py2.7.egg',
]
from erp5.util.testnode import TestNode
import tempfile
import shutil
import os
class ERP5TestNode(TestCase):
def setUp(self):
self._tempdir = tempfile.mkdtemp()
self.software_root = os.path.join(self._tempdir, 'software')
self.instance_root = os.path.join(self._tempdir, 'instance')
def tearDown(self):
shutil.rmtree(self._tempdir, True)
def test_01_GetDelNodeTestSuite(self):
test_node = TestNode(None, None)
node_test_suite = test_node.getNodeTestSuite('foo')
self.assertEquals(0, node_test_suite.retry_software_count)
node_test_suite.retry_software_count = 2
self.assertEquals(2, node_test_suite.retry_software_count)
node_test_suite = test_node.delNodeTestSuite('foo')
node_test_suite = test_node.getNodeTestSuite('foo')
self.assertEquals(0, node_test_suite.retry_software_count)
def test_01_GetNodeTestSuite(self):
pass
...@@ -71,7 +71,8 @@ setup(name=name, ...@@ -71,7 +71,8 @@ setup(name=name,
'erp5.util.benchmark.report:generateReport [benchmark-report]', 'erp5.util.benchmark.report:generateReport [benchmark-report]',
'web_checker_utility = erp5.util.webchecker:web_checker_utility' 'web_checker_utility = erp5.util.webchecker:web_checker_utility'
], ],
} },
test_suite='erp5.tests'
) )
# cleanup garbage # cleanup garbage
......
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