21
/// \mapname ADL EMI ADL
22
/// The libarccompute library has almost full support for EMI Activity
23
/// Description Language (ADL) v1.16, it is described in the EMI Execution
24
/// Service (ES) specification
25
/// (<a href="https://twiki.cern.ch/twiki/pub/EMI/EmiExecutionService/EMI-ES-Specification_v1.16.odt">EMI-ES-Specification_v1.16.odt</a>).<br/>
26
/// Currently the ADL parser is not able to parse: <br/>
21
28
ADLParser::ADLParser(PluginArgument* parg)
22
29
: JobDescriptionParserPlugin(parg) {
23
30
supportedLanguages.push_back("emies:adl");
349
356
XMLNode staging = node["adl:DataStaging"];
351
358
if((bool)identification) {
359
/// \mapattr ActivityIdentification.Name -> JobName
352
360
job.Identification.JobName = (std::string)identification["adl:Name"];
361
/// \mapattr ActivityIdentification.Description -> Description
353
362
job.Identification.Description = (std::string)identification["adl:Description"];
363
/// \mapattr ActivityIdentification.Type -> JobIdentificationType::Type
354
364
job.Identification.Type = (std::string)identification["adl:Type"];
365
/// \mapattr ActivityIdentification.Annotation -> Annotation
355
366
for(XMLNode annotation = identification["adl:Annotation"];
356
367
(bool)annotation;++annotation) {
357
368
job.Identification.Annotation.push_back((std::string)annotation);
359
370
// ARC extension: ActivityOldID
371
// TODO: Add note about this being a ARC extension.
372
/// \mapattr ActivityIdentification.ActivityOldID -> ActivityOldID
360
373
for(XMLNode activityoldid = identification["nordugrid-adl:ActivityOldID"];
361
374
(bool)activityoldid;++activityoldid) {
362
375
job.Identification.ActivityOldID.push_back((std::string)activityoldid);
365
378
if((bool)application) {
379
/// \mapattr Application.Executable.Path -> ExecutableType::Path
380
/// \mapattr Application.Executable.Argument -> ExecutableType::Argument
366
381
XMLNode executable = application["adl:Executable"];
367
382
if(executable && !ParseExecutable(executable, job.Application.Executable, dialect, logger)) {
368
383
jobdescs.clear();
386
/// \mapattr Application.Input -> Input
371
387
job.Application.Input = (std::string)application["adl:Input"];
388
/// \mapattr Application.Output -> Output
372
389
job.Application.Output = (std::string)application["adl:Output"];
390
/// \mapattr Application.Error -> Error
373
391
job.Application.Error = (std::string)application["adl:Error"];
392
/// \mapattr Application.Environment -> Environment
374
393
for(XMLNode environment = application["adl:Environment"];
375
394
(bool)environment;++environment) {
376
395
job.Application.Environment.push_back(
480
504
if((bool)resources) {
505
/// \mapattr Resources.OperatingSystem -> OperatingSystem
481
506
XMLNode os = resources["adl:OperatingSystem"];
483
508
// TODO: convert from EMI ES types. So far they look similar.
484
509
Software os_((std::string)os["adl:Family"],(std::string)os["adl:Name"],(std::string)os["adl:Version"]);
485
510
job.Resources.OperatingSystem.add(os_, Software::EQUAL);
512
/// \mapattr Resources.Platform -> Platform
487
513
XMLNode platform = resources["adl:Platform"];
488
514
if((bool)platform) {
489
515
// TODO: convert from EMI ES types. So far they look similar.
490
516
job.Resources.Platform = (std::string)platform;
518
/// \mapattr Resources.RuntimeEnvironment -> RunTimeEnvironment
492
519
for(XMLNode rte = resources["adl:RuntimeEnvironment"];(bool)rte;++rte) {
493
520
Software rte_("",(std::string)rte["adl:Name"],(std::string)rte["adl:Version"]);
494
521
for(XMLNode o = rte["adl:Option"];(bool)o;++o) {
504
531
if((bool)resources["adl:ParallelEnvironment"]) {
505
532
ParallelEnvironmentType& pe = job.Resources.ParallelEnvironment;
506
533
XMLNode xpe = resources["adl:ParallelEnvironment"];
534
/// \mapattr Resources.ParallelEnvironment.Type -> ParallelEnvironmentType::Type
507
535
if ((bool)xpe["adl:Type"]) {
508
536
pe.Type = (std::string)xpe["adl:Type"];
538
/// \mapattr Resources.ParallelEnvironment.Version -> ParallelEnvironmentType::Version
510
539
if ((bool)xpe["adl:Version"]) {
511
540
pe.Version = (std::string)xpe["adl:Version"];
542
/// \mapattr Resources.ParallelEnvironment.ProcessesPerSlot -> ParallelEnvironmentType::ProcessesPerSlot
513
543
if (((bool)xpe["adl:ProcessesPerSlot"]) && !stringto(xpe["adl:ProcessesPerSlot"], pe.ProcessesPerSlot)) {
514
544
logger.msg(ERROR, "[ADLParser] Missing or wrong value in ProcessesPerSlot.");
515
545
jobdescs.clear();
548
/// \mapattr Resources.ParallelEnvironment.ThreadsPerProcess -> ParallelEnvironmentType::ThreadsPerProcess
518
549
if (((bool)xpe["adl:ThreadsPerProcess"]) && !stringto(xpe["adl:ThreadsPerProcess"], pe.ThreadsPerProcess)) {
519
550
logger.msg(ERROR, "[ADLParser] Missing or wrong value in ThreadsPerProcess.");
520
551
jobdescs.clear();
554
/// \mapattr Resources.ParallelEnvironment.Option -> ParallelEnvironmentType::Options
523
555
for (XMLNode xOption = xpe["adl:Option"]; xOption; ++xOption) {
524
556
if ((!(bool)xOption["adl:Name"]) || ((std::string)xOption["adl:Name"]).empty()) {
525
557
logger.msg(ERROR, "[ADLParser] Missing Name element or value in ParallelEnvironment/Option element.");
575
611
job.Resources.SlotRequirement.SlotsPerHost = job.Resources.SlotRequirement.NumberOfSlots;
613
/// \mapattr Resources.SlotRequirement.SlotsPerHost -> SlotsPerHost
577
614
else if(!stringto(slot["adl:SlotsPerHost"],job.Resources.SlotRequirement.SlotsPerHost)) {
578
615
logger.msg(ERROR, "[ADLParser] Missing or wrong value in SlotsPerHost.");
579
616
jobdescs.clear();
619
/// \mapattr Resources.SlotRequirement.ExclusiveExecution -> ExclusiveExecution
582
620
if((bool)slot["adl:ExclusiveExecution"]) {
583
621
const std::string ee = slot["adl:ExclusiveExecution"];
584
622
if ((ee == "true") || (ee == "1")) {
807
854
XMLNode staging = description.NewChild("DataStaging");
809
856
// ActivityIdentification
857
/// \mapattr ActivityIdentification.JobName <- JobName
810
858
if(!job.Identification.JobName.empty()) identification.NewChild("Name") = job.Identification.JobName;
859
/// \mapattr ActivityIdentification.Description <- Description
811
860
if(!job.Identification.Description.empty()) identification.NewChild("Description") = job.Identification.Description;
861
/// \mapattr ActivityIdentification.Type <- JobIdentificationType::Type
812
862
if(!job.Identification.Type.empty()) identification.NewChild("Type") = job.Identification.Type;
863
/// \mapattr ActivityIdentification.Annotation <- Annotation
813
864
for (std::list<std::string>::const_iterator it = job.Identification.Annotation.begin();
814
865
it != job.Identification.Annotation.end(); it++) {
815
866
identification.NewChild("Annotation") = *it;
817
868
// ARC extension: ActivityOldID
869
/// \mapattr ActivityIdentification.ActivityOldID <- ActivityOldID
870
/// TODO: Add mapping note that this element is an extention.
818
871
for (std::list<std::string>::const_iterator it = job.Identification.ActivityOldID.begin();
819
872
it != job.Identification.ActivityOldID.end(); ++it) {
820
873
identification.NewChild("nordugrid-adl:ActivityOldID") = *it;
877
/// \mapattr Application.Executable.Path <- ExecutableType::Path
878
/// \mapattr Application.Executable.Argument <- ExecutableType::Argument
824
879
generateExecutableTypeElement(application.NewChild("Executable"), job.Application.Executable);
880
/// \mapattr Application.Input <- Input
825
881
if(!job.Application.Input.empty()) application.NewChild("Input") = job.Application.Input;
882
/// \mapattr Application.Output <- Output
826
883
if(!job.Application.Output.empty()) application.NewChild("Output") = job.Application.Output;
884
/// \mapattr Application.Error <- Error
827
885
if(!job.Application.Error.empty()) application.NewChild("Error") = job.Application.Error;
886
/// \mapattr Application.Environment <- Environment
828
887
for(std::list< std::pair<std::string, std::string> >::const_iterator it =
829
888
job.Application.Environment.begin(); it != job.Application.Environment.end(); it++) {
830
889
XMLNode environment = application.NewChild("Environment");
831
890
environment.NewChild("Name") = it->first;
832
891
environment.NewChild("Value") = it->second;
893
/// \mapattr Application.PreExecutable <- PreExecutable
834
894
for(std::list<ExecutableType>::const_iterator it = job.Application.PreExecutable.begin();
835
895
it != job.Application.PreExecutable.end(); ++it) {
836
896
generateExecutableTypeElement(application.NewChild("PreExecutable"), *it);
898
/// \mapattr Application.PostExecutable <- PostExecutable
838
899
for(std::list<ExecutableType>::const_iterator it = job.Application.PostExecutable.begin();
839
900
it != job.Application.PostExecutable.end(); ++it) {
840
901
generateExecutableTypeElement(application.NewChild("PostExecutable"), *it);
903
/// \mapattr Application.LoggingDirectory <- LogDir
842
904
if(!job.Application.LogDir.empty()) application.NewChild("LoggingDirectory") = job.Application.LogDir;
843
905
for (std::list<RemoteLoggingType>::const_iterator it = job.Application.RemoteLogging.begin();
844
906
it != job.Application.RemoteLogging.end(); it++) {
847
909
logging.NewChild("URL") = it->Location.fullstr();
848
910
if(it->optional) logging.NewAttribute("optional") = "true";
912
/// \mapattr Application.ExpirationTime <- ExpirationTime
850
913
if(job.Application.ExpirationTime > -1) {
851
914
XMLNode expire = application.NewChild("ExpirationTime");
852
915
expire = job.Application.ExpirationTime.str();
853
916
//if() expire.NewAttribute("optional") = "true";
918
/// \mapattr Application.WipeTime <- SessionLifeTime
855
919
if(job.Resources.SessionLifeTime > -1) {
856
920
XMLNode wipe = application.NewChild("WipeTime");
857
921
// TODO: ask for type change from dateTime to period.
858
922
wipe = (std::string)job.Resources.SessionLifeTime;
859
923
//if() wipe.NewAttribute("optional") = "true";
861
926
for (std::list<NotificationType>::const_iterator it = job.Application.Notification.begin();
862
927
it != job.Application.Notification.end(); it++) {
863
928
XMLNode notification = application.NewChild("Notification");
866
931
for (std::list<std::string>::const_iterator s = it->States.begin();
867
932
s != it->States.end(); s++) {
868
933
std::string st = InternalStateToADL(*s,false,logger);
869
if(st.empty()) continue; // return false; TODO later
870
notification.NewChild("OnState") = st;
873
// job.Application.Rerun
874
// job.Application.Priority
875
// job.Application.ProcessingStartTime
876
// job.Application.AccessControl
877
// job.Application.CredentialService
878
// job.Application.DryRun
882
for(std::list<Software>::const_iterator o =
883
job.Resources.OperatingSystem.getSoftwareList().begin();
884
o != job.Resources.OperatingSystem.getSoftwareList().end(); ++o) {
885
XMLNode os = resources.NewChild("OperatingSystem");
886
os.NewChild("Name") = o->getName();
887
std::string fam = o->getFamily();
888
if(!fam.empty()) os.NewChild("Family") = fam;
934
if(st.empty()) continue; // return false; TODO later
935
notification.NewChild("OnState") = st;
938
// job.Application.Rerun
939
// job.Application.Priority
940
// job.Application.ProcessingStartTime
941
// job.Application.AccessControl
942
// job.Application.CredentialService
943
// job.Application.DryRun
946
/// \mapattr Resources.OperatingSystem <- OperatingSystem
947
for(std::list<Software>::const_iterator o = job.Resources.OperatingSystem.getSoftwareList().begin();
948
o != job.Resources.OperatingSystem.getSoftwareList().end(); ++o) {
949
XMLNode os = resources.NewChild("OperatingSystem");
950
os.NewChild("Name") = o->getName();
951
std::string fam = o->getFamily();
952
if(!fam.empty()) os.NewChild("Family") = fam;
889
953
os.NewChild("Version") = o->getVersion();
955
/// \mapattr Resources.Platform <- Platform
891
956
if(!job.Resources.Platform.empty()) {
892
957
// TODO: convert to EMI ES types. So far they look same.
893
958
resources.NewChild("Platform") = job.Resources.Platform;
960
/// \mapattr Resources.RuntimeEnvironment <- RunTimeEnvironment
895
961
for(std::list<Software>::const_iterator s =
896
962
job.Resources.RunTimeEnvironment.getSoftwareList().begin();
897
963
s != job.Resources.RunTimeEnvironment.getSoftwareList().end();++s) {
908
974
XMLNode xpe("<ParallelEnvironment/>");
909
975
const ParallelEnvironmentType& pe = job.Resources.ParallelEnvironment;
976
/// \mapattr Resources.ParallelEnvironment.Type <- ParallelEnvironmentType::Type
910
977
if (!pe.Type.empty()) {
911
978
xpe.NewChild("Type") = pe.Type;
980
/// \mapattr Resources.ParallelEnvironment.Version <- ParallelEnvironmentType::Version
913
981
if (!pe.Version.empty()) {
914
982
xpe.NewChild("Version") = pe.Version;
984
/// \mapattr Resources.ParallelEnvironment.ProcessesPerSlot <- ParallelEnvironmentType::ProcessesPerSlot
916
985
if (pe.ProcessesPerSlot > -1) {
917
986
xpe.NewChild("ProcessesPerSlot") = tostring(pe.ProcessesPerSlot);
988
/// \mapattr Resources.ParallelEnvironment.ThreadsPerProcess <- ParallelEnvironmentType::ThreadsPerProcess
919
989
if (pe.ThreadsPerProcess > -1) {
920
990
xpe.NewChild("ThreadsPerProcess") = tostring(pe.ThreadsPerProcess);
992
/// \mapattr Resources.ParallelEnvironment.Option <- ParallelEnvironmentType::Options
922
993
for (std::multimap<std::string, std::string>::const_iterator it = pe.Options.begin();
923
994
it != pe.Options.end(); ++it) {
924
995
XMLNode xo = xpe.NewChild("Option");
929
1000
resources.NewChild(xpe);
1003
/// \mapattr Resources.Coprocessor <- Coprocessor
932
1004
if(!((std::string)job.Resources.Coprocessor).empty()) {
933
1005
XMLNode coprocessor = resources.NewChild("Coprocessor");
934
1006
coprocessor = (std::string)job.Resources.Coprocessor;
935
1007
if(job.Resources.Coprocessor.optIn) coprocessor.NewAttribute("optional") = "true";
937
1009
//TODO: check values. So far they look close.
1010
/// \mapattr Resources.NetworkInfo <- NetworkInfo
938
1011
if(!job.Resources.NetworkInfo.empty()) {
939
1012
resources.NewChild("NetworkInfo") = job.Resources.NetworkInfo;
1014
/// \mapattr Resources.NodeAccess <- NodeAccess
941
1015
switch(job.Resources.NodeAccess) {
942
1016
case NAT_INBOUND: resources.NewChild("NodeAccess") = "inbound"; break;
943
1017
case NAT_OUTBOUND: resources.NewChild("NodeAccess") = "outbound"; break;
944
1018
case NAT_INOUTBOUND: resources.NewChild("NodeAccess") = "inoutbound"; break;
1021
/// \mapattr Resources.IndividualPhysicalMemory <- IndividualPhysicalMemory
947
1022
if(job.Resources.IndividualPhysicalMemory.max != -1) {
948
1023
resources.NewChild("IndividualPhysicalMemory") = tostring(job.Resources.IndividualPhysicalMemory.max);
1025
/// \mapattr Resources.IndividualVirtualMemory <- IndividualVirtualMemory
950
1026
if(job.Resources.IndividualVirtualMemory.max != -1) {
951
1027
resources.NewChild("IndividualVirtualMemory") = tostring(job.Resources.IndividualVirtualMemory.max);
1029
/// \mapattr Resources.DiskSpaceRequirement <- DiskSpace
953
1030
if(job.Resources.DiskSpaceRequirement.DiskSpace.min > -1) {
954
1031
resources.NewChild("DiskSpaceRequirement") = tostring(job.Resources.DiskSpaceRequirement.DiskSpace.min*1024*1024);
1033
/// \mapattr Resources.RemoteSessionAccess <- SessionDirectoryAccess
956
1034
switch(job.Resources.SessionDirectoryAccess) {
957
1035
case SDAM_RW: resources.NewChild("RemoteSessionAccess") = "true"; break;
958
case SDAM_RO: resources.NewChild("RemoteSessionAccess") = "true"; break; // approximately
1036
case SDAM_RO: resources.NewChild("RemoteSessionAccess") = "true"; break; // approximately; TODO: Document in mapping.
962
1040
// BenchmarkType
963
1041
// BenchmarkValue
964
1042
XMLNode slot = resources.NewChild("SlotRequirement");
1043
/// \mapattr Resources.SlotRequirement.NumberOfSlots <- NumberOfSlots
965
1044
if(job.Resources.SlotRequirement.NumberOfSlots > -1) {
966
1045
slot.NewChild("NumberOfSlots") = tostring(job.Resources.SlotRequirement.NumberOfSlots);
1047
/// \mapattr Resources.SlotRequirement.SlotsPerHost <- SlotsPerHost
968
1048
if (job.Resources.SlotRequirement.SlotsPerHost > -1) {
969
1049
slot.NewChild("SlotsPerHost") = tostring(job.Resources.SlotRequirement.SlotsPerHost);
1051
/// \mapattr Resources.SlotRequirement.ExclusiveExecution <- ExclusiveExecution
971
1052
switch(job.Resources.SlotRequirement.ExclusiveExecution) {
972
1053
case SlotRequirementType::EE_TRUE: slot.NewChild("ExclusiveExecution") = "true"; break;
973
1054
case SlotRequirementType::EE_FALSE: slot.NewChild("ExclusiveExecution") = "false"; break;
976
1057
if(slot.Size() <= 0) slot.Destroy();
1058
/// \mapattr Resources.QueueName <- QueueName
977
1059
if(!job.Resources.QueueName.empty()) {;
978
1060
resources.NewChild("QueueName") = job.Resources.QueueName;
1062
/// \mapattr Resources.IndividualCPUTime <- IndividualCPUTime
980
1063
if(job.Resources.IndividualCPUTime.range.max != -1) {
981
1064
resources.NewChild("IndividualCPUTime") = tostring(job.Resources.IndividualCPUTime.range.max);
1066
/// \mapattr Resources.TotalCPUTime <- TotalCPUTime
983
1067
if(job.Resources.TotalCPUTime.range.max != -1) {
984
1068
resources.NewChild("TotalCPUTime") = tostring(job.Resources.TotalCPUTime.range.max);
1070
/// \mapattr Resources.WallTime <- IndividualWallTime
986
1071
if(job.Resources.TotalWallTime.range.max != -1) {
987
1072
resources.NewChild("WallTime") = tostring(job.Resources.TotalWallTime.range.max);
988
1073
} else if(job.Resources.IndividualWallTime.range.max != -1) {