Commit d59b20f7 authored by Benjamin Blanc's avatar Benjamin Blanc

Implement new way to perform ScalabilityTestNode in testERP5TestNode.py

parent 06055895
This diff is collapsed.
...@@ -55,12 +55,34 @@ class ScalabilityTestRunner(): ...@@ -55,12 +55,34 @@ class ScalabilityTestRunner():
self.master_nodes = [] # doesn't change during all the test self.master_nodes = [] # doesn't change during all the test
self.slave_nodes = [] # doesn't change during all the test self.slave_nodes = [] # doesn't change during all the test
# remaining_software_installation_grid contains at the begining
# all the softwares needed for this runner
# The grid looks like :
# { "COMP-1234" : ['http://soft1.cfg', 'https:///ipv6:00/soft2.cfg'],
# "COMP-4" : ['http://soft1.cfg', 'https:///ipv6:00/soft3.cfg'],
# "COMP-834" : ['http://soft4.cfg'],
# "COMP-90" : ['http://soft1.cfg', 'https:///ipv6:00/soft2.cfg'],
# }
# A thread is in charge of checking (by communication with slapOS Master)
# if softwares are correctly installed. If a software is correctly installed,
# the thread remove the software_url from the grid.
# The thread never stop his work until he is not killed.
# In an other hand, the runner (here) loop while the grid is not empty.
# When the grid is empty, it means that all softwares are installed, so
# the runner kills the thread and goes to the next procedure step.
# So, it also means that cluster_configuration, cluster_constraint
# and the list of availables/involved nodes (=> software repartition)
# have to be known to fill the grid.
self.remaining_software_installation_grid = {}
def _prepareSlapOS(*args, **kw): def _prepareSlapOS(self, software_path, computer_guid, create_partition=0):
# create_partition is kept for compatibility
""" """
A proxy to supply : Install software a software on a specific node A proxy to supply : Install software a software on a specific node
""" """
self.slapos_controler.supply(*args, **kw) self.slapos_controler.supply(software_path, computer_guid, create_partition)
# TODO : do something with slapOS Master to check if it's ok # TODO : do something with slapOS Master to check if it's ok
# put it here ? # put it here ?
# TODO : change the line below # TODO : change the line below
...@@ -78,16 +100,15 @@ class ScalabilityTestRunner(): ...@@ -78,16 +100,15 @@ class ScalabilityTestRunner():
# TODO : change the line below # TODO : change the line below
return {'status_code' : 0} return {'status_code' : 0}
def _extractSoftwarePathList(self, node_test_suite):
# TODO : write code
return []
def prepareSlapOSForTestSuite(self, node_test_suite): def prepareSlapOSForTestSuite(self, node_test_suite):
""" """
Install all testsuite's softwares (on worker_nodes) Install all testsuite's softwares (on worker_nodes)
""" """
# In fact we just need to extract (by knowing the ipv6) # In fact we just need to extract (by knowing the ipv6)
# softwares ipv6-url ( created during constructProfile(...) ) # softwares ipv6-url ( created during constructProfile(...) )
software_path_list = _extractSoftwarePathList(software_path_list) #software_path_list = _extractSoftwarePathList(software_path_list)
# TODO : extract software paths (ipv6+local suite path+password?) from node_test_suite
software_path_list = []
for software_path in software_path_list: for software_path in software_path_list:
for worker_node in self.worker_nodes: for worker_node in self.worker_nodes:
self._prepareSlapOS(software_path,worker_node['computer_id']) self._prepareSlapOS(software_path,worker_node['computer_id'])
......
...@@ -58,25 +58,21 @@ def createFile(path, mode, content): ...@@ -58,25 +58,21 @@ def createFile(path, mode, content):
# TODO : merge two controler in one (with different method name ?) class SlapOSControler(object):
class SlapOSControlerCluster(object):
def __init__(self, working_directory, config,
log, configuration_path_file):
GenericSlapOSControler.__init__(self, working_directory, config, log)
self.configuration_path_file = configuration_path_file
def initializeSlapOSControler(software_path_list=None, computer_guid=None): def __init__(self, working_directory, config, log):
""" self.config = config
Supply several softwares from a list on a node self.software_root = os.path.join(working_directory, 'soft')
Ex : self.instance_root = os.path.join(working_directory, 'inst')
my_controler.initializeSlapOSControler(['kvm.cfg', 'ok.cfg'], 'COMP-726') self.slapos_config = os.path.join(working_directory, 'slapos.cfg')
""" self.log = log
for software_path in software_path_list: self.proxy_database = os.path.join(working_directory, 'proxy.db')
self.supply(software_path, computer_guid) #self.configuration_path_file = self.config['configuration_path_file']
self.configuration_path_file = ""
def supply(self, software_url, computer_id): def supply(self, software_url, computer_id, remove=False):
""" """
Request the installation of a software release on a specific node
Ex : Ex :
my_controler.supply('kvm.cfg', 'COMP-726') my_controler.supply('kvm.cfg', 'COMP-726')
""" """
...@@ -87,15 +83,27 @@ class SlapOSControlerCluster(object): ...@@ -87,15 +83,27 @@ class SlapOSControlerCluster(object):
parser.add_argument("configuration_file") parser.add_argument("configuration_file")
parser.add_argument("software_url") parser.add_argument("software_url")
parser.add_argument("node") parser.add_argument("node")
if os.path.exists(configuration_file_path): if os.path.exists(configuration_file_path):
args = parser.parse_args([self.configuration_file_path, software_url, computer_id]) args = parser.parse_args([self.configuration_file_path, software_url, computer_id])
config = client.Config(args, args.configuration_file) config = client.Config(args, args.configuration_file)
client.supply(args.software_url, args.node, client.init(config)) try:
client.supply(args.software_url, args.node, client.init(config), remove=remove)
except:
self.log("SlapOSControler.supply, \
exception in registerOpenOrder", exc_info=sys.exc_info())
raise ValueError("Unable to supply (or remove)")
else: else:
raise ValueError("Configuration file not found.") raise ValueError("Configuration file not found.")
def destroy(self, software_url, computer_id):
def _request(self, reference, """
Request Deletetion of a software release on a specific node
Ex :
my_controler.destroy('kvm.cfg', 'COMP-726')
"""
self.supply(self, software_url, computer_id, remove=True)
def request(self, reference,
software_url, software_type, software_configuration, computer_guid=None): software_url, software_type, software_configuration, computer_guid=None):
""" """
configuration_file_path (slapos acount) configuration_file_path (slapos acount)
...@@ -112,36 +120,31 @@ class SlapOSControlerCluster(object): ...@@ -112,36 +120,31 @@ class SlapOSControlerCluster(object):
# TODO : remove return # TODO : remove return
return return
self.log('SlapOSControler : _request') self.log('SlapOSControler : _request')
filter_kw = None filter_kw = None
if computer_guid != None: if computer_guid != None:
filter_kw = { "computer_guid": computer_guid } filter_kw = { "computer_guid": computer_guid }
if os.path.exists(configuration_file_path):
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("configuration_file") parser.add_argument("configuration_file")
args = parser.parse_args([self.configuration_file_path]) args = parser.parse_args([self.configuration_file_path])
config = client.Config(args, args.configuration_file) config = client.Config(args, args.configuration_file)
local = client.init(config) local = client.init(config)
partition = local['slap'].registerOpenOrder().request( try:
software_release = software_url, partition = local['slap'].registerOpenOrder().request(
partition_reference = reference, software_release = software_url,
partition_parameter_kw = software_configuration, partition_reference = reference,
software_type = software_type, partition_parameter_kw = software_configuration,
filter_kw = filter_kw) software_type = software_type,
# print "Instance requested.\nState is : %s." % partition.getState() filter_kw = filter_kw)
# Is it possible to have the true state of the instance with getState() ? # print "Instance requested.\nState is : %s." % partition.getState()
# Is it possible to have the true state of the instance with getState() ?
# Do a return partition ?
except:
class SlapOSControler(object): self.log("SlapOSControler.request, \
exception in registerOpenOrder", exc_info=sys.exc_info())
def __init__(self, working_directory, config, log): raise ValueError("Unable to request")
self.config = config else:
self.software_root = os.path.join(working_directory, 'soft') raise ValueError("Configuration file not found.")
self.instance_root = os.path.join(working_directory, 'inst')
self.slapos_config = os.path.join(working_directory, 'slapos.cfg')
self.log = log
self.proxy_database = os.path.join(working_directory, 'proxy.db')
def _resetSoftware(self): def _resetSoftware(self):
self.log('SlapOSControler : GOING TO RESET ALL SOFTWARE : %r' % self.log('SlapOSControler : GOING TO RESET ALL SOFTWARE : %r' %
......
...@@ -304,7 +304,7 @@ branch = %(branch)s ...@@ -304,7 +304,7 @@ branch = %(branch)s
self._cleanupLog() self._cleanupLog()
self._cleanupTemporaryFiles() self._cleanupTemporaryFiles()
def run(self): def run(self, my_type_test=None):
## BLOCK OK ## BLOCK OK
log = self.log log = self.log
...@@ -339,10 +339,23 @@ branch = %(branch)s ...@@ -339,10 +339,23 @@ branch = %(branch)s
# Select the good runner # Select the good runner
if True : if my_type_test == None:
# Default way to determine if it is a slability or unit test
# Here parse/get information to
# if XXX : runner = UnitTe...
# elif YYY : runner = Scal...
# else : Raise ...
# But for the moment :
runner = UnitTestRunner(self)
# Used in testERP5TestNode
if my_type_test == 'UnitTest':
runner = UnitTestRunner(self) runner = UnitTestRunner(self)
else : elif my_type_test == 'ScalabilityTest':
runner = ScalabilityTestRunner(self) runner = ScalabilityTestRunner(self)
else:
raise NotImplementedError
runner.prepareSlapOSForTestNode(test_node_slapos) runner.prepareSlapOSForTestNode(test_node_slapos)
#Clean-up test suites #Clean-up test suites
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment