From ca446356462a66574251f041781d45224e9e027e Mon Sep 17 00:00:00 2001 From: dbeltran Date: Wed, 28 Aug 2024 12:47:22 +0200 Subject: [PATCH 1/3] Removed lsf platform #1327 --- autosubmit/platforms/paramiko_submitter.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/autosubmit/platforms/paramiko_submitter.py b/autosubmit/platforms/paramiko_submitter.py index f72b1ecf4..dfdb27232 100644 --- a/autosubmit/platforms/paramiko_submitter.py +++ b/autosubmit/platforms/paramiko_submitter.py @@ -26,7 +26,6 @@ from autosubmitconfigparser.config.basicconfig import BasicConfig from autosubmitconfigparser.config.configcommon import AutosubmitConfig from .submitter import Submitter from autosubmit.platforms.psplatform import PsPlatform -from autosubmit.platforms.lsfplatform import LsfPlatform from autosubmit.platforms.pbsplatform import PBSPlatform from autosubmit.platforms.sgeplatform import SgePlatform from autosubmit.platforms.ecplatform import EcPlatform @@ -140,9 +139,6 @@ class ParamikoSubmitter(Submitter): elif platform_type == 'ps': remote_platform = PsPlatform( asconf.expid, section, config) - elif platform_type == 'lsf': - remote_platform = LsfPlatform( - asconf.expid, section, config) elif platform_type == 'ecaccess': remote_platform = EcPlatform( asconf.expid, section, config, platform_version) -- GitLab From 233e8ce580a7150a13df472c90cf00e7654125cc Mon Sep 17 00:00:00 2001 From: dbeltran Date: Wed, 28 Aug 2024 13:02:36 +0200 Subject: [PATCH 2/3] Removed lsf platform #1327 --- autosubmit/autosubmit.py | 2 +- autosubmit/job/job_packager.py | 4 +- autosubmit/platforms/headers/lsf_header.py | 183 ------------------ autosubmit/platforms/lsfplatform.py | 148 -------------- autosubmit/platforms/platform.py | 2 +- .../platforms/wrappers/wrapper_factory.py | 17 -- 6 files changed, 4 insertions(+), 352 deletions(-) delete mode 100644 autosubmit/platforms/headers/lsf_header.py diff --git a/autosubmit/autosubmit.py b/autosubmit/autosubmit.py index 6e9541b7a..edbf41341 100644 --- a/autosubmit/autosubmit.py +++ b/autosubmit/autosubmit.py @@ -2493,7 +2493,7 @@ class Autosubmit: :param job_list: job list to check \n :type job_list: JobList object \n :param platforms_to_test: platforms used \n - :type platforms_to_test: set of Platform Objects, e.g. SgePlatform(), LsfPlatform(). \n + :type platforms_to_test: set of Platform Objects, e.g. SgePlatform(), SlurmPlatform(). \n :param packages_persistence: Handles database per experiment. \n :type packages_persistence: JobPackagePersistence object \n :param inspect: True if coming from generate_scripts_andor_wrappers(). \n diff --git a/autosubmit/job/job_packager.py b/autosubmit/job/job_packager.py index 9d8e92b84..f452d40ff 100644 --- a/autosubmit/job/job_packager.py +++ b/autosubmit/job/job_packager.py @@ -35,8 +35,8 @@ class JobPackager(object): :param as_config: Autosubmit basic configuration.\n :type as_config: AutosubmitConfig object.\n - :param platform: A particular platform we are dealing with, e.g. Lsf Platform.\n - :type platform: Specific Platform Object, e.g. LsfPlatform(), EcPlatform(), ...\n + :param platform: A particular platform we are dealing with, e.g. Slurm Platform.\n + :type platform: Specific Platform Object, e.g. SlurmPlatform(), EcPlatform(), ...\n :param jobs_list: Contains the list of the jobs, along other properties.\n :type jobs_list: JobList object. """ diff --git a/autosubmit/platforms/headers/lsf_header.py b/autosubmit/platforms/headers/lsf_header.py deleted file mode 100644 index 7a1089507..000000000 --- a/autosubmit/platforms/headers/lsf_header.py +++ /dev/null @@ -1,183 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright 2017-2020 Earth Sciences Department, BSC-CNS - -# This file is part of Autosubmit. - -# Autosubmit is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# Autosubmit is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with Autosubmit. If not, see . - -import textwrap - - -class LsfHeader(object): - """Class to handle the MareNostrum3 headers of a job""" - - # noinspection PyMethodMayBeStatic - def get_queue_directive(self, job): - """ - Returns queue directive for the specified job - - :param job: job to create queue directive for - :type job: Job - :return: queue directive - :rtype: str - """ - if job.parameters['CURRENT_QUEUE'] == '': - return "" - else: - return "BSUB -q {0}".format(job.parameters['CURRENT_QUEUE']) - - # noinspection PyMethodMayBeStatic - def get_scratch_free_space(self, job): - if not isinstance(job.scratch_free_space, int): - return "" - else: - return '#BSUB -R "select[(scratch<{0})]"'.format(job.scratch_free_space) - - # noinspection PyMethodMayBeStatic - def get_tasks_per_node(self, job): - if not isinstance(job.tasks, int): - return "" - else: - return '#BSUB -R "span[ptile={0}]"'.format(job.tasks) - - # noinspection PyMethodMayBeStatic - def get_exclusivity(self, job): - if job._platform.exclusivity == 'true': - return "#BSUB -x" - else: - return "" - - # noinspection PyMethodMayBeStatic,PyUnusedLocal - def get_custom_directives(self, job): - """ - Returns custom directives for the specified job - - :param job: job to create custom directive for - :type job: Job - :return: custom directives - :rtype: str - """ - # There is no custom directives, so directive is empty - if job.parameters['CUSTOM_DIRECTIVES'] != '': - return '\n'.join(str(s) for s in job.parameters['CUSTOM_DIRECTIVES']) - return "" - - @classmethod - def array_header(cls, filename, array_id, wallclock, num_processors, **kwargs): - return textwrap.dedent("""\ - ############################################################################### - # {0} - ############################################################################### - # - # - #BSUB -J {0}{1} - #BSUB -oo {0}.%I.out - #BSUB -eo {0}.%I.err - #BSUB -W {2} - #BSUB -n {3} - {4} - # - ############################################################################### - - SCRIPT=$(cat {0}.$LSB_JOBINDEX | awk 'NR==1') - chmod +x $SCRIPT - ./$SCRIPT - """.format(filename, array_id, wallclock, num_processors, '\n'.join(str(s) for s in kwargs['directives']))) - - @classmethod - def thread_header(cls, filename, wallclock, num_processors, job_scripts, dependency_directive, **kwargs): - return textwrap.dedent("""\ - #!/usr/bin/env python3 - ############################################################################### - # {0} - ############################################################################### - # - #BSUB -J {0} - #BSUB -o {0}.out - #BSUB -e {0}.err - #BSUB -W {1} - #BSUB -n {2} - {4} - {5} - # - ############################################################################### - - import os - import sys - from threading import Thread - from commands import getstatusoutput - - class JobThread(Thread): - def __init__ (self, template, id_run): - Thread.__init__(self) - self.template = template - self.id_run = id_run - - def run(self): - out = str(self.template) + '.' + str(self.id_run) + '.out' - err = str(self.template) + '.' + str(self.id_run) + '.err' - command = str(self.template) + ' ' + str(self.id_run) + ' ' + os.getcwd() - (self.status) = getstatusoutput(command + ' > ' + out + ' 2> ' + err) - - scripts = {3} - - for i in range(len(scripts)): - current = JobThread(scripts[i], i+self.id_run) - current.start() - current.join() - completed_filename = scripts[i].replace('.cmd', '_COMPLETED') - completed_path = os.path.join(os.getcwd(), completed_filename) - if os.path.exists(completed_path): - print("The job ", current.template," has been COMPLETED") - else: - print("The job ", current.template," has FAILED") - os._exit(1) - """.format(filename, wallclock, num_processors, str(job_scripts), dependency_directive, - '\n'.join(str(s) for s in kwargs['directives']))) - - SERIAL = textwrap.dedent("""\ - ############################################################################### - # %TASKTYPE% %DEFAULT.EXPID% EXPERIMENT - ############################################################################### - # - #%QUEUE_DIRECTIVE% - #BSUB -J %JOBNAME% - #BSUB -oo %CURRENT_SCRATCH_DIR%/%CURRENT_PROJ%/%CURRENT_USER%/%DEFAULT.EXPID%/LOG_%DEFAULT.EXPID%/%OUT_LOG_DIRECTIVE% - #BSUB -eo %CURRENT_SCRATCH_DIR%/%CURRENT_PROJ%/%CURRENT_USER%/%DEFAULT.EXPID%/LOG_%DEFAULT.EXPID%/%ERR_LOG_DIRECTIVE% - #BSUB -W %WALLCLOCK% - #BSUB -n %NUMPROC% - %EXCLUSIVITY_DIRECTIVE% - %CUSTOM_DIRECTIVES% - # - ############################################################################### - """) - - PARALLEL = textwrap.dedent("""\ - ############################################################################### - # %TASKTYPE% %DEFAULT.EXPID% EXPERIMENT - ############################################################################### - # - #%QUEUE_DIRECTIVE% - #BSUB -J %JOBNAME% - #BSUB -oo %CURRENT_SCRATCH_DIR%/%CURRENT_PROJ%/%CURRENT_USER%/%DEFAULT.EXPID%/LOG_%DEFAULT.EXPID%/%OUT_LOG_DIRECTIVE% - #BSUB -eo %CURRENT_SCRATCH_DIR%/%CURRENT_PROJ%/%CURRENT_USER%/%DEFAULT.EXPID%/LOG_%DEFAULT.EXPID%/%ERR_LOG_DIRECTIVE% - #BSUB -W %WALLCLOCK% - #BSUB -n %NUMPROC% - %TASKS_PER_NODE_DIRECTIVE% - %SCRATCH_FREE_SPACE_DIRECTIVE% - %CUSTOM_DIRECTIVES% - # - ############################################################################### - """) diff --git a/autosubmit/platforms/lsfplatform.py b/autosubmit/platforms/lsfplatform.py index ca3c23d68..e69de29bb 100644 --- a/autosubmit/platforms/lsfplatform.py +++ b/autosubmit/platforms/lsfplatform.py @@ -1,148 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright 2017-2020 Earth Sciences Department, BSC-CNS - -# This file is part of Autosubmit. - -# Autosubmit is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# Autosubmit is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with Autosubmit. If not, see . - -import os - -from autosubmit.platforms.paramiko_platform import ParamikoPlatform -from autosubmit.platforms.headers.lsf_header import LsfHeader -from autosubmit.platforms.wrappers.wrapper_factory import LSFWrapperFactory - - -class LsfPlatform(ParamikoPlatform): - """ - Class to manage jobs to host using LSF scheduler - - :param expid: experiment's identifier - :type expid: str - """ - - def submit_Script(self, hold=False): - pass - - def get_checkAlljobs_cmd(self, jobs_id): - pass - - def parse_queue_reason(self, output, job_id): - pass - - def parse_Alljobs_output(self, output, job_id): - pass - - def __init__(self, expid, name, config): - ParamikoPlatform.__init__(self, expid, name, config) - self.mkdir_cmd = None - self.get_cmd = None - self.put_cmd = None - self._submit_command_name = None - self._submit_cmd = None - self._checkhost_cmd = None - self._checkjob_cmd = None - self.cancel_cmd = None - self._header = LsfHeader() - self._wrapper = LSFWrapperFactory(self) - self.job_status = dict() - self.job_status['COMPLETED'] = ['DONE'] - self.job_status['RUNNING'] = ['RUN'] - self.job_status['QUEUING'] = ['PEND', 'FW_PEND'] - self.job_status['FAILED'] = ['SSUSP', 'USUSP', 'EXIT'] - self._allow_arrays = True - self._allow_wrappers = True - self.update_cmds() - - def update_cmds(self): - """ - Updates commands for platforms - """ - self.root_dir = os.path.join(self.scratch, self.project_dir, self.user, self.expid) - self.remote_log_dir = os.path.join(self.root_dir, "LOG_" + self.expid) - self.cancel_cmd = "bkill" - self._checkjob_cmd = "bjobs " - self._checkhost_cmd = "echo 1" - self._submit_cmd = "bsub -cwd " + self.remote_log_dir + " < " + self.remote_log_dir + "/" - self._submit_command_name = "bsub" - self.put_cmd = "scp" - self.get_cmd = "scp" - self.mkdir_cmd = "mkdir -p " + self.remote_log_dir - - def get_checkhost_cmd(self): - return self._checkhost_cmd - - def get_mkdir_cmd(self): - return self.mkdir_cmd - - def get_remote_log_dir(self): - return self.remote_log_dir - - def check_Alljobs(self, job_list, as_conf, retries=5): - for job,prev_status in job_list: - self.check_job(job) - def parse_job_output(self, output): - job_state = output.split('\n') - if len(job_state) > 1: - job_state = job_state[1].split() - if len(job_state) > 2: - return job_state[2] - # If we can not process output, assuming completed. Then we will look for completed files and status will - # change to failed if COMPLETED file is not present. - return 'DONE' - - def get_submitted_job_id(self, output, x11 = False): - return output.split('<')[1].split('>')[0] - - def jobs_in_queue(self): - return zip(*[line.split() for line in ''.split('\n')])[0][1:] - - def get_checkjob_cmd(self, job_id): - return self._checkjob_cmd + str(job_id) - - def get_submit_cmd(self, job_script, job, hold=False, export=""): - if (export is None or export.lower() == "none") or len(export) == 0: - export = "" - else: - export += " ; " - return export + self._submit_cmd + job_script - - def wrapper_header(self,**kwargs): - return """\ - #!/usr/bin/env python3 - ############################################################################### - # {0} - ############################################################################### - # - #BSUB -J {0} - #BSUB -q {1} - #BSUB -P {2} - #BSUB -oo {0}.out - #BSUB -eo {0}.err - #BSUB -W {3} - #BSUB -n {4} - {5} - {6} - # - ############################################################################### - """.format( - kwargs["filename"], - kwargs["queue"], - kwargs["project"], - kwargs["wallclock"], - kwargs["num_procs"], - kwargs["dependency"], - "\n".ljust(13).join(str(s) for s in kwargs["directives"]), - ) - diff --git a/autosubmit/platforms/platform.py b/autosubmit/platforms/platform.py index 258562a90..80a2d4971 100644 --- a/autosubmit/platforms/platform.py +++ b/autosubmit/platforms/platform.py @@ -258,7 +258,7 @@ class Platform(object): :param job_list: job list to check \n :type job_list: JobList object \n :param platforms_to_test: platforms used \n - :type platforms_to_test: set of Platform Objects, e.g. SgePlatform(), LsfPlatform(). \n + :type platforms_to_test: set of Platform Objects, e.g. SgePlatform(), SlurmPlatform(). \n :param packages_persistence: Handles database per experiment. \n :type packages_persistence: JobPackagePersistence object \n :param inspect: True if coming from generate_scripts_andor_wrappers(). \n diff --git a/autosubmit/platforms/wrappers/wrapper_factory.py b/autosubmit/platforms/wrappers/wrapper_factory.py index f5e3bd2b2..1f47996a9 100644 --- a/autosubmit/platforms/wrappers/wrapper_factory.py +++ b/autosubmit/platforms/wrappers/wrapper_factory.py @@ -238,23 +238,6 @@ class PJMWrapperFactory(WrapperFactory): def partition_directive(self, partition): return '#PJM -g {0}'.format(partition) -class LSFWrapperFactory(WrapperFactory): - - def vertical_wrapper(self, **kwargs): - return PythonVerticalWrapperBuilder(**kwargs) - - def horizontal_wrapper(self, **kwargs): - return PythonHorizontalWrapperBuilder(**kwargs) - - def header_directives(self, **kwargs): - return self.platform.wrapper_header(**kwargs) - - def queue_directive(self, queue): - return queue - - def dependency_directive(self, dependency): - return '#BSUB -w \'done({0})\' [-ti]'.format(dependency) - class EcWrapperFactory(WrapperFactory): -- GitLab From ac9c3964e15d727d51d7ea5dd4b92a149cb52ceb Mon Sep 17 00:00:00 2001 From: dbeltran Date: Fri, 30 Aug 2024 10:00:56 +0200 Subject: [PATCH 3/3] Removed lsf from docs and tests --- docs/source/index.rst | 2 +- docs/source/moduledoc/platforms.rst | 3 --- docs/source/qstartguide/index.rst | 2 +- .../userguide/configure/develop_a_project.rst | 18 +++------------ docs/source/userguide/configure/index.rst | 14 +++++------ test/regression/default_conf/platforms.conf | 23 +------------------ test/unit/files/fake-platforms.yml | 11 --------- 7 files changed, 12 insertions(+), 61 deletions(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index 6e2a35ce7..881be6367 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -218,7 +218,7 @@ of how to install Autosubmit with Conda. Multiplatform

