Commit ac4390fb authored by Benjamin Blanc's avatar Benjamin Blanc
Browse files

erp5_test_result: scalability (1)

parent 847cb0ab
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ActionInformation" module="Products.CMFCore.ActionInformation"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/object_view</string>
</tuple>
</value>
</item>
<item>
<key> <string>category</string> </key>
<value> <string>object_view</string> </value>
</item>
<item>
<key> <string>condition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>icon</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>generatedConfigurationView</string> </value>
</item>
<item>
<key> <string>permissions</string> </key>
<value>
<tuple>
<string>View</string>
</tuple>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Action Information</string> </value>
</item>
<item>
<key> <string>priority</string> </key>
<value> <float>1.0</float> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Generated Configuration</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>1</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Expression" module="Products.CMFCore.Expression"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>text</string> </key>
<value> <string>string:${object_url}/ScalabilityTestSuite_viewGeneratedConfiguration</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ActionInformation" module="Products.CMFCore.ActionInformation"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/object_action</string>
</tuple>
</value>
</item>
<item>
<key> <string>category</string> </key>
<value> <string>object_action</string> </value>
</item>
<item>
<key> <string>condition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>icon</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>vcs_repository</string> </value>
</item>
<item>
<key> <string>permissions</string> </key>
<value>
<tuple>
<string>Add Documents, Images, and Files</string>
</tuple>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Action Information</string> </value>
</item>
<item>
<key> <string>priority</string> </key>
<value> <float>1.0</float> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>VCS-Repository</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>1</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Expression" module="Products.CMFCore.Expression"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>text</string> </key>
<value> <string>string:${object_url}</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ActionInformation" module="Products.CMFCore.ActionInformation"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/object_view</string>
</tuple>
</value>
</item>
<item>
<key> <string>category</string> </key>
<value> <string>object_view</string> </value>
</item>
<item>
<key> <string>condition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>icon</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>view</string> </value>
</item>
<item>
<key> <string>permissions</string> </key>
<value>
<tuple>
<string>View</string>
</tuple>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Action Information</string> </value>
</item>
<item>
<key> <string>priority</string> </key>
<value> <float>1.0</float> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>View</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>1</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Expression" module="Products.CMFCore.Expression"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>text</string> </key>
<value> <string>string:${object_url}/ScalabilityTestSuite_view</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
##############################################################################
# Copyright (c) 2013 Nexedi SA and Contributors. All Rights Reserved.
# Sebastien Robin <seb@nexedi.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly advised to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
##############################################################################
from Products.ERP5.Document.ERP5ProjectUnitTestDistributor import ERP5ProjectUnitTestDistributor
import string
import erp5.util.taskdistribution
from Products.ERP5Type.Log import log
from AccessControl import ClassSecurityInfo
from Products.ERP5Type import Permissions
import json
import random
from Products.ERP5.Tool.TaskDistributionTool import TaskDistributionTool
class ERP5ScalabilityDistributor(ERP5ProjectUnitTestDistributor):
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
security.declareProtected(Permissions.ManagePortal, "optimizeConfiguration")
def optimizeConfiguration(self):
"""
Do master testnode selection and associate testsuites.
"""
# Get modules
portal = self.getPortalObject()
test_node_module = self._getTestNodeModule()
test_suite_module = self._getTestSuiteModule()
# Get lists of test node wich belong to the current distributor
all_test_node_list = test_node_module.searchFolder(
portal_type="Test Node", specialise_uid=self.getUid())
test_node_list = [ x.getObject() for x in all_test_node_list if x.validationState() == 'validated' ]
invalid_test_node_list = [ x.getObject() for x in all_test_node_list if x.validationState() != 'validated' ]
log("test_node_list:")
log([(x.getTitle(), x.getMaster()) for x in test_node_list])
log("invalid_test_node_list:")
log([(x.getTitle(), x.getMaster()) for x in invalid_test_node_list])
# Set master property to False for all invalid testnode
for node in invalid_test_node_list:
node.setMaster(False)
# Get all valid slave testnodes
slave_test_node_list = [ x.getObject() for x in test_node_list if x.getMaster()!=True ]
master_test_node_list = [ x.getObject() for x in test_node_list if x.getMaster()==True ]
log("---2--")
log("test_node_list:")
log([(x.getTitle(), x.getMaster()) for x in test_node_list])
log("invalid_test_node_list:")
log([(x.getTitle(), x.getMaster()) for x in invalid_test_node_list])
log("slave_test_node_list:")
log([(x.getTitle(), x.getMaster()) for x in slave_test_node_list])
log("master_test_node_list:")
log([(x.getTitle(), x.getMaster()) for x in master_test_node_list])
# if there is validated testnodes
if len(test_node_list) > 0:
# Only one testnode must be the master
# if there is no or more than 1 master
if len(master_test_node_list) != 1:
# No master: elect the first testnode as master
if len(master_test_node_list) == 0:
test_node_list[0].setMaster(True)
else:
# Too many master: keep as master only the the first of list
for node in master_test_node_list[1:]:
node.setMaster(False)
# Update testnode lists
slave_test_node_list = [ x.getObject() for x in test_node_list if x.getMaster()!=True ]
master_test_node_list = [ x.getObject() for x in test_node_list if x.getMaster()==True ]
log("---3--")
log("test_node_list:")
log([(x.getTitle(), x.getMaster()) for x in test_node_list])
log("invalid_test_node_list:")
log([(x.getTitle(), x.getMaster()) for x in invalid_test_node_list])
log("slave_test_node_list:")
log([(x.getTitle(), x.getMaster()) for x in slave_test_node_list])
log("master_test_node_list:")
log([(x.getTitle(), x.getMaster()) for x in master_test_node_list])
# Get test suites and aggregate them to all valid testnode
test_suite_list = [ x.getTitle() for x in test_suite_module.searchFolder(
portal_type="Scalability Test Suite",
validation_state="validated", specialise_uid=self.getUid())]
for test_node in test_node_list:
test_node.setAggregateList(test_suite_list)
security.declarePublic("getInvolvedNodeList")
def getInvolvedNodeList(self):
"""
getInvolvedNodeList doc
"""
test_node_module = self._getTestNodeModule()
distributor_title = self.getTitle()
involved_nodes = []
involved_nodes = involved_nodes + [ x.getObject() for x in test_node_module.searchFolder(validation_state='validated') if ( x.getSpecialiseTitle() == distributor_title ) ]
return involved_nodes
security.declarePublic("subscribeNode")
def subscribeNode(self,title,computer_guid,batch_mode=0):
"""
subscribeNode doc
"""
test_node_module = self._getTestNodeModule()
portal = self.getPortalObject()
tag = "%s_%s" % (self.getRelativeUrl(), title)
if portal.portal_activities.countMessageWithTag(tag) == 0:
test_node_list = test_node_module.searchFolder(portal_type="Test Node",title=title)
assert len(test_node_list) in (0, 1), "Unable to find testnode : %s" % title
test_node = None
if len(test_node_list) == 1:
test_node = test_node_list[0].getObject()
if test_node.getValidationState() != 'validated':
try:
test_node.validate()
except e:
LOG('Test Node Validate',ERROR,'%s' %e)
if test_node is None:
test_node = test_node_module.newContent(portal_type="Test Node", title=title, computer_guid=computer_guid,
specialise=self.getRelativeUrl(),
activate_kw={'tag': tag})
self.activate(after_tag=tag).optimizeConfiguration()
test_node.setPingDate()
return test_node
return None
security.declarePublic("getTestNode")
def getTestNode(self,title,batch_mode=0):
"""
getTestNode doc
"""
test_node_module = self._getTestNodeModule()
portal = self.getPortalObject()
tag = "%s_%s" % (self.getRelativeUrl(), title)
if portal.portal_activities.countMessageWithTag(tag) == 0:
test_node_list = test_node_module.searchFolder(portal_type="Test Node",title=title)
assert len(test_node_list) in (0, 1), "Unable to find testnode : %s" % title
test_node = None
if len(test_node_list) == 1:
test_node = test_node_list[0].getObject()
if test_node.getValidationState() != 'validated':
try:
test_node.validate()
except e:
LOG('Test Node Validate',ERROR,'%s' %e)
return test_node
return None
security.declarePublic("isMasterTestnode")
def isMasterTestnode(self,title, batch_mode=0):
"""
isMasterTestnode : return True if the node given in parameter exists and is a validated master
"""
test_node_module = self._getTestNodeModule()
test_node_master = [ node for node in test_node_module.searchFolder(portal_type="Test Node", title=title,
specialise=self.getRelativeUrl(),
validation_state="validated") if node.getMaster() == 1 ]
if len(test_node_master) == 1:
return True
else:
return False
security.declarePublic("getTestType")
def getTestType(self, batch_mode=0):
"""
getTestType : return a string defining the type of tests
"""
return 'ScalabilityTest'
security.declarePublic("startTestSuite")
def startTestSuite(self,title, batch_mode=0):
"""
startTestSuite : subscribe node + return testsuite list to the master
"""
config_list = []
test_node = self.getTestNode(title,batch_mode)
test_suite_module = self._getTestSuiteModule()
test_node_module = self._getTestNodeModule()
portal = self.getPortalObject()
# If the testnode wich request testsuites is not the master
# he does not have to receive any testsuites
master_test_node_title = [x.getTitle() for x in test_node_module.searchFolder(
validatation_state = 'validated') if (x.getMaster() == True) ][0]
if title != master_test_node_title:
if batch_mode:
return []
return json.dumps([])
if test_node != None:
test_suite_list = test_node.getAggregateList()
# We sort the list according to timestamp
choice_list = []
if len(test_suite_list):
choice_list = [x.getObject() for x in test_suite_module.searchFolder(
sort_on=[('indexation_timestamp','ascending')],
) if x.getTitle() in test_suite_list]
# XXX we should have first test suite with no test node working on
# them since a long time. However we do not have this information yet,
# so random sort is better for now.
choice_list.sort(key=lambda x: random.random())
for test_suite in choice_list:
config = {}
config["project_title"] = test_suite.getSourceProjectTitle()
config["test_suite"] = test_suite.getTestSuite()
config["test_suite_title"] = test_suite.getTitle()
config["additional_bt5_repository_id"] = test_suite.getAdditionalBt5RepositoryId()
config["test_suite_reference"] = test_suite.getReference()
# config["cluster_configuration"] = test_suite.getClusterConfiguration()
# config["cluster_constraint"] = test_suite.getClusterConstraint()
#config["number_configuration"] = test_suite.getNumberConfiguration()
config["number_configuration"] = len(test_suite.getGraphCoordinate())
vcs_repository_list = []
#In this case objectValues is faster than searchFolder
for repository in test_suite.objectValues(portal_type="Test Suite Repository"):
repository_dict = {}
for property_name in ["git_url", "profile_path", "buildout_section_id", "branch"]:
property_value = repository.getProperty(property_name)
# the property name url returns the object's url, so it is mandatory use another name.
if property_name == "git_url":
property_name="url"
if property_value is not None:
repository_dict[property_name] = property_value
vcs_repository_list.append(repository_dict)
config["vcs_repository_list"] = vcs_repository_list
to_delete_key_list = [x for x,y in config.items() if y==None]
[config.pop(x) for x in to_delete_key_list]
config_list.append(config)
if batch_mode:
return config_list
return json.dumps(config_list)
security.declarePublic("generateConfiguration")
def generateConfiguration(self, test_suite_title, batch_mode=0):
"""
generateConfiguration : this is just a proxy to an external method
"""
generated_configuration = self.ScalabilityTestSuiteUtils_generateConfigurationList(self, test_suite_title)
if batch_mode:
return generated_configuration
return json.dumps(generated_configuration)
security.declarePublic("getTestCaseSimulationState")
def getTestCaseSimulationState(self, test_result_line_path, batch_mode=0):
"""
getTestCaseSimulationState : return getTestCaseSimulationState of test result line
"""
portal = self.getPortalObject()
test_result_line = portal.restrictedTraverse(test_result_line_path)
return test_result_line.getSimulationState()
security.declarePublic("isTestCaseRunning")
def isTestCaseRunning(self, test_result_line_path, batch_mode=0):
"""
isTestCaseRunning : return True if test case is running
"""
return self.getTestCaseSimulationState(test_result_line_path) == 'started'
security.declarePublic("isTestCaseFailed")
def isTestCaseFailed(self, test_result_line_path, batch_mode=0):
"""
isTestCaseFailed : return True if test case is Failed
"""
return self.getTestCaseSimulationState(test_result_line_path) == 'failed'
security.declarePublic("isTestCaseCompleted")
def isTestCaseCompleted(self, test_result_line_path, batch_mode=0):
"""
isTestCaseCompleted : return True if test case is completed
"""
return self.getTestCaseSimulationState(test_result_line_path) == 'stopped'
security.declarePublic("isTestCaseCancelled")
def isTestCaseCancelled(self, test_result_line_path, batch_mode=0):
"""
isTestCaseCancelled : return True if test case is cancelled
"""
return self.getTestCaseSimulationState(test_result_line_path) == 'cancelled'
security.declarePublic("setTestCaseSimulationState")
def setTestCaseSimulationState(self, test_result_line_path, state, batch_mode=0):
"""
setTestCasesimulationState : set the Simulation state of a test case/test result line
"""
portal = self.getPortalObject()
test_result_line = portal.restrictedTraverse(test_result_line_path)
return test_result_line.setSimulationState(state)
security.declarePublic("startTestCase")
def startTestCase(self, test_result_line_path, batch_mode=0):
"""
startTestCase : change the simulation state of the test Case(result line) to started
"""
portal = self.getPortalObject()
test_result_line = portal.restrictedTraverse(test_result_line_path)
test_result_line.start()
security.declarePublic("stopTestCase")
def stopTestCase(self, test_result_line_path, batch_mode=0):
"""
stopTestCase : change the simulation state of the test Case(result line) to stopped
"""
portal = self.getPortalObject()
test_result_line = portal.restrictedTraverse(test_result_line_path)
test_result_line.stop()
security.declarePublic("cancelTestCase")
def cancelTestCase(self, test_result_line_path, batch_mode=0):
"""
cancelTestCase : change the simulation state of the test Case(result line) to cancelled
"""
portal = self.getPortalObject()
test_result_line = portal.restrictedTraverse(test_result_line_path)
test_result_line.cancel()
security.declarePublic("getTestResult")
def getTestResult(self, test_result_path, batch_mode=0):
"""
xxx :
"""
portal = self.getPortalObject()
test_result = portal.restrictedTraverse(test_result_path)
return test_result
security.declarePublic("stopTest")
def stopTest(self, test_result_path, batch_mode=0):
"""
xxx :
"""
portal = self.getPortalObject()
test_result = portal.restrictedTraverse(test_result_path)
return test_result.stop()
security.declarePublic("failTest")
def failTest(self, test_result_path, batch_mode=0):
"""
xxx :
"""
portal = self.getPortalObject()
test_result = portal.restrictedTraverse(test_result_path)
return test_result.fail()
def getNextTestCase(self, test_result_path, batch_mode=0):
"""
getNextTestCase : return informations about the running test case,
if no running test_case, return None
"""
test_result = self.getTestResult(test_result_path)
test_result_lines = test_result.objectValues(portal_type="Test Result Line",
sort_on='int_index')
count = 0
for test_result_line in test_result_lines:
count += 1
state = test_result_line.getSimulationState()
if state == "started":
relative_path = test_result_line.getRelativeUrl()
title = test_result_line.getTitle()
break;
else:
return None
next_test = {"relative_path": relative_path,
"title": title, "count" : count,
}
if batch_mode:
return next_test
return json.dumps(next_test)
\ No newline at end of file
##############################################################################
#
# Copyright (c) 2002-2013 Nexedi SA and Contributors. All Rights Reserved.
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly adviced to contract a Free Software
# Service Company return "OK"
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
##############################################################################
import jinja2
import json
def getGeneratedConfigurationList(self, *args, **kw):
document_list = []
template = jinja2.Template(self.getClusterConfiguration())
max = len(self.getGraphCoordinate())
#max = self.getNumberConfiguration()
compListView = [ "COMP-%i" %(x) for x in range(0,max+1) ]
for count in xrange(1, max+1):
templateVars = { "count" : count, "comp" : compListView }
outputText = template.render( templateVars )
description = json.dumps(json.loads(outputText), sort_keys=True, indent=4, separators=(',', ': '))
# Create a temp object
document_list.append(self.newContent(
temp_object=1,
title="%i" % count,
description="%s" %(description)))
return document_list
def generateConfigurationList(self, test_suite_title):
"""
generateConfigurationList : generate a dict wich contains a list
of cluster configurations for testnodes, using a test_suite and
available testnodes.
If it is not possible to generate a configuration, the 'launchable'
entry is False, otherwise it is True.
"""
def _unvalidateConfig(my_dict):
my_dict['launchable'] = False
if 'launcher_nodes_computer_guid' in my_dict:
my_dict['launcher_nodes_computer_guid'] = {}
if 'involved_nodes_computer_guid' in my_dict:
my_dict['involved_nodes_computer_guid'] = {}
if 'configuration_list' in my_dict:
my_dict['configuration_list'] = []
def _isInMyDictOrListRec(my_container, my_value):
def _isInMyDictOrList(current_container):
if current_container == my_value :
return True
elif type(current_container) == type({}):
for k,v in current_container.items():
if _isInMyDictOrList(current_container[k]) :
return True
elif type(current_container) == type([]):
for sub_container in current_container:
if _isInMyDictOrList(sub_container) :
return True
# Not found at this level and below
return False
return _isInMyDictOrList(my_container)
portal = self.getPortalObject()
test_suite_module = portal.test_suite_module
test_node_module = portal.test_node_module
portal_task_distribution = portal.portal_task_distribution
# Get test_suite informations from his title given in parameter
test_suite = test_suite_module.searchFolder(title=test_suite_title)[0]
lll = portal_task_distribution.searchFolder(title=test_suite.getSpecialiseTitle())
distributor_uid = lll[0].getUid()
cluster_configuration = test_suite.getClusterConfiguration()
cluster_constraint = test_suite.getClusterConstraint()
#number_configuration = test_suite.getNumberConfiguration()
number_configuration = len(test_suite.getGraphCoordinate())
randomized_path = test_suite.getRandomizedPath()
# Get testnodes available for this distributor
unvalid_node = "_my_unvalidated_dummy_node"
# Validated nodes wich are available to run test
available_nodes = test_node_module.searchFolder(
portal_type="Test Node", validation_state="validated",
specialise_uid=distributor_uid)
# Remaining node are nodes that can be insert in the template (so, excluded launcher nodes)
remaining_nodes = list(available_nodes)
launcher_nodes = []
launcher_nodes.append( remaining_nodes.pop() )
# Make list with only the computer_guid property of each node (to be used directly by template)
remaining_nodes_computer_guid = [unvalid_node] + [ node.getComputerGuid() for node in remaining_nodes ] + [unvalid_node]
launcher_nodes_computer_guid = [ node.getComputerGuid() for node in launcher_nodes ]
configuration_list_json = []
return_dict = {}
return_dict['error_message'] = 'No error.'
return_dict['randomized_path'] = randomized_path
# Will be modified after
return_dict['launchable'] = False
# source of possible error :
# bad json configuration
try:
template = jinja2.Template(cluster_configuration)
for count in xrange(1, number_configuration+1):
template_vars = { "count" : count, "comp" : remaining_nodes_computer_guid }
configuration_list_json.append( json.loads( template.render( template_vars ) ) )
return_dict['launchable'] = True
return_dict['configuration_list'] = configuration_list_json
return_dict['launcher_nodes_computer_guid'] = launcher_nodes_computer_guid
except:
return_dict['error_message'] = 'Bad json cluster_configuration ?'
_unvalidateConfig(return_dict)
# If the number of available nodes is lower than
# the number of nodes required by the template
if _isInMyDictOrListRec(return_dict, unvalid_node):
_unvalidateConfig(return_dict)
return_dict['error_message'] = 'The number of testnodes available for running\
the current test (%s) is insufficient.' %(test_suite_title)
# Get the list of all nodes wich will are involved in the test
involved_nodes_computer_guid = []
for node in available_nodes:
computer_guid = node.getComputerGuid()
if _isInMyDictOrListRec(return_dict, computer_guid):
involved_nodes_computer_guid.append(computer_guid)
return_dict['involved_nodes_computer_guid'] = involved_nodes_computer_guid
return return_dict
\ No newline at end of file
......@@ -2,6 +2,9 @@
<portal_type id="Benchmark Result">
<item>Benchmark Result Line</item>
</portal_type>
<portal_type id="Scalability Test Suite">
<item>Test Suite Repository</item>
</portal_type>
<portal_type id="Task Distribution Tool">
<item>Cloud Performance Unit Test Distributor</item>
<item>ERP5 Project Unit Test Distributor</item>
......@@ -21,6 +24,7 @@
<item>Test Suite Repository</item>
</portal_type>
<portal_type id="Test Suite Module">
<item>Scalability Test Suite</item>
<item>Test Suite</item>
</portal_type>
</allowed_content_type_list>
\ No newline at end of file
......@@ -2,6 +2,9 @@
<portal_type id="Benchmark Result">
<item>source_project</item>
</portal_type>
<portal_type id="Scalability Test Suite">
<item>specialise</item>
</portal_type>
<portal_type id="Test Node">
<item>aggregate</item>
<item>specialise</item>
......
......@@ -7,6 +7,11 @@
<portal_type id="Benchmark Result Line">
<item>Task</item>
</portal_type>
<portal_type id="Scalability Test Suite">
<item>Arrow</item>
<item>ScalabilityTestSuite</item>
<item>TestSuite</item>
</portal_type>
<portal_type id="Test Node">
<item>DublinCore</item>
</portal_type>
......
<type_roles>
<role id='Assignor; Assignee; Associate; Auditor; Author; Owner'>
<property id='title'>Default</property>
<property id='description'>Configured by Ben.</property>
<multi_property id='category'>group/my_group</multi_property>
</role>
</type_roles>
\ No newline at end of file
<type_roles>
<role id='Assignor; Assignee; Associate; Auditor; Author'>
<property id='title'>Default</property>
<property id='description'>Configured by Ben</property>
<multi_property id='category'>group/my_group</multi_property>
</role>
</type_roles>
\ No newline at end of file
<type_roles>
<role id='Assignor; Assignee; Associate; Auditor; Author'>
<property id='title'>Default</property>
<property id='description'>Configured by Ben</property>
<multi_property id='category'>group/my_group</multi_property>
</role>
</type_roles>
\ No newline at end of file
<type_roles>
<role id='Assignor; Assignee; Associate; Auditor; Author'>
<property id='title'>Default</property>
<property id='description'>Configured by Ben.</property>
<multi_property id='category'>group/my_group</multi_property>
</role>
</type_roles>
\ No newline at end of file
<type_roles>
<role id='Assignor; Assignee; Associate; Auditor; Author'>
<property id='title'>Default</property>
<property id='description'>Configured by Ben.</property>
<multi_property id='category'>group/my_group</multi_property>
</role>
</type_roles>
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Base Type" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>acquire_local_roles</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>content_icon</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>group_list</string> </key>
<value>
<tuple>
<string>embedded_document</string>
</tuple>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Scalability Test Suite</string> </value>
</item>
<item>
<key> <string>init_script</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>permission</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Base Type</string> </value>
</item>
<item>
<key> <string>type_class</string> </key>
<value> <string>TextDocument</string> </value>
</item>
<item>
<key> <string>type_interface</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>type_mixin</string> </key>
<value>
<tuple/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -7,6 +7,10 @@
<type>Benchmark Result Line</type>
<workflow>edit_workflow, test_result_workflow</workflow>
</chain>
<chain>
<type>Scalability Test Suite</type>
<workflow>edit_workflow, test_suite_workflow</workflow>
</chain>
<chain>
<type>Test Node</type>
<workflow>edit_workflow, test_node_workflow</workflow>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Property Sheet" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>ScalabilityTestSuite</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Property Sheet</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Standard Property" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>elementary_type/string</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>The configuration of the cluster.</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>cluster_configuration_property</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Standard Property</string> </value>
</item>
<item>
<key> <string>property_default</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Standard Property" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>elementary_type/string</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>The hardaware constrains used for the selection of cluster-nodes.</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>cluster_constraint_property</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Standard Property</string> </value>
</item>
<item>
<key> <string>property_default</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Standard Property" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>elementary_type/object</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>The list of abscissa coordinate of each test. The size of the list determinates the number of configuration to test.</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>graph_coordinate_property</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Standard Property</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Standard Property" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>elementary_type/string</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>A random string wich defines a relative path to acces to the software.cfg file.</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>randomized_path_property</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Standard Property</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
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