Skip to content

Commit 944977e

Browse files
authored
Fix IllegalArgumentException when process.resourceLabels is a closure (#7068)
In the nf-seqera executor, computeRunResourceLabels read the raw process.resourceLabels value from the session config. When the directive is defined dynamically (as a closure), the value was passed to Labels.toStringMap which rejected it as a non-Map, aborting execution. Closure-based resourceLabels typically reference task-scoped bindings (task.process, task.hash, ...) and cannot be meaningfully evaluated at the run level. Skip them at run level with a debug log; per-task resolution via TaskConfig.getResourceLabels continues to resolve the closure with the task binding as before. Signed-off-by: Paolo Di Tommaso <paolo@seqera.io> Signed-off-by: Paolo Di Tommaso <paolo.ditommaso@gmail.com>
1 parent 29370f4 commit 944977e

2 files changed

Lines changed: 24 additions & 1 deletion

File tree

plugins/nf-seqera/src/main/io/seqera/executor/SeqeraExecutor.groovy

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,13 @@ class SeqeraExecutor extends Executor implements ExtensionPoint {
214214
@PackageScope
215215
void computeRunResourceLabels() {
216216
final processMap = session.config.process as Map
217-
this.runResourceLabels = Labels.toStringMap(processMap?.get('resourceLabels'))
217+
final value = processMap?.get('resourceLabels')
218+
if( value instanceof Closure ) {
219+
log.debug "Skipping run-level process.resourceLabels: dynamic (closure) values are only resolved per-task"
220+
this.runResourceLabels = Collections.<String,String>emptyMap()
221+
return
222+
}
223+
this.runResourceLabels = Labels.toStringMap(value)
218224
}
219225

220226
SeqeraBatchSubmitter getBatchSubmitter() {

plugins/nf-seqera/src/test/io/seqera/executor/SeqeraExecutorTest.groovy

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,23 @@ class SeqeraExecutorTest extends Specification {
175175
executor.runResourceLabels == [:]
176176
}
177177

178+
def 'should skip run resource labels when process.resourceLabels is a closure'() {
179+
given:
180+
SysEnv.push([:])
181+
def executor = new SeqeraExecutor()
182+
def dynamic = { [team: 'a', priority: 7] }
183+
executor.session = Mock(Session) {
184+
getConfig() >> [process: [resourceLabels: dynamic]]
185+
}
186+
187+
when:
188+
executor.computeRunResourceLabels()
189+
190+
then:
191+
noExceptionThrown()
192+
executor.runResourceLabels == [:]
193+
}
194+
178195
def 'createRun populates CreateRunRequest.labels with config-level resourceLabels merged with auto-labels'() {
179196
given:
180197
SysEnv.push([:])

0 commit comments

Comments
 (0)