Commit ca831dcb authored by Łukasz Nowak's avatar Łukasz Nowak

slapos: Implement partition timeout parameter

It's very useful in some deployments to control maximum time of
partition processing. This parmater can end up in slapos.cfg configuration
file or command line.
parent 9465e76b
...@@ -85,6 +85,9 @@ class SlapgridCommand(ConfigCommand): ...@@ -85,6 +85,9 @@ class SlapgridCommand(ConfigCommand):
type=int, type=int,
help='Promise timeout in seconds' help='Promise timeout in seconds'
' (default: %(default)s)') ' (default: %(default)s)')
ap.add_argument('--partition-timeout',
type=int,
help='Partition timeout in seconds (optional)')
ap.add_argument('--now', ap.add_argument('--now',
action='store_true', action='store_true',
help='Launch slapgrid without delay. Default behavior.') help='Launch slapgrid without delay. Default behavior.')
......
...@@ -423,6 +423,7 @@ class Partition(object): ...@@ -423,6 +423,7 @@ class Partition(object):
instance_storage_home='', instance_storage_home='',
ipv4_global_network='', ipv4_global_network='',
buildout_debug=False, buildout_debug=False,
partition_timeout=None,
): ):
"""Initialisation of class parameters""" """Initialisation of class parameters"""
self.buildout = buildout self.buildout = buildout
...@@ -443,6 +444,7 @@ class Partition(object): ...@@ -443,6 +444,7 @@ class Partition(object):
self.software_release_url = software_release_url self.software_release_url = software_release_url
self.instance_storage_home = instance_storage_home self.instance_storage_home = instance_storage_home
self.ipv4_global_network = ipv4_global_network self.ipv4_global_network = ipv4_global_network
self.partition_timeout = partition_timeout
self.key_file = '' self.key_file = ''
self.cert_file = '' self.cert_file = ''
...@@ -701,7 +703,8 @@ class Partition(object): ...@@ -701,7 +703,8 @@ class Partition(object):
utils.launchBuildout(path=self.instance_path, utils.launchBuildout(path=self.instance_path,
buildout_binary=buildout_binary, buildout_binary=buildout_binary,
logger=self.logger, logger=self.logger,
debug=self.buildout_debug) debug=self.buildout_debug,
timeout=self.partition_timeout)
self.generateSupervisorConfigurationFile() self.generateSupervisorConfigurationFile()
self.createRetentionLockDelay() self.createRetentionLockDelay()
self.instance_python = getPythonExecutableFromSoftwarePath(self.software_path) self.instance_python = getPythonExecutableFromSoftwarePath(self.software_path)
......
...@@ -12,6 +12,7 @@ parser = argparse.ArgumentParser() ...@@ -12,6 +12,7 @@ parser = argparse.ArgumentParser()
parser.add_argument('--promise-folder', required=True) parser.add_argument('--promise-folder', required=True)
parser.add_argument('--legacy-promise-folder', default=None) parser.add_argument('--legacy-promise-folder', default=None)
parser.add_argument('--promise-timeout', type=int, default=20) parser.add_argument('--promise-timeout', type=int, default=20)
parser.add_argument('--partition-timeout', type=int, default=None)
parser.add_argument('--partition-folder', default=None) parser.add_argument('--partition-folder', default=None)
parser.add_argument('--log-folder', default=None) parser.add_argument('--log-folder', default=None)
parser.add_argument('--force', action='store_true') parser.add_argument('--force', action='store_true')
......
...@@ -260,6 +260,12 @@ def create_slapgrid_object(options, logger): ...@@ -260,6 +260,12 @@ def create_slapgrid_object(options, logger):
software_min_free_space = human2bytes(op.get('software_min_free_space', '1000M')) software_min_free_space = human2bytes(op.get('software_min_free_space', '1000M'))
instance_min_free_space = human2bytes(op.get('instance_min_free_space', '1000M')) instance_min_free_space = human2bytes(op.get('instance_min_free_space', '1000M'))
# Nicely check and convert partition_timeout, in order to support slapos.cfg
# provided, which is string and command line, which is int, and in the same
# time resort to proper None as default - no timeout
partition_timeout = op.get('partition_timeout', op.get('partition-timeout'))
if partition_timeout is not None:
partition_timeout = int(partition_timeout)
return Slapgrid(software_root=op['software_root'], return Slapgrid(software_root=op['software_root'],
instance_root=op['instance_root'], instance_root=op['instance_root'],
shared_part_list=op.get('shared_part_list', ''), shared_part_list=op.get('shared_part_list', ''),
...@@ -307,7 +313,8 @@ def create_slapgrid_object(options, logger): ...@@ -307,7 +313,8 @@ def create_slapgrid_object(options, logger):
ipv4_global_network=op.get('ipv4_global_network'), ipv4_global_network=op.get('ipv4_global_network'),
firewall_conf=op.get('firewall'), firewall_conf=op.get('firewall'),
config=options, config=options,
force_stop=op.get('force_stop', False)) force_stop=op.get('force_stop', False),
partition_timeout=partition_timeout)
def check_required_only_partitions(existing, required): def check_required_only_partitions(existing, required):
...@@ -370,6 +377,7 @@ class Slapgrid(object): ...@@ -370,6 +377,7 @@ class Slapgrid(object):
buildout_debug=False, buildout_debug=False,
shared_part_list='', shared_part_list='',
force_stop=False, force_stop=False,
partition_timeout=None,
): ):
"""Makes easy initialisation of class parameters""" """Makes easy initialisation of class parameters"""
# Parses arguments # Parses arguments
...@@ -413,6 +421,7 @@ class Slapgrid(object): ...@@ -413,6 +421,7 @@ class Slapgrid(object):
self.buildout = buildout self.buildout = buildout
self.buildout_debug = buildout_debug self.buildout_debug = buildout_debug
self.promise_timeout = promise_timeout self.promise_timeout = promise_timeout
self.partition_timeout = partition_timeout
self.develop = develop self.develop = develop
if software_release_filter_list is not None: if software_release_filter_list is not None:
self.software_release_filter_list = \ self.software_release_filter_list = \
...@@ -1180,6 +1189,7 @@ stderr_logfile_backups=1 ...@@ -1180,6 +1189,7 @@ stderr_logfile_backups=1
instance_min_free_space=self.instance_min_free_space, instance_min_free_space=self.instance_min_free_space,
instance_storage_home=self.instance_storage_home, instance_storage_home=self.instance_storage_home,
ipv4_global_network=self.ipv4_global_network, ipv4_global_network=self.ipv4_global_network,
partition_timeout=self.partition_timeout
) )
# let managers modify current partition # let managers modify current partition
......
...@@ -402,7 +402,7 @@ def bootstrapBuildout(path, logger, buildout=None, ...@@ -402,7 +402,7 @@ def bootstrapBuildout(path, logger, buildout=None,
def launchBuildout(path, buildout_binary, logger, def launchBuildout(path, buildout_binary, logger,
additional_buildout_parameter_list=None, additional_buildout_parameter_list=None,
debug=False): debug=False, timeout=None):
""" Launches buildout.""" """ Launches buildout."""
if additional_buildout_parameter_list is None: if additional_buildout_parameter_list is None:
additional_buildout_parameter_list = [] additional_buildout_parameter_list = []
...@@ -437,7 +437,8 @@ def launchBuildout(path, buildout_binary, logger, ...@@ -437,7 +437,8 @@ def launchBuildout(path, buildout_binary, logger,
env=getCleanEnvironment(logger=logger, env=getCleanEnvironment(logger=logger,
home_path=path), home_path=path),
debug=debug, debug=debug,
logger=logger) logger=logger,
timeout=timeout)
if process_handler.returncode is None or process_handler.returncode != 0: if process_handler.returncode is None or process_handler.returncode != 0:
message = 'Failed to run buildout profile in directory %r' % path message = 'Failed to run buildout profile in directory %r' % path
logger.error(message) logger.error(message)
......
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