From ba91511aecbe5bf396d76a8d61ad71caf9685a6c Mon Sep 17 00:00:00 2001 From: Andrei Tsaregorodtsev Date: Tue, 11 Oct 2022 13:27:30 +0200 Subject: [PATCH 01/13] feat: pass pilot stamp to the pilot environment --- .../Resources/Computing/HTCondorCEComputingElement.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py b/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py index 2d84f2bca7a..0c19004524d 100644 --- a/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py +++ b/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py @@ -152,13 +152,14 @@ def __init__(self, ceUniqueID): self.remoteScheddOptions = "" ############################################################################# - def __writeSub(self, executable, nJobs, location, processors): + def __writeSub(self, executable, nJobs, location, processors, pilotStamps): """Create the Sub File for submission. :param str executable: name of the script to execute :param int nJobs: number of desired jobs :param str location: directory that should contain the result of the jobs :param int processors: number of CPU cores to allocate + :param list pilotStamps: list of pilot stamps (strings) """ self.log.debug("Working directory: %s " % self.workingDirectory) @@ -197,7 +198,7 @@ def __writeSub(self, executable, nJobs, location, processors): output = $(Cluster).$(Process).out error = $(Cluster).$(Process).err log = $(Cluster).$(Process).log -environment = "HTCONDOR_JOBID=$(Cluster).$(Process)" +environment = "HTCONDOR_JOBID=$(Cluster).$(Process) DIRAC_PILOT_STAMP=$(stamp)" initialdir = %(initialDir)s grid_resource = condor %(ceName)s %(ceName)s:9619 transfer_output_files = "" @@ -208,7 +209,7 @@ def __writeSub(self, executable, nJobs, location, processors): %(extraString)s -Queue %(nJobs)s +Queue stamp in %(pilotStampList)s """ % dict( executable=executable, @@ -219,6 +220,7 @@ def __writeSub(self, executable, nJobs, location, processors): initialDir=os.path.join(self.workingDirectory, location), localScheddOptions=localScheddOptions, targetUniverse=targetUniverse, + pilotStampList=','.join(pilotStamps) ) subFile.write(sub) subFile.close() @@ -261,7 +263,7 @@ def submitJob(self, executableFile, proxy, numberOfJobs=1): # We randomize the location of the pilot output and log, because there are just too many of them location = logDir(self.ceName, commonJobStampPart) nProcessors = self.ceParameters.get("NumberOfProcessors", 1) - subName = self.__writeSub(executableFile, numberOfJobs, location, nProcessors) + subName = self.__writeSub(executableFile, numberOfJobs, location, nProcessors, jobStamps) cmd = ["condor_submit", "-terse", subName] # the options for submit to remote are different than the other remoteScheddOptions From 8637ca0b9ab4630fb7bfddc5edbc2b945a9cf088 Mon Sep 17 00:00:00 2001 From: Andrei Tsaregorodtsev Date: Tue, 11 Oct 2022 13:40:54 +0200 Subject: [PATCH 02/13] fix: double string quotes --- src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py b/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py index 0c19004524d..3b8fe6440a0 100644 --- a/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py +++ b/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py @@ -220,7 +220,7 @@ def __writeSub(self, executable, nJobs, location, processors, pilotStamps): initialDir=os.path.join(self.workingDirectory, location), localScheddOptions=localScheddOptions, targetUniverse=targetUniverse, - pilotStampList=','.join(pilotStamps) + pilotStampList=",".join(pilotStamps) ) subFile.write(sub) subFile.close() From a04d056c943ffb6c495cc52df4428b77d19a994c Mon Sep 17 00:00:00 2001 From: Andrei Tsaregorodtsev Date: Tue, 11 Oct 2022 13:47:43 +0200 Subject: [PATCH 03/13] feat: pass pilot stamp to the pilot environment --- src/DIRAC/Resources/Computing/ARCComputingElement.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/DIRAC/Resources/Computing/ARCComputingElement.py b/src/DIRAC/Resources/Computing/ARCComputingElement.py index f751d78c0fd..37c17075027 100755 --- a/src/DIRAC/Resources/Computing/ARCComputingElement.py +++ b/src/DIRAC/Resources/Computing/ARCComputingElement.py @@ -256,6 +256,7 @@ def _writeXRSL(self, executableFile, inputs=None, outputs=None, executables=None (inputFiles=({executable} "{executableFile}") {xrslInputAdditions}) (stdout="{diracStamp}.out") (stderr="{diracStamp}.err") +(environment="(DIRAC_PILOT_STAMP {diracStamp}")) (outputFiles={xrslOutputFiles}) (queue={queue}) {xrslMPAdditions} From 77ad29f78cb3aff65c449ef526c539b7288f5570 Mon Sep 17 00:00:00 2001 From: Andrei Tsaregorodtsev Date: Tue, 11 Oct 2022 14:50:14 +0200 Subject: [PATCH 04/13] feat: add pilot stamps for cloud pilots --- src/DIRAC/Resources/Computing/CloudComputingElement.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/DIRAC/Resources/Computing/CloudComputingElement.py b/src/DIRAC/Resources/Computing/CloudComputingElement.py index bc59730cddc..7a38e776c27 100644 --- a/src/DIRAC/Resources/Computing/CloudComputingElement.py +++ b/src/DIRAC/Resources/Computing/CloudComputingElement.py @@ -431,6 +431,7 @@ def submitJob(self, executableFile, proxy, numberOfJobs=1): instParams["ex_config_drive"] = True driver = self._getDriver() + stampDict = {} for _ in range(numberOfJobs): # generates an 8 character hex string @@ -443,9 +444,11 @@ def submitJob(self, executableFile, proxy, numberOfJobs=1): self.log.error("Failed to create_node", str(err)) continue instIDs.append(VM_ID_PREFIX + node.id) + stampDict[instName] = instRandom if not instIDs: return S_ERROR("Failed to submit any instances.") - return S_OK(instIDs) + result = S_OK(instIDs) + result["PilotStampDict"] = stampDict def killJob(self, jobIDList): """Stops VM instances From 8c2f8948dcd804e5d068f4c5f64b7c1908d9b752 Mon Sep 17 00:00:00 2001 From: Andrei Tsaregorodtsev Date: Tue, 11 Oct 2022 15:11:07 +0200 Subject: [PATCH 05/13] feat: define DIRAC_PILOT_STAMP for the VMs case --- src/DIRAC/Resources/Computing/cloudinit.template | 1 + 1 file changed, 1 insertion(+) diff --git a/src/DIRAC/Resources/Computing/cloudinit.template b/src/DIRAC/Resources/Computing/cloudinit.template index 3b8f489da9f..999ea2b1866 100644 --- a/src/DIRAC/Resources/Computing/cloudinit.template +++ b/src/DIRAC/Resources/Computing/cloudinit.template @@ -81,6 +81,7 @@ write_files: cd /mnt/dirac export X509_USER_PROXY=/mnt/proxy.pem export PILOT_UUID="cloud://$(cat /var/lib/cloud/data/instance-id)" + export DIRAC_PILOT_STAMP="${PILOT_UUID: -8:8}" bash /mnt/run_pilot.sh &> /mnt/dirac/startup.log yum_repos: From 60edb53e1de9b49ffa777ff53f7ba252cff343b1 Mon Sep 17 00:00:00 2001 From: Andrei Tsaregorodtsev Date: Tue, 11 Oct 2022 16:35:11 +0200 Subject: [PATCH 06/13] feat: propagate pilot stamp to the execution environment --- src/DIRAC/Resources/Computing/BatchSystems/Condor.py | 7 ++++--- src/DIRAC/Resources/Computing/BatchSystems/Host.py | 1 + src/DIRAC/Resources/Computing/BatchSystems/SLURM.py | 5 +++-- src/DIRAC/Resources/Computing/SSHBatchComputingElement.py | 6 +++++- src/DIRAC/Resources/Computing/SSHComputingElement.py | 4 ++++ 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/DIRAC/Resources/Computing/BatchSystems/Condor.py b/src/DIRAC/Resources/Computing/BatchSystems/Condor.py index a118ad67f90..2df20d100be 100644 --- a/src/DIRAC/Resources/Computing/BatchSystems/Condor.py +++ b/src/DIRAC/Resources/Computing/BatchSystems/Condor.py @@ -82,6 +82,7 @@ def submitJob(self, **kwargs): nJobs = kwargs.get("NJobs") if not nJobs: nJobs = 1 + stamps = kwargs["JobStamps"] numberOfProcessors = kwargs.get("NumberOfProcessors") wholeNode = kwargs.get("WholeNode") outputDir = kwargs["OutputDir"] @@ -106,15 +107,15 @@ def submitJob(self, **kwargs): Output = $(Cluster).$(Process).out Error = $(Cluster).$(Process).err Log = test.log - Environment = CONDOR_JOBID=$(Cluster).$(Process) + Environment = "CONDOR_JOBID=$(Cluster).$(Process) DIRAC_PILOT_STAMP=$(stamp)" Getenv = False request_cpus = %s - Queue %s + Queue stamp in %s """ - % (executable, requirements, outputDir, numberOfProcessors, nJobs) + % (executable, requirements, outputDir, numberOfProcessors, ",".join(stamps)) ) jdlFile.flush() diff --git a/src/DIRAC/Resources/Computing/BatchSystems/Host.py b/src/DIRAC/Resources/Computing/BatchSystems/Host.py index 65046045f29..cdd0a49396b 100644 --- a/src/DIRAC/Resources/Computing/BatchSystems/Host.py +++ b/src/DIRAC/Resources/Computing/BatchSystems/Host.py @@ -94,6 +94,7 @@ def submitJob(self, **kwargs): args["Stamp"] = stamps[_i] envDict = os.environ envDict[jobidName] = stamps[_i] + envDict["DIRAC_PILOT_STAMP"] = stamps[_i] if nodeHost: envDict["SSH_NODE_HOST"] = nodeHost try: diff --git a/src/DIRAC/Resources/Computing/BatchSystems/SLURM.py b/src/DIRAC/Resources/Computing/BatchSystems/SLURM.py index ef06503cc65..1bf31da6ba7 100644 --- a/src/DIRAC/Resources/Computing/BatchSystems/SLURM.py +++ b/src/DIRAC/Resources/Computing/BatchSystems/SLURM.py @@ -32,6 +32,7 @@ def submitJob(self, **kwargs): if not nJobs: nJobs = 1 + stamps = kwargs["JobStamps"] outputDir = kwargs["OutputDir"] errorDir = kwargs["ErrorDir"] queue = kwargs["Queue"] @@ -56,13 +57,13 @@ def submitJob(self, **kwargs): executable = self._generateSrunWrapper(executable) jobIDs = [] - for _i in range(nJobs): + for iJob in range(nJobs): jid = "" cmd = "%s; " % preamble if preamble else "" # By default, all the environment variables of the submitter node are propagated to the workers # It can create conflicts during the installation of the pilots # --export restricts the propagation to the PATH variable to get a clean environment in the workers - cmd += "sbatch --export=PATH " + cmd += "sbatch --export=PATH,DIRAC_PILOT_STAMP=%s " % stamps[iJob] cmd += "-o %s/%%j.out " % outputDir cmd += "-e %s/%%j.err " % errorDir cmd += "--partition=%s " % queue diff --git a/src/DIRAC/Resources/Computing/SSHBatchComputingElement.py b/src/DIRAC/Resources/Computing/SSHBatchComputingElement.py index ccf0f31eaa5..94fc0d35635 100644 --- a/src/DIRAC/Resources/Computing/SSHBatchComputingElement.py +++ b/src/DIRAC/Resources/Computing/SSHBatchComputingElement.py @@ -130,6 +130,7 @@ def submitJob(self, executableFile, proxy, numberOfJobs=1): # Submit jobs now restJobs = numberOfJobs submittedJobs = [] + stampDict = {} for slots in range(maxSlots, 0, -1): if slots not in rankHosts: continue @@ -141,6 +142,7 @@ def submitJob(self, executableFile, proxy, numberOfJobs=1): nJobs = len(result["Value"]) if nJobs > 0: submittedJobs.extend(result["Value"]) + stampDict.update(result.get("PilotStampDict",{})) restJobs = restJobs - nJobs if restJobs <= 0: break @@ -150,7 +152,9 @@ def submitJob(self, executableFile, proxy, numberOfJobs=1): if proxy: os.remove(submitFile) - return S_OK(submittedJobs) + result = S_OK(submittedJobs) + result["PilotStampDict"] = stampDict + return result def killJob(self, jobIDs): """Kill specified jobs""" diff --git a/src/DIRAC/Resources/Computing/SSHComputingElement.py b/src/DIRAC/Resources/Computing/SSHComputingElement.py index 945275e4093..bf581294c1e 100644 --- a/src/DIRAC/Resources/Computing/SSHComputingElement.py +++ b/src/DIRAC/Resources/Computing/SSHComputingElement.py @@ -641,6 +641,10 @@ def _submitJobToHost(self, executableFile, numberOfJobs, host=None): return S_ERROR("No jobs IDs returned") result = S_OK(jobIDs) + stampDict = {} + for iJob, jobID in enumerate(jobIDs): + stampDict[jobID] = jobStamps[iJob] + result["PilotStampDict"] = stampDict self.submittedJobs += len(batchIDs) return result From d5fd568ddf86c59e26c24a30a8bf9759dd0adc3e Mon Sep 17 00:00:00 2001 From: Andrei Tsaregorodtsev Date: Tue, 11 Oct 2022 16:50:33 +0200 Subject: [PATCH 07/13] feat: pass pilot stamp directly to the template --- src/DIRAC/Resources/Computing/CloudComputingElement.py | 7 +++++-- src/DIRAC/Resources/Computing/cloudinit.template | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/DIRAC/Resources/Computing/CloudComputingElement.py b/src/DIRAC/Resources/Computing/CloudComputingElement.py index 7a38e776c27..8a577362ec8 100644 --- a/src/DIRAC/Resources/Computing/CloudComputingElement.py +++ b/src/DIRAC/Resources/Computing/CloudComputingElement.py @@ -286,7 +286,7 @@ def _getSSHKeyID(self): """ return self.ceParameters.get("Instance_SSHKey", None) - def _getMetadata(self, executableFile): + def _getMetadata(self, executableFile, pilotStamp=""): """Builds metadata from configuration system, cloudinit template and dirac pilot job wrapper @@ -309,6 +309,8 @@ def _getMetadata(self, executableFile): filedef["content"] = self.proxy elif filedef["content"] == "EXECUTABLE_STR": filedef["content"] = exe_str + elif "STAMP_STR" in filedef["content"]: + filedef["content"] = filedef["content"].replace("STAMP_STR", pilotStamp) ext_packages = self.ceParameters.get("Context_ExtPackages", None) if ext_packages: packages = [x.strip() for x in ext_packages.split(",")] @@ -427,7 +429,6 @@ def submitJob(self, executableFile, proxy, numberOfJobs=1): instParams["image"] = self._getImage() instParams["size"] = self._getFlavor() instParams["ex_keyname"] = self._getSSHKeyID() - instParams["ex_userdata"] = self._getMetadata(executableFile) instParams["ex_config_drive"] = True driver = self._getDriver() @@ -438,6 +439,7 @@ def submitJob(self, executableFile, proxy, numberOfJobs=1): instRandom = str(uuid.uuid4()).upper()[:8] instName = VM_NAME_PREFIX + instRandom instParams["name"] = instName + instParams["ex_userdata"] = self._getMetadata( executableFile, instRandom ) try: node = driver.create_node(**instParams) except Exception as err: @@ -449,6 +451,7 @@ def submitJob(self, executableFile, proxy, numberOfJobs=1): return S_ERROR("Failed to submit any instances.") result = S_OK(instIDs) result["PilotStampDict"] = stampDict + return result def killJob(self, jobIDList): """Stops VM instances diff --git a/src/DIRAC/Resources/Computing/cloudinit.template b/src/DIRAC/Resources/Computing/cloudinit.template index 999ea2b1866..b2d1d1e0496 100644 --- a/src/DIRAC/Resources/Computing/cloudinit.template +++ b/src/DIRAC/Resources/Computing/cloudinit.template @@ -81,7 +81,7 @@ write_files: cd /mnt/dirac export X509_USER_PROXY=/mnt/proxy.pem export PILOT_UUID="cloud://$(cat /var/lib/cloud/data/instance-id)" - export DIRAC_PILOT_STAMP="${PILOT_UUID: -8:8}" + export DIRAC_PILOT_STAMP="STAMP_STR" bash /mnt/run_pilot.sh &> /mnt/dirac/startup.log yum_repos: From bf731c0a228add7523d9b09e0d31f68dbe8ce05b Mon Sep 17 00:00:00 2001 From: Andrei Tsaregorodtsev Date: Tue, 11 Oct 2022 16:52:26 +0200 Subject: [PATCH 08/13] fix: fix the black style --- src/DIRAC/Resources/Computing/SSHBatchComputingElement.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DIRAC/Resources/Computing/SSHBatchComputingElement.py b/src/DIRAC/Resources/Computing/SSHBatchComputingElement.py index 94fc0d35635..0796de483f2 100644 --- a/src/DIRAC/Resources/Computing/SSHBatchComputingElement.py +++ b/src/DIRAC/Resources/Computing/SSHBatchComputingElement.py @@ -142,7 +142,7 @@ def submitJob(self, executableFile, proxy, numberOfJobs=1): nJobs = len(result["Value"]) if nJobs > 0: submittedJobs.extend(result["Value"]) - stampDict.update(result.get("PilotStampDict",{})) + stampDict.update(result.get("PilotStampDict", {})) restJobs = restJobs - nJobs if restJobs <= 0: break From eed1f0e264282f9bcdc20e947e843be98363cd37 Mon Sep 17 00:00:00 2001 From: Andrei Tsaregorodtsev Date: Tue, 11 Oct 2022 16:57:30 +0200 Subject: [PATCH 09/13] fix: fix black style --- src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py b/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py index 3b8fe6440a0..70dbd4db90b 100644 --- a/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py +++ b/src/DIRAC/Resources/Computing/HTCondorCEComputingElement.py @@ -220,7 +220,7 @@ def __writeSub(self, executable, nJobs, location, processors, pilotStamps): initialDir=os.path.join(self.workingDirectory, location), localScheddOptions=localScheddOptions, targetUniverse=targetUniverse, - pilotStampList=",".join(pilotStamps) + pilotStampList=",".join(pilotStamps), ) subFile.write(sub) subFile.close() From 61a87a82e726362de01a6405b07bd639c50f636b Mon Sep 17 00:00:00 2001 From: Andrei Tsaregorodtsev Date: Fri, 14 Oct 2022 16:03:33 +0200 Subject: [PATCH 10/13] fix: environment definition in XRSL --- src/DIRAC/Resources/Computing/ARCComputingElement.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DIRAC/Resources/Computing/ARCComputingElement.py b/src/DIRAC/Resources/Computing/ARCComputingElement.py index 37c17075027..732a11e061c 100755 --- a/src/DIRAC/Resources/Computing/ARCComputingElement.py +++ b/src/DIRAC/Resources/Computing/ARCComputingElement.py @@ -256,7 +256,7 @@ def _writeXRSL(self, executableFile, inputs=None, outputs=None, executables=None (inputFiles=({executable} "{executableFile}") {xrslInputAdditions}) (stdout="{diracStamp}.out") (stderr="{diracStamp}.err") -(environment="(DIRAC_PILOT_STAMP {diracStamp}")) +(environment=("DIRAC_PILOT_STAMP" "{diracStamp}")) (outputFiles={xrslOutputFiles}) (queue={queue}) {xrslMPAdditions} From 4bbb70995269af4f85969b361c371cf7dbed1c76 Mon Sep 17 00:00:00 2001 From: Andrei Tsaregorodtsev Date: Fri, 14 Oct 2022 16:10:10 +0200 Subject: [PATCH 11/13] fix: adapt test for the __writeSub call changes --- .../Computing/test/Test_HTCondorCEComputingElement.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/DIRAC/Resources/Computing/test/Test_HTCondorCEComputingElement.py b/src/DIRAC/Resources/Computing/test/Test_HTCondorCEComputingElement.py index b8558d300d4..15b52daf018 100644 --- a/src/DIRAC/Resources/Computing/test/Test_HTCondorCEComputingElement.py +++ b/src/DIRAC/Resources/Computing/test/Test_HTCondorCEComputingElement.py @@ -6,6 +6,7 @@ from DIRAC.Resources.Computing import HTCondorCEComputingElement as HTCE from DIRAC.Resources.Computing.BatchSystems import Condor +from DIRAC.Core.Utilities.File import makeGuid from DIRAC import S_OK MODNAME = "DIRAC.Resources.Computing.HTCondorCEComputingElement" @@ -121,7 +122,13 @@ def test__writeSub(mocker, localSchedd, optionsNotExpected, optionsExpected): mocker.patch(MODNAME + ".tempfile.mkstemp", return_value=("os", "pilotName")) mocker.patch(MODNAME + ".mkDir") - htce._HTCondorCEComputingElement__writeSub("dirac-install", 42, "", 1) # pylint: disable=E1101 + jobStamps = [] + commonJobStampPart = makeGuid()[:3] + for _i in range(42): + jobStamp = commonJobStampPart + makeGuid()[:5] + jobStamps.append( jobStamp ) + + htce._HTCondorCEComputingElement__writeSub("dirac-install", 42, "", 1, jobStamps) # pylint: disable=E1101 for option in optionsNotExpected: # the three [0] are: call_args_list[firstCall][ArgsArgumentsTuple][FirstArgsArgument] assert option not in subFileMock.write.call_args_list[0][0][0] From ca6433e81141dcec2c9af528630874639534c485 Mon Sep 17 00:00:00 2001 From: Andrei Tsaregorodtsev Date: Mon, 17 Oct 2022 20:06:58 +0200 Subject: [PATCH 12/13] fix: black style fix --- .../Resources/Computing/test/Test_HTCondorCEComputingElement.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DIRAC/Resources/Computing/test/Test_HTCondorCEComputingElement.py b/src/DIRAC/Resources/Computing/test/Test_HTCondorCEComputingElement.py index 15b52daf018..76b1a482260 100644 --- a/src/DIRAC/Resources/Computing/test/Test_HTCondorCEComputingElement.py +++ b/src/DIRAC/Resources/Computing/test/Test_HTCondorCEComputingElement.py @@ -126,7 +126,7 @@ def test__writeSub(mocker, localSchedd, optionsNotExpected, optionsExpected): commonJobStampPart = makeGuid()[:3] for _i in range(42): jobStamp = commonJobStampPart + makeGuid()[:5] - jobStamps.append( jobStamp ) + jobStamps.append(jobStamp) htce._HTCondorCEComputingElement__writeSub("dirac-install", 42, "", 1, jobStamps) # pylint: disable=E1101 for option in optionsNotExpected: From 68348113fde7622fd69004f8cfb66227e312cfde Mon Sep 17 00:00:00 2001 From: Andrei Tsaregorodtsev Date: Tue, 18 Oct 2022 09:16:31 +0200 Subject: [PATCH 13/13] fix: black style fix --- src/DIRAC/Resources/Computing/CloudComputingElement.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DIRAC/Resources/Computing/CloudComputingElement.py b/src/DIRAC/Resources/Computing/CloudComputingElement.py index 8a577362ec8..2f4482f7793 100644 --- a/src/DIRAC/Resources/Computing/CloudComputingElement.py +++ b/src/DIRAC/Resources/Computing/CloudComputingElement.py @@ -439,7 +439,7 @@ def submitJob(self, executableFile, proxy, numberOfJobs=1): instRandom = str(uuid.uuid4()).upper()[:8] instName = VM_NAME_PREFIX + instRandom instParams["name"] = instName - instParams["ex_userdata"] = self._getMetadata( executableFile, instRandom ) + instParams["ex_userdata"] = self._getMetadata(executableFile, instRandom) try: node = driver.create_node(**instParams) except Exception as err: