Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
slapos.toolbox
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
Joanne Hugé
slapos.toolbox
Commits
e212d72c
Commit
e212d72c
authored
8 years ago
by
Nicolas Wavrant
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
runner: updates runnertest.py
parent
52f41344
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
95 additions
and
135 deletions
+95
-135
slapos/runner/run.py
slapos/runner/run.py
+3
-3
slapos/runner/runnertest.py
slapos/runner/runnertest.py
+92
-132
No files found.
slapos/runner/run.py
View file @
e212d72c
...
...
@@ -178,6 +178,6 @@ def getUpdatedParameter(self, var):
else
:
raise
KeyError
flask
.
config
.
Config
.
__getitem__
=
getUpdatedParameter
run
()
if
__name__
==
'slapos.runner.run'
:
flask
.
config
.
Config
.
__getitem__
=
getUpdatedParameter
run
()
This diff is collapsed.
Click to expand it.
slapos/runner/runnertest.py
View file @
e212d72c
...
...
@@ -11,6 +11,7 @@
#############################################
import
argparse
import
base64
import
ConfigParser
import
datetime
import
hashlib
...
...
@@ -19,8 +20,10 @@ import os
import
shutil
import
sup_process
import
StringIO
import
ssl
import
time
import
unittest
import
urllib2
from
slapos.runner.utils
import
(
getProfilePath
,
getSession
,
isInstanceRunning
,
...
...
@@ -31,6 +34,7 @@ from slapos.runner.utils import (getProfilePath,
from
slapos.runner
import
views
import
slapos.slap
from
slapos.htpasswd
import
HtpasswdFile
from
.run
import
Config
import
erp5.util.taskdistribution
as
taskdistribution
...
...
@@ -44,6 +48,29 @@ def parseArguments():
Parse arguments for erp5testnode-backed test.
"""
parser
=
argparse
.
ArgumentParser
()
# runnertest mandatory arguments
parser
.
add_argument
(
'--key_file'
,
metavar
=
'KEY_FILE'
,
help
=
'Path to the key file used to communicate with slapOS-master'
)
parser
.
add_argument
(
'--cert_file'
,
metavar
=
'CERT_FILE'
,
help
=
'Path to the cert file used to communicate with slapOS-master'
)
parser
.
add_argument
(
'--server_url'
,
metavar
=
'SERVER_URL'
,
help
=
'URL of the local slapproxy'
)
parser
.
add_argument
(
'--computer_id'
,
metavar
=
'COMPUTER_ID'
,
help
=
'ID of the COMP where the slaprunner is running'
)
parser
.
add_argument
(
'--partition_id'
,
metavar
=
'PARTITION_ID'
,
help
=
'ID of the partition where the slaprunner is depoyed'
)
# Test Node arguments
parser
.
add_argument
(
'--test_result_path'
,
metavar
=
'ERP5_TEST_RESULT_PATH'
,
help
=
'ERP5 relative path of the test result'
)
...
...
@@ -65,6 +92,10 @@ def parseArguments():
help
=
'Title of the testnode which is running this'
'launcher'
)
parser
.
add_argument
(
'--project_title'
,
metavar
=
'PROJECT_TITLE'
,
help
=
'The project title'
)
parser
.
add_argument
(
'--node_quantity'
,
help
=
'Number of parallel tests to run'
,
default
=
1
,
type
=
int
)
...
...
@@ -72,81 +103,57 @@ def parseArguments():
metavar
=
'TEST_SUITE_MASTER_URL'
,
help
=
'Url to connect to the ERP5 Master testsuite taskditributor'
)
parser
.
add_argument
(
'additional_arguments'
,
nargs
=
argparse
.
REMAINDER
)
return
parser
.
parse_args
()
class
Config
:
def
__init__
(
self
):
self
.
runner_workdir
=
None
self
.
software_root
=
None
self
.
instance_root
=
None
self
.
configuration_file_path
=
None
def
setConfig
(
self
):
"""
Set options given by parameters.
"""
self
.
configuration_file_path
=
os
.
path
.
abspath
(
os
.
environ
.
get
(
'RUNNER_CONFIG'
))
# Load configuration file
configuration_parser
=
ConfigParser
.
SafeConfigParser
()
configuration_parser
.
read
(
self
.
configuration_file_path
)
# Merges the arguments and configuration
for
section
in
(
"slaprunner"
,
"slapos"
,
"slapproxy"
,
"slapformat"
,
"sshkeys_authority"
,
"gitclient"
):
configuration_dict
=
dict
(
configuration_parser
.
items
(
section
))
for
key
in
configuration_dict
:
if
not
getattr
(
self
,
key
,
None
):
setattr
(
self
,
key
,
configuration_dict
[
key
])
class
SlaprunnerTestCase
(
unittest
.
TestCase
):
@
classmethod
def
setUpClass
(
cls
,
**
kw
):
if
len
(
kw
)
==
0
:
return
cls
.
server_url
=
kw
[
'server_url'
]
cls
.
key_file
=
kw
[
'key_file'
]
cls
.
cert_file
=
kw
[
'cert_file'
]
cls
.
computer_id
=
kw
[
'computer_id'
]
cls
.
partition_id
=
kw
[
'partition_id'
]
# Get parameters returned by slapos master
slap
=
slapos
.
slap
.
slap
()
slap
.
initializeConnection
(
cls
.
server_url
,
cls
.
key_file
,
cls
.
cert_file
)
cls
.
partition
=
slap
.
registerComputerPartition
(
computer_guid
=
cls
.
computer_id
,
partition_id
=
cls
.
partition_id
)
cls
.
parameter_dict
=
cls
.
partition
.
getConnectionParameterDict
()
for
attribute
,
value
in
cls
.
parameter_dict
.
iteritems
():
setattr
(
cls
,
attribute
.
replace
(
'-'
,
'_'
),
value
)
class
SlaprunnerTestCase
(
unittest
.
TestCase
):
#create slaprunner configuration
views
.
app
.
config
[
'TESTING'
]
=
True
config
=
Config
()
config
.
setConfig
()
views
.
app
.
config
.
update
(
**
config
.
__dict__
)
cls
.
app
=
views
.
app
.
test_client
()
cls
.
app
.
config
=
views
.
app
.
config
def
setUp
(
self
):
"""Initialize slapos webrunner here"""
views
.
app
.
config
[
'TESTING'
]
=
True
self
.
users
=
[
"slapuser"
,
"slappwd"
,
"slaprunner@nexedi.com"
,
"SlapOS web runner"
]
self
.
users
=
[
self
.
init_user
,
self
.
init_password
,
"slaprunner@nexedi.com"
,
"SlapOS web runner"
]
self
.
updateUser
=
[
"newslapuser"
,
"newslappwd"
,
"slaprunner@nexedi.com"
,
"SlapOS web runner"
]
self
.
repo
=
'https://lab.nexedi.com/nexedi/slapos.git'
self
.
software
=
"workspace/slapos/software/"
# relative directory fo SR
self
.
project
=
'slapos'
# Default project name
self
.
template
=
'template.cfg'
self
.
partitionPrefix
=
'slappart'
#create slaprunner configuration
config
=
Config
()
config
.
setConfig
()
# We do not run tests if a user is already set (runner being used)
if
os
.
path
.
exists
(
os
.
path
.
join
(
config
.
etc_dir
,
'.users'
)):
self
.
fail
(
msg
=
"A user is already set, can not start tests"
)
workdir
=
os
.
path
.
join
(
config
.
runner_workdir
,
'project'
)
software_link
=
os
.
path
.
join
(
config
.
runner_workdir
,
'softwareLink'
)
views
.
app
.
config
.
update
(
**
config
.
__dict__
)
#update or create all runner base directory to test_dir
self
.
workdir
=
workdir
=
os
.
path
.
join
(
self
.
app
.
config
[
'runner_workdir'
],
'project'
)
software_link
=
os
.
path
.
join
(
self
.
app
.
config
[
'runner_workdir'
],
'softwareLink'
)
#update or create all runner base directory to test_dir
if
not
os
.
path
.
exists
(
workdir
):
os
.
mkdir
(
workdir
)
if
not
os
.
path
.
exists
(
software_link
):
os
.
mkdir
(
software_link
)
views
.
app
.
config
.
update
(
software_log
=
config
.
software_root
.
rstrip
(
'/'
)
+
'.log'
,
instance_log
=
config
.
instance_root
.
rstrip
(
'/'
)
+
'.log'
,
workspace
=
workdir
,
software_link
=
software_link
,
instance_profile
=
'instance.cfg'
,
software_profile
=
'software.cfg'
,
SECRET_KEY
=
"123456"
,
PERMANENT_SESSION_LIFETIME
=
datetime
.
timedelta
(
days
=
31
),
instance_monitoring_url
=
'https://['
+
config
.
ipv6_address
+
']:9684'
,
)
self
.
app
=
views
.
app
.
test_client
()
self
.
app
.
config
=
views
.
app
.
config
#Create password recover code
parser
=
ConfigParser
.
ConfigParser
()
parser
.
read
(
self
.
app
.
config
[
'knowledge0_cfg'
])
self
.
rcode
=
parser
.
get
(
'public'
,
'recovery-code'
)
#Create config.json
json_file
=
os
.
path
.
join
(
views
.
app
.
config
[
'etc_dir'
],
'config.json'
)
if
not
os
.
path
.
exists
(
json_file
):
...
...
@@ -161,14 +168,11 @@ class SlaprunnerTestCase(unittest.TestCase):
def
tearDown
(
self
):
"""Remove all test data"""
project
=
os
.
path
.
join
(
self
.
app
.
config
[
'etc_dir'
],
'.project'
)
users
=
os
.
path
.
join
(
self
.
app
.
config
[
'etc_dir'
],
'.users'
)
#reset tested parameters
self
.
updateConfigParameter
(
'autorun'
,
False
)
self
.
updateConfigParameter
(
'auto_deploy'
,
True
)
if
os
.
path
.
exists
(
users
):
os
.
unlink
(
users
)
if
os
.
path
.
exists
(
project
):
os
.
unlink
(
project
)
if
os
.
path
.
exists
(
self
.
app
.
config
[
'workspace'
]):
...
...
@@ -179,10 +183,6 @@ class SlaprunnerTestCase(unittest.TestCase):
shutil
.
rmtree
(
self
.
app
.
config
[
'instance_root'
])
if
os
.
path
.
exists
(
self
.
app
.
config
[
'software_link'
]):
shutil
.
rmtree
(
self
.
app
.
config
[
'software_link'
])
#Stop process
sup_process
.
killRunningProcess
(
self
.
app
.
config
,
'slapproxy'
)
sup_process
.
killRunningProcess
(
self
.
app
.
config
,
'slapgrid-cp'
)
sup_process
.
killRunningProcess
(
self
.
app
.
config
,
'slapgrid-sr'
)
def
updateConfigParameter
(
self
,
parameter
,
value
):
config_parser
=
ConfigParser
.
SafeConfigParser
()
...
...
@@ -193,25 +193,8 @@ class SlaprunnerTestCase(unittest.TestCase):
with
open
(
os
.
getenv
(
'RUNNER_CONFIG'
),
'wb'
)
as
configfile
:
config_parser
.
write
(
configfile
)
def
configAccount
(
self
,
username
,
password
,
email
,
name
,
rcode
):
"""Helper for configAccount"""
return
self
.
app
.
post
(
'/configAccount'
,
data
=
dict
(
username
=
username
,
password
=
password
,
email
=
email
,
name
=
name
,
rcode
=
rcode
),
follow_redirects
=
True
)
def
setAccount
(
self
):
"""Initialize user account and log user in"""
response
=
loadJson
(
self
.
configAccount
(
self
.
users
[
0
],
self
.
users
[
1
],
self
.
users
[
2
],
self
.
users
[
3
],
self
.
rcode
))
self
.
assertEqual
(
response
[
'result'
],
""
)
def
updateAccount
(
self
,
newaccount
,
rcode
):
def
updateAccount
(
self
,
newaccount
):
"""Helper for update user account data"""
return
self
.
app
.
post
(
'/updateAccount'
,
data
=
dict
(
...
...
@@ -219,7 +202,6 @@ class SlaprunnerTestCase(unittest.TestCase):
password
=
newaccount
[
1
],
email
=
newaccount
[
2
],
name
=
newaccount
[
3
],
rcode
=
rcode
),
follow_redirects
=
True
)
...
...
@@ -227,11 +209,6 @@ class SlaprunnerTestCase(unittest.TestCase):
return
getProfilePath
(
self
.
app
.
config
[
'etc_dir'
],
self
.
app
.
config
[
'software_profile'
])
def
proxyStatus
(
self
,
status
=
True
):
"""Helper for testslapproxy status"""
proxy
=
sup_process
.
isRunning
(
self
.
app
.
config
,
'slapproxy'
)
self
.
assertEqual
(
proxy
,
status
)
def
setupProjectFolder
(
self
):
"""Helper to create a project folder as for slapos.git"""
base
=
os
.
path
.
join
(
self
.
app
.
config
[
'workspace'
],
'slapos'
)
...
...
@@ -271,38 +248,27 @@ class SlaprunnerTestCase(unittest.TestCase):
os
.
mkdir
(
base
)
open
(
template
,
"w"
).
write
(
content
)
def
stopSlapproxy
(
self
):
"""Kill slapproxy process"""
pass
def
test_configAccount
(
self
):
"""For the first lauch of slaprunner user need do create first account"""
result
=
self
.
configAccount
(
self
.
users
[
0
],
self
.
users
[
1
],
self
.
users
[
2
],
self
.
users
[
3
],
self
.
rcode
)
response
=
loadJson
(
result
)
self
.
assertEqual
(
response
[
'code'
],
1
)
account
=
getSession
(
self
.
app
.
config
)
self
.
assertEqual
(
account
,
self
.
users
)
def
assertCanLoginWith
(
self
,
username
,
password
):
request
=
urllib2
.
Request
(
self
.
backend_url
)
base64string
=
base64
.
encodestring
(
'%s:%s'
%
(
username
,
password
))[:
-
1
]
request
.
add_header
(
"Authorization"
,
"Basic %s"
%
base64string
)
ssl_context
=
ssl
.
_create_unverified_context
()
result
=
urllib2
.
urlopen
(
request
,
context
=
ssl_context
)
self
.
assertEqual
(
result
.
getcode
(),
200
)
def
test_updateAccount
(
self
):
"""test Update accound, this needs the user to log in"""
self
.
setAccount
()
htpasswd
=
os
.
path
.
join
(
self
.
app
.
config
[
'etc_dir'
],
'.htpasswd'
)
assert
self
.
users
[
0
]
in
open
(
htpasswd
).
read
()
response
=
loadJson
(
self
.
updateAccount
(
self
.
updateUser
,
self
.
rcode
))
# Check that given user can log in
self
.
assertCanLoginWith
(
self
.
users
[
0
],
self
.
users
[
1
])
# Adds a user
new_user
=
{
'username'
:
'vice-president'
,
'password'
:
'123456'
}
response
=
loadJson
(
self
.
app
.
post
(
'/addUser'
,
data
=
new_user
))
self
.
assertEqual
(
response
[
'code'
],
1
)
encode
=
HtpasswdFile
(
htpasswd
,
False
)
encode
.
update
(
self
.
updateUser
[
0
],
self
.
updateUser
[
1
])
assert
self
.
updateUser
[
0
]
in
open
(
htpasswd
).
read
()
self
.
assertCanLoginWith
(
new_user
[
'username'
],
new_user
[
'password'
])
def
test_startStopProxy
(
self
):
"""Test slapproxy"""
startProxy
(
self
.
app
.
config
)
self
.
proxyStatus
(
True
)
def
test_cloneProject
(
self
):
"""Start scenario 1 for deploying SR: Clone a project from git repository"""
self
.
setAccount
()
folder
=
'workspace/'
+
self
.
project
if
os
.
path
.
exists
(
self
.
app
.
config
[
'workspace'
]
+
'/'
+
self
.
project
):
shutil
.
rmtree
(
self
.
app
.
config
[
'workspace'
]
+
'/'
+
self
.
project
)
...
...
@@ -337,7 +303,6 @@ class SlaprunnerTestCase(unittest.TestCase):
def
test_createSR
(
self
):
"""Scenario 2: Create a new software release"""
self
.
setAccount
()
#setup project directory
self
.
setupProjectFolder
()
newSoftware
=
os
.
path
.
join
(
self
.
software
,
'slaprunner-test'
)
...
...
@@ -361,10 +326,6 @@ class SlaprunnerTestCase(unittest.TestCase):
self
.
assertFalse
(
isInstanceRunning
(
self
.
app
.
config
))
self
.
assertFalse
(
isSoftwareRunning
(
self
.
app
.
config
))
# Slapproxy process is supposed to be started
# newSoftware = os.path.join(self.software, 'slaprunner-test')
self
.
proxyStatus
(
True
)
self
.
stopSlapproxy
()
def
test_runSoftware
(
self
):
"""Scenario 4: CReate empty SR and save software.cfg file
...
...
@@ -399,20 +360,17 @@ class SlaprunnerTestCase(unittest.TestCase):
createdFile
=
os
.
path
.
join
(
self
.
app
.
config
[
'software_root'
],
sr_dir
[
0
],
'parts'
,
'test-application'
,
'slapos.git'
)
self
.
assertTrue
(
os
.
path
.
exists
(
createdFile
))
self
.
proxyStatus
(
True
)
self
.
stopSlapproxy
()
def
test_updateInstanceParameter
(
self
):
"""Scenarion 5: Update parameters of current sofware profile"""
self
.
setAccount
()
"""Scenario 5: Update parameters of current sofware profile"""
self
.
setupTestSoftware
()
#Set current projet and run Slapgrid-cp
software
=
os
.
path
.
join
(
self
.
software
,
'slaprunner-test'
)
software
=
self
.
software
+
'slaprunner-test/'
response
=
loadJson
(
self
.
app
.
post
(
'/setCurrentProject'
,
data
=
dict
(
path
=
software
),
follow_redirects
=
True
))
self
.
assertEqual
(
response
[
'result'
],
""
)
self
.
proxyStatus
(
True
)
#Send paramters for the instance
parameterDict
=
dict
(
appname
=
'slaprunnerTest'
,
cacountry
=
'France'
)
parameterXml
=
'<?xml version="1.0" encoding="utf-8"?>
\
n
<instance>'
...
...
@@ -442,7 +400,7 @@ class SlaprunnerTestCase(unittest.TestCase):
self
.
assertEqual
(
parameterXml
,
response
[
'result'
])
response
=
loadJson
(
self
.
app
.
get
(
'/getParameterXml/dict'
))
self
.
assertEqual
(
parameterDict
,
response
[
'result'
][
'instance'
])
self
.
stopSlapproxy
()
def
test_requestInstance
(
self
):
"""Scenarion 6: request software instance"""
...
...
@@ -474,8 +432,7 @@ class SlaprunnerTestCase(unittest.TestCase):
createdFile
=
os
.
path
.
join
(
instancePath
,
'etc'
,
'testfile'
)
self
.
assertTrue
(
os
.
path
.
exists
(
createdFile
))
assert
'simple file'
in
open
(
createdFile
).
read
()
self
.
proxyStatus
(
True
)
self
.
stopSlapproxy
()
def
test_safeAutoDeploy
(
self
):
"""Scenario 7: isSRReady won't overwrite the existing
...
...
@@ -485,7 +442,7 @@ class SlaprunnerTestCase(unittest.TestCase):
self
.
updateConfigParameter
(
'autorun'
,
False
)
project
=
open
(
os
.
path
.
join
(
self
.
app
.
config
[
'etc_dir'
],
'.project'
),
"w"
)
project
.
write
(
self
.
software
+
'slaprunner-test'
)
project
.
write
(
self
.
software
+
'slaprunner-test
/
'
)
project
.
close
()
response
=
isSoftwareReleaseReady
(
self
.
app
.
config
)
self
.
assertEqual
(
response
,
"0"
)
...
...
@@ -586,7 +543,7 @@ class SlaprunnerTestCase(unittest.TestCase):
# Checkout to master branch
response
=
loadJson
(
self
.
app
.
post
(
'/newBranch'
,
data
=
dict
(
project
=
self
.
software
,
project
=
self
.
workdir
+
'/slapos'
,
create
=
'0'
,
name
=
'master'
),
...
...
@@ -613,8 +570,6 @@ class SlaprunnerTestCase(unittest.TestCase):
# result is True if returncode is 0 (i.e "deployed and promise passed")
self
.
assertTrue
(
result
)
self
.
proxyStatus
(
True
)
self
.
stopSlapproxy
()
def
test_dynamicParametersReading
(
self
):
"""Test if the value of a parameter can change in the flask application
...
...
@@ -642,15 +597,20 @@ def main():
test_suite_title
=
args
.
test_suite_title
or
args
.
test_suite
revision
=
args
.
revision
SlaprunnerTestCase
.
setUpClass
(
key_file
=
args
.
key_file
,
cert_file
=
args
.
cert_file
,
server_url
=
args
.
server_url
,
computer_id
=
args
.
computer_id
,
partition_id
=
args
.
partition_id
)
test_result
=
master
.
createTestResult
(
revision
,
[
test_suite_title
],
args
.
test_node_title
,
True
,
test_suite_title
,
'foo'
)
#args.project_title)
args
.
test_node_title
,
True
,
test_suite_title
,
args
.
project_title
)
test_line
=
test_result
.
start
()
start_time
=
time
.
time
()
stderr
=
StringIO
.
StringIO
()
suite
=
unittest
.
TestLoader
().
loadTestsFromTestCase
(
SlaprunnerTestCase
)
test_result
=
unittest
.
TextTestRunner
(
verbosity
=
2
,
stream
=
stderr
).
run
(
suite
)
...
...
This diff is collapsed.
Click to expand it.
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