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
Nicolas Wavrant
slapos.core
Commits
11e60887
Commit
11e60887
authored
Oct 20, 2014
by
Marco Mariani
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update tests conforming to requests API
parent
4da82657
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
1430 additions
and
1483 deletions
+1430
-1483
setup.py
setup.py
+2
-1
slapos/proxy/views.py
slapos/proxy/views.py
+1
-1
slapos/slap/slap.py
slapos/slap/slap.py
+15
-13
slapos/tests/client.py
slapos/tests/client.py
+0
-2
slapos/tests/slap.py
slapos/tests/slap.py
+386
-341
slapos/tests/slapgrid.py
slapos/tests/slapgrid.py
+1017
-1001
slapos/tests/slapmock/httplib.py
slapos/tests/slapmock/httplib.py
+0
-123
slapos/tests/slapmock/requests.py
slapos/tests/slapmock/requests.py
+8
-0
slapos/tests/slapproxy/__init__.py
slapos/tests/slapproxy/__init__.py
+1
-1
No files found.
setup.py
View file @
11e60887
...
...
@@ -66,7 +66,8 @@ setup(name=name,
'bpython_console'
:
(
'bpython'
,)},
tests_require
=
[
'pyflakes'
,
'mock'
'mock'
,
'httmock'
,
],
zip_safe
=
False
,
# proxy depends on Flask, which has issues with
# accessing templates
...
...
slapos/proxy/views.py
View file @
11e60887
...
...
@@ -495,7 +495,7 @@ def forwardRequestToExternalMaster(master_url, request_form):
filter_kw
[
'source_instance_id'
]
=
partition_reference
new_request_form
[
'filter_xml'
]
=
dumps
(
filter_kw
)
partition
=
loads
(
slap
.
_connection_helper
.
POST
(
'/requestComputerPartition'
,
new_request_form
))
partition
=
loads
(
slap
.
_connection_helper
.
POST
(
'/requestComputerPartition'
,
data
=
new_request_form
))
# XXX move to other end
partition
.
_master_url
=
master_url
...
...
slapos/slap/slap.py
View file @
11e60887
...
...
@@ -338,7 +338,7 @@ class Computer(SlapDocument):
'message'
:
message
})
def
getStatus
(
self
):
xml
=
self
.
_connection_helper
.
GET
(
'getComputerStatus'
,
{
'computer_id'
:
self
.
_computer_id
})
xml
=
self
.
_connection_helper
.
GET
(
'getComputerStatus'
,
params
=
{
'computer_id'
:
self
.
_computer_id
})
return
xml_marshaller
.
loads
(
xml
)
def
revokeCertificate
(
self
):
...
...
@@ -548,7 +548,7 @@ class ComputerPartition(SlapRequester):
def
getCertificate
(
self
):
xml
=
self
.
_connection_helper
.
GET
(
'getComputerPartitionCertificate'
,
{
params
=
{
'computer_id'
:
self
.
_computer_id
,
'computer_partition_id'
:
self
.
_partition_id
,
}
...
...
@@ -557,7 +557,7 @@ class ComputerPartition(SlapRequester):
def
getStatus
(
self
):
xml
=
self
.
_connection_helper
.
GET
(
'getComputerPartitionStatus'
,
{
params
=
{
'computer_id'
:
self
.
_computer_id
,
'computer_partition_id'
:
self
.
_partition_id
,
}
...
...
@@ -579,7 +579,7 @@ class ConnectionHelper:
self
.
timeout
=
timeout
def
getComputerInformation
(
self
,
computer_id
):
xml
=
self
.
GET
(
'getComputerInformation'
,
{
'computer_id'
:
computer_id
})
xml
=
self
.
GET
(
'getComputerInformation'
,
params
=
{
'computer_id'
:
computer_id
})
return
xml_marshaller
.
loads
(
xml
)
def
getFullComputerInformation
(
self
,
computer_id
):
...
...
@@ -591,20 +591,21 @@ class ConnectionHelper:
params
=
{
'computer_id'
:
computer_id
}
if
not
computer_id
:
# XXX-Cedric: should raise something smarter than "NotFound".
raise
NotFoundError
(
'%r %r'
(
path
,
params
))
raise
NotFoundError
(
'%r %r'
%
(
path
,
params
))
try
:
xml
=
self
.
GET
(
path
,
params
)
xml
=
self
.
GET
(
path
,
params
=
params
)
except
NotFoundError
:
# XXX: This is a ugly way to keep backward compatibility,
# We should stablise slap library soon.
xml
=
self
.
GET
(
'getComputerInformation'
,
{
'computer_id'
:
computer_id
}
)
xml
=
self
.
GET
(
'getComputerInformation'
,
params
=
params
)
return
xml_marshaller
.
loads
(
xml
)
def
do_request
(
self
,
method
,
path
,
params
=
None
,
data
=
None
,
headers
=
None
):
url
=
urlparse
.
urljoin
(
self
.
slapgrid_uri
,
path
)
if
path
.
startswith
(
'/'
):
raise
ValueError
(
'method path should be relative: %s'
%
path
)
path
=
path
[
1
:]
# raise ValueError('method path should be relative: %s' % path)
try
:
if
url
.
startswith
(
'https'
):
...
...
@@ -707,7 +708,7 @@ class slap:
raise
NotFoundError
xml
=
self
.
_connection_helper
.
GET
(
'registerComputerPartition'
,
{
params
=
{
'computer_reference'
:
computer_guid
,
'computer_partition_reference'
:
partition_id
,
}
...
...
@@ -726,18 +727,19 @@ class slap:
def
getSoftwareReleaseListFromSoftwareProduct
(
self
,
software_product_reference
=
None
,
software_release_url
=
None
):
url
=
'/getSoftwareReleaseListFromSoftwareProduct?'
url
=
'getSoftwareReleaseListFromSoftwareProduct'
params
=
{}
if
software_product_reference
:
if
software_release_url
is
not
None
:
raise
AttributeError
(
'Both software_product_reference and '
'software_release_url parameters are specified.'
)
url
+=
'software_product_reference=%s'
%
software_product_reference
params
[
'software_product_reference'
]
=
software_product_reference
else
:
if
software_release_url
is
None
:
raise
AttributeError
(
'None of software_product_reference and '
'software_release_url parameters are specified.'
)
url
+=
'software_release_url=%s'
%
software_release_url
params
[
'software_release_url'
]
=
software_release_url
result
=
xml_marshaller
.
loads
(
self
.
_connection_helper
.
GET
(
url
))
result
=
xml_marshaller
.
loads
(
self
.
_connection_helper
.
GET
(
url
,
params
=
params
))
assert
(
type
(
result
)
==
list
)
return
result
slapos/tests/client.py
View file @
11e60887
...
...
@@ -27,8 +27,6 @@
import
logging
import
unittest
# XXX: BasicMixin should be in a separated module, not in slapgrid test module.
from
slapos.tests.slapgrid
import
BasicMixin
import
slapos.slap
import
slapos.client
...
...
slapos/tests/slap.py
View file @
11e60887
...
...
@@ -25,18 +25,16 @@
#
##############################################################################
import
httplib
import
logging
import
os
import
unittest
import
urlparse
import
httmock
import
slapos.slap
import
xml_marshaller
ORIGINAL_HTTPLIB_HTTPCONNECTION
=
httplib
.
HTTPConnection
ORIGINAL_HTTPLIB_HTTPSCONNECTION
=
httplib
.
HTTPSConnection
ORIGINAL_HTTPLIB_HTTPRESPONSE
=
httplib
.
HTTPResponse
class
UndefinedYetException
(
Exception
):
"""To catch exceptions which are not yet defined"""
...
...
@@ -49,7 +47,6 @@ class SlapMixin(unittest.TestCase):
def
setUp
(
self
):
self
.
_server_url
=
os
.
environ
.
get
(
'TEST_SLAP_SERVER_URL'
,
None
)
if
self
.
_server_url
is
None
:
self
.
_patchHttplib
()
self
.
server_url
=
'http://localhost/'
else
:
self
.
server_url
=
self
.
_server_url
...
...
@@ -58,31 +55,7 @@ class SlapMixin(unittest.TestCase):
self
.
partition_id
=
'PARTITION_01'
def
tearDown
(
self
):
self
.
_unpatchHttplib
()
def
_patchHttplib
(
self
):
"""Overrides httplib"""
import
slapmock.httplib
self
.
saved_httplib
=
{}
for
fake
in
vars
(
slapmock
.
httplib
):
self
.
saved_httplib
[
fake
]
=
getattr
(
httplib
,
fake
,
None
)
setattr
(
httplib
,
fake
,
getattr
(
slapmock
.
httplib
,
fake
))
def
_unpatchHttplib
(
self
):
"""Restores httplib overriding"""
import
httplib
# XXX not reliable
for
name
,
original_value
in
self
.
saved_httplib
.
items
():
setattr
(
httplib
,
name
,
original_value
)
del
self
.
saved_httplib
# XXX this fixes upper code, to be sure it is reliable
httplib
.
HTTPConnection
=
ORIGINAL_HTTPLIB_HTTPCONNECTION
httplib
.
HTTPSConnection
=
ORIGINAL_HTTPLIB_HTTPSCONNECTION
httplib
.
HTTPResponse
=
ORIGINAL_HTTPLIB_HTTPRESPONSE
pass
def
_getTestComputerId
(
self
):
"""
...
...
@@ -103,19 +76,7 @@ class TestSlap(SlapMixin):
"""
slap_instance
=
slapos
.
slap
.
slap
()
slap_instance
.
initializeConnection
(
self
.
server_url
)
self
.
assertIn
(
slap_instance
.
_connection_helper
.
host
,
self
.
server_url
)
self
.
assertIn
(
slap_instance
.
_connection_helper
.
path
,
self
.
server_url
)
def
test_slap_initialisation_wrong_url
(
self
):
"""
Asserts that slap initialisation raises exception when passed url
is not correct
"""
server_url
=
'https://user:pass@server/path/path?parameter=notAcceptable'
slap_instance
=
slapos
.
slap
.
slap
()
self
.
assertRaises
(
AttributeError
,
slap_instance
.
initializeConnection
,
server_url
)
self
.
assertEquals
(
slap_instance
.
_connection_helper
.
slapgrid_uri
,
self
.
server_url
)
def
test_registerComputer_with_new_guid
(
self
):
"""
...
...
@@ -179,19 +140,24 @@ class TestSlap(SlapMixin):
self
.
slap
.
initializeConnection
(
self
.
server_url
)
self
.
slap
.
registerComputer
(
computer_guid
)
def
server_response
(
self
,
path
,
method
,
body
,
header
):
parsed_url
=
urlparse
.
urlparse
(
path
.
lstrip
(
'/'
))
parsed_qs
=
urlparse
.
parse_qs
(
parsed_url
.
query
)
if
(
parsed_url
.
path
==
'registerComputerPartition'
and
parsed_qs
[
'computer_reference'
][
0
]
==
computer_guid
and
parsed_qs
[
'computer_partition_reference'
][
0
]
==
partition_id
):
partition
=
slapos
.
slap
.
ComputerPartition
(
computer_guid
,
partition_id
)
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
partition
))
def
handler
(
url
,
req
):
qs
=
urlparse
.
parse_qs
(
url
.
query
)
if
(
url
.
path
==
'/registerComputerPartition'
and
qs
==
{
'computer_reference'
:
[
computer_guid
],
'computer_partition_reference'
:
[
partition_id
]
}):
partition
=
slapos
.
slap
.
ComputerPartition
(
computer_guid
,
partition_id
)
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
partition
)
}
else
:
return
(
404
,
{},
''
)
httplib
.
HTTPConnection
.
_callback
=
server_response
return
{
'status_code'
:
400
}
self
.
_handler
=
handler
with
httmock
.
HTTMock
(
handler
):
partition
=
self
.
slap
.
registerComputerPartition
(
computer_guid
,
partition_id
)
self
.
assertIsInstance
(
partition
,
slapos
.
slap
.
ComputerPartition
)
...
...
@@ -201,6 +167,7 @@ class TestSlap(SlapMixin):
returns ComputerPartition object
"""
self
.
test_registerComputerPartition_new_partition_id_known_computer_guid
()
with
httmock
.
HTTMock
(
self
.
_handler
):
partition
=
self
.
slap
.
registerComputerPartition
(
self
.
_getTestComputerId
(),
self
.
partition_id
)
self
.
assertIsInstance
(
partition
,
slapos
.
slap
.
ComputerPartition
)
...
...
@@ -214,22 +181,23 @@ class TestSlap(SlapMixin):
self
.
slap
.
initializeConnection
(
self
.
server_url
)
partition_id
=
'PARTITION_01'
def
server_response
(
self
,
path
,
method
,
body
,
header
):
parsed_url
=
urlparse
.
urlparse
(
path
.
lstrip
(
'/'
)
)
parsed_qs
=
urlparse
.
parse_qs
(
parsed_url
.
query
)
if
(
parsed_url
.
path
==
'registerComputerPartition'
and
parsed_qs
[
'computer_reference'
][
0
]
==
computer_guid
and
parsed_qs
[
'computer_partition_reference'
][
0
]
==
partition_id
):
slapos
.
slap
.
ComputerPartition
(
computer_guid
,
partition_id
)
return
(
404
,
{},
''
)
def
handler
(
url
,
req
):
qs
=
urlparse
.
parse_qs
(
url
.
query
)
if
(
url
.
path
==
'/registerComputerPartition'
and
qs
==
{
'computer_reference'
:
[
computer_guid
],
'computer_partition_reference'
:
[
partition_id
]
}):
return
{
'status_code'
:
404
}
else
:
return
(
0
,
{},
''
)
httplib
.
HTTPConnection
.
_callback
=
server_response
return
{
'status_code'
:
0
}
with
httmock
.
HTTMock
(
handler
):
self
.
assertRaises
(
slapos
.
slap
.
NotFoundError
,
self
.
slap
.
registerComputerPartition
,
computer_guid
,
partition_id
)
def
test_getFullComputerInformation_empty_computer_guid
(
self
):
"""
Asserts that calling getFullComputerInformation with empty computer_id
...
...
@@ -237,12 +205,11 @@ class TestSlap(SlapMixin):
"""
self
.
slap
.
initializeConnection
(
self
.
server_url
)
def
server_response
(
self_httpconnection
,
path
,
method
,
body
,
header
):
def
handler
(
url
,
req
):
# Shouldn't even be called
self
.
assertFalse
(
True
)
httplib
.
HTTPConnection
.
_callback
=
server_response
with
httmock
.
HTTMock
(
handler
):
self
.
assertRaises
(
slapos
.
slap
.
NotFoundError
,
self
.
slap
.
_connection_helper
.
getFullComputerInformation
,
None
)
...
...
@@ -254,12 +221,11 @@ class TestSlap(SlapMixin):
"""
self
.
slap
.
initializeConnection
(
self
.
server_url
)
def
server_response
(
self_httpconnection
,
path
,
method
,
body
,
header
):
def
handler
(
url
,
req
):
# Shouldn't even be called
self
.
assertFalse
(
True
)
httplib
.
HTTPConnection
.
_callback
=
server_response
with
httmock
.
HTTMock
(
handler
):
self
.
assertRaises
(
slapos
.
slap
.
NotFoundError
,
self
.
slap
.
registerComputerPartition
,
None
,
'PARTITION_01'
)
...
...
@@ -271,12 +237,11 @@ class TestSlap(SlapMixin):
"""
self
.
slap
.
initializeConnection
(
self
.
server_url
)
def
server_response
(
self_httpconnection
,
path
,
method
,
body
,
header
):
def
handler
(
url
,
req
):
# Shouldn't even be called
self
.
assertFalse
(
True
)
httplib
.
HTTPConnection
.
_callback
=
server_response
with
httmock
.
HTTMock
(
handler
):
self
.
assertRaises
(
slapos
.
slap
.
NotFoundError
,
self
.
slap
.
registerComputerPartition
,
self
.
_getTestComputerId
(),
None
)
...
...
@@ -288,12 +253,11 @@ class TestSlap(SlapMixin):
"""
self
.
slap
.
initializeConnection
(
self
.
server_url
)
def
server_response
(
self_httpconnection
,
path
,
method
,
body
,
header
):
def
handler
(
url
,
req
):
# Shouldn't even be called
self
.
assertFalse
(
True
)
httplib
.
HTTPConnection
.
_callback
=
server_response
with
httmock
.
HTTMock
(
handler
):
self
.
assertRaises
(
slapos
.
slap
.
NotFoundError
,
self
.
slap
.
registerComputerPartition
,
None
,
None
)
...
...
@@ -309,14 +273,16 @@ class TestSlap(SlapMixin):
software_product_reference
=
'random_reference'
software_release_url_list
=
[
'1'
,
'2'
]
def
server_response
(
self_httpconnection
,
path
,
method
,
body
,
header
):
parsed_url
=
urlparse
.
urlparse
(
path
.
lstrip
(
'/'
))
parsed_qs
=
urlparse
.
parse_qs
(
parsed_url
.
query
)
if
parsed_url
.
path
==
'getSoftwareReleaseListFromSoftwareProduct'
\
and
parsed_qs
==
{
'software_product_reference'
:
[
software_product_reference
]}:
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
software_release_url_list
))
httplib
.
HTTPConnection
.
_callback
=
server_response
def
handler
(
url
,
req
):
qs
=
urlparse
.
parse_qs
(
url
.
query
)
if
(
url
.
path
==
'/getSoftwareReleaseListFromSoftwareProduct'
and
qs
==
{
'software_product_reference'
:
[
software_product_reference
]}):
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
software_release_url_list
)
}
with
httmock
.
HTTMock
(
handler
):
self
.
assertEqual
(
self
.
slap
.
getSoftwareReleaseListFromSoftwareProduct
(
software_product_reference
=
software_product_reference
),
...
...
@@ -333,14 +299,16 @@ class TestSlap(SlapMixin):
software_release_url
=
'random_url'
software_release_url_list
=
[
'1'
,
'2'
]
def
server_response
(
self_httpconnection
,
path
,
method
,
body
,
header
):
parsed_url
=
urlparse
.
urlparse
(
path
.
lstrip
(
'/'
))
parsed_qs
=
urlparse
.
parse_qs
(
parsed_url
.
query
)
if
parsed_url
.
path
==
'getSoftwareReleaseListFromSoftwareProduct'
\
and
parsed_qs
==
{
'software_release_url'
:
[
software_release_url
]}:
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
software_release_url_list
))
httplib
.
HTTPConnection
.
_callback
=
server_response
def
handler
(
url
,
req
):
qs
=
urlparse
.
parse_qs
(
url
.
query
)
if
(
url
.
path
==
'/getSoftwareReleaseListFromSoftwareProduct'
and
qs
==
{
'software_release_url'
:
[
software_release_url
]}):
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
software_release_url_list
)
}
with
httmock
.
HTTMock
(
handler
):
self
.
assertEqual
(
self
.
slap
.
getSoftwareReleaseListFromSoftwareProduct
(
software_release_url
=
software_release_url
),
...
...
@@ -381,28 +349,33 @@ class TestComputer(SlapMixin):
slap
=
self
.
slap
slap
.
initializeConnection
(
self
.
server_url
)
def
server_response
(
self
,
path
,
method
,
body
,
header
):
parsed_url
=
urlparse
.
urlparse
(
path
.
lstrip
(
'/'
))
parsed_qs
=
urlparse
.
parse_qs
(
parsed_url
.
query
)
if
(
parsed_url
.
path
==
'registerComputerPartition'
and
'computer_reference'
in
parsed_qs
and
'computer_partition_reference'
in
parsed_qs
):
def
handler
(
url
,
req
):
qs
=
urlparse
.
parse_qs
(
url
.
query
)
if
(
url
.
path
==
'/registerComputerPartition'
and
'computer_reference'
in
qs
and
'computer_partition_reference'
in
qs
):
slap_partition
=
slapos
.
slap
.
ComputerPartition
(
parsed_qs
[
'computer_reference'
][
0
],
parsed_qs
[
'computer_partition_reference'
][
0
])
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
))
elif
(
parsed_url
.
path
==
'getFullComputerInformation'
and
'computer_id'
in
parsed_qs
):
slap_computer
=
slapos
.
slap
.
Computer
(
parsed_qs
[
'computer_id'
][
0
])
qs
[
'computer_reference'
][
0
],
qs
[
'computer_partition_reference'
][
0
])
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
)
}
elif
(
url
.
path
==
'/getFullComputerInformation'
and
'computer_id'
in
qs
):
slap_computer
=
slapos
.
slap
.
Computer
(
qs
[
'computer_id'
][
0
])
slap_computer
.
_software_release_list
=
[]
slap_computer
.
_computer_partition_list
=
[]
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_computer
))
elif
parsed_url
.
path
==
'requestComputerPartition'
:
return
(
408
,
{},
''
)
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_computer
)
}
elif
url
.
path
==
'/requestComputerPartition'
:
return
{
'status_code'
:
408
}
else
:
return
(
404
,
{},
''
)
httplib
.
HTTPConnection
.
_callback
=
server_response
return
{
'status_code'
:
404
}
with
httmock
.
HTTMock
(
handler
):
computer
=
self
.
slap
.
registerComputer
(
computer_guid
)
self
.
assertEqual
(
computer
.
getComputerPartitionList
(),
[])
...
...
@@ -413,12 +386,11 @@ class TestComputer(SlapMixin):
"""
self
.
slap
.
initializeConnection
(
self
.
server_url
)
def
server_response
(
self_httpconnection
,
path
,
method
,
body
,
header
):
def
handler
(
url
,
req
):
# Shouldn't even be called
self
.
assertFalse
(
True
)
httplib
.
HTTPConnection
.
_callback
=
server_response
with
httmock
.
HTTMock
(
handler
):
computer
=
self
.
slap
.
registerComputer
(
None
)
self
.
assertRaises
(
slapos
.
slap
.
NotFoundError
,
getattr
(
computer
,
computer_method
))
...
...
@@ -446,6 +418,31 @@ class TestComputer(SlapMixin):
partition_id
=
'PARTITION_01'
self
.
slap
=
slapos
.
slap
.
slap
()
self
.
slap
.
initializeConnection
(
self
.
server_url
)
def
handler
(
url
,
req
):
qs
=
urlparse
.
parse_qs
(
url
.
query
)
if
(
url
.
path
==
'/registerComputerPartition'
and
qs
==
{
'computer_reference'
:
[
self
.
computer_guid
],
'computer_partition_reference'
:
[
partition_id
]
}):
partition
=
slapos
.
slap
.
ComputerPartition
(
self
.
computer_guid
,
partition_id
)
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
partition
)
}
elif
(
url
.
path
==
'/getFullComputerInformation'
and
'computer_id'
in
qs
):
slap_computer
=
slapos
.
slap
.
Computer
(
qs
[
'computer_id'
][
0
])
slap_computer
.
_computer_partition_list
=
[]
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_computer
)
}
else
:
return
{
'status_code'
:
400
}
with
httmock
.
HTTMock
(
handler
):
self
.
computer
=
self
.
slap
.
registerComputer
(
self
.
computer_guid
)
self
.
partition
=
self
.
slap
.
registerComputerPartition
(
self
.
computer_guid
,
partition_id
)
...
...
@@ -504,31 +501,38 @@ class TestComputerPartition(SlapMixin):
def
test_request_sends_request
(
self
):
partition_id
=
'PARTITION_01'
def
server_response
(
self
,
path
,
method
,
body
,
header
):
parsed_url
=
urlparse
.
urlparse
(
path
.
lstrip
(
'/'
))
parsed_qs
=
urlparse
.
parse_qs
(
parsed_url
.
query
)
if
(
parsed_url
.
path
==
'registerComputerPartition'
and
'computer_reference'
in
parsed_qs
and
'computer_partition_reference'
in
parsed_qs
):
def
handler
(
url
,
req
):
qs
=
urlparse
.
parse_qs
(
url
.
query
)
if
(
url
.
path
==
'/registerComputerPartition'
and
'computer_reference'
in
qs
and
'computer_partition_reference'
in
qs
):
slap_partition
=
slapos
.
slap
.
ComputerPartition
(
parsed_qs
[
'computer_reference'
][
0
],
parsed_qs
[
'computer_partition_reference'
][
0
])
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
))
elif
(
parsed_url
.
path
==
'getComputerInformation'
and
'computer_id'
in
parsed_qs
):
slap_computer
=
slapos
.
slap
.
Computer
(
parsed_qs
[
'computer_id'
][
0
])
qs
[
'computer_reference'
][
0
],
qs
[
'computer_partition_reference'
][
0
])
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
)
}
elif
(
url
.
path
==
'/getComputerInformation'
and
'computer_id'
in
qs
):
slap_computer
=
slapos
.
slap
.
Computer
(
qs
[
'computer_id'
][
0
])
slap_computer
.
_software_release_list
=
[]
slap_partition
=
slapos
.
slap
.
ComputerPartition
(
parsed_
qs
[
'computer_id'
][
0
],
qs
[
'computer_id'
][
0
],
partition_id
)
slap_computer
.
_computer_partition_list
=
[
slap_partition
]
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_computer
))
elif
parsed_url
.
path
==
'requestComputerPartition'
:
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_computer
)
}
elif
url
.
path
==
'/requestComputerPartition'
:
raise
RequestWasCalled
else
:
return
(
404
,
{},
''
)
return
{
'status_code'
:
404
}
httplib
.
HTTPConnection
.
_callback
=
server_response
with
httmock
.
HTTMock
(
handler
):
self
.
computer_guid
=
self
.
_getTestComputerId
()
self
.
slap
=
slapos
.
slap
.
slap
()
self
.
slap
.
initializeConnection
(
self
.
server_url
)
...
...
@@ -542,34 +546,39 @@ class TestComputerPartition(SlapMixin):
def
test_request_not_raises
(
self
):
partition_id
=
'PARTITION_01'
def
server_response
(
self
,
path
,
method
,
body
,
header
):
parsed_url
=
urlparse
.
urlparse
(
path
.
lstrip
(
'/'
))
parsed_qs
=
urlparse
.
parse_qs
(
parsed_url
.
query
)
if
(
parsed_url
.
path
==
'registerComputerPartition'
and
'computer_reference'
in
parsed_qs
and
'computer_partition_reference'
in
parsed_qs
):
def
handler
(
url
,
req
):
qs
=
urlparse
.
parse_qs
(
url
.
query
)
if
(
url
.
path
==
'/registerComputerPartition'
and
'computer_reference'
in
qs
and
'computer_partition_reference'
in
qs
):
slap_partition
=
slapos
.
slap
.
ComputerPartition
(
parsed_qs
[
'computer_reference'
][
0
],
parsed_qs
[
'computer_partition_reference'
][
0
])
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
))
elif
(
parsed_url
.
path
==
'getComputerInformation'
and
'computer_id'
in
parsed_qs
):
slap_computer
=
slapos
.
slap
.
Computer
(
parsed_qs
[
'computer_id'
][
0
])
qs
[
'computer_reference'
][
0
],
qs
[
'computer_partition_reference'
][
0
])
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
)
}
elif
(
url
.
path
==
'/getComputerInformation'
and
'computer_id'
in
qs
):
slap_computer
=
slapos
.
slap
.
Computer
(
qs
[
'computer_id'
][
0
])
slap_computer
.
_software_release_list
=
[]
slap_partition
=
slapos
.
slap
.
ComputerPartition
(
parsed_
qs
[
'computer_id'
][
0
],
qs
[
'computer_id'
][
0
],
partition_id
)
slap_computer
.
_computer_partition_list
=
[
slap_partition
]
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_computer
))
elif
parsed_url
.
path
==
'requestComputerPartition'
:
return
(
408
,
{},
''
)
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_computer
)
}
elif
url
.
path
==
'/requestComputerPartition'
:
return
{
'status_code'
:
408
}
else
:
return
(
404
,
{},
''
)
return
{
'status_code'
:
404
}
httplib
.
HTTPConnection
.
_callback
=
server_response
self
.
computer_guid
=
self
.
_getTestComputerId
()
self
.
slap
=
slapos
.
slap
.
slap
()
self
.
slap
.
initializeConnection
(
self
.
server_url
)
with
httmock
.
HTTMock
(
handler
):
computer_partition
=
self
.
slap
.
registerComputerPartition
(
self
.
computer_guid
,
partition_id
)
requested_partition
=
computer_partition
.
request
(
...
...
@@ -581,34 +590,39 @@ class TestComputerPartition(SlapMixin):
def
test_request_raises_later
(
self
):
partition_id
=
'PARTITION_01'
def
server_response
(
self
,
path
,
method
,
body
,
header
):
parsed_url
=
urlparse
.
urlparse
(
path
.
lstrip
(
'/'
))
parsed_qs
=
urlparse
.
parse_qs
(
parsed_url
.
query
)
if
(
parsed_url
.
path
==
'registerComputerPartition'
and
'computer_reference'
in
parsed_qs
and
'computer_partition_reference'
in
parsed_qs
):
def
handler
(
url
,
req
):
qs
=
urlparse
.
parse_qs
(
url
.
query
)
if
(
url
.
path
==
'/registerComputerPartition'
and
'computer_reference'
in
qs
and
'computer_partition_reference'
in
qs
):
slap_partition
=
slapos
.
slap
.
ComputerPartition
(
parsed_qs
[
'computer_reference'
][
0
],
parsed_qs
[
'computer_partition_reference'
][
0
])
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
))
elif
(
parsed_url
.
path
==
'getComputerInformation'
and
'computer_id'
in
parsed_qs
):
slap_computer
=
slapos
.
slap
.
Computer
(
parsed_qs
[
'computer_id'
][
0
])
qs
[
'computer_reference'
][
0
],
qs
[
'computer_partition_reference'
][
0
])
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
)
}
elif
(
url
.
path
==
'/getComputerInformation'
and
'computer_id'
in
qs
):
slap_computer
=
slapos
.
slap
.
Computer
(
qs
[
'computer_id'
][
0
])
slap_computer
.
_software_release_list
=
[]
slap_partition
=
slapos
.
slap
.
ComputerPartition
(
parsed_
qs
[
'computer_id'
][
0
],
qs
[
'computer_id'
][
0
],
partition_id
)
slap_computer
.
_computer_partition_list
=
[
slap_partition
]
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_computer
))
elif
parsed_url
.
path
==
'requestComputerPartition'
:
return
(
408
,
{},
''
)
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_computer
)
}
elif
url
.
path
==
'/requestComputerPartition'
:
return
{
'status_code'
:
408
}
else
:
return
(
404
,
{},
''
)
return
{
'status_code'
:
404
}
httplib
.
HTTPConnection
.
_callback
=
server_response
self
.
computer_guid
=
self
.
_getTestComputerId
()
self
.
slap
=
slapos
.
slap
.
slap
()
self
.
slap
.
initializeConnection
(
self
.
server_url
)
with
httmock
.
HTTMock
(
handler
):
computer_partition
=
self
.
slap
.
registerComputerPartition
(
self
.
computer_guid
,
partition_id
)
requested_partition
=
computer_partition
.
request
(
...
...
@@ -625,36 +639,46 @@ class TestComputerPartition(SlapMixin):
requested_partition_id
=
'PARTITION_02'
computer_guid
=
self
.
_getTestComputerId
()
def
server_response
(
self
,
path
,
method
,
body
,
header
):
parsed_url
=
urlparse
.
urlparse
(
path
.
lstrip
(
'/'
))
parsed_qs
=
urlparse
.
parse_qs
(
parsed_url
.
query
)
if
(
parsed_url
.
path
==
'registerComputerPartition'
and
'computer_reference'
in
parsed_qs
and
'computer_partition_reference'
in
parsed_qs
):
def
handler
(
url
,
req
):
qs
=
urlparse
.
parse_qs
(
url
.
query
)
if
(
url
.
path
==
'/registerComputerPartition'
and
'computer_reference'
in
qs
and
'computer_partition_reference'
in
qs
):
slap_partition
=
slapos
.
slap
.
ComputerPartition
(
parsed_qs
[
'computer_reference'
][
0
],
parsed_qs
[
'computer_partition_reference'
][
0
])
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
))
elif
(
parsed_url
.
path
==
'getComputerInformation'
and
'computer_id'
in
parsed_qs
):
slap_computer
=
slapos
.
slap
.
Computer
(
parsed_qs
[
'computer_id'
][
0
])
qs
[
'computer_reference'
][
0
],
qs
[
'computer_partition_reference'
][
0
])
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
)
}
elif
(
url
.
path
==
'/getComputerInformation'
and
'computer_id'
in
qs
):
slap_computer
=
slapos
.
slap
.
Computer
(
qs
[
'computer_id'
][
0
])
slap_computer
.
_software_release_list
=
[]
slap_partition
=
slapos
.
slap
.
ComputerPartition
(
parsed_
qs
[
'computer_id'
][
0
],
qs
[
'computer_id'
][
0
],
partition_id
)
slap_computer
.
_computer_partition_list
=
[
slap_partition
]
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_computer
))
elif
parsed_url
.
path
==
'requestComputerPartition'
:
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_computer
)
}
elif
url
.
path
==
'/requestComputerPartition'
:
from
slapos.slap.slap
import
SoftwareInstance
slap_partition
=
SoftwareInstance
(
slap_computer_id
=
computer_guid
,
slap_computer_partition_id
=
requested_partition_id
)
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
))
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
)
}
else
:
return
(
404
,
{},
''
)
return
{
'status_code'
:
404
}
httplib
.
HTTPConnection
.
_callback
=
server_response
self
.
slap
=
slapos
.
slap
.
slap
()
self
.
slap
.
initializeConnection
(
self
.
server_url
)
with
httmock
.
HTTMock
(
handler
):
computer_partition
=
self
.
slap
.
registerComputerPartition
(
computer_guid
,
partition_id
)
requested_partition
=
computer_partition
.
request
(
...
...
@@ -676,19 +700,22 @@ class TestComputerPartition(SlapMixin):
slap
=
self
.
slap
slap
.
initializeConnection
(
self
.
server_url
)
def
server_response
(
self
,
path
,
method
,
body
,
header
):
parsed_url
=
urlparse
.
urlparse
(
path
.
lstrip
(
'/'
))
parsed_qs
=
urlparse
.
parse_qs
(
parsed_url
.
query
)
if
(
parsed_url
.
path
==
'registerComputerPartition'
and
parsed_qs
[
'computer_reference'
][
0
]
==
computer_guid
and
parsed_qs
[
'computer_partition_reference'
][
0
]
==
partition_id
):
def
handler
(
url
,
req
):
qs
=
urlparse
.
parse_qs
(
url
.
query
)
if
(
url
.
path
==
'/registerComputerPartition'
and
qs
[
'computer_reference'
][
0
]
==
computer_guid
and
qs
[
'computer_partition_reference'
][
0
]
==
partition_id
):
partition
=
slapos
.
slap
.
ComputerPartition
(
computer_guid
,
partition_id
)
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
partition
))
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
partition
)
}
else
:
return
(
404
,
{},
''
)
httplib
.
HTTPConnection
.
_callback
=
server_response
return
{
'status_code'
:
404
}
with
httmock
.
HTTMock
(
handler
):
computer_partition
=
self
.
slap
.
registerComputerPartition
(
computer_guid
,
partition_id
)
self
.
assertRaises
(
slapos
.
slap
.
NotFoundError
,
...
...
@@ -731,28 +758,31 @@ class TestComputerPartition(SlapMixin):
slap
=
self
.
slap
slap
.
initializeConnection
(
self
.
server_url
)
def
server_response
(
self
,
path
,
method
,
body
,
header
):
parsed_url
=
urlparse
.
urlparse
(
path
.
lstrip
(
'/'
))
parsed_qs
=
urlparse
.
parse_qs
(
parsed_url
.
query
)
if
(
parsed_url
.
path
==
'registerComputerPartition'
and
parsed_qs
[
'computer_reference'
][
0
]
==
computer_guid
and
parsed_qs
[
'computer_partition_reference'
][
0
]
==
partition_id
):
def
handler
(
url
,
req
):
qs
=
urlparse
.
parse_qs
(
url
.
query
)
if
(
url
.
path
==
'/registerComputerPartition'
and
qs
[
'computer_reference'
][
0
]
==
computer_guid
and
qs
[
'computer_partition_reference'
][
0
]
==
partition_id
):
partition
=
slapos
.
slap
.
ComputerPartition
(
computer_guid
,
partition_id
)
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
partition
))
elif
parsed_url
.
path
==
'softwareInstanceError'
:
parsed_qs_body
=
urlparse
.
parse_qs
(
body
)
return
{
'statu_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
partition
)
}
elif
url
.
path
==
'/softwareInstanceError'
:
parsed_qs_body
=
urlparse
.
parse_qs
(
req
.
body
)
# XXX: why do we have computer_id and not computer_reference?
# XXX: why do we have computer_partition_id and not
# computer_partition_reference?
if
(
parsed_qs_body
[
'computer_id'
][
0
]
==
computer_guid
and
parsed_qs_body
[
'computer_partition_id'
][
0
]
==
partition_id
and
parsed_qs_body
[
'error_log'
][
0
]
==
'some error'
):
return
(
200
,
{},
''
)
return
{
'status_code'
:
200
}
return
(
404
,
{},
''
)
httplib
.
HTTPConnection
.
_callback
=
server_response
return
{
'status_code'
:
404
}
with
httmock
.
HTTMock
(
handler
):
computer_partition
=
slap
.
registerComputerPartition
(
computer_guid
,
partition_id
)
# XXX: Interface does not define return value
...
...
@@ -800,18 +830,19 @@ class TestSoftwareRelease(SlapMixin):
slap
=
self
.
slap
slap
.
initializeConnection
(
self
.
server_url
)
def
server_response
(
self
,
path
,
method
,
body
,
header
):
parsed_url
=
urlparse
.
urlparse
(
path
.
lstrip
(
'/'
))
parsed_qs
=
urlparse
.
parse_qs
(
body
)
if
(
parsed_url
.
path
==
'softwareReleaseError'
and
parsed_qs
[
'computer_id'
][
0
]
==
computer_guid
and
parsed_qs
[
'url'
][
0
]
==
software_release_uri
and
parsed_qs
[
'error_log'
][
0
]
==
'some error'
):
return
(
200
,
{},
''
)
return
(
404
,
{},
''
)
def
handler
(
url
,
req
):
qs
=
urlparse
.
parse_qs
(
req
.
body
)
if
(
url
.
path
==
'/softwareReleaseError'
and
qs
[
'computer_id'
][
0
]
==
computer_guid
and
qs
[
'url'
][
0
]
==
software_release_uri
and
qs
[
'error_log'
][
0
]
==
'some error'
):
return
{
'status_code'
:
200
}
return
{
'status_code'
:
404
}
httplib
.
HTTPConnection
.
_callback
=
server_response
with
httmock
.
HTTMock
(
handler
):
software_release
=
self
.
slap
.
registerSoftwareRelease
(
software_release_uri
)
software_release
.
_computer_guid
=
computer_guid
software_release
.
error
(
'some error'
)
...
...
@@ -825,21 +856,28 @@ class TestOpenOrder(SlapMixin):
# XXX: Interface lack registerOpenOrder method declaration
open_order
=
self
.
slap
.
registerOpenOrder
()
def
server_response
(
self
,
path
,
method
,
body
,
header
):
parsed_url
=
urlparse
.
urlparse
(
path
.
lstrip
(
'/'
))
if
parsed_url
.
path
==
'requestComputerPartition'
:
def
handler
(
url
,
req
):
if
url
.
path
==
'/requestComputerPartition'
:
raise
RequestWasCalled
httplib
.
HTTPConnection
.
_callback
=
server_response
with
httmock
.
HTTMock
(
handler
):
self
.
assertRaises
(
RequestWasCalled
,
open_order
.
request
,
software_release_uri
,
'myrefe'
)
@
unittest
.
skip
(
'unclear what should be returned'
)
def
test_request_not_raises
(
self
):
software_release_uri
=
'http://server/new/'
+
self
.
_getTestComputerId
()
self
.
slap
=
slapos
.
slap
.
slap
()
self
.
slap
.
initializeConnection
(
self
.
server_url
)
# XXX: Interface lack registerOpenOrder method declaration
def
handler
(
url
,
req
):
if
url
.
path
==
'/requestComputerPartition'
:
pass
# XXX what to do here?
with
httmock
.
HTTMock
(
handler
):
open_order
=
self
.
slap
.
registerOpenOrder
()
computer_partition
=
open_order
.
request
(
software_release_uri
,
'myrefe'
)
self
.
assertIsInstance
(
computer_partition
,
slapos
.
slap
.
ComputerPartition
)
...
...
@@ -851,10 +889,10 @@ class TestOpenOrder(SlapMixin):
# XXX: Interface lack registerOpenOrder method declaration
open_order
=
self
.
slap
.
registerOpenOrder
()
def
server_response
(
self
,
path
,
method
,
body
,
header
):
return
(
408
,
{},
''
)
def
handler
(
url
,
req
):
return
{
'status_code'
:
408
}
httplib
.
HTTPConnection
.
_callback
=
server_response
with
httmock
.
HTTMock
(
handler
):
computer_partition
=
open_order
.
request
(
software_release_uri
,
'myrefe'
)
self
.
assertIsInstance
(
computer_partition
,
slapos
.
slap
.
ComputerPartition
)
...
...
@@ -870,15 +908,17 @@ class TestOpenOrder(SlapMixin):
computer_guid
=
self
.
_getTestComputerId
()
requested_partition_id
=
'PARTITION_01'
def
server_response
(
self
,
path
,
method
,
body
,
header
):
def
handler
(
url
,
req
):
from
slapos.slap.slap
import
SoftwareInstance
slap_partition
=
SoftwareInstance
(
slap_computer_id
=
computer_guid
,
slap_computer_partition_id
=
requested_partition_id
)
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
))
httplib
.
HTTPConnection
.
_callback
=
server_response
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
)
}
with
httmock
.
HTTMock
(
handler
):
computer_partition
=
open_order
.
request
(
software_release_uri
,
'myrefe'
)
self
.
assertIsInstance
(
computer_partition
,
slapos
.
slap
.
ComputerPartition
)
self
.
assertEqual
(
requested_partition_id
,
computer_partition
.
getId
())
...
...
@@ -894,16 +934,19 @@ class TestOpenOrder(SlapMixin):
computer_guid
=
self
.
_getTestComputerId
()
requested_partition_id
=
'PARTITION_01'
def
server_response
(
self
,
path
,
method
,
body
,
header
):
def
handler
(
url
,
req
):
from
slapos.slap.slap
import
SoftwareInstance
slap_partition
=
SoftwareInstance
(
_connection_dict
=
{
"url"
:
'URL_CONNECTION_PARAMETER'
},
slap_computer_id
=
computer_guid
,
slap_computer_partition_id
=
requested_partition_id
)
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
))
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
)
}
httplib
.
HTTPConnection
.
_callback
=
server_response
with
httmock
.
HTTMock
(
handler
):
computer_partition
=
open_order
.
request
(
software_release_uri
,
'myrefe'
)
self
.
assertIsInstance
(
computer_partition
,
slapos
.
slap
.
ComputerPartition
)
self
.
assertEqual
(
requested_partition_id
,
computer_partition
.
getId
())
...
...
@@ -921,7 +964,7 @@ class TestOpenOrder(SlapMixin):
computer_guid
=
self
.
_getTestComputerId
()
requested_partition_id
=
'PARTITION_01'
def
server_response
(
self
,
path
,
method
,
body
,
header
):
def
handler
(
url
,
req
):
from
slapos.slap.slap
import
SoftwareInstance
slap_partition
=
SoftwareInstance
(
connection_xml
=
"""<?xml version='1.0' encoding='utf-8'?>
...
...
@@ -930,10 +973,12 @@ class TestOpenOrder(SlapMixin):
</instance>"""
,
slap_computer_id
=
computer_guid
,
slap_computer_partition_id
=
requested_partition_id
)
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
))
httplib
.
HTTPConnection
.
_callback
=
server_response
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_partition
)
}
with
httmock
.
HTTMock
(
handler
):
computer_partition
=
open_order
.
request
(
software_release_uri
,
'myrefe'
)
self
.
assertIsInstance
(
computer_partition
,
slapos
.
slap
.
ComputerPartition
)
self
.
assertEqual
(
requested_partition_id
,
computer_partition
.
getId
())
...
...
slapos/tests/slapgrid.py
View file @
11e60887
...
...
@@ -26,7 +26,6 @@
##############################################################################
from
__future__
import
absolute_import
import
httplib
import
logging
import
os
import
random
...
...
@@ -53,6 +52,8 @@ from slapos.grid import SlapObject
from
slapos.grid.SlapObject
import
WATCHDOG_MARK
import
slapos.grid.SlapObject
import
httmock
dummylogger
=
logging
.
getLogger
()
...
...
@@ -99,7 +100,8 @@ touch worked
"""
class
BasicMixin
:
class
BasicMixin
(
object
):
def
setUp
(
self
):
self
.
_tempdir
=
tempfile
.
mkdtemp
()
self
.
software_root
=
os
.
path
.
join
(
self
.
_tempdir
,
'software'
)
...
...
@@ -227,6 +229,7 @@ class TestBasicSlapgridCP(BasicMixin, unittest.TestCase):
os
.
mkdir
(
self
.
software_root
)
self
.
assertRaises
(
OSError
,
self
.
grid
.
processComputerPartitionList
)
@
unittest
.
skip
(
'which request handler here?'
)
def
test_no_master
(
self
):
os
.
mkdir
(
self
.
software_root
)
os
.
mkdir
(
self
.
instance_root
)
...
...
@@ -235,23 +238,6 @@ class TestBasicSlapgridCP(BasicMixin, unittest.TestCase):
class
MasterMixin
(
BasicMixin
):
def
_patchHttplib
(
self
):
"""Overrides httplib"""
import
slapos.tests.slapmock.httplib
self
.
saved_httplib
=
{}
for
fake
in
vars
(
slapos
.
tests
.
slapmock
.
httplib
):
self
.
saved_httplib
[
fake
]
=
getattr
(
httplib
,
fake
,
None
)
setattr
(
httplib
,
fake
,
getattr
(
slapos
.
tests
.
slapmock
.
httplib
,
fake
))
def
_unpatchHttplib
(
self
):
"""Restores httplib overriding"""
import
httplib
for
name
,
original_value
in
self
.
saved_httplib
.
items
():
setattr
(
httplib
,
name
,
original_value
)
del
self
.
saved_httplib
def
_mock_sleep
(
self
):
self
.
fake_waiting_time
=
None
self
.
real_sleep
=
time
.
sleep
...
...
@@ -267,17 +253,15 @@ class MasterMixin(BasicMixin):
time
.
sleep
=
self
.
real_sleep
def
setUp
(
self
):
self
.
_patchHttplib
()
self
.
_mock_sleep
()
BasicMixin
.
setUp
(
self
)
def
tearDown
(
self
):
self
.
_unpatchHttplib
()
self
.
_unmock_sleep
()
BasicMixin
.
tearDown
(
self
)
class
ComputerForTest
:
class
ComputerForTest
(
object
)
:
"""
Class to set up environment for tests setting instance, software
and server response
...
...
@@ -301,7 +285,76 @@ class ComputerForTest:
os
.
mkdir
(
self
.
software_root
)
self
.
setSoftwares
()
self
.
setInstances
()
self
.
setServerResponse
()
def
request_handler
(
self
,
url
,
req
):
"""
Define _callback.
Will register global sequence of message, sequence by partition
and error and error message by partition
"""
self
.
sequence
.
append
(
url
.
path
)
if
req
.
method
==
'GET'
:
qs
=
urlparse
.
parse_qs
(
url
.
query
)
else
:
qs
=
urlparse
.
parse_qs
(
req
.
body
)
if
(
url
.
path
==
'/getFullComputerInformation'
and
'computer_id'
in
qs
):
slap_computer
=
self
.
getComputer
(
qs
[
'computer_id'
][
0
])
return
{
'status_code'
:
200
,
'content'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_computer
)
}
if
req
.
method
==
'POST'
and
'computer_partition_id'
in
qs
:
instance
=
self
.
instance_list
[
int
(
qs
[
'computer_partition_id'
][
0
])]
instance
.
sequence
.
append
(
url
.
path
)
instance
.
header_list
.
append
(
req
.
headers
)
if
url
.
path
==
'/availableComputerPartition'
:
return
{
'status_code'
:
200
}
if
url
.
path
==
'/startedComputerPartition'
:
instance
.
state
=
'started'
return
{
'status_code'
:
200
}
if
url
.
path
==
'/stoppedComputerPartition'
:
instance
.
state
=
'stopped'
return
{
'status_code'
:
200
}
if
url
.
path
==
'/destroyedComputerPartition'
:
instance
.
state
=
'destroyed'
return
{
'status_code'
:
200
}
if
url
.
path
==
'/softwareInstanceBang'
:
return
{
'status_code'
:
200
}
if
url
.
path
==
'/softwareInstanceError'
:
instance
.
error_log
=
'
\
n
'
.
join
(
[
line
for
line
in
qs
[
'error_log'
][
0
].
splitlines
()
if
'dropPrivileges'
not
in
line
]
)
instance
.
error
=
True
return
{
'status_code'
:
200
}
elif
req
.
method
==
'POST'
and
'url'
in
qs
:
# XXX hardcoded to first software release!
software
=
self
.
software_list
[
0
]
software
.
sequence
.
append
(
url
.
path
)
if
url
.
path
==
'/buildingSoftwareRelease'
:
return
{
'status_code'
:
200
}
if
url
.
path
==
'/softwareReleaseError'
:
software
.
error_log
=
'
\
n
'
.
join
(
[
line
for
line
in
qs
[
'error_log'
][
0
].
splitlines
()
if
'dropPrivileges'
not
in
line
]
)
software
.
error
=
True
return
{
'status_code'
:
200
}
else
:
return
{
'status_code'
:
500
}
def
setSoftwares
(
self
):
"""
...
...
@@ -341,78 +394,9 @@ class ComputerForTest:
]
return
slap_computer
def
setServerResponse
(
self
):
httplib
.
HTTPConnection
.
_callback
=
self
.
getServerResponse
()
httplib
.
HTTPSConnection
.
_callback
=
self
.
getServerResponse
()
def
getServerResponse
(
self
):
"""
Define _callback.
Will register global sequence of message, sequence by partition
and error and error message by partition
"""
def
server_response
(
self_httplib
,
path
,
method
,
body
,
header
):
parsed_url
=
urlparse
.
urlparse
(
path
.
lstrip
(
'/'
))
self
.
sequence
.
append
(
parsed_url
.
path
)
if
method
==
'GET'
:
parsed_qs
=
urlparse
.
parse_qs
(
parsed_url
.
query
)
else
:
parsed_qs
=
urlparse
.
parse_qs
(
body
)
if
(
parsed_url
.
path
==
'getFullComputerInformation'
and
'computer_id'
in
parsed_qs
):
slap_computer
=
self
.
getComputer
(
parsed_qs
[
'computer_id'
][
0
])
return
(
200
,
{},
xml_marshaller
.
xml_marshaller
.
dumps
(
slap_computer
))
if
method
==
'POST'
and
'computer_partition_id'
in
parsed_qs
:
instance
=
self
.
instance_list
[
int
(
parsed_qs
[
'computer_partition_id'
][
0
])]
instance
.
sequence
.
append
(
parsed_url
.
path
)
instance
.
header_list
.
append
(
header
)
if
parsed_url
.
path
==
'availableComputerPartition'
:
return
(
200
,
{},
''
)
if
parsed_url
.
path
==
'startedComputerPartition'
:
instance
.
state
=
'started'
return
(
200
,
{},
''
)
if
parsed_url
.
path
==
'stoppedComputerPartition'
:
instance
.
state
=
'stopped'
return
(
200
,
{},
''
)
if
parsed_url
.
path
==
'destroyedComputerPartition'
:
instance
.
state
=
'destroyed'
return
(
200
,
{},
''
)
if
parsed_url
.
path
==
'softwareInstanceBang'
:
return
(
200
,
{},
''
)
if
parsed_url
.
path
==
'softwareInstanceError'
:
instance
.
error_log
=
'
\
n
'
.
join
(
[
line
for
line
in
parsed_qs
[
'error_log'
][
0
].
splitlines
()
if
'dropPrivileges'
not
in
line
]
)
instance
.
error
=
True
return
(
200
,
{},
''
)
elif
method
==
'POST'
and
'url'
in
parsed_qs
:
# XXX hardcoded to first software release!
software
=
self
.
software_list
[
0
]
software
.
sequence
.
append
(
parsed_url
.
path
)
if
parsed_url
.
path
==
'buildingSoftwareRelease'
:
return
(
200
,
{},
''
)
if
parsed_url
.
path
==
'softwareReleaseError'
:
software
.
error_log
=
'
\
n
'
.
join
(
[
line
for
line
in
parsed_qs
[
'error_log'
][
0
].
splitlines
()
if
'dropPrivileges'
not
in
line
]
)
software
.
error
=
True
return
(
200
,
{},
''
)
else
:
return
(
500
,
{},
''
)
return
server_response
class
InstanceForTest
:
class
InstanceForTest
(
object
):
"""
Class containing all needed paramaters and function to simulate instances
"""
...
...
@@ -479,7 +463,7 @@ class InstanceForTest:
open
(
self
.
key_file
,
'w'
).
write
(
self
.
key
)
class
SoftwareForTest
:
class
SoftwareForTest
(
object
)
:
"""
Class to prepare and simulate software.
each instance has a sotfware attributed
...
...
@@ -533,9 +517,8 @@ touch worked"""):
class
TestSlapgridCPWithMaster
(
MasterMixin
,
unittest
.
TestCase
):
def
test_nothing_to_do
(
self
):
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
,
0
,
0
)
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
,
0
,
0
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
self
.
assertEqual
(
self
.
grid
.
processComputerPartitionList
(),
slapgrid
.
SLAPGRID_SUCCESS
)
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
instance_root
),
[
'etc'
,
'var'
])
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
software_root
),
[])
...
...
@@ -544,6 +527,7 @@ class TestSlapgridCPWithMaster(MasterMixin, unittest.TestCase):
def
test_one_partition
(
self
):
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
self
.
assertEqual
(
self
.
grid
.
processComputerPartitionList
(),
slapgrid
.
SLAPGRID_SUCCESS
)
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
instance_root
),
[
'0'
,
'etc'
,
'var'
])
...
...
@@ -552,8 +536,8 @@ class TestSlapgridCPWithMaster(MasterMixin, unittest.TestCase):
'software_release'
,
'worked'
,
'.slapos-retention-lock-delay'
])
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
software_root
),
[
instance
.
software
.
software_hash
])
self
.
assertEqual
(
computer
.
sequence
,
[
'getFullComputerInformation'
,
'
availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/getFullComputerInformation'
,
'/
availableComputerPartition'
,
'/
stoppedComputerPartition'
])
def
test_one_partition_instance_cfg
(
self
):
"""
...
...
@@ -561,6 +545,7 @@ class TestSlapgridCPWithMaster(MasterMixin, unittest.TestCase):
"template.cfg" but "instance.cfg".
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
self
.
assertEqual
(
self
.
grid
.
processComputerPartitionList
(),
slapgrid
.
SLAPGRID_SUCCESS
)
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
instance_root
),
[
'0'
,
'etc'
,
'var'
])
...
...
@@ -569,16 +554,17 @@ class TestSlapgridCPWithMaster(MasterMixin, unittest.TestCase):
'software_release'
,
'worked'
,
'.slapos-retention-lock-delay'
])
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
software_root
),
[
instance
.
software
.
software_hash
])
self
.
assertEqual
(
computer
.
sequence
,
[
'getFullComputerInformation'
,
'
availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/getFullComputerInformation'
,
'/
availableComputerPartition'
,
'/
stoppedComputerPartition'
])
def
test_one_free_partition
(
self
):
"""
Test if slapgrid cp do
n'
t process "free" partition
Test if slapgrid cp do
es no
t process "free" partition
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
,
software_amount
=
0
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
partition
=
computer
.
instance_list
[
0
]
partition
.
requested_state
=
'destroyed'
self
.
assertEqual
(
self
.
grid
.
processComputerPartitionList
(),
slapgrid
.
SLAPGRID_SUCCESS
)
...
...
@@ -589,6 +575,7 @@ class TestSlapgridCPWithMaster(MasterMixin, unittest.TestCase):
def
test_one_partition_started
(
self
):
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
partition
=
computer
.
instance_list
[
0
]
partition
.
requested_state
=
'started'
partition
.
software
.
setBuildout
(
WRAPPER_CONTENT
)
...
...
@@ -601,12 +588,13 @@ class TestSlapgridCPWithMaster(MasterMixin, unittest.TestCase):
self
.
assertLogContent
(
wrapper_log
,
'Working'
)
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
software_root
),
[
partition
.
software
.
software_hash
])
self
.
assertEqual
(
computer
.
sequence
,
[
'getFullComputerInformation'
,
'
availableComputerPartition'
,
'
startedComputerPartition'
])
[
'/getFullComputerInformation'
,
'/
availableComputerPartition'
,
'/
startedComputerPartition'
])
self
.
assertEqual
(
partition
.
state
,
'started'
)
def
test_one_partition_started_stopped
(
self
):
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
instance
.
requested_state
=
'started'
...
...
@@ -637,8 +625,8 @@ chmod 755 etc/run/wrapper
self
.
assertLogContent
(
wrapper_log
,
'Working'
)
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
software_root
),
[
instance
.
software
.
software_hash
])
self
.
assertEqual
(
computer
.
sequence
,
[
'getFullComputerInformation'
,
'
availableComputerPartition'
,
'
startedComputerPartition'
])
[
'/getFullComputerInformation'
,
'/
availableComputerPartition'
,
'/
startedComputerPartition'
])
self
.
assertEqual
(
instance
.
state
,
'started'
)
computer
.
sequence
=
[]
...
...
@@ -650,8 +638,8 @@ chmod 755 etc/run/wrapper
'etc'
,
'software_release'
,
'worked'
,
'.slapos-retention-lock-delay'
])
self
.
assertLogContent
(
wrapper_log
,
'Signal handler called with signal 15'
)
self
.
assertEqual
(
computer
.
sequence
,
[
'getFullComputerInformation'
,
'
availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/getFullComputerInformation'
,
'/
availableComputerPartition'
,
'/
stoppedComputerPartition'
])
self
.
assertEqual
(
instance
.
state
,
'stopped'
)
def
test_one_broken_partition_stopped
(
self
):
...
...
@@ -661,6 +649,7 @@ chmod 755 etc/run/wrapper
to run) but status is still started.
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
instance
.
requested_state
=
'started'
...
...
@@ -692,8 +681,8 @@ chmod 755 etc/run/wrapper
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
software_root
),
[
instance
.
software
.
software_hash
])
self
.
assertEqual
(
computer
.
sequence
,
[
'getFullComputerInformation'
,
'
availableComputerPartition'
,
'
startedComputerPartition'
])
[
'/getFullComputerInformation'
,
'/
availableComputerPartition'
,
'/
startedComputerPartition'
])
self
.
assertEqual
(
instance
.
state
,
'started'
)
computer
.
sequence
=
[]
...
...
@@ -709,12 +698,13 @@ exit 1
'etc'
,
'software_release'
,
'worked'
,
'.slapos-retention-lock-delay'
])
self
.
assertLogContent
(
wrapper_log
,
'Signal handler called with signal 15'
)
self
.
assertEqual
(
computer
.
sequence
,
[
'
getFullComputerInformation'
,
'
softwareInstanceError'
])
[
'/
getFullComputerInformation'
,
'/
softwareInstanceError'
])
self
.
assertEqual
(
instance
.
state
,
'started'
)
def
test_one_partition_stopped_started
(
self
):
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
instance
.
requested_state
=
'stopped'
instance
.
software
.
setBuildout
(
WRAPPER_CONTENT
)
...
...
@@ -727,8 +717,8 @@ exit 1
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
software_root
),
[
instance
.
software
.
software_hash
])
self
.
assertEqual
(
computer
.
sequence
,
[
'getFullComputerInformation'
,
'
availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/getFullComputerInformation'
,
'/
availableComputerPartition'
,
'/
stoppedComputerPartition'
])
self
.
assertEqual
(
'stopped'
,
instance
.
state
)
instance
.
requested_state
=
'started'
...
...
@@ -744,8 +734,8 @@ exit 1
wrapper_log
=
os
.
path
.
join
(
instance
.
partition_path
,
'.0_wrapper.log'
)
self
.
assertLogContent
(
wrapper_log
,
'Working'
)
self
.
assertEqual
(
computer
.
sequence
,
[
'getFullComputerInformation'
,
'
availableComputerPartition'
,
'
startedComputerPartition'
])
[
'/getFullComputerInformation'
,
'/
availableComputerPartition'
,
'/
startedComputerPartition'
])
self
.
assertEqual
(
'started'
,
instance
.
state
)
def
test_one_partition_destroyed
(
self
):
...
...
@@ -754,6 +744,7 @@ exit 1
stopped by slapgrid-cp, not processed
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
instance
.
requested_state
=
'destroyed'
...
...
@@ -768,8 +759,8 @@ exit 1
self
.
assertItemsEqual
(
os
.
listdir
(
partition
),
[
'.slapgrid'
,
dummy_file_name
])
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
software_root
),
[
instance
.
software
.
software_hash
])
self
.
assertEqual
(
computer
.
sequence
,
[
'
getFullComputerInformation'
,
'
stoppedComputerPartition'
])
[
'/
getFullComputerInformation'
,
'/
stoppedComputerPartition'
])
self
.
assertEqual
(
'stopped'
,
instance
.
state
)
...
...
@@ -802,6 +793,7 @@ class TestSlapgridCPWithMasterWatchdog(MasterMixin, unittest.TestCase):
5.Wait for file generated by monkeypacthed bang to appear
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
partition
=
computer
.
instance_list
[
0
]
partition
.
requested_state
=
'started'
partition
.
software
.
setBuildout
(
DAEMON_CONTENT
)
...
...
@@ -829,6 +821,7 @@ class TestSlapgridCPWithMasterWatchdog(MasterMixin, unittest.TestCase):
5.Check that file generated by monkeypacthed bang do not appear
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
partition
=
computer
.
instance_list
[
0
]
partition
.
requested_state
=
'started'
...
...
@@ -868,6 +861,7 @@ class TestSlapgridCPWithMasterWatchdog(MasterMixin, unittest.TestCase):
(ie: watchdog id in process name)
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
certificate_repository_path
=
os
.
path
.
join
(
self
.
_tempdir
,
'partition_pki'
)
instance
.
setCertificate
(
certificate_repository_path
)
...
...
@@ -884,9 +878,7 @@ class TestSlapgridCPWithMasterWatchdog(MasterMixin, unittest.TestCase):
payload
=
'processname:%s groupname:%s from_state:RUNNING'
%
(
'daemon'
+
WATCHDOG_MARK
,
instance
.
name
)
watchdog
.
handle_event
(
headers
,
payload
)
self
.
assertEqual
(
instance
.
sequence
,
[
'softwareInstanceBang'
])
self
.
assertEqual
(
instance
.
header_list
[
0
][
'key'
],
instance
.
key
)
self
.
assertEqual
(
instance
.
header_list
[
0
][
'certificate'
],
instance
.
certificate
)
self
.
assertEqual
(
instance
.
sequence
,
[
'/softwareInstanceBang'
])
def
test_unwanted_events_will_not_bang
(
self
):
"""
...
...
@@ -939,6 +931,7 @@ class TestSlapgridCPWithMasterWatchdog(MasterMixin, unittest.TestCase):
.timestamp file.
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
certificate_repository_path
=
os
.
path
.
join
(
self
.
_tempdir
,
'partition_pki'
)
instance
.
setCertificate
(
certificate_repository_path
)
...
...
@@ -961,9 +954,7 @@ class TestSlapgridCPWithMasterWatchdog(MasterMixin, unittest.TestCase):
payload
=
'processname:%s groupname:%s from_state:RUNNING'
%
(
'daemon'
+
WATCHDOG_MARK
,
instance
.
name
)
watchdog
.
handle_event
(
headers
,
payload
)
self
.
assertEqual
(
instance
.
sequence
,
[
'softwareInstanceBang'
])
self
.
assertEqual
(
instance
.
header_list
[
0
][
'key'
],
instance
.
key
)
self
.
assertEqual
(
instance
.
header_list
[
0
][
'certificate'
],
instance
.
certificate
)
self
.
assertEqual
(
instance
.
sequence
,
[
'/softwareInstanceBang'
])
self
.
assertEqual
(
open
(
os
.
path
.
join
(
partition
,
slapos
.
grid
.
slapgrid
.
COMPUTER_PARTITION_LATEST_BANG_TIMESTAMP_FILENAME
)).
read
(),
timestamp_content
)
...
...
@@ -976,6 +967,7 @@ class TestSlapgridCPWithMasterWatchdog(MasterMixin, unittest.TestCase):
Practically speaking, .timestamp file in the partition does not exsit.
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
certificate_repository_path
=
os
.
path
.
join
(
self
.
_tempdir
,
'partition_pki'
)
instance
.
setCertificate
(
certificate_repository_path
)
...
...
@@ -995,9 +987,7 @@ class TestSlapgridCPWithMasterWatchdog(MasterMixin, unittest.TestCase):
payload
=
'processname:%s groupname:%s from_state:RUNNING'
%
(
'daemon'
+
WATCHDOG_MARK
,
instance
.
name
)
watchdog
.
handle_event
(
headers
,
payload
)
self
.
assertEqual
(
instance
.
sequence
,
[
'softwareInstanceBang'
])
self
.
assertEqual
(
instance
.
header_list
[
0
][
'key'
],
instance
.
key
)
self
.
assertEqual
(
instance
.
header_list
[
0
][
'certificate'
],
instance
.
certificate
)
self
.
assertEqual
(
instance
.
sequence
,
[
'/softwareInstanceBang'
])
self
.
assertNotEqual
(
open
(
os
.
path
.
join
(
partition
,
slapos
.
grid
.
slapgrid
.
COMPUTER_PARTITION_LATEST_BANG_TIMESTAMP_FILENAME
)).
read
(),
timestamp_content
)
...
...
@@ -1010,6 +1000,7 @@ class TestSlapgridCPWithMasterWatchdog(MasterMixin, unittest.TestCase):
* subsequent bangs are ignored until a deployment is successful.
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
certificate_repository_path
=
os
.
path
.
join
(
self
.
_tempdir
,
'partition_pki'
)
instance
.
setCertificate
(
certificate_repository_path
)
...
...
@@ -1029,9 +1020,7 @@ class TestSlapgridCPWithMasterWatchdog(MasterMixin, unittest.TestCase):
payload
=
'processname:%s groupname:%s from_state:RUNNING'
%
(
'daemon'
+
WATCHDOG_MARK
,
instance
.
name
)
watchdog
.
handle_event
(
headers
,
payload
)
self
.
assertEqual
(
instance
.
sequence
,
[
'softwareInstanceBang'
])
self
.
assertEqual
(
instance
.
header_list
[
0
][
'key'
],
instance
.
key
)
self
.
assertEqual
(
instance
.
header_list
[
0
][
'certificate'
],
instance
.
certificate
)
self
.
assertEqual
(
instance
.
sequence
,
[
'/softwareInstanceBang'
])
# Second bang
event
=
watchdog
.
process_state_events
[
0
]
...
...
@@ -1061,6 +1050,7 @@ class TestSlapgridCPWithMasterWatchdog(MasterMixin, unittest.TestCase):
* The process crashes again, watchdog ignroes it
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
certificate_repository_path
=
os
.
path
.
join
(
self
.
_tempdir
,
'partition_pki'
)
instance
.
setCertificate
(
certificate_repository_path
)
...
...
@@ -1084,9 +1074,7 @@ class TestSlapgridCPWithMasterWatchdog(MasterMixin, unittest.TestCase):
payload
=
'processname:%s groupname:%s from_state:RUNNING'
%
(
'daemon'
+
WATCHDOG_MARK
,
instance
.
name
)
watchdog
.
handle_event
(
headers
,
payload
)
self
.
assertEqual
(
instance
.
sequence
,
[
'softwareInstanceBang'
])
self
.
assertEqual
(
instance
.
header_list
[
0
][
'key'
],
instance
.
key
)
self
.
assertEqual
(
instance
.
header_list
[
0
][
'certificate'
],
instance
.
certificate
)
self
.
assertEqual
(
instance
.
sequence
,
[
'/softwareInstanceBang'
])
self
.
assertEqual
(
open
(
os
.
path
.
join
(
partition
,
slapos
.
grid
.
slapgrid
.
COMPUTER_PARTITION_LATEST_BANG_TIMESTAMP_FILENAME
)).
read
(),
timestamp_content
)
...
...
@@ -1114,9 +1102,7 @@ class TestSlapgridCPWithMasterWatchdog(MasterMixin, unittest.TestCase):
payload
=
'processname:%s groupname:%s from_state:RUNNING'
%
(
'daemon'
+
WATCHDOG_MARK
,
instance
.
name
)
watchdog
.
handle_event
(
headers
,
payload
)
self
.
assertEqual
(
instance
.
sequence
,
[
'softwareInstanceBang'
])
self
.
assertEqual
(
instance
.
header_list
[
0
][
'key'
],
instance
.
key
)
self
.
assertEqual
(
instance
.
header_list
[
0
][
'certificate'
],
instance
.
certificate
)
self
.
assertEqual
(
instance
.
sequence
,
[
'/softwareInstanceBang'
])
self
.
assertEqual
(
open
(
os
.
path
.
join
(
partition
,
slapos
.
grid
.
slapgrid
.
COMPUTER_PARTITION_LATEST_BANG_TIMESTAMP_FILENAME
)).
read
(),
timestamp_content
)
...
...
@@ -1134,6 +1120,7 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
def
test_partition_timestamp
(
self
):
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
timestamp
=
str
(
int
(
time
.
time
()))
instance
.
timestamp
=
timestamp
...
...
@@ -1149,10 +1136,11 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
self
.
assertEqual
(
self
.
grid
.
processComputerPartitionList
(),
slapgrid
.
SLAPGRID_SUCCESS
)
self
.
assertIn
(
timestamp
,
open
(
timestamp_path
).
read
())
self
.
assertEqual
(
instance
.
sequence
,
[
'availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
])
def
test_partition_timestamp_develop
(
self
):
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
timestamp
=
str
(
int
(
time
.
time
()))
instance
.
timestamp
=
timestamp
...
...
@@ -1170,11 +1158,12 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
self
.
assertEqual
(
self
.
launchSlapgrid
(),
slapgrid
.
SLAPGRID_SUCCESS
)
self
.
assertEqual
(
instance
.
sequence
,
[
'availableComputerPartition'
,
'
stoppedComputerPartition'
,
'availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
,
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
])
def
test_partition_old_timestamp
(
self
):
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
timestamp
=
str
(
int
(
time
.
time
()))
instance
.
timestamp
=
timestamp
...
...
@@ -1188,10 +1177,11 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
instance
.
timestamp
=
str
(
int
(
timestamp
)
-
1
)
self
.
assertEqual
(
self
.
launchSlapgrid
(),
slapgrid
.
SLAPGRID_SUCCESS
)
self
.
assertEqual
(
instance
.
sequence
,
[
'availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
])
def
test_partition_timestamp_new_timestamp
(
self
):
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
timestamp
=
str
(
int
(
time
.
time
()))
instance
.
timestamp
=
timestamp
...
...
@@ -1206,13 +1196,14 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
self
.
assertEqual
(
self
.
launchSlapgrid
(),
slapgrid
.
SLAPGRID_SUCCESS
)
self
.
assertEqual
(
self
.
launchSlapgrid
(),
slapgrid
.
SLAPGRID_SUCCESS
)
self
.
assertEqual
(
computer
.
sequence
,
[
'getFullComputerInformation'
,
'
availableComputerPartition'
,
'stoppedComputerPartition'
,
'
getFullComputerInformation'
,
'availableComputerPartition'
,
'
stoppedComputerPartition'
,
'
getFullComputerInformation'
])
[
'/getFullComputerInformation'
,
'/
availableComputerPartition'
,
'/stoppedComputerPartition'
,
'/
getFullComputerInformation'
,
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
,
'/
getFullComputerInformation'
])
def
test_partition_timestamp_no_timestamp
(
self
):
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
timestamp
=
str
(
int
(
time
.
time
()))
instance
.
timestamp
=
timestamp
...
...
@@ -1227,9 +1218,9 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
instance
.
timestamp
=
None
self
.
launchSlapgrid
()
self
.
assertEqual
(
computer
.
sequence
,
[
'getFullComputerInformation'
,
'
availableComputerPartition'
,
'stoppedComputerPartition'
,
'
getFullComputerInformation'
,
'availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/getFullComputerInformation'
,
'/
availableComputerPartition'
,
'/stoppedComputerPartition'
,
'/
getFullComputerInformation'
,
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
])
def
test_partition_periodicity_remove_timestamp
(
self
):
"""
...
...
@@ -1237,6 +1228,7 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
removes the .timestamp file.
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
timestamp
=
str
(
int
(
time
.
time
()))
...
...
@@ -1274,6 +1266,7 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
5. We check that modification time of .timestamp was modified
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
,
20
,
20
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance0
=
computer
.
instance_list
[
0
]
timestamp
=
str
(
int
(
time
.
time
()
-
5
))
instance0
.
timestamp
=
timestamp
...
...
@@ -1293,16 +1286,16 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
time
.
sleep
(
wanted_periodicity
+
1
)
for
instance
in
computer
.
instance_list
[
1
:]:
self
.
assertEqual
(
instance
.
sequence
,
[
'availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
])
time
.
sleep
(
1
)
self
.
launchSlapgrid
()
self
.
assertEqual
(
instance0
.
sequence
,
[
'availableComputerPartition'
,
'
startedComputerPartition'
,
'availableComputerPartition'
,
'
startedComputerPartition'
,
[
'/availableComputerPartition'
,
'/
startedComputerPartition'
,
'/availableComputerPartition'
,
'/
startedComputerPartition'
,
])
for
instance
in
computer
.
instance_list
[
1
:]:
self
.
assertEqual
(
instance
.
sequence
,
[
'availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
])
self
.
assertGreater
(
os
.
path
.
getmtime
(
os
.
path
.
join
(
instance0
.
partition_path
,
'.timestamp'
)),
last_runtime
)
...
...
@@ -1314,6 +1307,7 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
started.
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
,
20
,
20
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance0
=
computer
.
instance_list
[
0
]
timestamp
=
str
(
int
(
time
.
time
()
-
5
))
instance0
.
timestamp
=
timestamp
...
...
@@ -1332,15 +1326,15 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
time
.
sleep
(
wanted_periodicity
+
1
)
for
instance
in
computer
.
instance_list
[
1
:]:
self
.
assertEqual
(
instance
.
sequence
,
[
'availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
])
time
.
sleep
(
1
)
self
.
launchSlapgrid
()
self
.
assertEqual
(
instance0
.
sequence
,
[
'availableComputerPartition'
,
'
stoppedComputerPartition'
,
'availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
,
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
])
for
instance
in
computer
.
instance_list
[
1
:]:
self
.
assertEqual
(
instance
.
sequence
,
[
'availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
])
self
.
assertNotEqual
(
os
.
path
.
getmtime
(
os
.
path
.
join
(
instance0
.
partition_path
,
'.timestamp'
)),
last_runtime
)
...
...
@@ -1352,6 +1346,7 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
started.
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
,
20
,
20
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance0
=
computer
.
instance_list
[
0
]
timestamp
=
str
(
int
(
time
.
time
()
-
5
))
instance0
.
timestamp
=
timestamp
...
...
@@ -1371,16 +1366,16 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
time
.
sleep
(
wanted_periodicity
+
1
)
for
instance
in
computer
.
instance_list
[
1
:]:
self
.
assertEqual
(
instance
.
sequence
,
[
'availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
])
time
.
sleep
(
1
)
instance0
.
requested_state
=
'destroyed'
self
.
launchSlapgrid
()
self
.
assertEqual
(
instance0
.
sequence
,
[
'availableComputerPartition'
,
'
stoppedComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
,
'/
stoppedComputerPartition'
])
for
instance
in
computer
.
instance_list
[
1
:]:
self
.
assertEqual
(
instance
.
sequence
,
[
'availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
])
self
.
assertNotEqual
(
os
.
path
.
getmtime
(
os
.
path
.
join
(
instance0
.
partition_path
,
'.timestamp'
)),
last_runtime
)
...
...
@@ -1397,8 +1392,9 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
4. We launch slapgrid anew and check that install as not been called again
"""
timestamp
=
str
(
int
(
time
.
time
()))
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
,
1
,
1
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
timestamp
=
str
(
int
(
time
.
time
()))
instance
=
computer
.
instance_list
[
0
]
instance
.
software
.
setPeriodicity
(
-
1
)
instance
.
timestamp
=
timestamp
...
...
@@ -1419,8 +1415,9 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
new setup and one time because of periodicity = 0)
"""
timestamp
=
str
(
int
(
time
.
time
()))
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
,
1
,
1
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
timestamp
=
str
(
int
(
time
.
time
()))
instance
=
computer
.
instance_list
[
0
]
instance
.
software
.
setPeriodicity
(
0
)
instance
.
timestamp
=
timestamp
...
...
@@ -1435,6 +1432,7 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
2. One will fail but the other one will be processed correctly
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
,
2
,
2
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance0
=
computer
.
instance_list
[
0
]
instance1
=
computer
.
instance_list
[
1
]
instance1
.
software
=
computer
.
software_list
[
1
]
...
...
@@ -1442,9 +1440,9 @@ class TestSlapgridCPPartitionProcessing(MasterMixin, unittest.TestCase):
exit 42"""
)
self
.
launchSlapgrid
()
self
.
assertEqual
(
instance0
.
sequence
,
[
'
softwareInstanceError'
])
[
'/
softwareInstanceError'
])
self
.
assertEqual
(
instance1
.
sequence
,
[
'availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
])
def
test_one_partition_lacking_software_path_does_not_disturb_others
(
self
):
"""
...
...
@@ -1452,15 +1450,16 @@ exit 42""")
2. One will fail but the other one will be processed correctly
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
,
2
,
2
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance0
=
computer
.
instance_list
[
0
]
instance1
=
computer
.
instance_list
[
1
]
instance1
.
software
=
computer
.
software_list
[
1
]
shutil
.
rmtree
(
instance0
.
software
.
srdir
)
self
.
launchSlapgrid
()
self
.
assertEqual
(
instance0
.
sequence
,
[
'
softwareInstanceError'
])
[
'/
softwareInstanceError'
])
self
.
assertEqual
(
instance1
.
sequence
,
[
'availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
])
def
test_one_partition_lacking_software_bin_path_does_not_disturb_others
(
self
):
"""
...
...
@@ -1468,15 +1467,16 @@ exit 42""")
2. One will fail but the other one will be processed correctly
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
,
2
,
2
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance0
=
computer
.
instance_list
[
0
]
instance1
=
computer
.
instance_list
[
1
]
instance1
.
software
=
computer
.
software_list
[
1
]
shutil
.
rmtree
(
instance0
.
software
.
srbindir
)
self
.
launchSlapgrid
()
self
.
assertEqual
(
instance0
.
sequence
,
[
'
softwareInstanceError'
])
[
'/
softwareInstanceError'
])
self
.
assertEqual
(
instance1
.
sequence
,
[
'availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
])
def
test_one_partition_lacking_path_does_not_disturb_others
(
self
):
"""
...
...
@@ -1484,15 +1484,16 @@ exit 42""")
2. One will fail but the other one will be processed correctly
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
,
2
,
2
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance0
=
computer
.
instance_list
[
0
]
instance1
=
computer
.
instance_list
[
1
]
instance1
.
software
=
computer
.
software_list
[
1
]
shutil
.
rmtree
(
instance0
.
partition_path
)
self
.
launchSlapgrid
()
self
.
assertEqual
(
instance0
.
sequence
,
[
'
softwareInstanceError'
])
[
'/
softwareInstanceError'
])
self
.
assertEqual
(
instance1
.
sequence
,
[
'availableComputerPartition'
,
'
stoppedComputerPartition'
])
[
'/availableComputerPartition'
,
'/
stoppedComputerPartition'
])
def
test_one_partition_buildout_fail_is_correctly_logged
(
self
):
"""
...
...
@@ -1500,14 +1501,15 @@ exit 42""")
2. It will fail, make sure that whole log is sent to master
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
,
1
,
1
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
line1
=
"Nerdy kitten: Can I has
a process crash?"
line1
=
"Nerdy kitten: Can I haz
a process crash?"
line2
=
"Cedric: Sure, here it is."
instance
.
software
.
setBuildout
(
"""#!/bin/sh
echo %s; echo %s; exit 42"""
%
(
line1
,
line2
))
self
.
launchSlapgrid
()
self
.
assertEqual
(
instance
.
sequence
,
[
'
softwareInstanceError'
])
self
.
assertEqual
(
instance
.
sequence
,
[
'/
softwareInstanceError'
])
# We don't care of actual formatting, we just want to have full log
self
.
assertIn
(
line1
,
instance
.
error_log
)
self
.
assertIn
(
line2
,
instance
.
error_log
)
...
...
@@ -1524,6 +1526,7 @@ class TestSlapgridUsageReport(MasterMixin, unittest.TestCase):
Test than an instance in "destroyed" state is correctly destroyed
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
instance
.
requested_state
=
'started'
instance
.
software
.
setBuildout
(
WRAPPER_CONTENT
)
...
...
@@ -1536,9 +1539,9 @@ class TestSlapgridUsageReport(MasterMixin, unittest.TestCase):
self
.
assertLogContent
(
wrapper_log
,
'Working'
)
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
software_root
),
[
instance
.
software
.
software_hash
])
self
.
assertEqual
(
computer
.
sequence
,
[
'
getFullComputerInformation'
,
'
availableComputerPartition'
,
'
startedComputerPartition'
])
[
'/
getFullComputerInformation'
,
'/
availableComputerPartition'
,
'/
startedComputerPartition'
])
self
.
assertEqual
(
instance
.
state
,
'started'
)
# Then destroy the instance
...
...
@@ -1555,9 +1558,9 @@ class TestSlapgridUsageReport(MasterMixin, unittest.TestCase):
self
.
assertIsNotCreated
(
wrapper_log
)
self
.
assertEqual
(
computer
.
sequence
,
[
'
getFullComputerInformation'
,
'
stoppedComputerPartition'
,
'
destroyedComputerPartition'
])
[
'/
getFullComputerInformation'
,
'/
stoppedComputerPartition'
,
'/
destroyedComputerPartition'
])
self
.
assertEqual
(
instance
.
state
,
'destroyed'
)
def
test_partition_list_is_complete_if_empty_destroyed_partition
(
self
):
...
...
@@ -1570,6 +1573,7 @@ class TestSlapgridUsageReport(MasterMixin, unittest.TestCase):
2. See if it destroyed
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
computer
.
sequence
=
[]
...
...
@@ -1586,13 +1590,14 @@ class TestSlapgridUsageReport(MasterMixin, unittest.TestCase):
self
.
assertEqual
(
computer
.
sequence
,
[
'getFullComputerInformation'
,
'stoppedComputerPartition'
,
'
destroyedComputerPartition'
])
[
'/getFullComputerInformation'
,
'/stoppedComputerPartition'
,
'/
destroyedComputerPartition'
])
def
test_slapgrid_not_destroy_bad_instance
(
self
):
"""
Checks that slapgrid-ur don't destroy instance not to be destroyed.
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
instance
.
requested_state
=
'started'
instance
.
software
.
setBuildout
(
WRAPPER_CONTENT
)
...
...
@@ -1605,9 +1610,9 @@ class TestSlapgridUsageReport(MasterMixin, unittest.TestCase):
self
.
assertLogContent
(
wrapper_log
,
'Working'
)
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
software_root
),
[
instance
.
software
.
software_hash
])
self
.
assertEqual
(
computer
.
sequence
,
[
'
getFullComputerInformation'
,
'
availableComputerPartition'
,
'
startedComputerPartition'
])
[
'/
getFullComputerInformation'
,
'/
availableComputerPartition'
,
'/
startedComputerPartition'
])
self
.
assertEqual
(
'started'
,
instance
.
state
)
# Then run usage report and see if it is still working
...
...
@@ -1626,7 +1631,7 @@ class TestSlapgridUsageReport(MasterMixin, unittest.TestCase):
wrapper_log
=
os
.
path
.
join
(
instance
.
partition_path
,
'.0_wrapper.log'
)
self
.
assertLogContent
(
wrapper_log
,
'Working'
)
self
.
assertEqual
(
computer
.
sequence
,
[
'
getFullComputerInformation'
])
[
'/
getFullComputerInformation'
])
self
.
assertEqual
(
'started'
,
instance
.
state
)
def
test_slapgrid_instance_ignore_free_instance
(
self
):
...
...
@@ -1635,6 +1640,7 @@ class TestSlapgridUsageReport(MasterMixin, unittest.TestCase):
software_release URI) is ignored by slapgrid-cp.
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
instance
.
software
.
name
=
None
...
...
@@ -1645,7 +1651,7 @@ class TestSlapgridUsageReport(MasterMixin, unittest.TestCase):
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
instance_root
),
[
'0'
,
'etc'
,
'var'
])
self
.
assertItemsEqual
(
os
.
listdir
(
instance
.
partition_path
),
[])
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
software_root
),
[
instance
.
software
.
software_hash
])
self
.
assertEqual
(
computer
.
sequence
,
[
'
getFullComputerInformation'
])
self
.
assertEqual
(
computer
.
sequence
,
[
'/
getFullComputerInformation'
])
def
test_slapgrid_report_ignore_free_instance
(
self
):
"""
...
...
@@ -1653,6 +1659,7 @@ class TestSlapgridUsageReport(MasterMixin, unittest.TestCase):
software_release URI) is ignored by slapgrid-ur.
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
instance
.
software
.
name
=
None
...
...
@@ -1663,7 +1670,7 @@ class TestSlapgridUsageReport(MasterMixin, unittest.TestCase):
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
instance_root
),
[
'0'
,
'etc'
,
'var'
])
self
.
assertItemsEqual
(
os
.
listdir
(
instance
.
partition_path
),
[])
self
.
assertItemsEqual
(
os
.
listdir
(
self
.
software_root
),
[
instance
.
software
.
software_hash
])
self
.
assertEqual
(
computer
.
sequence
,
[
'
getFullComputerInformation'
])
self
.
assertEqual
(
computer
.
sequence
,
[
'/
getFullComputerInformation'
])
class
TestSlapgridSoftwareRelease
(
MasterMixin
,
unittest
.
TestCase
):
...
...
@@ -1673,15 +1680,16 @@ class TestSlapgridSoftwareRelease(MasterMixin, unittest.TestCase):
2. It will fail, make sure that whole log is sent to master
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
,
1
,
1
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
software
=
computer
.
software_list
[
0
]
line1
=
"Nerdy kitten: Can I has
a process crash?"
line1
=
"Nerdy kitten: Can I haz
a process crash?"
line2
=
"Cedric: Sure, here it is."
software
.
setBuildout
(
"""#!/bin/sh
echo %s; echo %s; exit 42"""
%
(
line1
,
line2
))
self
.
launchSlapgridSoftware
()
self
.
assertEqual
(
software
.
sequence
,
[
'buildingSoftwareRelease'
,
'
softwareReleaseError'
])
[
'/buildingSoftwareRelease'
,
'/
softwareReleaseError'
])
# We don't care of actual formatting, we just want to have full log
self
.
assertIn
(
line1
,
software
.
error_log
)
self
.
assertIn
(
line2
,
software
.
error_log
)
...
...
@@ -1733,6 +1741,7 @@ buildout = /path/to/buildout/binary
class
TestSlapgridCPWithMasterPromise
(
MasterMixin
,
unittest
.
TestCase
):
def
test_one_failing_promise
(
self
):
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
instance
.
requested_state
=
'started'
worked_file
=
os
.
path
.
join
(
instance
.
partition_path
,
'fail_worked'
)
...
...
@@ -1749,6 +1758,7 @@ class TestSlapgridCPWithMasterPromise(MasterMixin, unittest.TestCase):
def
test_one_succeeding_promise
(
self
):
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
instance
.
requested_state
=
'started'
self
.
fake_waiting_time
=
0.1
...
...
@@ -1766,8 +1776,8 @@ class TestSlapgridCPWithMasterPromise(MasterMixin, unittest.TestCase):
def
test_stderr_has_been_sent
(
self
):
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
httplib
.
HTTPConnection
.
_callback
=
computer
.
getServerResponse
()
instance
.
requested_state
=
'started'
self
.
fake_waiting_time
=
0.5
...
...
@@ -1793,6 +1803,7 @@ class TestSlapgridCPWithMasterPromise(MasterMixin, unittest.TestCase):
def
test_timeout_works
(
self
):
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
instance
.
requested_state
=
'started'
...
...
@@ -1818,6 +1829,7 @@ class TestSlapgridCPWithMasterPromise(MasterMixin, unittest.TestCase):
def
test_two_succeeding_promises
(
self
):
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
instance
.
requested_state
=
'started'
...
...
@@ -1840,6 +1852,7 @@ class TestSlapgridCPWithMasterPromise(MasterMixin, unittest.TestCase):
def
test_one_succeeding_one_failing_promises
(
self
):
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
instance
.
requested_state
=
'started'
self
.
fake_waiting_time
=
0.1
...
...
@@ -1868,6 +1881,7 @@ class TestSlapgridCPWithMasterPromise(MasterMixin, unittest.TestCase):
def
test_one_succeeding_one_timing_out_promises
(
self
):
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
instance
.
requested_state
=
'started'
self
.
fake_waiting_time
=
0.1
...
...
@@ -1902,6 +1916,7 @@ class TestSlapgridDestructionLock(MasterMixin, unittest.TestCase):
if specifying a retention lock delay.
"""
computer
=
ComputerForTest
(
self
.
software_root
,
self
.
instance_root
)
with
httmock
.
HTTMock
(
computer
.
request_handler
):
instance
=
computer
.
instance_list
[
0
]
instance
.
requested_state
=
'started'
instance
.
filter_dict
=
{
'retention_delay'
:
1.0
/
(
3600
*
24
)}
...
...
@@ -1929,3 +1944,4 @@ class TestSlapgridDestructionLock(MasterMixin, unittest.TestCase):
time
.
sleep
(
1
)
self
.
grid
.
agregateAndSendUsage
()
self
.
assertFalse
(
os
.
path
.
exists
(
dummy_instance_file_path
))
slapos/tests/slapmock/httplib.py
deleted
100644 → 0
View file @
4da82657
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""Mocked httplib
"""
__all__
=
[]
def
log
(
message
):
"""Need to be overridden to get a proper logger
"""
pass
class
HTTPConnection
(
object
):
scheme
=
'http'
def
_callback
(
self
,
path
,
method
,
body
,
headers
):
"""To get it works properly, you need to override
HTTPConnection._callback. This method received the instance, the path,
method and request body as parameter, and it has to return a tuple with
headers dictionary and body response string.
@param self object instance reference
@param URL the parsed URL
@param method the http method
@param body the request body
@param headers the request headers
@return tuple containing status integer, headers dictionary and body
response"""
return
(
0
,
{},
''
,
)
def
__init__
(
self
,
host
,
port
=
None
,
strict
=
None
,
timeout
=
None
,
source_address
=
None
):
self
.
host
=
host
self
.
port
=
port
self
.
strict
=
strict
self
.
timeout
=
timeout
self
.
source_address
=
source_address
self
.
__response
=
None
def
request
(
self
,
method
,
url
,
body
=
None
,
headers
=
None
):
status
,
headers
,
body
=
self
.
_callback
(
url
,
method
,
body
,
headers
)
self
.
__response
=
HTTPResponse
(
'HTTP/1.1'
,
status
,
'OK'
,
body
,
headers
)
def
getresponse
(
self
):
response
=
self
.
__response
self
.
__response
=
None
return
response
def
set_debuglevel
(
self
,
level
):
pass
def
set_tunnel
(
self
,
host
,
port
=
None
,
headers
=
None
):
pass
def
connect
(
self
):
pass
def
close
(
self
):
pass
def
putrequest
(
self
,
request
,
selector
,
skip_host
=
None
,
skip_accept_encoding
=
None
):
pass
def
putheader
(
self
,
*
args
):
pass
def
endheaders
(
self
):
pass
def
send
(
self
,
data
):
pass
class
HTTPSConnection
(
HTTPConnection
):
def
__init__
(
self
,
host
,
port
=
None
,
key_file
=
None
,
cert_file
=
None
,
strict
=
None
,
timeout
=
None
,
source_address
=
None
):
super
(
HTTPSConnection
,
self
).
__init__
(
host
,
port
,
strict
,
timeout
,
source_address
)
self
.
certificate
=
open
(
cert_file
,
'r'
).
read
()
self
.
key
=
open
(
key_file
,
'r'
).
read
()
def
request
(
self
,
method
,
url
,
body
=
None
,
headers
=
None
):
headers
[
'certificate'
]
=
self
.
certificate
headers
[
'key'
]
=
self
.
key
status
,
headers
,
body
=
self
.
_callback
(
url
,
method
,
body
,
headers
)
self
.
__response
=
HTTPResponse
(
'HTTP/1.1'
,
status
,
'OK'
,
body
,
headers
)
def
getresponse
(
self
):
response
=
self
.
__response
self
.
__response
=
None
return
response
class
HTTPResponse
(
object
):
def
__init__
(
self
,
version
,
status
,
reason
,
content
,
headers
=
()):
self
.
version
=
version
self
.
status
=
status
self
.
reason
=
reason
self
.
__headers
=
headers
self
.
__content
=
content
def
read
(
self
,
amt
=
None
):
result
=
None
if
amt
is
None
:
result
=
self
.
__content
self
.
__content
=
''
else
:
end
=
max
(
amt
,
len
(
self
.
__content
))
result
=
self
.
__content
[:
end
]
del
self
.
__content
[:
end
]
return
result
def
getheader
(
self
,
name
,
default
=
None
):
pass
def
getheaders
(
self
):
pass
slapos/tests/slapmock/requests.py
0 → 100644
View file @
11e60887
# -*- coding: utf-8 -*-
def
response_ok
(
url
,
request
):
return
{
'status_code'
:
200
,
'content'
:
''
}
slapos/tests/slapproxy/__init__.py
View file @
11e60887
...
...
@@ -968,7 +968,7 @@ database_uri = %(tempdir)s/lib/external_proxy.db
'xml'
:
xml_marshaller
.
xml_marshaller
.
dumps
(
computer_dict
),
}
self
.
external_proxy_slap
.
_connection_helper
.
POST
(
'/loadComputerConfigurationFromXML'
,
parameter_dict
=
request_dict
)
data
=
request_dict
)
def
_checkInstanceIsFowarded
(
self
,
name
,
partition_parameter_kw
,
software_release
):
"""
...
...
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