Description
Steps to reproduce
- Add post job command to deployment
- For example, for gaussian 09 on comet in seagrid.org we had (approximately)
mkdir -p "$PWD"_restart; if (ls ./*.chk 1> /dev/null 2>&1); then cp *.chk ${PWD}_restart; fi; if (ls ./*.rwf* 1> /dev/null 2>&1); then mv *.rwf* ${PWD}_restart; fi;
Expected results
Since there are no predefined script variables in this post job command, it should just pass through. I would expect that once the Groovy templating is applied that the post job command is unchanged.
Actual results
GFac throws an exception. See the stack trace below.
Workaround
For now the workaround is to escape the dollar sign in variables that aren't predefined script variables:
mkdir -p "\$PWD"_restart; if (ls ./*.chk 1> /dev/null 2>&1); then cp *.chk \${PWD}_restart; fi; if (ls ./*.rwf* 1> /dev/null 2>&1); then mv *.rwf* \${PWD}_restart; fi;
Implementation ideas
- Change our implementation of GroovyMap so that if a variable is requested that doesn't exist in the map it will just return that variable back, with a dollar sign in front. For example, the following would be true
groovyMap.get("PWD").equals("${PWD}")
The downside to this approach is that it may make typos harder to find. But in any case a typo will cause an error so this approach seems preferable because other environment variables like $PWD won't cause errors and will just pass through.
More information
Stack trace:
2017-07-27 15:36:44,501 [pool-7-thread-24] INFO o.a.a.gfac.core.GFacUtils process_id=PROCESS_64a60cad-fe27-4f92-a5c5-7 7358d4ae93d, token_id=3d65bf6d-2c9f-4166-a51b-e76e0022bd3b, experiment_id=Clone_of_Clone_of_Testmvrwf_93b1e30c-c79a-4ff 6-8fb6-d76eae96fd16, gateway_id=seagrid - Email list: gw77jobs@scigap.org 2017-07-27 15:36:44,515 [pool-7-thread-24] ERROR o.a.a.g.i.t.DefaultJobSubmissionTask process_id=PROCESS_64a60cad-fe27- 4f92-a5c5-77358d4ae93d, token_id=3d65bf6d-2c9f-4166-a51b-e76e0022bd3b, experiment_id=Clone_of_Clone_of_Testmvrwf_93b1e3 0c-c79a-4ff6-8fb6-d76eae96fd16, gateway_id=seagrid - JobSubmission failed groovy.lang.MissingPropertyException: No such property: PWD for class: groovy.lang.Binding at groovy.lang.Binding.getVariable(Binding.java:63) at groovy.lang.Binding.getProperty(Binding.java:105) at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:172) at groovy.lang.Closure.getPropertyTryThese(Closure.java:312) at groovy.lang.Closure.getPropertyDelegateFirst(Closure.java:302) at groovy.lang.Closure.getProperty(Closure.java:287) at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:50) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:307) at groovy.tmp.templates.GStringTemplateScript424$_getTemplate_closure1.doCall(GStringTemplateScript424.groovy:2 ) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1024) at groovy.lang.Closure.call(Closure.java:414) at groovy.lang.Closure$WritableClosure.writeTo(Closure.java:844) at groovy.lang.Closure$WritableClosure.toString(Closure.java:970) at org.apache.airavata.gfac.core.GFacUtils.parseCommands(GFacUtils.java:715) at org.apache.airavata.gfac.core.GFacUtils.lambda$createGroovyMap$5(GFacUtils.java:555) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:352) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) at org.apache.airavata.gfac.core.GFacUtils.createGroovyMap(GFacUtils.java:556) at org.apache.airavata.gfac.impl.task.DefaultJobSubmissionTask.execute(DefaultJobSubmissionTask.java:72) at org.apache.airavata.gfac.impl.GFacEngineImpl.executeTask(GFacEngineImpl.java:814) at org.apache.airavata.gfac.impl.GFacEngineImpl.executeJobSubmission(GFacEngineImpl.java:510) at org.apache.airavata.gfac.impl.GFacEngineImpl.executeTaskListFrom(GFacEngineImpl.java:386) at org.apache.airavata.gfac.impl.GFacEngineImpl.executeProcess(GFacEngineImpl.java:286) at org.apache.airavata.gfac.impl.GFacWorker.executeProcess(GFacWorker.java:227) at org.apache.airavata.gfac.impl.GFacWorker.run(GFacWorker.java:86) at org.apache.airavata.common.logging.MDCUtil.lambda$wrapWithMDC$0(MDCUtil.java:40) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748)