Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
139
Merge Requests
139
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Jobs
Commits
Open sidebar
nexedi
erp5
Commits
da44845a
Commit
da44845a
authored
Feb 20, 2023
by
Thomas Gambier
🚴🏼
Committed by
Lu Xu
Mar 27, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
erp5_test_result: rework slapos agent distributor
parent
27c22d64
Changes
29
Hide whitespace changes
Inline
Side-by-side
Showing
29 changed files
with
563 additions
and
257 deletions
+563
-257
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.ERP5ProjectUnitTestDistributor.py
...omponents/document.erp5.ERP5ProjectUnitTestDistributor.py
+6
-4
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.ERP5ScalabilityDistributor.py
...al_components/document.erp5.ERP5ScalabilityDistributor.py
+1
-1
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.SlapOSAgentDistributor.py
...portal_components/document.erp5.SlapOSAgentDistributor.py
+91
-15
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.SlapOSAgentDistributor.xml
...ortal_components/document.erp5.SlapOSAgentDistributor.xml
+3
-1
bt5/erp5_test_result/ExtensionTemplateItem/portal_components/extension.erp5.ScalabilityTestSuiteUtils.py
...al_components/extension.erp5.ScalabilityTestSuiteUtils.py
+2
-2
bt5/erp5_test_result/PropertySheetTemplateItem/portal_property_sheets/SlapOSSoftwareReleaseUnitTest/filter_kw_property.xml
...eets/SlapOSSoftwareReleaseUnitTest/filter_kw_property.xml
+34
-0
bt5/erp5_test_result/PropertySheetTemplateItem/portal_property_sheets/SlapOSSoftwareReleaseUnitTest/shared_property.xml
..._sheets/SlapOSSoftwareReleaseUnitTest/shared_property.xml
+38
-0
bt5/erp5_test_result/PropertySheetTemplateItem/portal_property_sheets/SlapOSSoftwareReleaseUnitTest/software_type_property.xml
.../SlapOSSoftwareReleaseUnitTest/software_type_property.xml
+38
-0
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view.xml
...s/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view.xml
+3
-0
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view/my_filter_kw.xml
...esult/SlapOSSoftwareReleaseUnitTest_view/my_filter_kw.xml
+54
-61
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view/my_shared.xml
...t_result/SlapOSSoftwareReleaseUnitTest_view/my_shared.xml
+184
-0
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view/my_software_type.xml
...t/SlapOSSoftwareReleaseUnitTest_view/my_software_type.xml
+3
-26
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view/my_text_content.xml
...lt/SlapOSSoftwareReleaseUnitTest_view/my_text_content.xml
+1
-1
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TaskDistributorAlarm_optimize.py
...l_skins/erp5_test_result/TaskDistributorAlarm_optimize.py
+2
-2
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResultLine_getResultHistoryList.py
...s/erp5_test_result/TestResultLine_getResultHistoryList.py
+2
-2
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResultLine_view/my_duration.xml
...kins/erp5_test_result/TestResultLine_view/my_duration.xml
+14
-53
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResultModule_reportCompleted.py
...kins/erp5_test_result/TestResultModule_reportCompleted.py
+1
-1
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_getJsonScalabilityStats.py
...ns/erp5_test_result/TestResult_getJsonScalabilityStats.py
+3
-3
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_getJumpVCSResultList.py
...skins/erp5_test_result/TestResult_getJumpVCSResultList.py
+3
-3
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_getSummaryForRSS.py
...tal_skins/erp5_test_result/TestResult_getSummaryForRSS.py
+8
-8
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_getTestSuiteList.py
...tal_skins/erp5_test_result/TestResult_getTestSuiteList.py
+1
-1
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_getTitleForRSS.py
...ortal_skins/erp5_test_result/TestResult_getTitleForRSS.py
+1
-1
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_statTestResultLineList.py
...ins/erp5_test_result/TestResult_statTestResultLineList.py
+1
-2
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_view.xml
...ateItem/portal_skins/erp5_test_result/TestResult_view.xml
+0
-2
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestSuiteModule_addTestSuite.py
...al_skins/erp5_test_result/TestSuiteModule_addTestSuite.py
+1
-1
bt5/erp5_test_result/TestTemplateItem/portal_components/test.erp5.testTaskDistribution.py
...eItem/portal_components/test.erp5.testTaskDistribution.py
+63
-63
bt5/erp5_test_result/ToolComponentTemplateItem/portal_components/tool.erp5.TaskDistributionTool.py
...eItem/portal_components/tool.erp5.TaskDistributionTool.py
+3
-2
bt5/erp5_test_result/WorkflowTemplateItem/portal_workflow/test_result_workflow/script_TestResult_fail.py
...l_workflow/test_result_workflow/script_TestResult_fail.py
+1
-1
bt5/erp5_test_result/WorkflowTemplateItem/portal_workflow/test_suite_workflow/script_TestSuite_afterValidate.py
...low/test_suite_workflow/script_TestSuite_afterValidate.py
+1
-1
No files found.
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.ERP5ProjectUnitTestDistributor.py
View file @
da44845a
...
...
@@ -28,7 +28,7 @@ from Products.ERP5Type.XMLObject import XMLObject
from
DateTime
import
DateTime
import
json
import
random
from
zLOG
import
LOG
,
DEBUG
,
ERROR
from
zLOG
import
LOG
,
DEBUG
,
ERROR
,
INFO
from
AccessControl
import
ClassSecurityInfo
from
Products.ERP5Type
import
Permissions
from
Products.ZSQLCatalog.SQLCatalog
import
SimpleQuery
...
...
@@ -271,7 +271,7 @@ class ERP5ProjectUnitTestDistributor(XMLObject):
if
test_node
.
getValidationState
()
!=
'validated'
:
try
:
test_node
.
validate
()
except
Exception
as
e
:
except
Exception
,
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
,
...
...
@@ -384,7 +384,7 @@ class ERP5ProjectUnitTestDistributor(XMLObject):
for
x
in
to_delete_key_list
:
config
.
pop
(
x
)
config_list
.
append
(
config
)
LOG
(
'ERP5ProjectUnitTestDistributor.startTestSuite, config_list'
,
DEBUG
,
config_list
)
LOG
(
'ERP5ProjectUnitTestDistributor.startTestSuite, config_list'
,
INFO
,
config_list
)
if
batch_mode
:
return
config_list
return
json
.
dumps
(
config_list
)
...
...
@@ -395,12 +395,13 @@ class ERP5ProjectUnitTestDistributor(XMLObject):
"""
Here this is only a proxy to the task distribution tool
"""
LOG
(
'ERP5ProjectUnitTestDistributor.createTestResult'
,
DEBUG
,
(
node_title
,
test_title
))
LOG
(
'ERP5ProjectUnitTestDistributor.createTestResult'
,
INFO
,
(
node_title
,
test_title
))
portal
=
self
.
getPortalObject
()
if
node_title
:
test_node
=
self
.
_getTestNodeFromTitle
(
node_title
)
test_node
.
setPingDate
()
test_suite
=
self
.
_getTestSuiteFromTitle
(
test_title
)
LOG
(
'ERP5ProjectUnitTestDistributor.createTestResult 2'
,
INFO
,
(
test_suite
))
if
test_suite
is
not
None
:
if
not
allow_restart
and
test_suite
.
isEnabled
():
# in case if allow_restart is not enforced by client and test_node
...
...
@@ -430,6 +431,7 @@ class ERP5ProjectUnitTestDistributor(XMLObject):
return
test_node
def
_getTestSuiteFromTitle
(
self
,
suite_title
):
LOG
(
'ERP5ProjectUnitTestDistributor._getTestSuiteFromTitle'
,
INFO
,
(
suite_title
,
self
.
_getTestSuiteModule
()))
test_suite_list
=
self
.
_getTestSuiteModule
().
searchFolder
(
portal_type
=
'Test Suite'
,
title
=
SimpleQuery
(
comparison_operator
=
'='
,
title
=
suite_title
),
...
...
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.ERP5ScalabilityDistributor.py
View file @
da44845a
...
...
@@ -128,7 +128,7 @@ class ERP5ScalabilityDistributor(ERP5ProjectUnitTestDistributor, object):
if
test_node
.
getValidationState
()
!=
'validated'
:
try
:
test_node
.
validate
()
except
Exception
as
e
:
except
Exception
,
e
:
LOG
(
'Test Node Validate'
,
ERROR
,
'%s'
%
e
)
return
test_node
return
None
...
...
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.SlapOSAgentDistributor.py
View file @
da44845a
...
...
@@ -26,7 +26,9 @@
##############################################################################
from
erp5.component.document.ERP5ProjectUnitTestDistributor
import
ERP5ProjectUnitTestDistributor
from
DateTime
import
DateTime
from
zLOG
import
LOG
,
DEBUG
,
ERROR
,
INFO
from
Products.ZSQLCatalog.SQLCatalog
import
SimpleQuery
from
AccessControl
import
ClassSecurityInfo
from
Products.ERP5Type
import
Permissions
import
json
...
...
@@ -65,41 +67,115 @@ class SlapOSAgentDistributor(ERP5ProjectUnitTestDistributor):
"""
return
'SlapOSAgentTest'
security
.
declarePublic
(
"createTestResult"
)
def
createTestResult
(
self
,
name
,
revision
,
test_name_list
,
allow_restart
,
test_title
=
None
,
node_title
=
None
,
project_title
=
None
):
"""
Here this is only a proxy to the task distribution tool
"""
LOG
(
'SlapOSAgentDistributor.createTestResult'
,
INFO
,
(
node_title
,
test_title
,
revision
))
portal
=
self
.
getPortalObject
()
if
node_title
:
test_node
=
self
.
_getTestNodeFromTitle
(
node_title
)
test_node
.
setPingDate
()
test_suite
=
self
.
_getTestSuiteFromTitle
(
test_title
)
LOG
(
'SlapOSAgentDistributor.createTestResult 2'
,
INFO
,
(
test_suite
))
if
test_suite
is
not
None
:
if
not
allow_restart
and
test_suite
.
isEnabled
():
# in case if allow_restart is not enforced by client and test_node
# periodicity is enabled control the restartability based on test_suite
# periodicity
current_date
=
DateTime
()
alarm_date
=
test_suite
.
getAlarmDate
()
if
alarm_date
is
None
or
alarm_date
<=
current_date
:
allow_restart
=
True
test_suite
.
setAlarmDate
(
test_suite
.
getNextPeriodicalDate
(
current_date
,
alarm_date
))
#test_suite.setPingDate()
return
portal
.
portal_task_distribution
.
createTestResult
(
name
,
revision
,
test_name_list
,
allow_restart
,
test_title
=
test_title
,
node_title
=
node_title
,
project_title
=
project_title
)
def
_getTestNodeFromTitle
(
self
,
node_title
):
test_node_list
=
self
.
_getTestNodeModule
().
searchFolder
(
portal_type
=
"Test Node"
,
title
=
SimpleQuery
(
comparison_operator
=
'='
,
title
=
node_title
),
limit
=
2
)
assert
len
(
test_node_list
)
==
1
,
"We found %i test nodes for %s"
%
(
len
(
test_node_list
),
node_title
)
test_node
=
test_node_list
[
0
].
getObject
()
return
test_node
def
_getTestSuiteFromTitle
(
self
,
suite_title
):
LOG
(
'SlapOSAgentDistributor._getTestSuiteFromTitle'
,
INFO
,
(
suite_title
,
self
.
_getTestSuiteModule
()))
test_suite_list
=
self
.
_getTestSuiteModule
().
searchFolder
(
portal_type
=
'SlapOS Agent Test Suite'
,
title
=
SimpleQuery
(
comparison_operator
=
'='
,
title
=
suite_title
),
validation_state
=
'validated'
,
limit
=
2
)
assert
len
(
test_suite_list
)
<=
1
,
"We found %i test suite for %s"
%
(
len
(
test_suite_list
),
suite_title
)
test_suite
=
None
if
len
(
test_suite_list
):
test_suite
=
test_suite_list
[
0
].
getObject
()
return
test_suite
security
.
declarePublic
(
"generateConfiguration"
)
def
generateConfiguration
(
self
,
test_suite_title
,
batch_mode
=
0
):
"""
generateConfiguration :
this is just a proxy to an external method
generateConfiguration :
not used for slapos agent
"""
test_suite_module
=
self
.
_getTestSuiteModule
(
)
return
json
.
dumps
({
"configuration_list"
:
[{}]}
)
security
.
declarePublic
(
"getServiceList"
)
def
getServiceList
(
self
,
test_suite_title
):
"""
getServiceList : return a dict containing the list of services to request to slapos master before running the test
"""
LOG
(
'[SlapOSAgentDistributor] getServiceList'
,
INFO
,
test_suite_title
)
test_suite_module
=
self
.
_getTestSuiteModule
()
test_suite_list
=
test_suite_module
.
searchFolder
(
title
=
test_suite_title
,
validation_state
=
"validated"
,
specialise_uid
=
self
.
getUid
())
service_list
=
{}
if
len
(
test_suite_list
)
==
0
:
return
json
.
dumps
({})
error_message
=
'Error getting test suite information. Bad test suite title? '
LOG
(
'[SlapOSAgentDistributor] getServiceList'
,
ERROR
,
error_message
)
return
json
.
dumps
({
'error_message'
:
error_message
})
generated_configuration
=
{}
for
unit_test
in
test_suite_list
[
0
].
searchFolder
(
portal_type
=
"SlapOS Software Release Unit Test"
):
generated_configuration
[
unit_test
.
getTitle
()]
=
{
LOG
(
'[SlapOSAgentDistributor] getServiceList, unit_test: '
,
INFO
,
unit_test
.
getTitle
())
service_list
[
unit_test
.
getTitle
()]
=
{
"title"
:
unit_test
.
getTitle
(),
"url"
:
unit_test
.
getUrlString
(),
"group"
:
unit_test
.
getGroupReference
(
"default"
)}
if
unit_test
.
getTextContent
()
is
not
None
:
generated_configuration
[
unit_test
.
getTitle
()][
'request_kw'
]
=
unit_test
.
getTextContent
()
"group"
:
unit_test
.
getGroupReference
(
"default"
),
"shared"
:
unit_test
.
getShared
(),
"software_type"
:
unit_test
.
getSoftwareType
(),
"partition_parameter_kw"
:
unit_test
.
getTextContent
(),
"filter_kw"
:
unit_test
.
getFilterKw
()
}
if
unit_test
.
getSupplyComputer
()
is
not
None
:
generated_configuration
[
unit_test
.
getTitle
()][
'supply_computer'
]
=
unit_test
.
getSupplyComputer
()
return
json
.
dumps
(
generated_configuration
)
service_list
[
unit_test
.
getTitle
()][
'supply_computer'
]
=
unit_test
.
getSupplyComputer
()
LOG
(
'[SlapOSAgentDistributor] getServiceList, final service_list: '
,
INFO
,
service_list
)
return
json
.
dumps
(
service_list
)
def
_getSortedNodeTestSuiteToRun
(
self
,
test_node
):
"""
Returned ordered list of test suites of a test node.
For now do nothing
"""
test_suite_list
=
test_node
.
getAggregateValueList
()
return
test_suite_list
...
...
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.SlapOSAgentDistributor.xml
View file @
da44845a
...
...
@@ -39,7 +39,9 @@
<item>
<key>
<string>
text_content_warning_message
</string>
</key>
<value>
<tuple/>
<tuple>
<string>
W: 30, 0: Unused DEBUG imported from zLOG (unused-import)
</string>
</tuple>
</value>
</item>
<item>
...
...
bt5/erp5_test_result/ExtensionTemplateItem/portal_components/extension.erp5.ScalabilityTestSuiteUtils.py
View file @
da44845a
...
...
@@ -110,7 +110,7 @@ def generateConfigurationList(self, test_suite_title):
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
.
getReference
()
for
node
in
remaining_nodes
]
+
[
unvalid_node
]
launcher_nodes_computer_guid
=
[
node
.
getReference
()
for
node
in
launcher_nodes
]
...
...
@@ -149,6 +149,6 @@ def generateConfigurationList(self, test_suite_title):
computer_guid
=
node
.
getReference
()
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
bt5/erp5_test_result/PropertySheetTemplateItem/portal_property_sheets/SlapOSSoftwareReleaseUnitTest/filter_kw_property.xml
0 → 100644
View file @
da44845a
<?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/text
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
filter_kw_property
</string>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Standard Property
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_test_result/PropertySheetTemplateItem/portal_property_sheets/SlapOSSoftwareReleaseUnitTest/shared_property.xml
0 → 100644
View file @
da44845a
<?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/boolean
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string>
Is it shared instance
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
shared_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>
bt5/erp5_test_result/PropertySheetTemplateItem/portal_property_sheets/SlapOSSoftwareReleaseUnitTest/software_type_property.xml
0 → 100644
View file @
da44845a
<?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/text
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string>
software_type used for the service
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
software_type_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>
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view.xml
View file @
da44845a
...
...
@@ -104,6 +104,9 @@
<string>
my_url_string
</string>
<string>
my_supply_computer
</string>
<string>
my_group_reference
</string>
<string>
my_software_type
</string>
<string>
my_shared
</string>
<string>
my_filter_kw
</string>
</list>
</value>
</item>
...
...
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/
TestResult_view/your_real_duration
.xml
→
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/
SlapOSSoftwareReleaseUnitTest_view/my_filter_kw
.xml
View file @
da44845a
...
...
@@ -2,13 +2,13 @@
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"
String
Field"
module=
"Products.Formulator.StandardFields"
/>
<global
name=
"
TextArea
Field"
module=
"Products.Formulator.StandardFields"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
your_real_duration
</string>
</value>
<value>
<string>
my_filter_kw
</string>
</value>
</item>
<item>
<key>
<string>
message_values
</string>
</key>
...
...
@@ -18,13 +18,21 @@
<key>
<string>
external_validator_failed
</string>
</key>
<value>
<string>
The input failed the external validator.
</string>
</value>
</item>
<item>
<key>
<string>
line_too_long
</string>
</key>
<value>
<string>
A line was too long.
</string>
</value>
</item>
<item>
<key>
<string>
required_not_found
</string>
</key>
<value>
<string>
Input is required but no input given.
</string>
</value>
</item>
<item>
<key>
<string>
too_long
</string>
</key>
<value>
<string>
Too much input was given.
</string>
</value>
<value>
<string>
You entered too many characters.
</string>
</value>
</item>
<item>
<key>
<string>
too_many_lines
</string>
</key>
<value>
<string>
You entered too many lines.
</string>
</value>
</item>
</dictionary>
</value>
...
...
@@ -50,39 +58,39 @@
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
display_maxwidth
</string>
</key>
<key>
<string>
editable
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
display_width
</string>
</key>
<key>
<string>
enabled
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
e
ditable
</string>
</key>
<key>
<string>
e
xternal_validator
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
e
nabled
</string>
</key>
<key>
<string>
e
xtra
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
external_validator
</string>
</key>
<key>
<string>
height
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
extra
</string>
</key>
<key>
<string>
hidden
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
hidden
</string>
</key>
<key>
<string>
max_length
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
input_type
</string>
</key>
<key>
<string>
max_linelength
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
max_l
ength
</string>
</key>
<key>
<string>
max_l
ines
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
...
...
@@ -94,15 +102,15 @@
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
truncat
e
</string>
</key>
<key>
<string>
unicod
e
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
unicod
e
</string>
</key>
<key>
<string>
whitespace_preserv
e
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
w
hitespace_preserve
</string>
</key>
<key>
<string>
w
idth
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
...
...
@@ -122,48 +130,46 @@
</item>
<item>
<key>
<string>
default
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
display_maxwidth
</string>
</key>
<key>
<string>
editable
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
display_width
</string>
</key>
<key>
<string>
enabled
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
e
ditable
</string>
</key>
<key>
<string>
e
xternal_validator
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
e
nabled
</string>
</key>
<key>
<string>
e
xtra
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
external_validator
</string>
</key>
<key>
<string>
height
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
extra
</string>
</key>
<key>
<string>
hidden
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
hidden
</string>
</key>
<key>
<string>
max_length
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
input_type
</string>
</key>
<key>
<string>
max_linelength
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
max_l
ength
</string>
</key>
<key>
<string>
max_l
ines
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
...
...
@@ -175,15 +181,15 @@
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
truncat
e
</string>
</key>
<key>
<string>
unicod
e
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
unicod
e
</string>
</key>
<key>
<string>
whitespace_preserv
e
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
w
hitespace_preserve
</string>
</key>
<key>
<string>
w
idth
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
...
...
@@ -207,19 +213,11 @@
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string>
Difference between end date and start date
</string>
</value>
</item>
<item>
<key>
<string>
display_maxwidth
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
display_width
</string>
</key>
<value>
<int>
20
</int>
</value>
</item>
<item>
<key>
<string>
editable
</string>
</key>
<value>
<int>
0
</int>
</value>
<value>
<int>
1
</int>
</value>
</item>
<item>
<key>
<string>
enabled
</string>
</key>
...
...
@@ -233,16 +231,24 @@
<key>
<string>
extra
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
height
</string>
</key>
<value>
<int>
5
</int>
</value>
</item>
<item>
<key>
<string>
hidden
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
input_type
</string>
</key>
<value>
<string>
text
</string>
</value>
<key>
<string>
max_length
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
max_linelength
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
max_l
ength
</string>
</key>
<key>
<string>
max_l
ines
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
...
...
@@ -251,11 +257,7 @@
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Duration
</string>
</value>
</item>
<item>
<key>
<string>
truncate
</string>
</key>
<value>
<int>
0
</int>
</value>
<value>
<string>
filter_kw (json format)
</string>
</value>
</item>
<item>
<key>
<string>
unicode
</string>
</key>
...
...
@@ -263,7 +265,11 @@
</item>
<item>
<key>
<string>
whitespace_preserve
</string>
</key>
<value>
<int>
0
</int>
</value>
<value>
<int>
1
</int>
</value>
</item>
<item>
<key>
<string>
width
</string>
</key>
<value>
<int>
40
</int>
</value>
</item>
</dictionary>
</value>
...
...
@@ -271,17 +277,4 @@
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"TALESMethod"
module=
"Products.Formulator.TALESField"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_text
</string>
</key>
<value>
<string>
python: context.getStopDate().asdatetime() - context.getStartDate().asdatetime() if context.hasStopDate() else \'\'
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view/my_shared.xml
0 → 100644
View file @
da44845a
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"CheckBoxField"
module=
"Products.Formulator.StandardFields"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
my_shared
</string>
</value>
</item>
<item>
<key>
<string>
message_values
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
external_validator_failed
</string>
</key>
<value>
<string>
The input failed the external validator.
</string>
</value>
</item>
<item>
<key>
<string>
required_not_found
</string>
</key>
<value>
<string>
This field is mandatory.
</string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
overrides
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
alternate_name
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
css_class
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
default
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
editable
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
enabled
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
external_validator
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
extra
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
hidden
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
required
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
tales
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
alternate_name
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
css_class
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
default
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
editable
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
enabled
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
external_validator
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
extra
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
hidden
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
required
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
values
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
alternate_name
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
css_class
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
default
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
editable
</string>
</key>
<value>
<int>
1
</int>
</value>
</item>
<item>
<key>
<string>
enabled
</string>
</key>
<value>
<int>
1
</int>
</value>
</item>
<item>
<key>
<string>
external_validator
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
extra
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
hidden
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
required
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Shared
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/
TestResult_view/listbox_duration
.xml
→
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/
SlapOSSoftwareReleaseUnitTest_view/my_software_type
.xml
View file @
da44845a
...
...
@@ -8,7 +8,7 @@
<dictionary>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
listbox_duration
</string>
</value>
<value>
<string>
my_software_type
</string>
</value>
</item>
<item>
<key>
<string>
message_values
</string>
</key>
...
...
@@ -77,10 +77,6 @@
<key>
<string>
hidden
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
input_type
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
max_length
</string>
</key>
<value>
<string></string>
</value>
...
...
@@ -122,9 +118,7 @@
</item>
<item>
<key>
<string>
default
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
...
...
@@ -158,10 +152,6 @@
<key>
<string>
hidden
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
input_type
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
max_length
</string>
</key>
<value>
<string></string>
</value>
...
...
@@ -251,7 +241,7 @@
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Duration
</string>
</value>
<value>
<string>
Software Type
</string>
</value>
</item>
<item>
<key>
<string>
truncate
</string>
</key>
...
...
@@ -271,17 +261,4 @@
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"TALESMethod"
module=
"Products.Formulator.TALESField"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_text
</string>
</key>
<value>
<string>
python: modules[\'datetime\'].timedelta(seconds=cell.getProperty(\'duration\'))
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view/my_text_content.xml
View file @
da44845a
...
...
@@ -257,7 +257,7 @@
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Request KW
(json format)
</string>
</value>
<value>
<string>
partition_parameter_kw
(json format)
</string>
</value>
</item>
<item>
<key>
<string>
unicode
</string>
</key>
...
...
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TaskDistributorAlarm_optimize.py
View file @
da44845a
from
DateTime
import
DateTime
now
=
DateTime
()
#Clean-up invalidated Test Nodes and
# invalidate inactive ones
# invalidate inactive ones
list_node
=
context
.
portal_catalog
(
portal_type
=
"Test Node"
,
)
...
...
@@ -30,7 +30,7 @@ for test_node in list_node:
portal
=
context
.
getPortalObject
()
distributor_list
=
portal
.
portal_task_distribution
.
objectValues
()
for
distributor
in
distributor_list
:
for
distributor
in
distributor_list
:
distributor
.
activate
(
tag
=
tag
).
optimizeConfiguration
()
context
.
activate
(
after_tag
=
tag
).
getId
()
...
...
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResultLine_getResultHistoryList.py
View file @
da44845a
...
...
@@ -23,7 +23,7 @@ expected_title = context.getTitle()
for
tr
in
context
.
portal_catalog
(
**
query_params
):
line_found
=
False
tr
=
tr
.
getObject
()
# Optimisation: the test result line probably have the same id in the previous
# test result.
line
=
getattr
(
tr
,
expected_id
,
None
)
...
...
@@ -45,5 +45,5 @@ for tr in context.portal_catalog(**query_params):
# return as many test result line as the count method returns.
if
not
line_found
:
result_list
.
append
(
tr
.
asContext
(
string_index
=
'NOT_EXECUTED'
))
return
result_list
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResultLine_view/my_duration.xml
View file @
da44845a
...
...
@@ -2,7 +2,7 @@
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"
String
Field"
module=
"Products.Formulator.StandardFields"
/>
<global
name=
"
Float
Field"
module=
"Products.Formulator.StandardFields"
/>
</pickle>
<pickle>
<dictionary>
...
...
@@ -19,12 +19,12 @@
<value>
<string>
The input failed the external validator.
</string>
</value>
</item>
<item>
<key>
<string>
required_not_found
</string>
</key>
<value>
<string>
Input is required but no input given
.
</string>
</value>
<key>
<string>
not_float
</string>
</key>
<value>
<string>
You did not enter a floating point number
.
</string>
</value>
</item>
<item>
<key>
<string>
too_long
</string>
</key>
<value>
<string>
Too much input was
given.
</string>
</value>
<key>
<string>
required_not_found
</string>
</key>
<value>
<string>
Input is required but no input
given.
</string>
</value>
</item>
</dictionary>
</value>
...
...
@@ -78,11 +78,11 @@
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
input_
typ
e
</string>
</key>
<key>
<string>
input_
styl
e
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
max_length
</string>
</key>
<key>
<string>
precision
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
...
...
@@ -93,14 +93,6 @@
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
truncate
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
unicode
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
whitespace_preserve
</string>
</key>
<value>
<string></string>
</value>
...
...
@@ -122,9 +114,7 @@
</item>
<item>
<key>
<string>
default
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
...
...
@@ -159,11 +149,11 @@
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
input_
typ
e
</string>
</key>
<key>
<string>
input_
styl
e
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
max_length
</string>
</key>
<key>
<string>
precision
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
...
...
@@ -174,14 +164,6 @@
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
truncate
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
unicode
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
whitespace_preserve
</string>
</key>
<value>
<string></string>
</value>
...
...
@@ -238,12 +220,12 @@
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
input_
typ
e
</string>
</key>
<value>
<string>
text
</string>
</value>
<key>
<string>
input_
styl
e
</string>
</key>
<value>
<string>
-1 234.5
</string>
</value>
</item>
<item>
<key>
<string>
max_length
</string>
</key>
<value>
<
string></string
>
</value>
<key>
<string>
precision
</string>
</key>
<value>
<
int>
3
</int
>
</value>
</item>
<item>
<key>
<string>
required
</string>
</key>
...
...
@@ -253,14 +235,6 @@
<key>
<string>
title
</string>
</key>
<value>
<string>
Duration
</string>
</value>
</item>
<item>
<key>
<string>
truncate
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
unicode
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
whitespace_preserve
</string>
</key>
<value>
<int>
0
</int>
</value>
...
...
@@ -271,17 +245,4 @@
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"TALESMethod"
module=
"Products.Formulator.TALESField"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_text
</string>
</key>
<value>
<string>
python: modules[\'datetime\'].timedelta(seconds=context.getProperty(\'duration\'))
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResultModule_reportCompleted.py
View file @
da44845a
...
...
@@ -43,7 +43,7 @@ for test_id, test_result in all_test_results.items():
cmdline
=
log_files
.
get
(
'cmdline'
),
stdout
=
log_files
.
get
(
'stdout'
),
stderr
=
log_files
.
get
(
'stderr'
),)
test_report
.
edit
(
string_index
=
form
.
get
(
'result'
),
all_tests
=
all_tests
,
...
...
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_getJsonScalabilityStats.py
View file @
da44845a
import
json
# Get result lines
test_result_lines
=
context
.
objectValues
(
portal_type
=
"Test Result Line"
,
test_result_lines
=
context
.
objectValues
(
portal_type
=
"Test Result Line"
,
sort_on
=
"int_index"
)
# Create a dict containing stats for each test
...
...
@@ -24,7 +24,7 @@ for tl in test_result_lines:
# initial init
if
test_name
not
in
results
.
keys
():
results
[
test_name
]
=
[]
results
[
test_name
].
append
({
'created_docs'
:
test_documents_created
,
results
[
test_name
].
append
({
'created_docs'
:
test_documents_created
,
'duration'
:
3600
})
test_suite
=
context
.
getPortalObject
().
test_suite_module
.
searchFolder
(
title
=
context
.
getTitle
())[
0
]
...
...
@@ -35,5 +35,5 @@ xs = map(int, test_suite.getGraphCoordinate())
# viewer shows only one graph thus return only one test
tests
=
results
[
test_suite_name
]
return
json
.
dumps
({
"test"
:
tests
,
return
json
.
dumps
({
"test"
:
tests
,
"xs"
:
xs
})
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_getJumpVCSResultList.py
View file @
da44845a
...
...
@@ -10,7 +10,7 @@ def makeVCSLink(repository_url, revision):
if
'lab.nexedi'
in
repository_url
and
repository_url
.
endswith
(
'.git'
):
repository_url
=
repository_url
[:
-
len
(
'.git'
)]
if
'@'
in
repository_url
:
# remove credentials
scheme
=
repository_url
.
split
(
':'
)[
0
]
scheme
=
repository_url
.
split
(
':'
)[
0
]
url
=
'%s://%s/commit/%s'
%
(
scheme
,
repository_url
.
split
(
'@'
)[
1
],
revision
)
else
:
url
=
'%s/commit/%s'
%
(
repository_url
,
revision
)
...
...
@@ -21,14 +21,14 @@ def makeVCSLink(repository_url, revision):
def
getListItemUrl
(
*
args
,
**
kw
):
return
url
return
Object
(
uid
=
'new_'
,
getUid
=
lambda
:
'new_'
,
getListItemUrl
=
getListItemUrl
,
repository
=
repository_url
,
revision
=
revision
)
for
repository
in
test_suite_data
[
'repository_dict'
].
values
():
result_list
.
append
(
makeVCSLink
(
...
...
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_getSummaryForRSS.py
View file @
da44845a
...
...
@@ -3,21 +3,21 @@ test_result = context
result
=
[]
p
=
result
.
append
if
len
([
x
for
x
in
test_result
.
contentValues
(
portal_type
=
'Test Result Node'
)
if
x
.
getSimulationState
()
==
'failed'
]):
if
len
([
x
for
x
in
test_result
.
contentValues
(
portal_type
=
'Test Result Node'
)
if
x
.
getSimulationState
()
==
'failed'
]):
p
(
'Result: %s (Building Failed)'
%
test_result
.
getStringIndex
()
)
else
:
p
(
'Result: %s'
%
test_result
.
getStringIndex
())
#p('Test Suite: %s' % test_result.getTitle())
p
(
'Revision: %s'
%
test_result
.
getReference
()
or
test_result
.
getIntIndex
())
#p('Test Suite: %s' % test_result.getTitle())
p
(
'Revision: %s'
%
test_result
.
getReference
()
or
test_result
.
getIntIndex
())
p
(
'Launch Date: %s'
%
test_result
.
getStartDate
())
comment
=
test_result
.
getProperty
(
'comment'
)
if
comment
:
comment
=
test_result
.
getProperty
(
'comment'
)
if
comment
:
p
(
comment
)
p
(
''
)
p
(
''
)
p
(
'All tests: %s, Failures: %s, Errors: %s, Skips: %s'
%
\
(
test_result
.
getProperty
(
'all_tests'
),
(
test_result
.
getProperty
(
'all_tests'
),
test_result
.
getProperty
(
'failures'
),
test_result
.
getProperty
(
'errors'
),
test_result
.
getProperty
(
'skips'
)))
...
...
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_getTestSuiteList.py
View file @
da44845a
...
...
@@ -3,7 +3,7 @@
"""
test_suite_list
=
[]
test_result_line_list
=
context
.
objectValues
(
portal_type
=
'Test Result Line'
,
portal_type
=
'Test Result Line'
,
sort_on
=
"int_index"
)
if
len
(
test_result_line_list
)
>
0
:
...
...
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_getTitleForRSS.py
View file @
da44845a
test_result
=
context
return
"%s (T:%s/F:%s/E:%s/S:%s)"
%
(
context
.
getTitle
(),
test_result
.
getProperty
(
'all_tests'
),
test_result
.
getProperty
(
'all_tests'
),
test_result
.
getProperty
(
'failures'
),
test_result
.
getProperty
(
'errors'
),
test_result
.
getProperty
(
'skips'
))
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_statTestResultLineList.py
View file @
da44845a
import
datetime
from
Products.PythonScripts.standard
import
Object
return
[
Object
(
duration
=
datetime
.
timedelta
(
seconds
=
context
.
getProperty
(
'duration'
,
0
)),
return
[
Object
(
duration
=
int
(
context
.
getProperty
(
'duration'
,
0
)),
all_tests
=
context
.
getProperty
(
'all_tests'
),
errors
=
context
.
getProperty
(
'errors'
),
failures
=
context
.
getProperty
(
'failures'
),
...
...
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_view.xml
View file @
da44845a
...
...
@@ -87,7 +87,6 @@
<list>
<string>
listbox_string_index
</string>
<string>
listbox_start_date
</string>
<string>
listbox_duration
</string>
</list>
</value>
</item>
...
...
@@ -100,7 +99,6 @@
<string>
my_id
</string>
<string>
my_start_date
</string>
<string>
my_stop_date
</string>
<string>
your_real_duration
</string>
</list>
</value>
</item>
...
...
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestSuiteModule_addTestSuite.py
View file @
da44845a
...
...
@@ -12,7 +12,7 @@ test_suite = context.newContent(
test_suite
=
config
[
'test_suite'
],
int_index
=
config
[
'int_index'
],
vcs_repository
=
test_suite_repository
)
)
if
batch_mode
:
return
test_suite
bt5/erp5_test_result/TestTemplateItem/portal_components/test.erp5.testTaskDistribution.py
View file @
da44845a
from
Products.ERP5Type.Core.Workflow
import
ValidationFailed
from
Products.ERP5Type.tests.ERP5TypeTestCase
import
ERP5TypeTestCase
import
json
import
json
from
time
import
sleep
from
DateTime
import
DateTime
import
responses
...
...
@@ -75,7 +75,7 @@ class TaskDistributionTestCase(ERP5TypeTestCase):
original_class
=
self
.
distributor
.
__class__
original_scalability_class
=
self
.
scalability_distributor
.
__class__
original_performance_class
=
self
.
performance_distributor
.
__class__
original_class
.
_getTestNodeModule
=
self
.
_original_getTestNodeModule
original_class
.
_getTestSuiteModule
=
self
.
_original_getTestSuiteModule
original_scalability_class
.
_getTestNodeModule
=
self
.
_original_getTestNodeModule
...
...
@@ -164,9 +164,9 @@ class TaskDistributionTestCase(ERP5TypeTestCase):
self
.
assertEqual
(
test_result
.
getSimulationState
(),
"started"
)
self
.
tic
()
if
stop_count
==
2
:
self
.
assertEqual
(
test_result
.
getSimulationState
(),
"stopped"
)
self
.
assertEqual
s
(
test_result
.
getSimulationState
(),
"stopped"
)
else
:
self
.
assertEqual
(
test_result
.
getSimulationState
(),
"started"
)
self
.
assertEqual
s
(
test_result
.
getSimulationState
(),
"started"
)
def
_cleanupTestResult
(
self
):
self
.
tic
()
...
...
@@ -209,16 +209,16 @@ class TestTaskDistribution(TaskDistributionTestCase):
def
test_02_createTestSuite
(
self
):
# Test Test Suite
test_suite
=
self
.
_createTestSuite
()[
0
]
self
.
assertEqual
(
test_suite
.
getPortalType
(),
"Test Suite"
)
self
.
assertEqual
(
test_suite
.
getSpecialise
(),
self
.
distributor
.
getRelativeUrl
())
self
.
assertEqual
s
(
test_suite
.
getPortalType
(),
"Test Suite"
)
self
.
assertEqual
s
(
test_suite
.
getSpecialise
(),
self
.
distributor
.
getRelativeUrl
())
# Test Scalability Test Suite
scalability_test_suite
=
self
.
_createTestSuite
(
portal_type
=
"Scalability Test Suite"
,
specialise_value
=
self
.
scalability_distributor
)[
0
]
self
.
assertEqual
(
scalability_test_suite
.
getPortalType
(),
self
.
assertEqual
s
(
scalability_test_suite
.
getPortalType
(),
"Scalability Test Suite"
)
self
.
assertEqual
(
scalability_test_suite
.
getSpecialise
(),
self
.
assertEqual
s
(
scalability_test_suite
.
getSpecialise
(),
self
.
scalability_distributor
.
getRelativeUrl
())
def
test_02b_checkConsistencyOnTestSuite
(
self
):
...
...
@@ -338,7 +338,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
title
=
"COMP42-Node1"
))
return
[
"%s"
%
x
[
"test_suite_title"
]
for
x
in
config_list
]
# By default we have random order between test suites
self
.
assertEqual
(
set
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
]),
self
.
assertEqual
s
(
set
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
]),
set
(
getTestSuiteList
()))
# Check that if test suite 1 and test suite 2 are recently processed,
...
...
@@ -349,19 +349,19 @@ class TestTaskDistribution(TaskDistributionTestCase):
self
.
processTest
(
"test suite 2"
,
"r0=b"
)
self
.
tic
()
sleep
(
1
)
self
.
assertEqual
(
getTestSuiteList
()[
0
],
"test suite 3"
)
self
.
assertEqual
s
(
getTestSuiteList
()[
0
],
"test suite 3"
)
self
.
processTest
(
"test suite 3"
,
"r0=b"
)
# after test suite 3, we now have to process test suite 1
# since it is the oldest one
self
.
tic
()
sleep
(
1
)
self
.
assertEqual
(
getTestSuiteList
()[
0
],
"test suite 1"
)
self
.
assertEqual
s
(
getTestSuiteList
()[
0
],
"test suite 1"
)
self
.
processTest
(
"test suite 1"
,
"r0=c"
)
# after test suite 1, we now have to process test suite 2
# since it is the oldest one
self
.
tic
()
sleep
(
1
)
self
.
assertEqual
(
getTestSuiteList
()[
0
],
"test suite 2"
)
self
.
assertEqual
s
(
getTestSuiteList
()[
0
],
"test suite 2"
)
self
.
processTest
(
"test suite 2"
,
"r0=d"
)
self
.
tic
()
sleep
(
1
)
...
...
@@ -370,20 +370,20 @@ class TestTaskDistribution(TaskDistributionTestCase):
self
.
tic
()
sleep
(
1
)
# we should then have by order 3, 2, 1
self
.
assertEqual
([
"test suite 3"
,
"test suite 2"
,
"test suite 1"
],
self
.
assertEqual
s
([
"test suite 3"
,
"test suite 2"
,
"test suite 1"
],
getTestSuiteList
())
# now launch all test of test 3, even if they are not finished yet
self
.
processTest
(
"test suite 3"
,
"r0=f"
,
stop_count
=
1
)
self
.
tic
()
sleep
(
1
)
self
.
assertEqual
([
"test suite 2"
,
"test suite 1"
,
"test suite 3"
],
self
.
assertEqual
s
([
"test suite 2"
,
"test suite 1"
,
"test suite 3"
],
getTestSuiteList
())
# now launch partially tests of suite 2, it must have priority over
# test 3, even if test 3 is older because all tests of test 3 are ongoing
self
.
processTest
(
"test suite 2"
,
"r0=g"
,
start_count
=
1
,
stop_count
=
0
)
self
.
tic
()
sleep
(
1
)
self
.
assertEqual
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
],
self
.
assertEqual
s
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
],
getTestSuiteList
())
def
test_04c_startTestSuiteOrderWithManyTestNodes
(
self
):
...
...
@@ -435,9 +435,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
self
.
pinDateTime
(
now
+
2.0
/
86400
)
self
.
processTest
(
"test suite 3"
,
"r0=a"
,
node_title
=
"COMP1-Node1"
)
# so by default, when no test is running, older test suite is given first
self
.
assertEqual
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
],
self
.
assertEqual
s
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
],
getTestSuiteList
(
"COMP0-Node1"
))
self
.
assertEqual
([
"test suite 2"
,
"test suite 3"
],
self
.
assertEqual
s
([
"test suite 2"
,
"test suite 3"
],
getTestSuiteList
(
"COMP5-Node1"
))
# Start some work
self
.
pinDateTime
(
now
+
3.0
/
86400
)
...
...
@@ -445,9 +445,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
# COMP1-Node1 : test suite 2
# suite 1 is now the newest, it is checked last, test suite 3 has priority on test suite 2
# since no test is running for it
self
.
assertEqual
([
"test suite 1"
,
"test suite 3"
,
"test suite 2"
],
self
.
assertEqual
s
([
"test suite 1"
,
"test suite 3"
,
"test suite 2"
],
getTestSuiteList
(
"COMP0-Node1"
))
self
.
assertEqual
([
"test suite 3"
,
"test suite 2"
],
self
.
assertEqual
s
([
"test suite 3"
,
"test suite 2"
],
getTestSuiteList
(
"COMP5-Node1"
))
# Now let's say test suite 3 is starting too
self
.
pinDateTime
(
now
+
4.0
/
86400
)
...
...
@@ -456,7 +456,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
# COMP6-Node1 : test suite 3
# test suite 3 still should have the priority other test suite 2, because it
# has higher priority
self
.
assertEqual
([
"test suite 3"
,
"test suite 2"
],
self
.
assertEqual
s
([
"test suite 3"
,
"test suite 2"
],
getTestSuiteList
(
"COMP5-Node1"
))
# another test node working on test suite 3
self
.
processTest
(
"test suite 3"
,
"r0=b"
,
node_title
=
"COMP7-Node1"
,
start_count
=
0
,
stop_count
=
0
)
...
...
@@ -465,9 +465,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
# COMP7-Node1 : test suite 3
# Now we have 2 testnodes for test suite 3, and only 1 for test suite 2, time to give
# more priority to test suite 2
self
.
assertEqual
([
"test suite 2"
,
"test suite 3"
],
self
.
assertEqual
s
([
"test suite 2"
,
"test suite 3"
],
getTestSuiteList
(
"COMP5-Node1"
))
self
.
assertEqual
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
],
self
.
assertEqual
s
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
],
getTestSuiteList
(
"COMP0-Node1"
))
# so now a testnode working on test suite 2
self
.
processTest
(
"test suite 2"
,
"r0=b"
,
node_title
=
"COMP2-Node1"
,
start_count
=
0
,
stop_count
=
0
)
...
...
@@ -477,7 +477,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
# COMP7-Node1 : test suite 3
# Now we have 2 testnodes for test suite 3, and 2 for test suite 2, time to give
# more priority to test suite 3
self
.
assertEqual
([
"test suite 3"
,
"test suite 2"
],
self
.
assertEqual
s
([
"test suite 3"
,
"test suite 2"
],
getTestSuiteList
(
"COMP5-Node1"
))
self
.
processTest
(
"test suite 3"
,
"r0=b"
,
node_title
=
"COMP8-Node1"
,
start_count
=
0
,
stop_count
=
0
)
# COMP1-Node1 : test suite 2
...
...
@@ -487,7 +487,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
# COMP8-Node1 : test suite 3
# Now we have 3 testnodes for test suite 3, and 2 for test suite 2, test suite 3 still
# need priority due to higher priority
self
.
assertEqual
([
"test suite 3"
,
"test suite 2"
],
self
.
assertEqual
s
([
"test suite 3"
,
"test suite 2"
],
getTestSuiteList
(
"COMP5-Node1"
))
self
.
processTest
(
"test suite 3"
,
"r0=b"
,
node_title
=
"COMP9-Node1"
,
start_count
=
0
,
stop_count
=
0
)
# COMP1-Node1 : test suite 2
...
...
@@ -498,9 +498,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
# COMP9-Node1 : test suite 3
# Now we have 4 testnodes for test suite 3, and 2 for test suite 2, test suite 2 will
# have again priority
self
.
assertEqual
([
"test suite 2"
,
"test suite 3"
],
self
.
assertEqual
s
([
"test suite 2"
,
"test suite 3"
],
getTestSuiteList
(
"COMP5-Node1"
))
self
.
assertEqual
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
],
self
.
assertEqual
s
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
],
getTestSuiteList
(
"COMP0-Node1"
))
self
.
processTest
(
"test suite 2"
,
"r0=b"
,
node_title
=
"COMP3-Node1"
,
start_count
=
0
,
stop_count
=
0
)
# COMP1-Node1 : test suite 2
...
...
@@ -512,7 +512,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
# COMP9-Node1 : test suite 3
# Now we have 4 testnodes for test suite 3, and 3 for test suite 2, test suite 3 will
# have again priority
self
.
assertEqual
([
"test suite 3"
,
"test suite 2"
],
self
.
assertEqual
s
([
"test suite 3"
,
"test suite 2"
],
getTestSuiteList
(
"COMP5-Node1"
))
self
.
processTest
(
"test suite 3"
,
"r0=b"
,
node_title
=
"COMP4-Node1"
,
start_count
=
0
,
stop_count
=
0
)
# COMP1-Node1 : test suite 2
...
...
@@ -523,9 +523,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
# COMP7-Node1 : test suite 3
# COMP8-Node1 : test suite 3
# COMP9-Node1 : test suite 3
self
.
assertEqual
([
"test suite 3"
,
"test suite 2"
],
self
.
assertEqual
s
([
"test suite 3"
,
"test suite 2"
],
getTestSuiteList
(
"COMP5-Node1"
))
self
.
assertEqual
([
"test suite 1"
,
"test suite 3"
,
"test suite 2"
],
self
.
assertEqual
s
([
"test suite 1"
,
"test suite 3"
,
"test suite 2"
],
getTestSuiteList
(
"COMP0-Node1"
))
finally
:
self
.
unpinDateTime
()
...
...
@@ -654,7 +654,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
self
.
tic
()
next_test_result_path
,
_
=
self
.
_createTestResult
(
test_list
=
[
'testFoo'
,
'testBar'
],
revision
=
"r0=a,r1=b"
)
self
.
assertNotEqual
(
next_test_result_path
,
test_result_path
)
self
.
assertNotEqual
s
(
next_test_result_path
,
test_result_path
)
line_url
,
test
=
self
.
tool
.
startUnitTest
(
next_test_result_path
)
next_line_url
,
next_test
=
self
.
tool
.
startUnitTest
(
next_test_result_path
)
self
.
assertEqual
([
'testFoo'
,
'testBar'
],
[
test
,
next_test
])
...
...
@@ -861,7 +861,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
Is this really useful and used ?
"""
self
.
_checkCreateTestResultAndAllowRestart
()
self
.
_checkCreateTestResultAndAllowRestart
()
def
test_09b_checkCreateTestResultAndAllowRestartWithTic
(
self
):
"""
...
...
@@ -881,15 +881,15 @@ class TestTaskDistribution(TaskDistributionTestCase):
"""
test_suite
,
=
self
.
_createTestSuite
(
cluster_configuration
=
None
)
# pylint: disable=unbalanced-tuple-unpacking
self
.
tic
()
self
.
assertEqual
(
'{"configuration_list": [{}]}'
,
self
.
distributor
.
generateConfiguration
(
test_suite
.
getTitle
()))
self
.
assertEqual
s
(
'{"configuration_list": [{}]}'
,
self
.
distributor
.
generateConfiguration
(
test_suite
.
getTitle
()))
test_suite
.
setClusterConfiguration
(
"{'foo': 3}"
)
self
.
assertEqual
(
'{"configuration_list": [{}]}'
,
self
.
distributor
.
generateConfiguration
(
test_suite
.
getTitle
()))
self
.
assertEqual
s
(
'{"configuration_list": [{}]}'
,
self
.
distributor
.
generateConfiguration
(
test_suite
.
getTitle
()))
test_suite
.
setClusterConfiguration
(
'{"foo": 3}'
)
self
.
assertEqual
(
'{"configuration_list": [{"foo": 3}]}'
,
self
.
distributor
.
generateConfiguration
(
test_suite
.
getTitle
()))
self
.
assertEqual
s
(
'{"configuration_list": [{"foo": 3}]}'
,
self
.
distributor
.
generateConfiguration
(
test_suite
.
getTitle
()))
# make sure generateConfiguration does not fail if test suite is invalidated
test_suite
.
invalidate
()
self
.
tic
()
self
.
assertEqual
(
'{"configuration_list": [{}]}'
,
self
.
distributor
.
generateConfiguration
(
test_suite
.
getTitle
()))
self
.
assertEqual
s
(
'{"configuration_list": [{}]}'
,
self
.
distributor
.
generateConfiguration
(
test_suite
.
getTitle
()))
def
_checkTestSuiteAggregateList
(
self
,
*
args
):
self
.
tic
()
...
...
@@ -916,7 +916,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
check
=
self
.
_checkTestSuiteAggregateList
check
([
test_node_one
,
[
"one"
]],
[
test_node_two
,
[
"two"
]])
# first test suite is invalidated, so it should be removed from nodes,
# first test suite is invalidated, so it should be removed from nodes,
# but this should not change assignment of second test suite
test_suite_one
.
invalidate
()
check
([
test_node_one
,
[]],
...
...
@@ -1042,7 +1042,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
self
.
tool
.
TestTaskDistribution
.
setMaxTestSuite
(
10
)
self
.
_callOptimizeAlarm
()
self
.
assertEqual
(
5
,
len
(
set
(
test_node
.
getAggregateList
())))
self
.
assertEqual
(
set
(
test_node
.
getAggregateList
()),
self
.
assertEqual
(
set
(
test_node
.
getAggregateList
()),
set
([
x
.
getRelativeUrl
()
for
x
in
test_suite_list
]))
def
test_12_checkCloudPerformanceOptimizationIsStable
(
self
):
...
...
@@ -1062,7 +1062,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
check
=
self
.
_checkTestSuiteAggregateList
check
([
test_node_one
,
[
"one"
,
"two"
]],
[
test_node_two
,
[
"one"
,
"two"
]])
# first test suite is invalidated, so it should be removed from nodes,
# first test suite is invalidated, so it should be removed from nodes,
# but this should not change assignment of second test suite
test_suite_one
.
invalidate
()
check
([
test_node_one
,
[
"two"
]],
...
...
@@ -1130,7 +1130,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
Check test node subscription.
"""
test_node_module
=
self
.
test_node_module
# Generate informations for nodes to subscribe
nodes
=
dict
([(
"COMP%d-Scalability-Node_test14"
%
i
,
"COMP-%d"
%
i
)
for
i
in
range
(
0
,
5
)])
# Subscribe nodes
...
...
@@ -1143,7 +1143,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
test_node_titles
=
[
x
.
getTitle
()
for
x
in
test_nodes
]
# Check subscription
for
node_title
in
nodes
.
keys
():
self
.
assert
In
(
node_title
,
test_node_titles
)
self
.
assert
True
(
node_title
in
test_node_titles
)
# Check ping date
# TODO..
...
...
@@ -1153,7 +1153,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
- Check the master election
"""
test_node_module
=
self
.
test_node_module
## 1 (check election, classic)
# Subscribe nodes
self
.
scalability_distributor
.
subscribeNode
(
"COMP1-Scalability-Node1"
,
computer_guid
=
"COMP-1"
)
...
...
@@ -1175,13 +1175,13 @@ class TestTaskDistribution(TaskDistributionTestCase):
master_test_node_list
,
slave_test_node_list
=
getMasterAndSlaveNodeList
()
# -Only one master must be elected
self
.
assertEqual
(
1
,
len
(
master_test_node_list
))
self
.
assertEqual
s
(
1
,
len
(
master_test_node_list
))
# -Others test node must not be the matser
self
.
assertEqual
(
3
,
len
(
slave_test_node_list
))
# Get the current master test node
self
.
assertEqual
s
(
3
,
len
(
slave_test_node_list
))
# Get the current master test node
current_master_test_node_1
=
master_test_node_list
[
0
]
## 2 (check election, with adding new nodes)
# Add new nodes
self
.
scalability_distributor
.
subscribeNode
(
"COMP5-Scalability-Node5"
,
computer_guid
=
"COMP-5"
)
...
...
@@ -1190,14 +1190,14 @@ class TestTaskDistribution(TaskDistributionTestCase):
# Check test node election
master_test_node_list
,
slave_test_node_list
=
getMasterAndSlaveNodeList
()
# -Only one master must be elected
self
.
assertEqual
(
1
,
len
(
master_test_node_list
))
self
.
assertEqual
s
(
1
,
len
(
master_test_node_list
))
# -Others test node must not be the matser
self
.
assertEqual
(
5
,
len
(
slave_test_node_list
))
self
.
assertEqual
s
(
5
,
len
(
slave_test_node_list
))
# Get the current master test node
current_master_test_node_2
=
master_test_node_list
[
0
]
# Master test node while he is alive
self
.
assertEqual
(
current_master_test_node_1
.
getTitle
(),
self
.
assertEqual
s
(
current_master_test_node_1
.
getTitle
(),
current_master_test_node_2
.
getTitle
())
## 3 (check election, with master deletion)
...
...
@@ -1206,16 +1206,16 @@ class TestTaskDistribution(TaskDistributionTestCase):
# Check test node election
master_test_node_list
,
slave_test_node_list
=
getMasterAndSlaveNodeList
()
# -Only one master must be elected
self
.
assertEqual
(
1
,
len
(
master_test_node_list
))
self
.
assertEqual
s
(
1
,
len
(
master_test_node_list
))
# -Others test node must not be the matser
self
.
assertEqual
(
4
,
len
(
slave_test_node_list
))
self
.
assertEqual
s
(
4
,
len
(
slave_test_node_list
))
# Get the current master test node
# Get the current master test node
current_master_test_node_3
=
master_test_node_list
[
0
]
# Master test node must be an other test node than previously
self
.
assertNotEqual
(
current_master_test_node_2
.
getTitle
(),
self
.
assertNotEqual
s
(
current_master_test_node_2
.
getTitle
(),
current_master_test_node_3
.
getTitle
())
def
test_16_startTestSuiteERP5ScalabilityDistributor
(
self
):
"""
...
...
@@ -1231,12 +1231,12 @@ class TestTaskDistribution(TaskDistributionTestCase):
self
.
scalability_distributor
.
subscribeNode
(
"COMP4-Scalability-Node4"
,
computer_guid
=
"COMP-4"
)
# Create test suite
self
.
_createTestSuite
(
quantity
=
1
,
priority
=
1
,
reference_correction
=
0
,
specialise_value
=
self
.
scalability_distributor
,
portal_type
=
"Scalability Test Suite"
)
specialise_value
=
self
.
scalability_distributor
,
portal_type
=
"Scalability Test Suite"
)
self
.
tic
()
self
.
_callOptimizeAlarm
()
# Get current master test node
master_test_nodes
=
[
x
for
x
in
test_node_module
.
searchFolder
()
\
if
(
x
.
getMaster
()
==
True
and
x
.
getValidationState
()
==
"validated"
)]
if
(
x
.
getMaster
()
==
True
and
x
.
getValidationState
()
==
"validated"
)]
current_master_test_node
=
master_test_nodes
[
0
]
self
.
tic
()
# Each node run startTestSuite
...
...
@@ -1255,12 +1255,12 @@ class TestTaskDistribution(TaskDistributionTestCase):
title
=
"COMP4-Scalability-Node4"
))
}
# Check if master has got a non empty configuration
self
.
assertNotEqual
(
config_nodes
[
current_master_test_node
.
getTitle
()],
[])
self
.
assertNotEqual
s
(
config_nodes
[
current_master_test_node
.
getTitle
()],
[])
# -Delete master test node suite from dict
del
config_nodes
[
current_master_test_node
.
getTitle
()]
# Check if slave test node have got empty list
for
suite
in
config_nodes
.
values
():
self
.
assertEqual
(
suite
,
[])
self
.
assertEqual
s
(
suite
,
[])
def
test_16A_startTestSuiteERP5ScalabilityDistributorWithRunningTestResult
(
self
):
# Subscribe nodes
...
...
@@ -1277,7 +1277,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
test_result
.
start
()
self
.
tic
()
configuration
=
self
.
scalability_distributor
.
startTestSuite
(
title
=
"COMP1-Scalability-Node1"
)
self
.
assertNotEqual
(
configuration
,
[])
self
.
assertNotEqual
s
(
configuration
,
[])
def
test_17_isMasterTestnodeERP5ScalabilityDistributor
(
self
):
...
...
@@ -1296,7 +1296,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
# Optimize configuration
self
.
scalability_distributor
.
optimizeConfiguration
()
self
.
tic
()
# Get test nodes
# Get test nodes
master_test_nodes
=
[
x
for
x
in
test_node_module
.
searchFolder
()
if
(
x
.
getMaster
()
==
True
and
x
.
getValidationState
()
==
'validated'
)]
slave_test_nodes
=
[
x
for
x
in
test_node_module
.
searchFolder
()
...
...
@@ -1330,7 +1330,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
partition_dict
+=
' "instance-count": {{ count }},
\
n
'
partition_dict
+=
' "family": "%s",
\
n
'
%
family_name
partition_dict
+=
' "computer_guid": "%s"
\
n
'
%
node_list
[
j
][
0
]
partition_dict
+=
'}'
partition_dict
+=
'}'
if
j
!=
i
-
1
:
partition_dict
+=
',
\
n
'
else
:
...
...
@@ -1363,9 +1363,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
# break
# # Get configuration list generated from test suite
## configuration_list = self.scalability_distributor.generateConfiguration(test_suite_title)
#
#
# # logs
## log(configuration_list)
## log(configuration_list)
def
test_19_testMultiDistributor
(
self
):
pass
...
...
bt5/erp5_test_result/ToolComponentTemplateItem/portal_components/tool.erp5.TaskDistributionTool.py
View file @
da44845a
...
...
@@ -31,7 +31,7 @@ from AccessControl import ClassSecurityInfo
from
Products.ERP5Type
import
Permissions
from
Products.ERP5Type.Tool.BaseTool
import
BaseTool
from
Products.ZSQLCatalog.SQLCatalog
import
SimpleQuery
,
NegatedQuery
from
zLOG
import
LOG
,
DEBUG
from
zLOG
import
LOG
,
DEBUG
,
INFO
from
xmlrpclib
import
Binary
class
TaskDistributionTool
(
BaseTool
):
...
...
@@ -89,7 +89,7 @@ class TaskDistributionTool(BaseTool):
-> (test_result_path, revision) or None if already completed
"""
LOG
(
'
createTestResult'
,
DEBUG
,
(
name
,
revision
,
test_title
,
project_title
))
LOG
(
'
tool.erp5.TaskDistributionTool.createTestResult'
,
INFO
,
(
name
,
revision
,
test_title
,
project_title
))
portal
=
self
.
getPortalObject
()
if
test_title
is
None
:
test_title
=
name
...
...
@@ -215,6 +215,7 @@ class TaskDistributionTool(BaseTool):
# following 2 functions only call 'newContent' on test_result
createTestResultLineList
(
test_result
,
test_name_list
)
createNode
(
test_result
,
node_title
)
LOG
(
'createTestResult RESULT'
,
INFO
,
(
test_result
.
getRelativeUrl
(),
revision
))
return
test_result
.
getRelativeUrl
(),
revision
security
.
declarePublic
(
'startUnitTest'
)
...
...
bt5/erp5_test_result/WorkflowTemplateItem/portal_workflow/test_result_workflow/script_TestResult_fail.py
View file @
da44845a
...
...
@@ -15,4 +15,4 @@ if test_result.getPortalType() == 'Test Result Node':
edit_kw
[
key
]
=
key_value
test_result
.
edit
(
**
edit_kw
)
else
:
cont
ainer
.
script_
TestResult_complete
(
sci
)
cont
ext
.
TestResult_complete
(
sci
)
bt5/erp5_test_result/WorkflowTemplateItem/portal_workflow/test_suite_workflow/script_TestSuite_afterValidate.py
View file @
da44845a
...
...
@@ -18,7 +18,7 @@ if test_suite.getReference() is None:
test_suite
.
setReference
(
int2letter
(
new_id
))
def
generateRandomString
(
size
):
tab
=
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
tab
=
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
my_string
=
''
for
_
in
range
(
size
):
my_string
=
my_string
+
choice
(
tab
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment