diff --git a/erp5/util/benchmark/scalability_launcher.py b/erp5/util/benchmark/scalability_launcher.py index 75599c5ee7430e10c19d43529a7d2b38c0a1fa45..a28ed4dfeff768f7a3de0e41f50eb7b6d5de7e9e 100644 --- a/erp5/util/benchmark/scalability_launcher.py +++ b/erp5/util/benchmark/scalability_launcher.py @@ -7,22 +7,26 @@ import time import sys import multiprocessing import errno - +import json import logging import logging.handlers from .argument import ArgumentType from .performance_tester import PerformanceTester from erp5.util import taskdistribution +from erp5.util.testnode import testnodeUtils class ScalabilityTest(object): - def __init__(self, title, count): - self.title = title - self.count = count + def __init__(self, data, test_result): + self.__dict__ = {} + self.__dict__.update(data) + self.test_result = test_result + + def stop(self): + self.test_result.stopTestCase(self.relative_path) + + def cancel(self): + self.test_result.cancelTestCase(self.relative_path) - def dump(self): - print '<ScalabilityTest>' - print 'self.title: %s' %(str(self.title)) - print 'self.count: %s' %(str(self.count)) class ScalabilityLauncher(object): def __init__(self): @@ -44,10 +48,13 @@ class ScalabilityLauncher(object): self.log = logger.info # Proxy to with erp5 master test_result - self.test_result = taskdistribution.TestResultProxyProxy(self.__argumentNamespace.portal_url, - 1.0, logger, self.__argumentNamespace.test_result_url, - self.__argumentNamespace.node_title, self.__argumentNamespace.revision) - + self.test_result = taskdistribution.TestResultProxyProxy( + self.__argumentNamespace.test_suite_master_url, + 1.0, self.log, + self.__argumentNamespace.test_result_path, + self.__argumentNamespace.node_title, + self.__argumentNamespace.revision + ) @staticmethod def _addParserArguments(parser): # Mandatory arguments @@ -93,46 +100,37 @@ class ScalabilityLauncher(object): """ pass - def updateTestResultLineStatus(self, state): + def getNextTest(self): """ - Update state of a test_result_line + Return a ScalabilityTest with current running test case informations, + or None if no test_case ready """ - # TODO : set a line per count value and use setState (?) - # - pass - - def _getNextTest(self): - """ - Get testsuite parameters - """ - title = "My Sweet Title" - count = 1 - next_test = ScalabilityTest(title, count) + data = self.test_result.getNextTestCase() + if data == None : + return None + decoded_data = testnodeUtils.deunicodeData(json.loads( + data + )) + next_test = ScalabilityTest(decoded_data, self.test_result) return next_test def run(self): self.log("Scalability Launcher started") - max_time = 10 + max_time = 36000 start_time = time.time() error_message_set, exit_status = set(), 0 - - test_result = taskdistribution.TestResultProxyProxy( - self.__argumentNamespace.test_suite_master_url, - 1.0, self.log, - self.__argumentNamespace.test_result_path, - self.__argumentNamespace.node_title, - self.__argumentNamespace.revision - ) - - #self.log("%s", self.test_result.isAlive()) - + while time.time()-start_time < max_time: - current_test = self._getNextTest() - current_test.dump() - time.sleep(2) + current_test = self.getNextTest() + if current_test == None: + self.log("No Test Case Ready") + time.sleep(5) + else: + # Here call a runScalabilityTest ( placed on product/ERP5Type/tests ) ? + self.log("Test Case %s is running..." %(current_test.title)) + current_test.stop() + self.log("Test Case Stopped") - # Here call a runScalabilityTest ( placed on product/ERP5Type/tests ) ? - return error_message_set, exit_status def main(): diff --git a/erp5/util/taskdistribution/__init__.py b/erp5/util/taskdistribution/__init__.py index f31d14bde300e22c5b4c6c2a5f3a00d49823483c..cf3a0ba06bf7bb2ceed109c5a3e7e800e11095a3 100644 --- a/erp5/util/taskdistribution/__init__.py +++ b/erp5/util/taskdistribution/__init__.py @@ -386,7 +386,7 @@ class TestResultProxyProxy(TestResultProxy): node_title, revision): try: proxy = ServerProxy( - portal_url, + test_suite_master_url, allow_none=True, ).portal_task_distribution except: @@ -394,12 +394,24 @@ class TestResultProxyProxy(TestResultProxy): TestResultProxy.__init__(self, proxy, retry_time, logger, test_result_path, node_title, revision) - def getNextTestResultLinePath(self): + def getNextTestCase(self): """ - A proxy to getNextTestResultLinePath + A proxy to getNextTestCase Return the relative path of the test with the running state """ - return bool(self._retryRPC('getNextTestResultLinePath', [self._test_result_path])) + return self._retryRPC('getNextTestCase', [self._test_result_path]) + + def cancelTestCase(self, test_result_line_path): + """ + + """ + return self._retryRPC('cancelTestCase', [test_result_line_path]) + + def stopTestCase(self, test_result_line_path): + """ + + """ + return self._retryRPC('stopTestCase', [test_result_line_path]) diff --git a/erp5/util/testnode/ScalabilityTestRunner.py b/erp5/util/testnode/ScalabilityTestRunner.py index 15541e3b93b708f6324da5fd5da108b22c45c0ff..a9fa7b7c388a671c91cc85bdb1eebf8f911a68bf 100644 --- a/erp5/util/testnode/ScalabilityTestRunner.py +++ b/erp5/util/testnode/ScalabilityTestRunner.py @@ -109,7 +109,7 @@ class ScalabilityTestRunner(): config.update({'scalability-launcher-title':'MyTestNodeTitle'}) config.update({'test-result-path':test_result.test_result_path}) config.update({'test-suite-revision':test_result.revision}) - config.update({'test-suite-master-url':self.config['test_suite_master_url']}) + config.update({'test-suite-master-url':self.testnode.config['test_suite_master_url']}) return config def _createInstance(self, software_path, software_configuration, instance_title, @@ -301,6 +301,13 @@ late a SlapOS (positive) answer." %(str(os.getpid()),str(os.getpid()),)) exclude_list=[x for x in test_list if x!=test_list[count]] count += 1 test_result_line_proxy = test_result_proxy.start(exclude_list) + # No more test to run + if test_result_line_proxy == None : + # Hum normal ? + self.log("Already tested.") + # Clean up + return {'status_code' : 0} + self.log("Test for count : %d is in a running state." %count) while test_result_line_proxy.isRunning() and test_result_proxy.isAlive(): time.sleep(15) @@ -327,7 +334,8 @@ late a SlapOS (positive) answer." %(str(os.getpid()),str(os.getpid()),)) else: self.log("Test in a undeterminated state.") raise ValueError("Test case is in an undeterminated state") - + + # todo : something like test_result_line_proxy.stop() return {'status_code' : 0} def _cleanUpNodesInformation(self):