-

Widely used to run experiments on different platforms simultaneously, using batch schedulers such as Slurm, PBS, LSF. It is deployed and used on various HPC and cloud systems.

+

Widely used to run experiments on different platforms simultaneously, using batch schedulers such as Slurm and PBS. It is deployed and used on various HPC and cloud systems.

diff --git a/docs/source/moduledoc/platforms.rst b/docs/source/moduledoc/platforms.rst index 4fb9f3ee9..ecb8003ff 100644 --- a/docs/source/moduledoc/platforms.rst +++ b/docs/source/moduledoc/platforms.rst @@ -3,9 +3,6 @@ autosubmit.platform .. automodule:: autosubmit.platforms.ecplatform :show-inheritance: :members: -.. automodule:: autosubmit.platforms.lsfplatform - :show-inheritance: - :members: .. automodule:: autosubmit.platforms.pbsplatform :show-inheritance: :members: diff --git a/docs/source/qstartguide/index.rst b/docs/source/qstartguide/index.rst index 9ec8ad034..29a78ec25 100644 --- a/docs/source/qstartguide/index.rst +++ b/docs/source/qstartguide/index.rst @@ -211,7 +211,7 @@ Now open platforms.yml. Note: This will be an example for marenostrum4 PLATFORMS: marenostrum4: - # Queue type. Options: ps, SGE, LSF, SLURM, PBS, eceaccess + # Queue type. Options: ps, SGE, SLURM, PBS, eceaccess # scheduler type TYPE: slurm HOST: mn1.bsc.es,mn2.bsc.es,mn3.bsc.es diff --git a/docs/source/userguide/configure/develop_a_project.rst b/docs/source/userguide/configure/develop_a_project.rst index 74786fda5..132d800af 100644 --- a/docs/source/userguide/configure/develop_a_project.rst +++ b/docs/source/userguide/configure/develop_a_project.rst @@ -271,7 +271,7 @@ Platform configuration # Example platform with all options specified ## Platform name # PLATFORM: - ## Queue type. Options: PBS, SGE, PS, LSF, ecaccess, SLURM + ## Queue type. Options: PBS, SGE, PS, ecaccess, SLURM # TYPE: ## Version of queue manager to use. Needed only in PBS (options: 10, 11, 12) and ecaccess (options: pbs, loadleveler) # VERSION: @@ -308,7 +308,7 @@ Platform configuration # TOTAL_JOBS: 6 ithaca: - # Queue type. Options: ps, SGE, LSF, SLURM, PBS, eceaccess + # Queue type. Options: ps, SGE, SLURM, PBS, eceaccess TYPE: SGE HOST: ithaca PROJECT: cfu @@ -605,7 +605,7 @@ In this section, we describe the platform configuration using `-QOS` and also `P SCRATCH_DIR: /gpfs/scratch marenostrum4: - # Queue type. Options: ps, SGE, LSF, SLURM, PBS, eceaccess + # Queue type. Options: ps, SGE, SLURM, PBS, eceaccess TYPE: slurm HOST: mn1.bsc.es,mn2.bsc.es,mn3.bsc.es PROJECT: bsc32 @@ -641,18 +641,6 @@ In this section, we describe the platform configuration using `-QOS` and also `P SERIAL_QUEUE: debug QUEUE: debug - nord3: - TYPE: lsf - HOST: nord1.bsc.es - PROJECT: bsc32 - USER: bsc32070 - ADD_PROJECT_TO_HOST: False - SCRATCH_DIR: /gpfs/scratch - TEST_SUITE: False - MAX_WALLCLOCK: 48:00 - MAX_PROCESSORS: 1024 - PROCESSORS_PER_NODE: 16 - transfer_node: TYPE: ps HOST: dt01.bsc.es diff --git a/docs/source/userguide/configure/index.rst b/docs/source/userguide/configure/index.rst index 360d7a959..9b04ee850 100644 --- a/docs/source/userguide/configure/index.rst +++ b/docs/source/userguide/configure/index.rst @@ -277,7 +277,7 @@ identifier and add this text: This will create a platform named "new_platform". The options specified are all mandatory: -* TYPE: queue type for the platform. Options supported are PBS, SGE, PS, LSF, ecaccess and SLURM. +* TYPE: queue type for the platform. Options supported are PBS, SGE, PS, ecaccess and SLURM. * HOST: hostname of the platform @@ -354,15 +354,13 @@ Example: .. code-block:: yaml PLATFORMS: - marenostrum3: - TYPE: LSF + marenostrum5: + TYPE: slurm HOST: mn-bsc32 PROJECT: bsc32 ADD_PROJECT_TO_HOST: false - USER: bsc32XXX + USER: bsc032XXX SCRATCH_DIR: /gpfs/scratch - TEST_SUITE: True - EXCLUSIVITY: True Of course, you can configure only one or both. For example, for reservation it would be: @@ -374,8 +372,8 @@ Example: .. code-block:: YAML PLATFORMS: - marenostrum3: - TYPE: LSF + marenostrum5: + TYPE: slurm ... RESERVATION: your-reservation-id diff --git a/test/regression/default_conf/platforms.conf b/test/regression/default_conf/platforms.conf index 8be29c4b5..09fd4f1e4 100644 --- a/test/regression/default_conf/platforms.conf +++ b/test/regression/default_conf/platforms.conf @@ -30,18 +30,6 @@ SCRATCH_DIR = /esnas/scratch TEST_SUITE = False QUEUE = serial -[marenostrum3] -TYPE = lsf -VERSION = mn -HOST = mn3 -PROJECT = bsc32 -QUEUE = debug -ADD_PROJECT_TO_HOST = false -USER = bsc32047 -SCRATCH_DIR = /gpfs/scratch -TEST_SUITE = True -PROCESSORS_PER_NODE = 16 - [marenostrum4] TYPE = slurm HOST = mn4 @@ -65,13 +53,4 @@ USER = m300339 SCRATCH_DIR = /mnt/lustre01/work TEST_SUITE = True -[SEDEMA] -# Queue type. Options: ps, SGE, LSF, SLURM, PBS, eceaccess -TYPE = lsf -HOST = aqfs-mex -PROJECT = AQFS-MexDF_operacional -ADD_PROJECT_TO_HOST = false -USER = modelos -SCRATCH_DIR = /data -TEST_SUITE = False -QUEUE = medium_priority + diff --git a/test/unit/files/fake-platforms.yml b/test/unit/files/fake-platforms.yml index ba5810c3f..b7a618a1a 100644 --- a/test/unit/files/fake-platforms.yml +++ b/test/unit/files/fake-platforms.yml @@ -41,17 +41,6 @@ PLATFORMS: TEST_SUITE: 'False' SERIAL_QUEUE: debug QUEUE: debug - NORD3: - TYPE: lsf - HOST: nord1.bsc.es - PROJECT: bsc32 - USER: bsc32070 - ADD_PROJECT_TO_HOST: 'False' - SCRATCH_DIR: /gpfs/scratch - TEST_SUITE: 'False' - MAX_WALLCLOCK: 48:00 - MAX_PROCESSORS: '1024' - PROCESSORS_PER_NODE: '16' TRANSFER_NODE: TYPE: ps HOST: dt01.bsc.es -- GitLab