Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
slapos.core
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
Roque
slapos.core
Commits
71d64127
Commit
71d64127
authored
Feb 24, 2023
by
Cédric Le Ninivin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
slapos_jio_api_style: Add mote tests
* Compute Bang * Software Release
parent
8f96305f
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
275 additions
and
622 deletions
+275
-622
master/bt5/slapos_jio_api_style/TestTemplateItem/portal_components/test.erp5.testSlapOSJIOAPI.py
...plateItem/portal_components/test.erp5.testSlapOSJIOAPI.py
+275
-622
No files found.
master/bt5/slapos_jio_api_style/TestTemplateItem/portal_components/test.erp5.testSlapOSJIOAPI.py
View file @
71d64127
...
...
@@ -33,6 +33,7 @@ from App.Common import rfc1123_date
import
os
import
tempfile
import
time
import
urllib
# blurb to make nice XML comparisions
import
xml.dom.ext.reader.Sax
...
...
@@ -44,7 +45,6 @@ import json
from
binascii
import
hexlify
from
OFS.Traversable
import
NotFound
def
hashData
(
data
):
return
hexlify
(
hashlib
.
sha1
(
json
.
dumps
(
data
,
sort_keys
=
True
)).
digest
())
...
...
@@ -122,6 +122,7 @@ class TestSlapOSJIOAPIMixin(SlapOSTestCaseMixin):
self
.
compute_node_id
=
self
.
compute_node
.
getReference
()
self
.
compute_node_user_id
=
self
.
compute_node
.
getUserId
()
self
.
pinDateTime
(
DateTime
())
self
.
callUpdateRevisionAndTic
()
def
getAPIStateFromSlapState
(
self
,
state
):
state_dict
=
{
...
...
@@ -131,25 +132,25 @@ class TestSlapOSJIOAPIMixin(SlapOSTestCaseMixin):
}
return
state_dict
.
get
(
state
,
None
)
def
getToApi
(
self
,
json_data
):
def
getToApi
(
self
,
data_dict
):
self
.
portal
.
REQUEST
.
set
(
"live_test"
,
True
)
self
.
portal
.
REQUEST
.
set
(
"BODY"
,
json
_data
)
return
self
.
web_site
.
api
.
get
(
)
self
.
portal
.
REQUEST
.
set
(
"BODY"
,
json
.
dumps
(
data_dict
)
)
return
json_loads_byteified
(
self
.
web_site
.
api
.
get
()
)
def
putToApi
(
self
,
json_data
):
def
putToApi
(
self
,
data_dict
):
self
.
portal
.
REQUEST
.
set
(
"live_test"
,
True
)
self
.
portal
.
REQUEST
.
set
(
"BODY"
,
json
_data
)
return
self
.
web_site
.
api
.
put
(
)
self
.
portal
.
REQUEST
.
set
(
"BODY"
,
json
.
dumps
(
data_dict
)
)
return
json_loads_byteified
(
self
.
web_site
.
api
.
put
()
)
def
postToApi
(
self
,
json_data
):
def
postToApi
(
self
,
data_dict
):
self
.
portal
.
REQUEST
.
set
(
"live_test"
,
True
)
self
.
portal
.
REQUEST
.
set
(
"BODY"
,
json
_data
)
return
self
.
web_site
.
api
.
post
(
)
self
.
portal
.
REQUEST
.
set
(
"BODY"
,
json
.
dumps
(
data_dict
)
)
return
json_loads_byteified
(
self
.
web_site
.
api
.
post
()
)
def
allDocsToApi
(
self
,
json_data
):
def
allDocsToApi
(
self
,
data_dict
):
self
.
portal
.
REQUEST
.
set
(
"live_test"
,
True
)
self
.
portal
.
REQUEST
.
set
(
"BODY"
,
json
_data
)
return
self
.
web_site
.
api
.
allDocs
(
)
self
.
portal
.
REQUEST
.
set
(
"BODY"
,
json
.
dumps
(
data_dict
)
)
return
json_loads_byteified
(
self
.
web_site
.
api
.
allDocs
()
)
def
callUpdateRevision
(
self
):
self
.
portal
.
portal_alarms
.
slapos_update_jio_api_revision_template
.
activeSense
()
...
...
@@ -162,162 +163,6 @@ class TestSlapOSJIOAPIMixin(SlapOSTestCaseMixin):
self
.
unpinDateTime
()
self
.
_cleaupREQUEST
()
class
TestSlapOSSlapToolgetFullComputerInformation
(
TestSlapOSJIOAPIMixin
):
def
deactivated_test_activate_getFullComputerInformation_first_access
(
self
):
self
.
_makeComplexComputeNode
(
with_slave
=
True
)
self
.
portal
.
REQUEST
[
'disable_isTestRun'
]
=
True
self
.
tic
()
self
.
login
(
self
.
compute_node_user_id
)
self
.
portal_slap
.
getFullComputerInformation
(
self
.
compute_node_id
)
# First access.
# Cache has been filled by interaction workflow
# (luckily, it seems the cache is filled after everything is indexed)
response
=
self
.
portal_slap
.
getFullComputerInformation
(
self
.
compute_node_id
)
self
.
commit
()
first_etag
=
self
.
compute_node
.
_calculateRefreshEtag
()
first_body_fingerprint
=
hashData
(
self
.
compute_node
.
_getCacheComputeNodeInformation
(
self
.
compute_node_id
)
)
self
.
assertEqual
(
200
,
response
.
status
)
self
.
assertTrue
(
'last-modified'
not
in
response
.
headers
)
self
.
assertEqual
(
first_etag
,
response
.
headers
.
get
(
'etag'
))
self
.
assertEqual
(
first_body_fingerprint
,
hashData
(
response
.
body
))
self
.
assertEqual
(
0
,
len
(
self
.
portal
.
portal_activities
.
getMessageList
()))
# Trigger the compute_node reindexation
# This should trigger a new etag, but the body should be the same
self
.
compute_node
.
reindexObject
()
self
.
commit
()
# Second access
# Check that the result is stable, as the indexation timestamp is not changed yet
current_activity_count
=
len
(
self
.
portal
.
portal_activities
.
getMessageList
())
response
=
self
.
portal_slap
.
getFullComputerInformation
(
self
.
compute_node_id
)
self
.
commit
()
self
.
assertEqual
(
200
,
response
.
status
)
self
.
assertTrue
(
'last-modified'
not
in
response
.
headers
)
self
.
assertEqual
(
first_etag
,
response
.
headers
.
get
(
'etag'
))
self
.
assertEqual
(
first_body_fingerprint
,
hashData
(
response
.
body
))
self
.
assertEqual
(
current_activity_count
,
len
(
self
.
portal
.
portal_activities
.
getMessageList
()))
self
.
tic
()
# Third access, new calculation expected
# The retrieved informations comes from the cache
# But a new cache modification activity is triggered
response
=
self
.
portal_slap
.
getFullComputerInformation
(
self
.
compute_node_id
)
self
.
commit
()
self
.
assertEqual
(
200
,
response
.
status
)
self
.
assertTrue
(
'last-modified'
not
in
response
.
headers
)
second_etag
=
self
.
compute_node
.
_calculateRefreshEtag
()
second_body_fingerprint
=
hashData
(
self
.
compute_node
.
_getCacheComputeNodeInformation
(
self
.
compute_node_id
)
)
self
.
assertNotEqual
(
first_etag
,
second_etag
)
# The indexation timestamp does not impact the response body
self
.
assertEqual
(
first_body_fingerprint
,
second_body_fingerprint
)
self
.
assertEqual
(
first_etag
,
response
.
headers
.
get
(
'etag'
))
self
.
assertEqual
(
first_body_fingerprint
,
hashData
(
response
.
body
))
self
.
assertEqual
(
1
,
len
(
self
.
portal
.
portal_activities
.
getMessageList
()))
# Execute the cache modification activity
self
.
tic
()
# 4th access
# The new etag value is now used
response
=
self
.
portal_slap
.
getFullComputerInformation
(
self
.
compute_node_id
)
self
.
commit
()
self
.
assertEqual
(
200
,
response
.
status
)
self
.
assertTrue
(
'last-modified'
not
in
response
.
headers
)
self
.
assertEqual
(
second_etag
,
response
.
headers
.
get
(
'etag'
))
self
.
assertEqual
(
first_body_fingerprint
,
hashData
(
response
.
body
))
self
.
assertEqual
(
0
,
len
(
self
.
portal
.
portal_activities
.
getMessageList
()))
# Edit the instance
# This should trigger a new etag and a new body
self
.
stop_requested_software_instance
.
edit
(
text_content
=
self
.
generateSafeXml
())
self
.
commit
()
# 5th access
# Check that the result is stable, as the indexation timestamp is not changed yet
current_activity_count
=
len
(
self
.
portal
.
portal_activities
.
getMessageList
())
# Edition does not impact the etag
self
.
assertEqual
(
second_etag
,
self
.
compute_node
.
_calculateRefreshEtag
())
third_body_fingerprint
=
hashData
(
self
.
compute_node
.
_getCacheComputeNodeInformation
(
self
.
compute_node_id
)
)
# The edition impacts the response body
self
.
assertNotEqual
(
first_body_fingerprint
,
third_body_fingerprint
)
response
=
self
.
portal_slap
.
getFullComputerInformation
(
self
.
compute_node_id
)
self
.
commit
()
self
.
assertEqual
(
200
,
response
.
status
)
self
.
assertTrue
(
'last-modified'
not
in
response
.
headers
)
self
.
assertEqual
(
second_etag
,
response
.
headers
.
get
(
'etag'
))
self
.
assertEqual
(
first_body_fingerprint
,
hashData
(
response
.
body
))
self
.
assertEqual
(
current_activity_count
,
len
(
self
.
portal
.
portal_activities
.
getMessageList
()))
self
.
tic
()
# 6th, the instance edition triggered an interaction workflow
# which updated the cache
response
=
self
.
portal_slap
.
getFullComputerInformation
(
self
.
compute_node_id
)
self
.
commit
()
self
.
assertEqual
(
200
,
response
.
status
)
self
.
assertTrue
(
'last-modified'
not
in
response
.
headers
)
third_etag
=
self
.
compute_node
.
_calculateRefreshEtag
()
self
.
assertNotEqual
(
second_etag
,
third_etag
)
self
.
assertEqual
(
third_etag
,
response
.
headers
.
get
(
'etag'
))
self
.
assertEqual
(
third_body_fingerprint
,
hashData
(
response
.
body
))
self
.
assertEqual
(
0
,
len
(
self
.
portal
.
portal_activities
.
getMessageList
()))
# Remove the slave link to the partition
# Compute Node should loose permission to access the slave instance
self
.
start_requested_slave_instance
.
setAggregate
(
''
)
self
.
commit
()
# 7th access
# Check that the result is stable, as the indexation timestamp is not changed yet
current_activity_count
=
len
(
self
.
portal
.
portal_activities
.
getMessageList
())
# Edition does not impact the etag
self
.
assertEqual
(
third_etag
,
self
.
compute_node
.
_calculateRefreshEtag
())
# The edition does not impact the response body yet, as the aggregate relation
# is not yet unindex
self
.
assertEqual
(
third_body_fingerprint
,
hashData
(
self
.
compute_node
.
_getCacheComputeNodeInformation
(
self
.
compute_node_id
)
))
response
=
self
.
portal_slap
.
getFullComputerInformation
(
self
.
compute_node_id
)
self
.
commit
()
self
.
assertEqual
(
200
,
response
.
status
)
self
.
assertTrue
(
'last-modified'
not
in
response
.
headers
)
self
.
assertEqual
(
third_etag
,
response
.
headers
.
get
(
'etag'
))
self
.
assertEqual
(
third_body_fingerprint
,
hashData
(
response
.
body
))
self
.
assertEqual
(
current_activity_count
,
len
(
self
.
portal
.
portal_activities
.
getMessageList
()))
self
.
tic
()
# 8th access
# changing the aggregate relation trigger the partition reindexation
# which trigger cache modification activity
# So, we should get the correct cached value
response
=
self
.
portal_slap
.
getFullComputerInformation
(
self
.
compute_node_id
)
self
.
commit
()
self
.
assertEqual
(
200
,
response
.
status
)
self
.
assertTrue
(
'last-modified'
not
in
response
.
headers
)
fourth_etag
=
self
.
compute_node
.
_calculateRefreshEtag
()
fourth_body_fingerprint
=
hashData
(
self
.
compute_node
.
_getCacheComputeNodeInformation
(
self
.
compute_node_id
)
)
self
.
assertNotEqual
(
third_etag
,
fourth_etag
)
# The indexation timestamp does not impact the response body
self
.
assertNotEqual
(
third_body_fingerprint
,
fourth_body_fingerprint
)
self
.
assertEqual
(
fourth_etag
,
response
.
headers
.
get
(
'etag'
))
self
.
assertEqual
(
fourth_body_fingerprint
,
hashData
(
response
.
body
))
self
.
assertEqual
(
0
,
len
(
self
.
portal
.
portal_activities
.
getMessageList
()))
class
TestSlapOSSlapToolComputeNodeAccess
(
TestSlapOSJIOAPIMixin
):
def
test_01_getFullComputerInformation
(
self
):
self
.
_makeComplexComputeNode
(
with_slave
=
True
)
...
...
@@ -329,10 +174,10 @@ class TestSlapOSSlapToolComputeNodeAccess(TestSlapOSJIOAPIMixin):
self
.
login
(
self
.
compute_node_user_id
)
self
.
maxDiff
=
None
instance_list_response
=
json_loads_byteified
(
self
.
allDocsToApi
(
json
.
dumps
({
instance_list_response
=
self
.
allDocsToApi
({
"compute_node_id"
:
self
.
compute_node_id
,
"portal_type"
:
"Software Instance"
,
})
))
})
response
=
self
.
portal
.
REQUEST
.
RESPONSE
self
.
assertEqual
(
200
,
response
.
getStatus
())
self
.
assertEqual
(
'application/json'
,
...
...
@@ -369,9 +214,7 @@ class TestSlapOSSlapToolComputeNodeAccess(TestSlapOSJIOAPIMixin):
instance
=
instance_list
[
i
]
# Get instance as "user"
self
.
login
(
self
.
compute_node_user_id
)
instance_dict
=
json_loads_byteified
(
self
.
getToApi
(
json
.
dumps
(
instance_resut_dict
[
"get_parameters"
]
)))
instance_dict
=
self
.
getToApi
(
instance_resut_dict
[
"get_parameters"
])
response
=
self
.
portal
.
REQUEST
.
RESPONSE
self
.
assertEqual
(
200
,
response
.
getStatus
())
self
.
assertEqual
(
'application/json'
,
...
...
@@ -407,490 +250,300 @@ class TestSlapOSSlapToolComputeNodeAccess(TestSlapOSJIOAPIMixin):
"portal_type"
:
instance
.
getPortalType
(),
},
instance_dict
)
def
deactivated_test_not_accessed_getComputerStatus
(
self
):
self
.
login
(
self
.
compute_node_user_id
)
created_at
=
rfc1123_date
(
DateTime
())
since
=
created_at
response
=
self
.
portal_slap
.
getComputerStatus
(
self
.
compute_node_id
)
self
.
assertEqual
(
200
,
response
.
status
)
self
.
assertEqual
(
'public, max-age=60, stale-if-error=604800'
,
response
.
headers
.
get
(
'cache-control'
))
self
.
assertEqual
(
'REMOTE_USER'
,
response
.
headers
.
get
(
'vary'
))
self
.
assertTrue
(
'last-modified'
in
response
.
headers
)
self
.
assertEqual
(
'text/xml; charset=utf-8'
,
response
.
headers
.
get
(
'content-type'
))
# check returned XML
xml_fp
=
StringIO
.
StringIO
()
xml
.
dom
.
ext
.
PrettyPrint
(
xml
.
dom
.
ext
.
reader
.
Sax
.
FromXml
(
response
.
body
),
stream
=
xml_fp
)
xml_fp
.
seek
(
0
)
got_xml
=
xml_fp
.
read
()
expected_xml
=
"""
\
<?xml version='1.0' encoding='UTF-8'?>
<marshal>
<dictionary id='i2'>
<string>created_at</string>
<string>%(created_at)s</string>
<string>no_data</string>
<int>1</int>
<string>since</string>
<string>%(since)s</string>
<string>state</string>
<string/>
<string>text</string>
<string>#error no data found for %(compute_node_id)s</string>
<string>user</string>
<string>SlapOS Master</string>
</dictionary>
</marshal>
"""
%
dict
(
created_at
=
created_at
,
since
=
since
,
compute_node_id
=
self
.
compute_node_id
)
self
.
assertEqual
(
expected_xml
,
got_xml
,
'
\
n
'
.
join
([
q
for
q
in
difflib
.
unified_diff
(
expected_xml
.
split
(
'
\
n
'
),
got_xml
.
split
(
'
\
n
'
))]))
def
deactivated_test_accessed_getComputerStatus
(
self
):
self
.
login
(
self
.
compute_node_user_id
)
self
.
portal_slap
.
getFullComputerInformation
(
self
.
compute_node_id
)
created_at
=
rfc1123_date
(
DateTime
())
since
=
created_at
response
=
self
.
portal_slap
.
getComputerStatus
(
self
.
compute_node_id
)
self
.
assertEqual
(
200
,
response
.
status
)
self
.
assertEqual
(
'public, max-age=60, stale-if-error=604800'
,
response
.
headers
.
get
(
'cache-control'
))
self
.
assertEqual
(
'REMOTE_USER'
,
response
.
headers
.
get
(
'vary'
))
self
.
assertTrue
(
'last-modified'
in
response
.
headers
)
self
.
assertEqual
(
'text/xml; charset=utf-8'
,
response
.
headers
.
get
(
'content-type'
))
# check returned XML
xml_fp
=
StringIO
.
StringIO
()
xml
.
dom
.
ext
.
PrettyPrint
(
xml
.
dom
.
ext
.
reader
.
Sax
.
FromXml
(
response
.
body
),
stream
=
xml_fp
)
xml_fp
.
seek
(
0
)
got_xml
=
xml_fp
.
read
()
expected_xml
=
"""
\
<?xml version='1.0' encoding='UTF-8'?>
<marshal>
<dictionary id='i2'>
<string>created_at</string>
<string>%(created_at)s</string>
<string>no_data_since_15_minutes</string>
<int>0</int>
<string>no_data_since_5_minutes</string>
<int>0</int>
<string>since</string>
<string>%(since)s</string>
<string>state</string>
<string/>
<string>text</string>
<string>#access %(compute_node_id)s</string>
<string>user</string>
<string>%(compute_node_id)s</string>
</dictionary>
</marshal>
"""
%
dict
(
created_at
=
created_at
,
since
=
since
,
compute_node_id
=
self
.
compute_node_id
)
self
.
assertEqual
(
expected_xml
,
got_xml
,
'
\
n
'
.
join
([
q
for
q
in
difflib
.
unified_diff
(
expected_xml
.
split
(
'
\
n
'
),
got_xml
.
split
(
'
\
n
'
))]))
def
test_02_computerBang
(
self
):
self
.
_makeComplexComputeNode
()
self
.
callUpdateRevisionAndTic
()
def
assertComputeNodeBangSimulator
(
self
,
args
,
kwargs
):
stored
=
eval
(
open
(
self
.
compute_node_bang_simulator
).
read
())
#pylint: disable=eval-used
# do the same translation magic as in workflow
kwargs
[
'comment'
]
=
kwargs
.
pop
(
'comment'
)
self
.
assertEqual
(
stored
,
[{
'recargs'
:
args
,
'reckwargs'
:
kwargs
,
'recmethod'
:
'reportComputeNodeBang'
}])
self
.
called_banged_kw
=
""
def
calledBang
(
*
args
,
**
kw
):
self
.
called_banged_kw
=
kw
start_date
=
DateTime
()
def
deactivated_test_computerBang
(
self
):
self
.
_makeComplexComputeNode
()
self
.
compute_node_bang_simulator
=
tempfile
.
mkstemp
()[
1
]
try
:
reportComputeNodeBang
=
self
.
compute_node
.
__class__
.
reportComputeNodeBang
self
.
compute_node
.
__class__
.
reportComputeNodeBang
=
calledBang
self
.
login
(
self
.
compute_node_user_id
)
self
.
compute_node
.
reportComputeNodeBang
=
Simulator
(
self
.
compute_node_bang_simulator
,
'reportComputeNodeBang'
)
error_log
=
'Please bang me'
response
=
self
.
portal_slap
.
computerBang
(
self
.
compute_node_id
,
error_log
)
self
.
assertEqual
(
'None'
,
response
)
# We do not assert getComputerStatus on this test, since
# the change of the timestamp is part of reportComputeNodeBang
self
.
assertComputeNodeBangSimulator
((),
{
'comment'
:
error_log
})
response
=
self
.
putToApi
({
"compute_node_id"
:
self
.
compute_node_id
,
"portal_type"
:
"Compute Node"
,
"bang_status_message"
:
error_log
,
})
self
.
assertEqual
(
self
.
called_banged_kw
,
{
"comment"
:
error_log
})
self
.
assertEqual
(
response
[
"compute_node_id"
],
self
.
compute_node
.
getReference
())
self
.
assertEqual
(
response
[
"success"
],
"Done"
)
self
.
assertEqual
(
response
[
"portal_type"
],
"Compute Node"
)
self
.
assertTrue
(
response
[
"$schema"
].
endswith
(
"ComputeNode_updateFromJSON/getOutputJSONSchema"
))
self
.
assertTrue
(
DateTime
(
response
[
"date"
])
>=
start_date
)
finally
:
if
os
.
path
.
exists
(
self
.
compute_node_bang_simulator
):
os
.
unlink
(
self
.
compute_node_bang_simulator
)
def
assertLoadComputeNodeConfigurationFromXML
(
self
,
args
,
kwargs
):
stored
=
eval
(
open
(
self
.
compute_node_load_configuration_simulator
).
read
())
#pylint: disable=eval-used
# do the same translation magic as in workflow
self
.
assertEqual
(
stored
,
[{
'recargs'
:
args
,
'reckwargs'
:
kwargs
,
'recmethod'
:
'ComputeNode_updateFromDict'
}])
def
deactivated_test_loadComputerConfigurationFromXML
(
self
):
self
.
compute_node_load_configuration_simulator
=
tempfile
.
mkstemp
()[
1
]
try
:
self
.
login
(
self
.
compute_node_user_id
)
self
.
compute_node
.
ComputeNode_updateFromDict
=
Simulator
(
self
.
compute_node_load_configuration_simulator
,
'ComputeNode_updateFromDict'
)
self
.
compute_node
.
__class__
.
reportComputeNodeBang
=
reportComputeNodeBang
compute_node_xml
=
"""
\
<?xml version='1.0' encoding='UTF-8'?>
<marshal>
<dictionary id='i2'>
<string>reference</string>
<string>%(compute_node_reference)s</string>
</dictionary>
</marshal>
"""
%
{
'compute_node_reference'
:
self
.
compute_node
.
getReference
()}
def
test_03_not_accessed_getSoftwareInstallationStatus
(
self
):
"""
xXXX TODO Cedric Make sure we can create and modifiy when using weird url strings
"""
response
=
self
.
portal_slap
.
loadComputerConfigurationFromXML
(
compute_node_xml
)
self
.
assertEqual
(
'Content properly posted.'
,
response
)
self
.
assertLoadComputeNodeConfigurationFromXML
(
({
'reference'
:
self
.
compute_node
.
getReference
()},),
{})
finally
:
if
os
.
path
.
exists
(
self
.
compute_node_load_configuration_simulator
):
os
.
unlink
(
self
.
compute_node_load_configuration_simulator
)
def
deactivated_test_not_accessed_getSoftwareInstallationStatus
(
self
):
self
.
_makeComplexComputeNode
()
self
.
compute_node_bang_simulator
=
tempfile
.
mkstemp
()[
1
]
self
.
callUpdateRevisionAndTic
()
self
.
login
(
self
.
compute_node_user_id
)
created_at
=
rfc1123_date
(
DateTime
())
since
=
created_at
software_installation
=
self
.
start_requested_software_installation
url_string
=
software_installation
.
getUrlString
()
response
=
self
.
portal_slap
.
getSoftwareInstallationStatus
(
url_string
,
self
.
compute_node_id
)
self
.
assertEqual
(
200
,
response
.
status
)
self
.
assertEqual
(
'public, max-age=60, stale-if-error=604800'
,
response
.
headers
.
get
(
'cache-control'
))
self
.
assertEqual
(
'REMOTE_USER'
,
response
.
headers
.
get
(
'vary'
))
self
.
assertTrue
(
'last-modified'
in
response
.
headers
)
self
.
assertEqual
(
'text/xml; charset=utf-8'
,
software_dict
=
self
.
getToApi
({
"portal_type"
:
"Software Installation"
,
"software_release_uri"
:
urllib
.
quote
(
url_string
),
"compute_node_id"
:
self
.
compute_node_id
,
})
response
=
self
.
portal
.
REQUEST
.
RESPONSE
self
.
assertEqual
(
200
,
response
.
getStatus
())
self
.
assertEqual
(
'application/json'
,
response
.
headers
.
get
(
'content-type'
))
# check returned XML
xml_fp
=
StringIO
.
StringIO
()
xml
.
dom
.
ext
.
PrettyPrint
(
xml
.
dom
.
ext
.
reader
.
Sax
.
FromXml
(
response
.
body
),
stream
=
xml_fp
)
xml_fp
.
seek
(
0
)
got_xml
=
xml_fp
.
read
()
status_dict
=
software_installation
.
getAccessStatus
()
expected_dict
=
{
"$schema"
:
software_installation
.
getJSONSchemaUrl
(),
"reference"
:
software_installation
.
getReference
(),
"software_release_uri"
:
software_installation
.
getUrlString
(),
"compute_node_id"
:
software_installation
.
getAggregateReference
(),
"state"
:
"available"
,
"reported_state"
:
status_dict
.
get
(
"state"
),
"status_message"
:
status_dict
.
get
(
"text"
),
"processing_timestamp"
:
software_installation
.
getSlapTimestamp
(),
"api_revision"
:
software_installation
.
getJIOAPIRevision
(
self
.
web_site
.
api
.
getRelativeUrl
()),
}
expected_xml
=
"""
\
<?xml version='1.0' encoding='UTF-8'?>
<marshal>
<dictionary id='i2'>
<string>created_at</string>
<string>%(created_at)s</string>
<string>no_data</string>
<int>1</int>
<string>since</string>
<string>%(since)s</string>
<string>state</string>
<string/>
<string>text</string>
<string>#error no data found for %(reference)s</string>
<string>user</string>
<string>SlapOS Master</string>
</dictionary>
</marshal>
"""
%
dict
(
created_at
=
created_at
,
since
=
since
,
reference
=
software_installation
.
getReference
()
)
self
.
assertEqual
(
expected_xml
,
got_xml
,
'
\
n
'
.
join
([
q
for
q
in
difflib
.
unified_diff
(
expected_xml
.
split
(
'
\
n
'
),
got_xml
.
split
(
'
\
n
'
))]))
self
.
assertEqual
(
expected_dict
,
software_dict
)
def
deactivated_test
_destroyedSoftwareRelease_noSoftwareInstallation
(
self
):
def
test_04
_destroyedSoftwareRelease_noSoftwareInstallation
(
self
):
self
.
login
(
self
.
compute_node_user_id
)
self
.
assertRaises
(
NotFound
,
self
.
portal_slap
.
destroyedSoftwareRelease
,
"http://example.org/foo"
,
self
.
compute_node_id
)
start_time
=
DateTime
()
software_release_uri
=
"http://example.org/foo"
response_dict
=
self
.
putToApi
(
{
"software_release_uri"
:
software_release_uri
,
"compute_node_id"
:
self
.
compute_node_id
,
"reported_state"
:
"destroyed"
,
"portal_type"
:
"Software Installation"
,
}
)
response
=
self
.
portal
.
REQUEST
.
RESPONSE
self
.
assertEqual
(
400
,
response
.
getStatus
())
self
.
assertEqual
(
'application/json'
,
response
.
headers
.
get
(
'content-type'
))
self
.
assertEqual
(
'404'
,
response_dict
[
"status"
])
self
.
assertEqual
(
str
(
"No software release %r found on compute_node %r"
%
(
software_release_uri
,
self
.
compute_node
.
getReference
())),
response_dict
[
"message"
]
)
self
.
assertTrue
(
response_dict
[
"$schema"
].
endswith
(
"/error-response-schema.json"
))
self
.
login
()
error_log
=
self
.
portal
.
restrictedTraverse
(
"error_record_module/%s"
%
response_dict
[
"debug_id"
]
)
self
.
assertTrue
(
error_log
.
getCreationDate
()
>=
start_time
)
self
.
assertTrue
(
software_release_uri
in
error_log
.
getTextContent
())
def
deactivated_test
_destroyedSoftwareRelease_noDestroyRequested
(
self
):
def
test_05
_destroyedSoftwareRelease_noDestroyRequested
(
self
):
self
.
_makeComplexComputeNode
()
self
.
callUpdateRevisionAndTic
()
start_time
=
DateTime
()
software_installation
=
self
.
start_requested_software_installation
software_release_uri
=
software_installation
.
getUrlString
()
self
.
login
(
self
.
compute_node_user_id
)
self
.
assertRaises
(
NotFound
,
self
.
portal_slap
.
destroyedSoftwareRelease
,
self
.
start_requested_software_installation
.
getUrlString
(),
self
.
compute_node_id
)
response_dict
=
self
.
putToApi
(
{
"software_release_uri"
:
urllib
.
quote
(
software_release_uri
),
"compute_node_id"
:
self
.
compute_node_id
,
"reported_state"
:
"destroyed"
,
"portal_type"
:
"Software Installation"
,
}
)
response
=
self
.
portal
.
REQUEST
.
RESPONSE
self
.
assertEqual
(
400
,
response
.
getStatus
())
self
.
assertEqual
(
'application/json'
,
response
.
headers
.
get
(
'content-type'
))
self
.
assertEqual
(
400
,
response_dict
[
"status"
])
self
.
assertEqual
(
"Reported state is destroyed but requested state is not destroyed"
,
response_dict
[
"message"
]
)
self
.
assertTrue
(
response_dict
[
"$schema"
].
endswith
(
"/error-response-schema.json"
))
self
.
login
()
error_log
=
self
.
portal
.
restrictedTraverse
(
"error_record_module/%s"
%
response_dict
[
"debug_id"
]
)
self
.
assertTrue
(
error_log
.
getCreationDate
()
>=
start_time
)
self
.
assertTrue
(
urllib
.
quote
(
software_release_uri
)
in
error_log
.
getTextContent
())
def
deactivated_test
_destroyedSoftwareRelease_destroyRequested
(
self
):
def
test_06
_destroyedSoftwareRelease_destroyRequested
(
self
):
self
.
_makeComplexComputeNode
()
self
.
login
(
self
.
compute_node_user_id
)
self
.
callUpdateRevisionAndTic
()
start_date
=
DateTime
()
destroy_requested
=
self
.
destroy_requested_software_installation
self
.
assertEqual
(
destroy_requested
.
getValidationState
(),
"validated"
)
self
.
portal_slap
.
destroyedSoftwareRelease
(
destroy_requested
.
getUrlString
(),
self
.
compute_node_id
)
software_release_uri
=
destroy_requested
.
getUrlString
()
response_dict
=
self
.
putToApi
(
{
"software_release_uri"
:
urllib
.
quote
(
software_release_uri
),
"compute_node_id"
:
self
.
compute_node_id
,
"reported_state"
:
"destroyed"
,
"portal_type"
:
"Software Installation"
,
}
)
response
=
self
.
portal
.
REQUEST
.
RESPONSE
self
.
assertEqual
(
200
,
response
.
getStatus
())
self
.
assertEqual
(
'application/json'
,
response
.
headers
.
get
(
'content-type'
))
self
.
assertEqual
(
destroy_requested
.
getValidationState
(),
"invalidated"
)
self
.
assertEqual
(
response_dict
[
"compute_node_id"
],
self
.
compute_node
.
getReference
())
self
.
assertEqual
(
response_dict
[
"software_release_uri"
],
software_release_uri
)
self
.
assertEqual
(
response_dict
[
"success"
],
"Done"
)
self
.
assertEqual
(
response_dict
[
"portal_type"
],
"Software Installation"
)
self
.
assertTrue
(
response_dict
[
"$schema"
].
endswith
(
"SoftwareInstallation_updateFromJSON/getOutputJSONSchema"
))
self
.
assertTrue
(
DateTime
(
response_dict
[
"date"
])
>=
start_date
)
def
deactivated_test_availableSoftwareRelease
(
self
):
self
.
_makeComplexComputeNode
()
self
.
compute_node_bang_simulator
=
tempfile
.
mkstemp
()[
1
]
self
.
login
(
self
.
compute_node_user_id
)
software_installation
=
self
.
start_requested_software_installation
url_string
=
software_installation
.
getUrlString
()
response
=
self
.
portal_slap
.
availableSoftwareRelease
(
url_string
,
self
.
compute_node_id
)
self
.
assertEqual
(
'None'
,
response
)
created_at
=
rfc1123_date
(
DateTime
())
since
=
created_at
response
=
self
.
portal_slap
.
getSoftwareInstallationStatus
(
url_string
,
self
.
compute_node_id
)
# check returned XML
xml_fp
=
StringIO
.
StringIO
()
xml
.
dom
.
ext
.
PrettyPrint
(
xml
.
dom
.
ext
.
reader
.
Sax
.
FromXml
(
response
.
body
),
stream
=
xml_fp
)
xml_fp
.
seek
(
0
)
got_xml
=
xml_fp
.
read
()
expected_xml
=
"""
\
<?xml version='1.0' encoding='UTF-8'?>
<marshal>
<dictionary id='i2'>
<string>created_at</string>
<string>%(created_at)s</string>
<string>no_data_since_15_minutes</string>
<int>0</int>
<string>no_data_since_5_minutes</string>
<int>0</int>
<string>since</string>
<string>%(since)s</string>
<string>state</string>
<string>available</string>
<string>text</string>
<string>#access software release %(url_string)s available</string>
<string>user</string>
<string>%(compute_node_id)s</string>
</dictionary>
</marshal>
"""
%
dict
(
created_at
=
created_at
,
since
=
since
,
url_string
=
url_string
,
compute_node_id
=
self
.
compute_node_id
,
)
self
.
assertEqual
(
expected_xml
,
got_xml
,
'
\
n
'
.
join
([
q
for
q
in
difflib
.
unified_diff
(
expected_xml
.
split
(
'
\
n
'
),
got_xml
.
split
(
'
\
n
'
))]))
def
deactivated_test_building
SoftwareRelease
(
self
):
def
test_07_available
SoftwareRelease
(
self
):
self
.
_makeComplexComputeNode
()
self
.
compute_node_bang_simulator
=
tempfile
.
mkstemp
()[
1
]
self
.
login
(
self
.
compute_node_user_id
)
software_installation
=
self
.
start_requested_software_installation
url_string
=
software_installation
.
getUrlString
()
response
=
self
.
portal_slap
.
buildingSoftwareRelease
(
url_string
,
self
.
compute_node_id
)
self
.
assertEqual
(
'None'
,
response
)
created_at
=
rfc1123_date
(
DateTime
())
since
=
created_at
response
=
self
.
portal_slap
.
getSoftwareInstallationStatus
(
url_string
,
self
.
compute_node_id
)
# check returned XML
xml_fp
=
StringIO
.
StringIO
()
self
.
callUpdateRevisionAndTic
()
start_date
=
DateTime
()
xml
.
dom
.
ext
.
PrettyPrint
(
xml
.
dom
.
ext
.
reader
.
Sax
.
FromXml
(
response
.
body
),
stream
=
xml_fp
)
xml_fp
.
seek
(
0
)
got_xml
=
xml_fp
.
read
()
expected_xml
=
"""
\
<?xml version='1.0' encoding='UTF-8'?>
<marshal>
<dictionary id='i2'>
<string>created_at</string>
<string>%(created_at)s</string>
<string>no_data_since_15_minutes</string>
<int>0</int>
<string>no_data_since_5_minutes</string>
<int>0</int>
<string>since</string>
<string>%(since)s</string>
<string>state</string>
<string>building</string>
<string>text</string>
<string>#building software release %(url_string)s</string>
<string>user</string>
<string>%(compute_node_id)s</string>
</dictionary>
</marshal>
"""
%
dict
(
created_at
=
created_at
,
since
=
since
,
url_string
=
url_string
,
compute_node_id
=
self
.
compute_node_id
,
software_installation
=
self
.
start_requested_software_installation
self
.
assertEqual
(
software_installation
.
getValidationState
(),
"validated"
)
software_release_uri
=
software_installation
.
getUrlString
()
response_dict
=
self
.
putToApi
(
{
"software_release_uri"
:
urllib
.
quote
(
software_release_uri
),
"compute_node_id"
:
self
.
compute_node_id
,
"reported_state"
:
"available"
,
"portal_type"
:
"Software Installation"
,
}
)
self
.
assertEqual
(
expected_xml
,
got_xml
,
'
\
n
'
.
join
([
q
for
q
in
difflib
.
unified_diff
(
expected_xml
.
split
(
'
\
n
'
),
got_xml
.
split
(
'
\
n
'
))]))
response
=
self
.
portal
.
REQUEST
.
RESPONSE
self
.
assertEqual
(
200
,
response
.
getStatus
())
self
.
assertEqual
(
'application/json'
,
response
.
headers
.
get
(
'content-type'
))
self
.
assertEqual
(
response_dict
[
"compute_node_id"
],
self
.
compute_node
.
getReference
())
self
.
assertEqual
(
response_dict
[
"software_release_uri"
],
software_release_uri
)
self
.
assertEqual
(
response_dict
[
"success"
],
"Done"
)
self
.
assertEqual
(
response_dict
[
"portal_type"
],
"Software Installation"
)
self
.
assertTrue
(
response_dict
[
"$schema"
].
endswith
(
"SoftwareInstallation_updateFromJSON/getOutputJSONSchema"
))
self
.
assertTrue
(
DateTime
(
response_dict
[
"date"
])
>=
start_date
)
software_dict
=
self
.
getToApi
({
"portal_type"
:
"Software Installation"
,
"software_release_uri"
:
urllib
.
quote
(
software_release_uri
),
"compute_node_id"
:
self
.
compute_node_id
,
})
response
=
self
.
portal
.
REQUEST
.
RESPONSE
expected_dict
=
{
"$schema"
:
software_installation
.
getJSONSchemaUrl
(),
"reference"
:
software_installation
.
getReference
(),
"software_release_uri"
:
software_release_uri
,
"compute_node_id"
:
software_installation
.
getAggregateReference
(),
"state"
:
"available"
,
"reported_state"
:
"available"
,
"status_message"
:
"#access software release %s available"
%
software_release_uri
,
"processing_timestamp"
:
software_installation
.
getSlapTimestamp
(),
"api_revision"
:
software_installation
.
getJIOAPIRevision
(
self
.
web_site
.
api
.
getRelativeUrl
()),
}
self
.
assertEqual
(
expected_dict
,
software_dict
)
def
deactivated_test_softwareReleaseError
(
self
):
def
test_08_buildingSoftwareRelease
(
self
):
self
.
_makeComplexComputeNode
()
self
.
compute_node_bang_simulator
=
tempfile
.
mkstemp
()[
1
]
self
.
login
(
self
.
compute_node_user_id
)
software_installation
=
self
.
start_requested_software_installation
url_string
=
software_installation
.
getUrlString
()
response
=
self
.
portal_slap
.
softwareReleaseError
(
url_string
,
self
.
compute_node_id
,
'error log'
)
self
.
assertEqual
(
'None'
,
response
)
created_at
=
rfc1123_date
(
DateTime
())
since
=
created_at
response
=
self
.
portal_slap
.
getSoftwareInstallationStatus
(
url_string
,
self
.
compute_node_id
)
# check returned XML
xml_fp
=
StringIO
.
StringIO
()
self
.
callUpdateRevisionAndTic
()
start_date
=
DateTime
()
xml
.
dom
.
ext
.
PrettyPrint
(
xml
.
dom
.
ext
.
reader
.
Sax
.
FromXml
(
response
.
body
),
stream
=
xml_fp
)
xml_fp
.
seek
(
0
)
got_xml
=
xml_fp
.
read
()
expected_xml
=
"""
\
<?xml version='1.0' encoding='UTF-8'?>
<marshal>
<dictionary id='i2'>
<string>created_at</string>
<string>%(created_at)s</string>
<string>no_data_since_15_minutes</string>
<int>0</int>
<string>no_data_since_5_minutes</string>
<int>0</int>
<string>since</string>
<string>%(since)s</string>
<string>state</string>
<string/>
<string>text</string>
<string>#error while installing %(url_string)s</string>
<string>user</string>
<string>%(compute_node_id)s</string>
</dictionary>
</marshal>
"""
%
dict
(
created_at
=
created_at
,
since
=
since
,
url_string
=
url_string
,
compute_node_id
=
self
.
compute_node_id
,
software_installation
=
self
.
start_requested_software_installation
self
.
assertEqual
(
software_installation
.
getValidationState
(),
"validated"
)
software_release_uri
=
software_installation
.
getUrlString
()
response_dict
=
self
.
putToApi
(
{
"software_release_uri"
:
urllib
.
quote
(
software_release_uri
),
"compute_node_id"
:
self
.
compute_node_id
,
"reported_state"
:
"building"
,
"portal_type"
:
"Software Installation"
,
}
)
self
.
assertEqual
(
expected_xml
,
got_xml
,
'
\
n
'
.
join
([
q
for
q
in
difflib
.
unified_diff
(
expected_xml
.
split
(
'
\
n
'
),
got_xml
.
split
(
'
\
n
'
))]))
def
deactivated_test_useComputer_wrong_xml
(
self
):
self
.
login
(
self
.
compute_node_user_id
)
response
=
self
.
portal_slap
.
useComputer
(
self
.
compute_node_id
,
"foobar"
)
self
.
assertEqual
(
400
,
response
.
status
)
self
.
assertEqual
(
""
,
response
.
body
)
def
assertReportComputeNodeConsumption
(
self
,
args
,
kwargs
):
stored
=
eval
(
open
(
self
.
compute_node_use_compute_node_simulator
).
read
())
#pylint: disable=eval-used
# do the same translation magic as in workflow
self
.
assertEqual
(
stored
,
[{
'recargs'
:
args
,
'reckwargs'
:
kwargs
,
'recmethod'
:
'ComputeNode_reportComputeNodeConsumption'
}])
def
deactivated_test_useComputer_expected_xml
(
self
):
self
.
compute_node_use_compute_node_simulator
=
tempfile
.
mkstemp
()[
1
]
try
:
self
.
login
(
self
.
compute_node_user_id
)
self
.
compute_node
.
ComputeNode_reportComputeNodeConsumption
=
Simulator
(
self
.
compute_node_use_compute_node_simulator
,
'ComputeNode_reportComputeNodeConsumption'
)
consumption_xml
=
"""<?xml version='1.0' encoding='utf-8'?>
<journal>
<transaction type="Sale Packing List">
<title>Resource consumptions</title>
<start_date></start_date>
<stop_date></stop_date>
<reference>testusagé</reference>
<currency></currency>
<payment_mode></payment_mode>
<category></category>
<arrow type="Administration">
<source></source>
<destination></destination>
</arrow>
<movement>
<resource>CPU Consumption</resource>
<title>Title Sale Packing List Line 1</title>
<reference>slappart0</reference>
<quantity>42.42</quantity>
<price>0.00</price>
<VAT>None</VAT>
<category>None</category>
</movement>
</transaction>
</journal>"""
response
=
self
.
portal_slap
.
useComputer
(
self
.
compute_node_id
,
consumption_xml
)
self
.
assertEqual
(
200
,
response
.
status
)
self
.
assertEqual
(
"OK"
,
response
.
body
)
self
.
assertReportComputeNodeConsumption
(
(
"testusagé"
,
consumption_xml
,),
{})
finally
:
if
os
.
path
.
exists
(
self
.
compute_node_use_compute_node_simulator
):
os
.
unlink
(
self
.
compute_node_use_compute_node_simulator
)
response
=
self
.
portal
.
REQUEST
.
RESPONSE
self
.
assertEqual
(
200
,
response
.
getStatus
())
self
.
assertEqual
(
'application/json'
,
response
.
headers
.
get
(
'content-type'
))
self
.
assertEqual
(
response_dict
[
"compute_node_id"
],
self
.
compute_node
.
getReference
())
self
.
assertEqual
(
response_dict
[
"software_release_uri"
],
software_release_uri
)
self
.
assertEqual
(
response_dict
[
"success"
],
"Done"
)
self
.
assertEqual
(
response_dict
[
"portal_type"
],
"Software Installation"
)
self
.
assertTrue
(
response_dict
[
"$schema"
].
endswith
(
"SoftwareInstallation_updateFromJSON/getOutputJSONSchema"
))
self
.
assertTrue
(
DateTime
(
response_dict
[
"date"
])
>=
start_date
)
software_dict
=
self
.
getToApi
({
"portal_type"
:
"Software Installation"
,
"software_release_uri"
:
urllib
.
quote
(
software_release_uri
),
"compute_node_id"
:
self
.
compute_node_id
,
})
response
=
self
.
portal
.
REQUEST
.
RESPONSE
expected_dict
=
{
"$schema"
:
software_installation
.
getJSONSchemaUrl
(),
"reference"
:
software_installation
.
getReference
(),
"software_release_uri"
:
software_release_uri
,
"compute_node_id"
:
software_installation
.
getAggregateReference
(),
"state"
:
"available"
,
"reported_state"
:
"building"
,
"status_message"
:
"#building software release %s"
%
software_release_uri
,
"processing_timestamp"
:
software_installation
.
getSlapTimestamp
(),
"api_revision"
:
software_installation
.
getJIOAPIRevision
(
self
.
web_site
.
api
.
getRelativeUrl
()),
}
self
.
assertEqual
(
expected_dict
,
software_dict
)
def
deactivated_test_useComputer_empty_reference
(
self
):
self
.
compute_node_use_compute_node_simulator
=
tempfile
.
mkstemp
()[
1
]
try
:
self
.
login
(
self
.
compute_node_user_id
)
self
.
compute_node
.
ComputeNode_reportComputeNodeConsumption
=
Simulator
(
self
.
compute_node_use_compute_node_simulator
,
'ComputeNode_reportComputeNodeConsumption'
)
consumption_xml
=
"""<?xml version='1.0' encoding='utf-8'?>
<journal>
<transaction type="Sale Packing List">
<title>Resource consumptions</title>
<start_date></start_date>
<stop_date></stop_date>
<reference></reference>
<currency></currency>
<payment_mode></payment_mode>
<category></category>
<arrow type="Administration">
<source></source>
<destination></destination>
</arrow>
<movement>
<resource>CPU Consumption</resource>
<title>Title Sale Packing List Line 1</title>
<reference>slappart0</reference>
<quantity>42.42</quantity>
<price>0.00</price>
<VAT>None</VAT>
<category>None</category>
</movement>
</transaction>
</journal>"""
response
=
self
.
portal_slap
.
useComputer
(
self
.
compute_node_id
,
consumption_xml
)
self
.
assertEqual
(
200
,
response
.
status
)
self
.
assertEqual
(
"OK"
,
response
.
body
)
self
.
assertReportComputeNodeConsumption
(
(
""
,
consumption_xml
,),
{})
finally
:
if
os
.
path
.
exists
(
self
.
compute_node_use_compute_node_simulator
):
os
.
unlink
(
self
.
compute_node_use_compute_node_simulator
)
def
test_09_softwareReleaseError
(
self
):
self
.
_makeComplexComputeNode
()
self
.
callUpdateRevisionAndTic
()
start_date
=
DateTime
()
software_installation
=
self
.
start_requested_software_installation
self
.
assertEqual
(
software_installation
.
getValidationState
(),
"validated"
)
software_release_uri
=
software_installation
.
getUrlString
()
response_dict
=
self
.
putToApi
(
{
"software_release_uri"
:
urllib
.
quote
(
software_release_uri
),
"compute_node_id"
:
self
.
compute_node_id
,
"portal_type"
:
"Software Installation"
,
"error_status"
:
'error log'
,
}
)
response
=
self
.
portal
.
REQUEST
.
RESPONSE
self
.
assertEqual
(
200
,
response
.
getStatus
())
self
.
assertEqual
(
'application/json'
,
response
.
headers
.
get
(
'content-type'
))
self
.
assertEqual
(
response_dict
[
"compute_node_id"
],
self
.
compute_node
.
getReference
())
self
.
assertEqual
(
response_dict
[
"software_release_uri"
],
software_release_uri
)
self
.
assertEqual
(
response_dict
[
"success"
],
"Done"
)
self
.
assertEqual
(
response_dict
[
"portal_type"
],
"Software Installation"
)
self
.
assertTrue
(
response_dict
[
"$schema"
].
endswith
(
"SoftwareInstallation_updateFromJSON/getOutputJSONSchema"
))
self
.
assertTrue
(
DateTime
(
response_dict
[
"date"
])
>=
start_date
)
software_dict
=
self
.
getToApi
({
"portal_type"
:
"Software Installation"
,
"software_release_uri"
:
urllib
.
quote
(
software_release_uri
),
"compute_node_id"
:
self
.
compute_node_id
,
})
response
=
self
.
portal
.
REQUEST
.
RESPONSE
expected_dict
=
{
"$schema"
:
software_installation
.
getJSONSchemaUrl
(),
"reference"
:
software_installation
.
getReference
(),
"software_release_uri"
:
software_release_uri
,
"compute_node_id"
:
software_installation
.
getAggregateReference
(),
"state"
:
"available"
,
"reported_state"
:
""
,
"status_message"
:
"#error while installing %s"
%
software_release_uri
,
"processing_timestamp"
:
software_installation
.
getSlapTimestamp
(),
"api_revision"
:
software_installation
.
getJIOAPIRevision
(
self
.
web_site
.
api
.
getRelativeUrl
()),
}
self
.
assertEqual
(
expected_dict
,
software_dict
)
class
TestSlapOSSlapToolInstanceAccess
(
TestSlapOSJIOAPIMixin
):
def
deactivated_test_getComputerPartitionCertificate
(
self
):
...
...
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