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
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
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
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Carlos Ramos Carreño
erp5
Commits
e43da477
Commit
e43da477
authored
Mar 28, 2023
by
Lu Xu
👀
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
erp5_test_result: rework slapos agent distributor
parent
83dbd0d3
Changes
18
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
538 additions
and
232 deletions
+538
-232
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/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/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/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/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
No files found.
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.ERP5ProjectUnitTestDistributor.py
View file @
e43da477
...
...
@@ -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 @
e43da477
...
...
@@ -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 @
e43da477
...
...
@@ -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 @
e43da477
...
...
@@ -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/PropertySheetTemplateItem/portal_property_sheets/SlapOSSoftwareReleaseUnitTest/filter_kw_property.xml
0 → 100644
View file @
e43da477
<?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 @
e43da477
<?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 @
e43da477
<?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 @
e43da477
...
...
@@ -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 @
e43da477
...
...
@@ -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 @
e43da477
<?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 @
e43da477
...
...
@@ -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 @
e43da477
...
...
@@ -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/TestResultLine_view/my_duration.xml
View file @
e43da477
...
...
@@ -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/TestResult_statTestResultLineList.py
View file @
e43da477
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 @
e43da477
...
...
@@ -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/TestTemplateItem/portal_components/test.erp5.testTaskDistribution.py
View file @
e43da477
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 @
e43da477
...
...
@@ -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 @
e43da477
...
...
@@ -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
)
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