panda-server-source 0.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- panda_server_source-0.8.0.dist-info/METADATA +55 -0
- panda_server_source-0.8.0.dist-info/RECORD +375 -0
- panda_server_source-0.8.0.dist-info/WHEEL +4 -0
- panda_server_source-0.8.0.dist-info/licenses/LICENSE.txt +202 -0
- pandajedi/__init__.py +0 -0
- pandajedi/jedibrokerage/AtlasAnalJobBroker.py +2343 -0
- pandajedi/jedibrokerage/AtlasBrokerUtils.py +1292 -0
- pandajedi/jedibrokerage/AtlasProdJobBroker.py +2064 -0
- pandajedi/jedibrokerage/AtlasProdTaskBroker.py +629 -0
- pandajedi/jedibrokerage/GenJobBroker.py +381 -0
- pandajedi/jedibrokerage/JobBrokerBase.py +133 -0
- pandajedi/jedibrokerage/TaskBrokerBase.py +15 -0
- pandajedi/jedibrokerage/__init__.py +0 -0
- pandajedi/jediconfig/__init__.py +0 -0
- pandajedi/jediconfig/jedi_config.py +40 -0
- pandajedi/jedicore/FactoryBase.py +182 -0
- pandajedi/jedicore/Interaction.py +433 -0
- pandajedi/jedicore/JediDBProxy.py +56 -0
- pandajedi/jedicore/JediDBProxyPool.py +37 -0
- pandajedi/jedicore/JediDBSchemaInfo.py +17 -0
- pandajedi/jedicore/JediException.py +13 -0
- pandajedi/jedicore/JediTaskBuffer.py +984 -0
- pandajedi/jedicore/JediTaskBufferInterface.py +50 -0
- pandajedi/jedicore/MsgWrapper.py +124 -0
- pandajedi/jedicore/ProcessUtils.py +34 -0
- pandajedi/jedicore/SiteCandidate.py +90 -0
- pandajedi/jedicore/ThreadUtils.py +205 -0
- pandajedi/jedicore/__init__.py +0 -0
- pandajedi/jediddm/AtlasDDMClient.py +1708 -0
- pandajedi/jediddm/DDMClientBase.py +16 -0
- pandajedi/jediddm/DDMInterface.py +83 -0
- pandajedi/jediddm/GenDDMClient.py +17 -0
- pandajedi/jediddm/__init__.py +0 -0
- pandajedi/jedidog/AtlasAnalWatchDog.py +648 -0
- pandajedi/jedidog/AtlasDataCarouselWatchDog.py +189 -0
- pandajedi/jedidog/AtlasDataLocalityUpdaterWatchDog.py +215 -0
- pandajedi/jedidog/AtlasProdWatchDog.py +443 -0
- pandajedi/jedidog/AtlasQueueFillerWatchDog.py +800 -0
- pandajedi/jedidog/AtlasTaskWithholderWatchDog.py +245 -0
- pandajedi/jedidog/AtlasWorkflowManagerWatchDog.py +63 -0
- pandajedi/jedidog/GenWatchDog.py +21 -0
- pandajedi/jedidog/JumboWatchDog.py +147 -0
- pandajedi/jedidog/TypicalWatchDogBase.py +122 -0
- pandajedi/jedidog/WatchDogBase.py +53 -0
- pandajedi/jedidog/__init__.py +0 -0
- pandajedi/jediexec/reniceJEDI.py +25 -0
- pandajedi/jedigen/AtlasTaskGenerator.py +110 -0
- pandajedi/jedigen/TaskGeneratorBase.py +15 -0
- pandajedi/jedigen/__init__.py +0 -0
- pandajedi/jedimsgprocessor/__init__.py +0 -0
- pandajedi/jedimsgprocessor/ai_parameter_adjuster_msg_processor +71 -0
- pandajedi/jedimsgprocessor/atlas_idds_msg_processor.py +66 -0
- pandajedi/jedimsgprocessor/base_msg_processor.py +33 -0
- pandajedi/jedimsgprocessor/forwarding_msg_processor.py +29 -0
- pandajedi/jedimsgprocessor/hpo_msg_processor.py +93 -0
- pandajedi/jedimsgprocessor/jedi_contents_feeder_msg_processor.py +63 -0
- pandajedi/jedimsgprocessor/jedi_job_generator_msg_processor.py +185 -0
- pandajedi/jedimsgprocessor/jedi_post_processor_msg_processor.py +82 -0
- pandajedi/jedimsgprocessor/kafka_msg_processor.py +44 -0
- pandajedi/jedimsgprocessor/panda_callback_msg_processor.py +182 -0
- pandajedi/jedimsgprocessor/panda_to_jedi_msg_processor.py +74 -0
- pandajedi/jedimsgprocessor/processing_msg_processor.py +134 -0
- pandajedi/jedimsgprocessor/status_report_msg_processor.py +129 -0
- pandajedi/jedimsgprocessor/tape_carousel_msg_processor.py +118 -0
- pandajedi/jedimsgprocessor/workflow_manager_msg_processor.py +89 -0
- pandajedi/jediorder/ContentsFeeder.py +785 -0
- pandajedi/jediorder/JediDaemon.py +27 -0
- pandajedi/jediorder/JediKnight.py +55 -0
- pandajedi/jediorder/JediMaster.py +238 -0
- pandajedi/jediorder/JediMsgProcessor.py +32 -0
- pandajedi/jediorder/JobBroker.py +33 -0
- pandajedi/jediorder/JobGenerator.py +2763 -0
- pandajedi/jediorder/JobSplitter.py +308 -0
- pandajedi/jediorder/JobThrottler.py +28 -0
- pandajedi/jediorder/PostProcessor.py +166 -0
- pandajedi/jediorder/TaskBroker.py +268 -0
- pandajedi/jediorder/TaskCommando.py +334 -0
- pandajedi/jediorder/TaskGenerator.py +17 -0
- pandajedi/jediorder/TaskRefiner.py +611 -0
- pandajedi/jediorder/TaskSetupper.py +17 -0
- pandajedi/jediorder/WatchDog.py +79 -0
- pandajedi/jediorder/__init__.py +0 -0
- pandajedi/jedipprocess/AtlasAnalPostProcessor.py +404 -0
- pandajedi/jedipprocess/AtlasPostProcessorUtils.py +50 -0
- pandajedi/jedipprocess/AtlasProdPostProcessor.py +178 -0
- pandajedi/jedipprocess/GenPostProcessor.py +35 -0
- pandajedi/jedipprocess/MailTemplates.py +185 -0
- pandajedi/jedipprocess/PostProcessorBase.py +269 -0
- pandajedi/jedipprocess/__init__.py +0 -0
- pandajedi/jedirefine/AtlasAnalTaskRefiner.py +259 -0
- pandajedi/jedirefine/AtlasProdTaskRefiner.py +162 -0
- pandajedi/jedirefine/GenTaskRefiner.py +61 -0
- pandajedi/jedirefine/RefinerUtils.py +154 -0
- pandajedi/jedirefine/TaskRefinerBase.py +996 -0
- pandajedi/jedirefine/__init__.py +0 -0
- pandajedi/jedisetup/AtlasTaskSetupper.py +309 -0
- pandajedi/jedisetup/GenTaskSetupper.py +16 -0
- pandajedi/jedisetup/SimpleTaskSetupper.py +152 -0
- pandajedi/jedisetup/TaskSetupperBase.py +15 -0
- pandajedi/jedisetup/__init__.py +0 -0
- pandajedi/jeditest/SchemaChecker.py +41 -0
- pandajedi/jeditest/addContWoSoTask.py +54 -0
- pandajedi/jeditest/addDataCarouselRequest.py +47 -0
- pandajedi/jeditest/addEventServiceTask.py +101 -0
- pandajedi/jeditest/addHpoTask.py +81 -0
- pandajedi/jeditest/addIDDSStageInRequest.py +56 -0
- pandajedi/jeditest/addNonAtlasTask.py +71 -0
- pandajedi/jeditest/addNonAtlasTaskEnc.py +64 -0
- pandajedi/jeditest/addTestTask.py +124 -0
- pandajedi/jeditest/addTestTaskParamToDEFT.py +70 -0
- pandajedi/jeditest/addTestTaskWithMerger.py +97 -0
- pandajedi/jeditest/brokerTest.py +78 -0
- pandajedi/jeditest/cancelDataCarouselRequest.py +35 -0
- pandajedi/jeditest/contentsFeederTest.py +28 -0
- pandajedi/jeditest/contentsFeederTestWithTask.py +18 -0
- pandajedi/jeditest/ddmTest.py +4 -0
- pandajedi/jeditest/jobGenForOneTask.py +38 -0
- pandajedi/jeditest/jobGeneratorTest.py +43 -0
- pandajedi/jeditest/jobSplitterTest.py +104 -0
- pandajedi/jeditest/jobThrottlerTest.py +22 -0
- pandajedi/jeditest/msgProcessorTest.py +9 -0
- pandajedi/jeditest/postProcessorTest.py +18 -0
- pandajedi/jeditest/resubmitDataCarouselRequest.py +35 -0
- pandajedi/jeditest/resubmitTaskParam.py +20 -0
- pandajedi/jeditest/taskBrokerTest.py +22 -0
- pandajedi/jeditest/taskBrokerTestWithTask.py +38 -0
- pandajedi/jeditest/taskBufferTest.py +5 -0
- pandajedi/jeditest/taskCommandoTest.py +28 -0
- pandajedi/jeditest/taskRefinerTest.py +30 -0
- pandajedi/jeditest/testOneTaskToRefine.py +49 -0
- pandajedi/jeditest/testOneTaskToTaskBroker.py +42 -0
- pandajedi/jeditest/testPandaDDMMap.py +62 -0
- pandajedi/jeditest/updateDataCarouselRequestParams.py +50 -0
- pandajedi/jeditest/watchDogTest.py +25 -0
- pandajedi/jeditest/workQueueTest.py +22 -0
- pandajedi/jedithrottle/AtlasAnalJobThrottler.py +19 -0
- pandajedi/jedithrottle/AtlasProdJobThrottler.py +18 -0
- pandajedi/jedithrottle/GenJobThrottler.py +26 -0
- pandajedi/jedithrottle/JobThrottlerBase.py +496 -0
- pandajedi/jedithrottle/__init__.py +0 -0
- pandaserver/__init__.py +0 -0
- pandaserver/api/__init__.py +0 -0
- pandaserver/api/v1/__init__.py +0 -0
- pandaserver/api/v1/common.py +339 -0
- pandaserver/api/v1/credential_management_api.py +372 -0
- pandaserver/api/v1/data_carousel_api.py +264 -0
- pandaserver/api/v1/event_api.py +269 -0
- pandaserver/api/v1/file_server_api.py +942 -0
- pandaserver/api/v1/harvester_api.py +445 -0
- pandaserver/api/v1/http_client.py +166 -0
- pandaserver/api/v1/idds_api.py +180 -0
- pandaserver/api/v1/job_api.py +463 -0
- pandaserver/api/v1/metaconfig_api.py +122 -0
- pandaserver/api/v1/pilot_api.py +895 -0
- pandaserver/api/v1/statistics_api.py +207 -0
- pandaserver/api/v1/system_api.py +186 -0
- pandaserver/api/v1/task_api.py +1520 -0
- pandaserver/api/v1/tests/__init__.py +0 -0
- pandaserver/api/v1/tests/credential_management_api_tests.py +116 -0
- pandaserver/api/v1/tests/data_carousel_api_tests.py +82 -0
- pandaserver/api/v1/tests/harvester_api_tests.py +188 -0
- pandaserver/api/v1/tests/idds_api_tests.py +45 -0
- pandaserver/api/v1/tests/job_api_tests.py +112 -0
- pandaserver/api/v1/tests/pilot_api_tests.py +154 -0
- pandaserver/api/v1/tests/statistics_api_tests.py +104 -0
- pandaserver/api/v1/tests/system_api_tests.py +58 -0
- pandaserver/api/v1/tests/task_api_tests.py +590 -0
- pandaserver/api/v1/version.py +2 -0
- pandaserver/api/v1/workflow_api.py +136 -0
- pandaserver/brokerage/SiteMapper.py +406 -0
- pandaserver/brokerage/__init__.py +0 -0
- pandaserver/brokerage/broker.py +272 -0
- pandaserver/config/__init__.py +0 -0
- pandaserver/config/config_utils.py +15 -0
- pandaserver/config/daemon_config.py +29 -0
- pandaserver/config/mcp_config.py +38 -0
- pandaserver/config/panda_config.py +233 -0
- pandaserver/configurator/Carbon.py +65 -0
- pandaserver/configurator/Configurator.py +908 -0
- pandaserver/configurator/__init__.py +0 -0
- pandaserver/configurator/aux.py +73 -0
- pandaserver/daemons/__init__.py +0 -0
- pandaserver/daemons/master.py +110 -0
- pandaserver/daemons/master_systemd.py +79 -0
- pandaserver/daemons/scripts/__init__.py +0 -0
- pandaserver/daemons/scripts/add_main.py +264 -0
- pandaserver/daemons/scripts/add_sub.py +221 -0
- pandaserver/daemons/scripts/cache_pilots.py +47 -0
- pandaserver/daemons/scripts/cache_schedconfig.py +286 -0
- pandaserver/daemons/scripts/carbon.py +50 -0
- pandaserver/daemons/scripts/configurator.py +94 -0
- pandaserver/daemons/scripts/copyArchive.py +1387 -0
- pandaserver/daemons/scripts/datasetManager.py +1154 -0
- pandaserver/daemons/scripts/dummy_test.py +25 -0
- pandaserver/daemons/scripts/evpPD2P.py +144 -0
- pandaserver/daemons/scripts/hs_scrapers.py +264 -0
- pandaserver/daemons/scripts/metric_collector.py +927 -0
- pandaserver/daemons/scripts/panda_activeusers_query.py +80 -0
- pandaserver/daemons/scripts/pilotStreaming.py +109 -0
- pandaserver/daemons/scripts/process_workflow_files_daemon.py +166 -0
- pandaserver/daemons/scripts/recover_lost_files_daemon.py +177 -0
- pandaserver/daemons/scripts/task_evaluator.py +405 -0
- pandaserver/daemons/scripts/tmpwatch.py +70 -0
- pandaserver/daemons/scripts/worker_synchronization.py +97 -0
- pandaserver/daemons/utils.py +753 -0
- pandaserver/dataservice/DataServiceUtils.py +323 -0
- pandaserver/dataservice/ErrorCode.py +25 -0
- pandaserver/dataservice/RecoverLostFilesCore.py +322 -0
- pandaserver/dataservice/__init__.py +0 -0
- pandaserver/dataservice/activator.py +79 -0
- pandaserver/dataservice/adder_atlas_plugin.py +1106 -0
- pandaserver/dataservice/adder_dummy_plugin.py +31 -0
- pandaserver/dataservice/adder_gen.py +954 -0
- pandaserver/dataservice/adder_plugin_base.py +27 -0
- pandaserver/dataservice/adder_result.py +75 -0
- pandaserver/dataservice/adder_simple_plugin.py +160 -0
- pandaserver/dataservice/closer.py +247 -0
- pandaserver/dataservice/closer_atlas_plugin.py +90 -0
- pandaserver/dataservice/ddm.py +1381 -0
- pandaserver/dataservice/ddm_handler.py +95 -0
- pandaserver/dataservice/dyn_data_distributer.py +824 -0
- pandaserver/dataservice/event_lookup_client_ei.py +77 -0
- pandaserver/dataservice/event_picker.py +268 -0
- pandaserver/dataservice/finisher.py +194 -0
- pandaserver/dataservice/setupper.py +225 -0
- pandaserver/dataservice/setupper_atlas_plugin.py +1851 -0
- pandaserver/dataservice/setupper_dummy_plugin.py +47 -0
- pandaserver/dataservice/setupper_plugin_base.py +67 -0
- pandaserver/jobdispatcher/DispatcherUtils.py +35 -0
- pandaserver/jobdispatcher/ErrorCode.py +19 -0
- pandaserver/jobdispatcher/JobDispatcher.py +1625 -0
- pandaserver/jobdispatcher/Protocol.py +443 -0
- pandaserver/jobdispatcher/Watcher.py +186 -0
- pandaserver/jobdispatcher/__init__.py +0 -0
- pandaserver/pandamcp/__init__.py +0 -0
- pandaserver/pandamcp/mcp_main.py +56 -0
- pandaserver/pandamcp/mcp_test_client.py +95 -0
- pandaserver/pandamcp/mcp_utils.py +74 -0
- pandaserver/proxycache/__init__.py +0 -0
- pandaserver/proxycache/panda_proxy_cache.py +240 -0
- pandaserver/proxycache/token_cache.py +141 -0
- pandaserver/server/.gacl +6 -0
- pandaserver/server/panda.py +539 -0
- pandaserver/srvcore/CoreUtils.py +572 -0
- pandaserver/srvcore/MailUtils.py +106 -0
- pandaserver/srvcore/__init__.py +0 -0
- pandaserver/srvcore/allowed_methods.py +100 -0
- pandaserver/srvcore/oidc_utils.py +152 -0
- pandaserver/srvcore/panda_request.py +196 -0
- pandaserver/srvcore/srv_msg_utils.py +42 -0
- pandaserver/taskbuffer/ConBridge.py +513 -0
- pandaserver/taskbuffer/DBProxyPool.py +95 -0
- pandaserver/taskbuffer/DataCarousel.py +3053 -0
- pandaserver/taskbuffer/DatasetSpec.py +137 -0
- pandaserver/taskbuffer/DdmSpec.py +201 -0
- pandaserver/taskbuffer/ErrorCode.py +87 -0
- pandaserver/taskbuffer/EventServiceUtils.py +396 -0
- pandaserver/taskbuffer/FileSpec.py +290 -0
- pandaserver/taskbuffer/GlobalShares.py +244 -0
- pandaserver/taskbuffer/HarvesterMetricsSpec.py +92 -0
- pandaserver/taskbuffer/Initializer.py +82 -0
- pandaserver/taskbuffer/InputChunk.py +1080 -0
- pandaserver/taskbuffer/JediCacheSpec.py +57 -0
- pandaserver/taskbuffer/JediDatasetSpec.py +588 -0
- pandaserver/taskbuffer/JediFileSpec.py +242 -0
- pandaserver/taskbuffer/JediTaskSpec.py +1687 -0
- pandaserver/taskbuffer/JobSpec.py +1006 -0
- pandaserver/taskbuffer/JobUtils.py +232 -0
- pandaserver/taskbuffer/NucleusSpec.py +116 -0
- pandaserver/taskbuffer/OraDBProxy.py +174 -0
- pandaserver/taskbuffer/PanDAMsgProcessor.py +8 -0
- pandaserver/taskbuffer/PandaDBSchemaInfo.py +18 -0
- pandaserver/taskbuffer/ParseJobXML.py +350 -0
- pandaserver/taskbuffer/PickleFileSpec.py +18 -0
- pandaserver/taskbuffer/PickleJobSpec.py +25 -0
- pandaserver/taskbuffer/PrioUtil.py +40 -0
- pandaserver/taskbuffer/ProcessGroups.py +111 -0
- pandaserver/taskbuffer/ResourceSpec.py +175 -0
- pandaserver/taskbuffer/SQLDumper.py +37 -0
- pandaserver/taskbuffer/SQLManager.py +60 -0
- pandaserver/taskbuffer/SiteSpec.py +304 -0
- pandaserver/taskbuffer/SupErrors.py +10 -0
- pandaserver/taskbuffer/TaskBuffer.py +2882 -0
- pandaserver/taskbuffer/TaskBufferInterface.py +163 -0
- pandaserver/taskbuffer/Utils.py +848 -0
- pandaserver/taskbuffer/WorkQueue.py +227 -0
- pandaserver/taskbuffer/WorkQueueMapper.py +203 -0
- pandaserver/taskbuffer/WorkerSpec.py +143 -0
- pandaserver/taskbuffer/WrappedCursor.py +487 -0
- pandaserver/taskbuffer/WrappedPickle.py +88 -0
- pandaserver/taskbuffer/WrappedPostgresConn.py +24 -0
- pandaserver/taskbuffer/__init__.py +0 -0
- pandaserver/taskbuffer/db_proxy_mods/OraDBProxy_structure.png +0 -0
- pandaserver/taskbuffer/db_proxy_mods/__init__.py +7 -0
- pandaserver/taskbuffer/db_proxy_mods/base_module.py +841 -0
- pandaserver/taskbuffer/db_proxy_mods/data_carousel_module.py +772 -0
- pandaserver/taskbuffer/db_proxy_mods/entity_module.py +3804 -0
- pandaserver/taskbuffer/db_proxy_mods/job_complex_module.py +5661 -0
- pandaserver/taskbuffer/db_proxy_mods/job_standalone_module.py +2640 -0
- pandaserver/taskbuffer/db_proxy_mods/metrics_module.py +874 -0
- pandaserver/taskbuffer/db_proxy_mods/misc_standalone_module.py +4272 -0
- pandaserver/taskbuffer/db_proxy_mods/task_complex_module.py +6172 -0
- pandaserver/taskbuffer/db_proxy_mods/task_event_module.py +4953 -0
- pandaserver/taskbuffer/db_proxy_mods/task_standalone_module.py +4999 -0
- pandaserver/taskbuffer/db_proxy_mods/task_utils_module.py +2063 -0
- pandaserver/taskbuffer/db_proxy_mods/worker_module.py +1944 -0
- pandaserver/taskbuffer/db_proxy_mods/workflow_module.py +832 -0
- pandaserver/taskbuffer/retryModule.py +552 -0
- pandaserver/taskbuffer/task_split_rules.py +308 -0
- pandaserver/taskbuffer/workflow_processor.py +249 -0
- pandaserver/taskbuffer/wrapped_oracle_conn.py +18 -0
- pandaserver/test/SchemaChecker.py +40 -0
- pandaserver/test/__init__.py +0 -0
- pandaserver/test/banUser.py +43 -0
- pandaserver/test/boostPrio.py +19 -0
- pandaserver/test/boostUser.py +35 -0
- pandaserver/test/callbackDDM.py +11 -0
- pandaserver/test/daod_on_demand.py +95 -0
- pandaserver/test/finishJob.py +184 -0
- pandaserver/test/finishTaskJEDI.py +11 -0
- pandaserver/test/getJobs.py +53 -0
- pandaserver/test/killJob.py +79 -0
- pandaserver/test/killJobLowPrio.py +99 -0
- pandaserver/test/killJobsInTask.py +56 -0
- pandaserver/test/killTask.py +80 -0
- pandaserver/test/killTaskJEDI.py +11 -0
- pandaserver/test/killUser.py +83 -0
- pandaserver/test/lsst/README.txt +7 -0
- pandaserver/test/lsst/lsstSubmit.py +139 -0
- pandaserver/test/lsst/lsstSubmitMERGEtest.py +141 -0
- pandaserver/test/lsst/lsstSubmitPhosim332.py +53 -0
- pandaserver/test/lsst/prepare-client-tarball-from-bigpanda-server.sh +41 -0
- pandaserver/test/reassignJobs.py +17 -0
- pandaserver/test/reassignSite.py +82 -0
- pandaserver/test/reassignTask.py +117 -0
- pandaserver/test/reassignWaiting.py +39 -0
- pandaserver/test/recoverLostFiles.py +7 -0
- pandaserver/test/reloadInputDS.py +51 -0
- pandaserver/test/sendCommandToJob.py +26 -0
- pandaserver/test/setDebugMode.py +38 -0
- pandaserver/test/setPriority.py +28 -0
- pandaserver/test/testEvgen.py +60 -0
- pandaserver/test/testEvgen17.py +58 -0
- pandaserver/test/testG4sim.py +81 -0
- pandaserver/test/testG4sim17.py +90 -0
- pandaserver/test/testGlobalShares.py +131 -0
- pandaserver/test/testReco.py +103 -0
- pandaserver/test/testSimulReco14.py +98 -0
- pandaserver/test/testSiteMap.py +26 -0
- pandaserver/test/testUpdateWorkerPilotStatus.py +9 -0
- pandaserver/userinterface/Client.py +1686 -0
- pandaserver/userinterface/UserIF.py +1799 -0
- pandaserver/userinterface/__init__.py +0 -0
- pandaserver/workflow/__init__.py +0 -0
- pandaserver/workflow/data_handler_plugins/base_data_handler.py +48 -0
- pandaserver/workflow/data_handler_plugins/ddm_collection_data_handler.py +100 -0
- pandaserver/workflow/data_handler_plugins/panda_task_data_handler.py +140 -0
- pandaserver/workflow/pcwl_test.py +122 -0
- pandaserver/workflow/pcwl_utils.py +384 -0
- pandaserver/workflow/psnakemake_container.json +68 -0
- pandaserver/workflow/psnakemake_task.json +62 -0
- pandaserver/workflow/psnakemake_test.py +60 -0
- pandaserver/workflow/snakeparser/__init__.py +3 -0
- pandaserver/workflow/snakeparser/extensions.py +74 -0
- pandaserver/workflow/snakeparser/log.py +53 -0
- pandaserver/workflow/snakeparser/names.py +3 -0
- pandaserver/workflow/snakeparser/parser.py +332 -0
- pandaserver/workflow/snakeparser/utils.py +29 -0
- pandaserver/workflow/step_handler_plugins/base_step_handler.py +85 -0
- pandaserver/workflow/step_handler_plugins/panda_task_step_handler.py +280 -0
- pandaserver/workflow/workflow_base.py +531 -0
- pandaserver/workflow/workflow_core.py +1974 -0
- pandaserver/workflow/workflow_core_smoketest.py +388 -0
- pandaserver/workflow/workflow_parser.py +222 -0
- pandaserver/workflow/workflow_utils.py +1047 -0
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from pandaserver.workflow.workflow_base import (
|
|
2
|
+
WFDataSpec,
|
|
3
|
+
WFDataStatus,
|
|
4
|
+
WFDataTargetCheckResult,
|
|
5
|
+
WFDataType,
|
|
6
|
+
WFStepSpec,
|
|
7
|
+
WFStepStatus,
|
|
8
|
+
WFStepTargetCheckResult,
|
|
9
|
+
WFStepTargetSubmitResult,
|
|
10
|
+
WFStepType,
|
|
11
|
+
WorkflowSpec,
|
|
12
|
+
WorkflowStatus,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class BaseDataHandler:
|
|
17
|
+
"""
|
|
18
|
+
Base class for data handlers in the workflow system.
|
|
19
|
+
This class provides a common interface and some utility methods for data handlers.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
def __init__(self, task_buffer, ddm_if, *args, **kwargs):
|
|
23
|
+
"""
|
|
24
|
+
Initialize the step handler with necessary parameters.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
task_buffer: The task buffer interface to interact with the task database.
|
|
28
|
+
ddm_if: The DDM interface to interact with the DDM system.
|
|
29
|
+
*args: Additional positional arguments.
|
|
30
|
+
**kwargs: Additional keyword arguments.
|
|
31
|
+
"""
|
|
32
|
+
self.tbif = task_buffer
|
|
33
|
+
self.ddm_if = ddm_if
|
|
34
|
+
|
|
35
|
+
def check_target(self, data_spec: WFDataSpec, **kwargs) -> WFDataTargetCheckResult:
|
|
36
|
+
"""
|
|
37
|
+
Check the status of the data target.
|
|
38
|
+
This method should be implemented by subclasses to handle the specifics of data target status checking.
|
|
39
|
+
This method should NOT modify data_spec. Any update information should be stored in the WFStepTargetCheckResult returned instead.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
data_spec (WFDataSpec): The data specification to check.
|
|
43
|
+
**kwargs: Additional keyword arguments.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
WFDataTargetCheckResult: The result of the target check.
|
|
47
|
+
"""
|
|
48
|
+
raise NotImplementedError("Subclasses must implement this method.")
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import traceback
|
|
3
|
+
import uuid
|
|
4
|
+
|
|
5
|
+
from pandacommon.pandalogger.LogWrapper import LogWrapper
|
|
6
|
+
from pandacommon.pandalogger.PandaLogger import PandaLogger
|
|
7
|
+
|
|
8
|
+
from pandaserver.workflow.data_handler_plugins.base_data_handler import BaseDataHandler
|
|
9
|
+
from pandaserver.workflow.workflow_base import (
|
|
10
|
+
WFDataSpec,
|
|
11
|
+
WFDataStatus,
|
|
12
|
+
WFDataTargetCheckResult,
|
|
13
|
+
WFDataTargetCheckStatus,
|
|
14
|
+
WFDataType,
|
|
15
|
+
WFStepSpec,
|
|
16
|
+
WFStepStatus,
|
|
17
|
+
WFStepType,
|
|
18
|
+
WorkflowSpec,
|
|
19
|
+
WorkflowStatus,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
# main logger
|
|
23
|
+
logger = PandaLogger().getLogger(__name__.split(".")[-1])
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class DDMCollectionDIDType:
|
|
27
|
+
"""
|
|
28
|
+
Data Identifier Types for DDM Collections
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
DATASET = "DATASET"
|
|
32
|
+
CONTAINER = "CONTAINER"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class DDMCollectionState:
|
|
36
|
+
"""
|
|
37
|
+
States for DDM Collections
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
open = "open"
|
|
41
|
+
closed = "closed"
|
|
42
|
+
missing = "missing"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class DDMCollectionDataHandler(BaseDataHandler):
|
|
46
|
+
"""
|
|
47
|
+
Handler for DDM collection data in the workflow.
|
|
48
|
+
This class is responsible for managing the DDM collection data within a workflow.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
def __init__(self, *args, **kwargs):
|
|
52
|
+
"""
|
|
53
|
+
Initialize the data handler with necessary parameters.
|
|
54
|
+
"""
|
|
55
|
+
# Initialize base class or any required modules here
|
|
56
|
+
super().__init__(*args, **kwargs)
|
|
57
|
+
self.plugin_flavor = "ddm_collection"
|
|
58
|
+
|
|
59
|
+
def check_target(self, data_spec: WFDataSpec, **kwargs) -> WFDataTargetCheckResult:
|
|
60
|
+
"""
|
|
61
|
+
Check the status of the DDM collection data target.
|
|
62
|
+
This method should be implemented to handle the specifics of DDM collection data status checking.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
data_spec (WFDataSpec): The data specification containing details about the data to be checked.
|
|
66
|
+
**kwargs: Additional keyword arguments that may be required for checking.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
WFDataTargetCheckResult: An object containing the result of the check, including success status, current data status, and message.
|
|
70
|
+
"""
|
|
71
|
+
tmp_log = LogWrapper(logger, f"check_target workflow_id={data_spec.workflow_id} data_id={data_spec.data_id}")
|
|
72
|
+
# Initialize
|
|
73
|
+
check_result = WFDataTargetCheckResult()
|
|
74
|
+
# Check data flavor
|
|
75
|
+
if data_spec.flavor != self.plugin_flavor:
|
|
76
|
+
tmp_log.warning(f"flavor={data_spec.flavor} not {self.plugin_flavor}; skipped")
|
|
77
|
+
check_result.message = f"flavor not {self.plugin_flavor}; skipped"
|
|
78
|
+
return check_result
|
|
79
|
+
# Check DDM collection status
|
|
80
|
+
collection = data_spec.target_id
|
|
81
|
+
collection_meta = self.ddm_if.get_dataset_metadata(collection, ignore_missing=True)
|
|
82
|
+
if collection_meta is None:
|
|
83
|
+
check_result.success = False
|
|
84
|
+
check_result.message = f"Failed to get metadata for collection {collection}"
|
|
85
|
+
tmp_log.error(f"{check_result.message}")
|
|
86
|
+
return check_result
|
|
87
|
+
match collection_meta.get("state"):
|
|
88
|
+
case DDMCollectionState.missing:
|
|
89
|
+
check_result.check_status = WFDataTargetCheckStatus.nonexist
|
|
90
|
+
case DDMCollectionState.open:
|
|
91
|
+
if collection_meta.get("length", 0) == 0:
|
|
92
|
+
check_result.check_status = WFDataTargetCheckStatus.insuffi
|
|
93
|
+
else:
|
|
94
|
+
check_result.check_status = WFDataTargetCheckStatus.suffice
|
|
95
|
+
case DDMCollectionState.closed:
|
|
96
|
+
check_result.check_status = WFDataTargetCheckStatus.complete
|
|
97
|
+
check_result.metadata = collection_meta
|
|
98
|
+
check_result.success = True
|
|
99
|
+
tmp_log.info(f"Got collection {collection} check_status={check_result.check_status}")
|
|
100
|
+
return check_result
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import traceback
|
|
3
|
+
import uuid
|
|
4
|
+
|
|
5
|
+
from pandacommon.pandalogger.LogWrapper import LogWrapper
|
|
6
|
+
from pandacommon.pandalogger.PandaLogger import PandaLogger
|
|
7
|
+
|
|
8
|
+
from pandaserver.workflow.data_handler_plugins.base_data_handler import BaseDataHandler
|
|
9
|
+
from pandaserver.workflow.workflow_base import (
|
|
10
|
+
WFDataSpec,
|
|
11
|
+
WFDataStatus,
|
|
12
|
+
WFDataTargetCheckResult,
|
|
13
|
+
WFDataTargetCheckStatus,
|
|
14
|
+
WFDataType,
|
|
15
|
+
WFStepSpec,
|
|
16
|
+
WFStepStatus,
|
|
17
|
+
WFStepType,
|
|
18
|
+
WorkflowSpec,
|
|
19
|
+
WorkflowStatus,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
# Whether to consider partial data (e.g. some files in DDM collection) as sufficient for step input
|
|
23
|
+
PARTIAL_DATA_SUFFICE = False
|
|
24
|
+
|
|
25
|
+
# main logger
|
|
26
|
+
logger = PandaLogger().getLogger(__name__.split(".")[-1])
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class DDMCollectionDIDType:
|
|
30
|
+
"""
|
|
31
|
+
Data Identifier Types for DDM Collections
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
DATASET = "DATASET"
|
|
35
|
+
CONTAINER = "CONTAINER"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class DDMCollectionState:
|
|
39
|
+
"""
|
|
40
|
+
States for DDM Collections
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
open = "open"
|
|
44
|
+
closed = "closed"
|
|
45
|
+
missing = "missing"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class PandaTaskDataHandler(BaseDataHandler):
|
|
49
|
+
"""
|
|
50
|
+
Handler for PanDA task intermediate/output data in the workflow.
|
|
51
|
+
This class is responsible for managing the data generated by PanDA task within a workflow.
|
|
52
|
+
The output data from a PanDA task is usually a DDM container, which remains open even after the task completion.
|
|
53
|
+
Thus, the handler not only checks the status of the DDM collection to determine if there are files available, but also verifies the step status of source workflow steps to ensure that the data generation process has been completed successfully.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
def __init__(self, *args, **kwargs):
|
|
57
|
+
"""
|
|
58
|
+
Initialize the data handler with necessary parameters.
|
|
59
|
+
"""
|
|
60
|
+
# Initialize base class or any required modules here
|
|
61
|
+
super().__init__(*args, **kwargs)
|
|
62
|
+
self.plugin_flavor = "panda_task"
|
|
63
|
+
|
|
64
|
+
def check_target(self, data_spec: WFDataSpec, **kwargs) -> WFDataTargetCheckResult:
|
|
65
|
+
"""
|
|
66
|
+
Check the status of the PanDA task data target.
|
|
67
|
+
This method should be implemented to handle the specifics of PanDA task data status checking.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
data_spec (WFDataSpec): The data specification containing details about the data to be checked.
|
|
71
|
+
**kwargs: Additional keyword arguments that may be required for checking.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
WFDataTargetCheckResult: An object containing the result of the check, including success status, current data status, and message.
|
|
75
|
+
"""
|
|
76
|
+
tmp_log = LogWrapper(logger, f"check_target workflow_id={data_spec.workflow_id} data_id={data_spec.data_id}")
|
|
77
|
+
# Initialize
|
|
78
|
+
check_result = WFDataTargetCheckResult()
|
|
79
|
+
# Check data flavor
|
|
80
|
+
if data_spec.flavor != self.plugin_flavor:
|
|
81
|
+
tmp_log.warning(f"flavor={data_spec.flavor} not {self.plugin_flavor}; skipped")
|
|
82
|
+
check_result.message = f"flavor not {self.plugin_flavor}; skipped"
|
|
83
|
+
return check_result
|
|
84
|
+
# Check source step status
|
|
85
|
+
if data_spec.source_step_id is not None:
|
|
86
|
+
source_step_spec = self.tbif.get_workflow_step(data_spec.source_step_id)
|
|
87
|
+
if source_step_spec is None:
|
|
88
|
+
check_result.success = False
|
|
89
|
+
check_result.message = f"Failed to get source step step_id={data_spec.source_step_id}; skipped"
|
|
90
|
+
tmp_log.error(f"{check_result.message}")
|
|
91
|
+
return check_result
|
|
92
|
+
if source_step_spec.status == WFStepStatus.done:
|
|
93
|
+
# Source step done; consider data fully available
|
|
94
|
+
check_result.success = True
|
|
95
|
+
check_result.check_status = WFDataTargetCheckStatus.complete
|
|
96
|
+
tmp_log.info(f"Source step step_id={source_step_spec.step_id} done, data considered fully available; check_status={check_result.check_status}")
|
|
97
|
+
return check_result
|
|
98
|
+
elif source_step_spec.status in WFStepStatus.final_statuses:
|
|
99
|
+
# Source step in final status but not done; skip data availability
|
|
100
|
+
check_result.success = True
|
|
101
|
+
check_result.message = f"Source step step_id={source_step_spec.step_id} {source_step_spec.status}; skip data availability check"
|
|
102
|
+
tmp_log.warning(f"{check_result.message}")
|
|
103
|
+
return check_result
|
|
104
|
+
else:
|
|
105
|
+
tmp_log.info(f"Source step step_id={source_step_spec.step_id} status={source_step_spec.status}; checking data availability")
|
|
106
|
+
else:
|
|
107
|
+
tmp_log.info("No source step yet; checking data availability")
|
|
108
|
+
# Without source step or source step not terminated; check number of files in DDM collections
|
|
109
|
+
total_n_files = 0
|
|
110
|
+
none_exist = True
|
|
111
|
+
output_types = data_spec.get_parameter("output_types")
|
|
112
|
+
if output_types is None:
|
|
113
|
+
output_types = []
|
|
114
|
+
for output_type in output_types:
|
|
115
|
+
collection = f"{data_spec.target_id}_{output_type}"
|
|
116
|
+
tmp_stat, tmp_res = self.ddm_if.get_number_of_files(collection)
|
|
117
|
+
if tmp_stat is None:
|
|
118
|
+
tmp_log.debug(f"Collection {collection} does not exist")
|
|
119
|
+
elif not tmp_stat:
|
|
120
|
+
# Error in getting number of files
|
|
121
|
+
check_result.success = False
|
|
122
|
+
check_result.message = f"Failed to get number of files for collection {collection}: {tmp_res}"
|
|
123
|
+
tmp_log.error(f"{check_result.message}")
|
|
124
|
+
return check_result
|
|
125
|
+
else:
|
|
126
|
+
none_exist = False
|
|
127
|
+
n_files = tmp_res
|
|
128
|
+
total_n_files += n_files
|
|
129
|
+
tmp_log.debug(f"Got collection {collection} n_files={n_files}")
|
|
130
|
+
# Check number of files
|
|
131
|
+
if none_exist:
|
|
132
|
+
check_result.check_status = WFDataTargetCheckStatus.nonexist
|
|
133
|
+
elif PARTIAL_DATA_SUFFICE and total_n_files > 0:
|
|
134
|
+
# At least 1 file for step input
|
|
135
|
+
check_result.check_status = WFDataTargetCheckStatus.suffice
|
|
136
|
+
else:
|
|
137
|
+
check_result.check_status = WFDataTargetCheckStatus.insuffi
|
|
138
|
+
check_result.success = True
|
|
139
|
+
tmp_log.info(f"Got total_n_files={total_n_files}; check_status={check_result.check_status}")
|
|
140
|
+
return check_result
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import sys
|
|
3
|
+
|
|
4
|
+
from pandaserver.workflow.pcwl_utils import parse_workflow_file, resolve_nodes
|
|
5
|
+
from pandaserver.workflow.workflow_utils import (
|
|
6
|
+
convert_nodes_to_workflow,
|
|
7
|
+
dump_nodes,
|
|
8
|
+
get_node_id_map,
|
|
9
|
+
set_workflow_outputs,
|
|
10
|
+
)
|
|
11
|
+
from ruamel import yaml
|
|
12
|
+
|
|
13
|
+
logging.basicConfig(format="%(asctime)s - %(levelname)s - %(message)s", level=logging.DEBUG)
|
|
14
|
+
with open(sys.argv[2]) as f:
|
|
15
|
+
data = yaml.safe_load(f) or dict()
|
|
16
|
+
nodes, root_in = parse_workflow_file(sys.argv[1], logging)
|
|
17
|
+
s_id, t_nodes, nodes = resolve_nodes(nodes, root_in, data, 0, set(), sys.argv[3], logging)
|
|
18
|
+
set_workflow_outputs(nodes)
|
|
19
|
+
id_map = get_node_id_map(nodes)
|
|
20
|
+
# task template
|
|
21
|
+
template = {
|
|
22
|
+
"buildSpec": {
|
|
23
|
+
"jobParameters": "-i ${IN} -o ${OUT} --sourceURL ${SURL} " "-r ./ --useAthenaPackages --useCMake --cmtConfig x86_64-slc6-gcc49-opt ",
|
|
24
|
+
"archiveName": "sources.5bca61db-3b0d-4e65-b102-7d56d82f4567.tar.gz",
|
|
25
|
+
"prodSourceLabel": "panda",
|
|
26
|
+
},
|
|
27
|
+
"sourceURL": "https://aipanda047.cern.ch:25443",
|
|
28
|
+
"cliParams": "prun --exec ls --useAthenaPackages --outDS user.tmaeno.4586bbc2-e891-441b-a9f4-4a9ceb9a9f8d",
|
|
29
|
+
"site": None,
|
|
30
|
+
"vo": "atlas",
|
|
31
|
+
"respectSplitRule": True,
|
|
32
|
+
"osInfo": "Linux-3.10.0-1160.36.2.el7.x86_64-x86_64-with-centos-7.9.2009-Core",
|
|
33
|
+
"log": {
|
|
34
|
+
"type": "template",
|
|
35
|
+
"param_type": "log",
|
|
36
|
+
"container": "user.tmaeno.4586bbc2-e891-441b-a9f4-4a9ceb9a9f8d.log/",
|
|
37
|
+
"value": "user.tmaeno.4586bbc2-e891-441b-a9f4-4a9ceb9a9f8d.log.$JEDITASKID.${SN}.log.tgz",
|
|
38
|
+
"dataset": "user.tmaeno.4586bbc2-e891-441b-a9f4-4a9ceb9a9f8d.log/",
|
|
39
|
+
},
|
|
40
|
+
"transUses": "Atlas-21.0.6",
|
|
41
|
+
"excludedSite": [],
|
|
42
|
+
"nMaxFilesPerJob": 200,
|
|
43
|
+
"uniqueTaskName": True,
|
|
44
|
+
"taskName": "user.tmaeno.4586bbc2-e891-441b-a9f4-4a9ceb9a9f8d/",
|
|
45
|
+
"transHome": "AnalysisTransforms",
|
|
46
|
+
"includedSite": None,
|
|
47
|
+
"jobParameters": [
|
|
48
|
+
{"type": "constant", "value": '-j "" --sourceURL ${SURL}'},
|
|
49
|
+
{"type": "constant", "value": "-r ./"},
|
|
50
|
+
{"padding": False, "type": "constant", "value": '-p "'},
|
|
51
|
+
{"padding": False, "type": "constant", "value": "ls"},
|
|
52
|
+
{"type": "constant", "value": '"'},
|
|
53
|
+
{"type": "constant", "value": "-l ${LIB}"},
|
|
54
|
+
{
|
|
55
|
+
"type": "constant",
|
|
56
|
+
"value": "--useAthenaPackages " "--useCMake --cmtConfig x86_64-slc6-gcc49-opt ",
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
"prodSourceLabel": "user",
|
|
60
|
+
"processingType": "panda-client-1.4.81-jedi-run",
|
|
61
|
+
"architecture": "x86_64-slc6-gcc49-opt@centos7",
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
c_template = {
|
|
66
|
+
"sourceURL": "https://aipanda048.cern.ch:25443",
|
|
67
|
+
"cliParams": "prun --cwl test.cwl --yaml a.yaml " "--relayHost aipanda059.cern.ch --outDS " "user.tmaeno.1f2860f0-30d6-4352-9f87-9b9dde82fd80",
|
|
68
|
+
"site": None,
|
|
69
|
+
"vo": "atlas",
|
|
70
|
+
"respectSplitRule": True,
|
|
71
|
+
"osInfo": "Linux-3.10.0-1160.36.2.el7.x86_64-x86_64-with-centos-7.9.2009-Core",
|
|
72
|
+
"log": {
|
|
73
|
+
"type": "template",
|
|
74
|
+
"param_type": "log",
|
|
75
|
+
"container": "user.tmaeno.1f2860f0-30d6-4352-9f87-9b9dde82fd80.log/",
|
|
76
|
+
"value": "user.tmaeno.1f2860f0-30d6-4352-9f87-9b9dde82fd80.log.$JEDITASKID.${SN}.log.tgz",
|
|
77
|
+
"dataset": "user.tmaeno.1f2860f0-30d6-4352-9f87-9b9dde82fd80.log/",
|
|
78
|
+
},
|
|
79
|
+
"transUses": "",
|
|
80
|
+
"excludedSite": [],
|
|
81
|
+
"nMaxFilesPerJob": 200,
|
|
82
|
+
"uniqueTaskName": True,
|
|
83
|
+
"taskName": "user.tmaeno.1f2860f0-30d6-4352-9f87-9b9dde82fd80/",
|
|
84
|
+
"transHome": None,
|
|
85
|
+
"includedSite": None,
|
|
86
|
+
"container_name": "__dummy_container__",
|
|
87
|
+
"multiStepExec": {
|
|
88
|
+
"preprocess": {"args": "--preprocess ${TRF_ARGS}", "command": "${TRF}"},
|
|
89
|
+
"containerOptions": {
|
|
90
|
+
"containerImage": "__dummy_container__",
|
|
91
|
+
"containerExec": 'echo "=== cat exec script ==="; ' "cat __run_main_exec.sh; echo; " 'echo "=== exec script ==="; ' "/bin/sh __run_main_exec.sh",
|
|
92
|
+
},
|
|
93
|
+
"postprocess": {"args": "--postprocess ${TRF_ARGS}", "command": "${TRF}"},
|
|
94
|
+
},
|
|
95
|
+
"jobParameters": [
|
|
96
|
+
{"type": "constant", "value": '-j "" --sourceURL ${SURL}'},
|
|
97
|
+
{"type": "constant", "value": "-r ."},
|
|
98
|
+
{"padding": False, "type": "constant", "value": '-p "'},
|
|
99
|
+
{"padding": False, "type": "constant", "value": "__dummy_exec_str__"},
|
|
100
|
+
{"type": "constant", "value": '"'},
|
|
101
|
+
{
|
|
102
|
+
"type": "constant",
|
|
103
|
+
"value": "-a jobO.b6bdf294-8a46-4b02-b399-46619db4088b.tar.gz",
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
"prodSourceLabel": "user",
|
|
107
|
+
"processingType": "panda-client-1.4.81-jedi-run",
|
|
108
|
+
"architecture": "",
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
task_template = {"athena": template, "container": c_template}
|
|
112
|
+
|
|
113
|
+
[node.resolve_params(task_template, id_map) for node in nodes]
|
|
114
|
+
print(dump_nodes(nodes))
|
|
115
|
+
|
|
116
|
+
workflow, dump_str_list = convert_nodes_to_workflow(nodes)
|
|
117
|
+
print("".join(dump_str_list))
|
|
118
|
+
|
|
119
|
+
for node in nodes:
|
|
120
|
+
s, o = node.verify()
|
|
121
|
+
if not s:
|
|
122
|
+
print(f"Verification error in ID:{node.id} {o}")
|