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
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"""
|
|
2
|
+
dataset specification
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class DatasetSpec(object):
|
|
8
|
+
# attributes
|
|
9
|
+
_attributes = (
|
|
10
|
+
"vuid",
|
|
11
|
+
"name",
|
|
12
|
+
"version",
|
|
13
|
+
"type",
|
|
14
|
+
"status",
|
|
15
|
+
"numberfiles",
|
|
16
|
+
"currentfiles",
|
|
17
|
+
"creationdate",
|
|
18
|
+
"modificationdate",
|
|
19
|
+
"MoverID",
|
|
20
|
+
"transferStatus",
|
|
21
|
+
"subType",
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
# attributes which have 0 by default
|
|
25
|
+
_zeroAttrs = ("MoverID", "transferStatus")
|
|
26
|
+
|
|
27
|
+
# constructor
|
|
28
|
+
def __init__(self):
|
|
29
|
+
# install attributes
|
|
30
|
+
for attr in self._attributes:
|
|
31
|
+
setattr(self, attr, None)
|
|
32
|
+
|
|
33
|
+
# override __getattribute__ for SQL
|
|
34
|
+
def __getattribute__(self, name):
|
|
35
|
+
ret = object.__getattribute__(self, name)
|
|
36
|
+
if ret is None:
|
|
37
|
+
return "NULL"
|
|
38
|
+
return ret
|
|
39
|
+
|
|
40
|
+
# return a tuple of values
|
|
41
|
+
def values(self):
|
|
42
|
+
ret = []
|
|
43
|
+
for attr in self._attributes:
|
|
44
|
+
val = getattr(self, attr)
|
|
45
|
+
ret.append(val)
|
|
46
|
+
return tuple(ret)
|
|
47
|
+
|
|
48
|
+
# return map of values
|
|
49
|
+
def valuesMap(self):
|
|
50
|
+
ret = {}
|
|
51
|
+
for attr in self._attributes:
|
|
52
|
+
val = getattr(self, attr)
|
|
53
|
+
if val == "NULL":
|
|
54
|
+
if attr in self._zeroAttrs:
|
|
55
|
+
val = 0
|
|
56
|
+
else:
|
|
57
|
+
val = None
|
|
58
|
+
ret[f":{attr}"] = val
|
|
59
|
+
return ret
|
|
60
|
+
|
|
61
|
+
# pack tuple into DatasetSpec
|
|
62
|
+
def pack(self, values):
|
|
63
|
+
for i in range(len(self._attributes)):
|
|
64
|
+
attr = self._attributes[i]
|
|
65
|
+
val = values[i]
|
|
66
|
+
setattr(self, attr, val)
|
|
67
|
+
|
|
68
|
+
# return column names for INSERT
|
|
69
|
+
def columnNames(cls):
|
|
70
|
+
ret = ""
|
|
71
|
+
for attr in cls._attributes:
|
|
72
|
+
if ret != "":
|
|
73
|
+
ret += ","
|
|
74
|
+
ret += attr
|
|
75
|
+
return ret
|
|
76
|
+
|
|
77
|
+
columnNames = classmethod(columnNames)
|
|
78
|
+
|
|
79
|
+
# return expression of values for INSERT
|
|
80
|
+
def valuesExpression(cls):
|
|
81
|
+
ret = "VALUES("
|
|
82
|
+
for attr in cls._attributes:
|
|
83
|
+
ret += "%s"
|
|
84
|
+
if attr != cls._attributes[len(cls._attributes) - 1]:
|
|
85
|
+
ret += ","
|
|
86
|
+
ret += ")"
|
|
87
|
+
return ret
|
|
88
|
+
|
|
89
|
+
valuesExpression = classmethod(valuesExpression)
|
|
90
|
+
|
|
91
|
+
# return expression of bind values for INSERT
|
|
92
|
+
def bindValuesExpression(cls):
|
|
93
|
+
ret = "VALUES("
|
|
94
|
+
for attr in cls._attributes:
|
|
95
|
+
ret += f":{attr},"
|
|
96
|
+
ret = ret[:-1]
|
|
97
|
+
ret += ")"
|
|
98
|
+
return ret
|
|
99
|
+
|
|
100
|
+
bindValuesExpression = classmethod(bindValuesExpression)
|
|
101
|
+
|
|
102
|
+
# return an expression for UPDATE
|
|
103
|
+
def updateExpression(cls):
|
|
104
|
+
ret = ""
|
|
105
|
+
for attr in cls._attributes:
|
|
106
|
+
ret = ret + attr + "=%s"
|
|
107
|
+
if attr != cls._attributes[len(cls._attributes) - 1]:
|
|
108
|
+
ret += ","
|
|
109
|
+
return ret
|
|
110
|
+
|
|
111
|
+
updateExpression = classmethod(updateExpression)
|
|
112
|
+
|
|
113
|
+
# return an expression of bind variables for UPDATE
|
|
114
|
+
def bindUpdateExpression(cls):
|
|
115
|
+
ret = ""
|
|
116
|
+
for attr in cls._attributes:
|
|
117
|
+
ret += f"{attr}=:{attr},"
|
|
118
|
+
ret = ret[:-1]
|
|
119
|
+
return ret
|
|
120
|
+
|
|
121
|
+
bindUpdateExpression = classmethod(bindUpdateExpression)
|
|
122
|
+
|
|
123
|
+
# return state values to be pickled
|
|
124
|
+
def __getstate__(self):
|
|
125
|
+
state = []
|
|
126
|
+
for attr in self._attributes:
|
|
127
|
+
val = getattr(self, attr)
|
|
128
|
+
state.append(val)
|
|
129
|
+
return state
|
|
130
|
+
|
|
131
|
+
# restore state from the unpickled state values
|
|
132
|
+
def __setstate__(self, state):
|
|
133
|
+
for i, attr in enumerate(self._attributes):
|
|
134
|
+
if i < len(state):
|
|
135
|
+
setattr(self, attr, state[i])
|
|
136
|
+
else:
|
|
137
|
+
setattr(self, attr, None)
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ddm endpoint specification object
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import re
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class DdmSpec(object):
|
|
10
|
+
# constructor
|
|
11
|
+
def __init__(self):
|
|
12
|
+
self.all = {}
|
|
13
|
+
self.local = set()
|
|
14
|
+
self.default_read = None
|
|
15
|
+
self.default_write = None
|
|
16
|
+
self.tape = set()
|
|
17
|
+
|
|
18
|
+
def add(self, relation, endpoint_dictionary):
|
|
19
|
+
"""
|
|
20
|
+
Add an endpoint to the DDM specification.
|
|
21
|
+
|
|
22
|
+
This method adds an endpoint to the DDM specification by copying all properties
|
|
23
|
+
about the DDM endpoint and relation. It also updates local endpoints, default
|
|
24
|
+
read/write endpoints, and tape endpoints.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
relation (dict): A dictionary containing the relation properties.
|
|
28
|
+
endpoint_dictionary (dict): A dictionary containing the endpoint properties.
|
|
29
|
+
"""
|
|
30
|
+
name = relation["ddm_endpoint_name"]
|
|
31
|
+
|
|
32
|
+
# Protection against inconsistent dict
|
|
33
|
+
if name not in endpoint_dictionary:
|
|
34
|
+
return
|
|
35
|
+
|
|
36
|
+
# All endpoints, copy all properties about DDM endpoint and relation
|
|
37
|
+
self.all[name] = {}
|
|
38
|
+
for key in endpoint_dictionary[name]:
|
|
39
|
+
value = endpoint_dictionary[name][key]
|
|
40
|
+
self.all[name][key] = value
|
|
41
|
+
for key in relation:
|
|
42
|
+
value = relation[key]
|
|
43
|
+
self.all[name][key] = value
|
|
44
|
+
|
|
45
|
+
# Local endpoints
|
|
46
|
+
if relation["is_local"] != "N":
|
|
47
|
+
self.local.add(name)
|
|
48
|
+
|
|
49
|
+
# Default read and write
|
|
50
|
+
if relation["default_read"] == "Y":
|
|
51
|
+
self.default_read = name
|
|
52
|
+
if relation["default_write"] == "Y":
|
|
53
|
+
self.default_write = name
|
|
54
|
+
|
|
55
|
+
# Tape
|
|
56
|
+
if relation["is_tape"] == "Y":
|
|
57
|
+
self.tape.add(name)
|
|
58
|
+
|
|
59
|
+
def getAllEndPoints(self):
|
|
60
|
+
"""
|
|
61
|
+
Get all DDM endpoints. This method returns a list of all DDM endpoints.
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
list: A list of all DDM endpoints.
|
|
65
|
+
"""
|
|
66
|
+
return list(self.all)
|
|
67
|
+
|
|
68
|
+
def getEndPoint(self, endpoint_name):
|
|
69
|
+
"""
|
|
70
|
+
Get a specific DDM endpoint.
|
|
71
|
+
|
|
72
|
+
This method returns the properties of a specific DDM endpoint.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
endpoint_name (str): The name of the DDM endpoint.
|
|
76
|
+
Returns:
|
|
77
|
+
dict or None: A dictionary containing the properties of the DDM endpoint, or None if not found.
|
|
78
|
+
"""
|
|
79
|
+
if endpoint_name in self.all:
|
|
80
|
+
return self.all[endpoint_name]
|
|
81
|
+
return None
|
|
82
|
+
|
|
83
|
+
def getLocalEndPoints(self):
|
|
84
|
+
"""
|
|
85
|
+
This method returns a sorted list of local DDM endpoints.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
list: A sorted list of local DDM endpoints.
|
|
89
|
+
"""
|
|
90
|
+
sorted_endpoints = sorted(self.local)
|
|
91
|
+
return sorted_endpoints
|
|
92
|
+
|
|
93
|
+
def getDefaultWrite(self):
|
|
94
|
+
"""
|
|
95
|
+
This method returns the default write DDM endpoint.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
str or None: The default write DDM endpoint, or None if not set.
|
|
99
|
+
"""
|
|
100
|
+
return self.default_write
|
|
101
|
+
|
|
102
|
+
def getDefaultRead(self):
|
|
103
|
+
"""
|
|
104
|
+
This method returns the default read DDM endpoint.
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
str or None: The default write DDM endpoint, or None if not set.
|
|
108
|
+
"""
|
|
109
|
+
return self.default_read
|
|
110
|
+
|
|
111
|
+
def getTapeEndPoints(self):
|
|
112
|
+
"""
|
|
113
|
+
This method returns a tuple of tape DDM endpoints.
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
tuple: A tuple of tape DDM endpoints.
|
|
117
|
+
"""
|
|
118
|
+
return tuple(self.tape)
|
|
119
|
+
|
|
120
|
+
def isAssociated(self, endpoint_name):
|
|
121
|
+
"""
|
|
122
|
+
This method checks if a given endpoint name is associated with any DDM endpoint.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
endpoint_name (str): The name of the DDM endpoint.
|
|
126
|
+
|
|
127
|
+
Returns:
|
|
128
|
+
bool: True if the endpoint is associated, False otherwise.
|
|
129
|
+
"""
|
|
130
|
+
return endpoint_name in self.all
|
|
131
|
+
|
|
132
|
+
def getAssociatedEndpoint(self, patt, mode="output"):
|
|
133
|
+
"""
|
|
134
|
+
This method returns the DDM endpoint associated with a given pattern and of the lowest order.
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
patt (str): The pattern to match.
|
|
138
|
+
mode (str): The mode, either "input" or "output". Default is "output".
|
|
139
|
+
Returns:
|
|
140
|
+
dict or None: A dictionary containing the properties of the associated DDM endpoint, or None if not found.
|
|
141
|
+
"""
|
|
142
|
+
patt = patt.split("/")[-1]
|
|
143
|
+
if patt in self.all:
|
|
144
|
+
return self.all[patt]
|
|
145
|
+
|
|
146
|
+
endpoint = None
|
|
147
|
+
order = 10**6 # Like infinite
|
|
148
|
+
for tmp_ddm_endpoint_name in self.all:
|
|
149
|
+
tmp_ddm_endpoint_dict = self.all[tmp_ddm_endpoint_name]
|
|
150
|
+
# get the order of the current loop endpoint
|
|
151
|
+
if mode == "input":
|
|
152
|
+
tmp_order = tmp_ddm_endpoint_dict["order_read"]
|
|
153
|
+
elif mode == "output":
|
|
154
|
+
tmp_order = tmp_ddm_endpoint_dict["order_write"]
|
|
155
|
+
# we already have a closer endpoint, so skip the looping one
|
|
156
|
+
if tmp_order > order:
|
|
157
|
+
continue
|
|
158
|
+
|
|
159
|
+
# check name
|
|
160
|
+
if re.search(patt, tmp_ddm_endpoint_name) is not None:
|
|
161
|
+
endpoint = self.all[tmp_ddm_endpoint_name]
|
|
162
|
+
order = tmp_order
|
|
163
|
+
|
|
164
|
+
# check type
|
|
165
|
+
pattern_without_vo = re.sub("ATLAS", "", patt)
|
|
166
|
+
if self.all[tmp_ddm_endpoint_name]["type"] == pattern_without_vo:
|
|
167
|
+
endpoint = self.all[tmp_ddm_endpoint_name]
|
|
168
|
+
order = tmp_order
|
|
169
|
+
|
|
170
|
+
return endpoint
|
|
171
|
+
|
|
172
|
+
def getTokenMap(self, mode):
|
|
173
|
+
"""
|
|
174
|
+
This method returns a mapping between space tokens and endpoint names based on the mode.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
mode (str): The mode, either "input" or "output".
|
|
178
|
+
Returns:
|
|
179
|
+
dict: A dictionary mapping tokens to endpoint names.
|
|
180
|
+
"""
|
|
181
|
+
ret_map = {}
|
|
182
|
+
orders = {}
|
|
183
|
+
for tmp_ddm_endpoint_name in self.all:
|
|
184
|
+
tmp_ddm_endpoint_dict = self.all[tmp_ddm_endpoint_name]
|
|
185
|
+
token = tmp_ddm_endpoint_dict["ddm_spacetoken_name"]
|
|
186
|
+
|
|
187
|
+
# get the order
|
|
188
|
+
if mode == "input":
|
|
189
|
+
order = tmp_ddm_endpoint_dict["order_read"]
|
|
190
|
+
elif mode == "output":
|
|
191
|
+
order = tmp_ddm_endpoint_dict["order_write"]
|
|
192
|
+
|
|
193
|
+
# map already contains this token
|
|
194
|
+
if token in ret_map and orders[token] < order:
|
|
195
|
+
continue
|
|
196
|
+
|
|
197
|
+
# add
|
|
198
|
+
ret_map[token] = tmp_ddm_endpoint_name
|
|
199
|
+
orders[token] = order
|
|
200
|
+
|
|
201
|
+
return ret_map
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# error code
|
|
2
|
+
|
|
3
|
+
# killed
|
|
4
|
+
EC_Kill = 100
|
|
5
|
+
|
|
6
|
+
# transfer timeout
|
|
7
|
+
EC_Transfer = 101
|
|
8
|
+
|
|
9
|
+
# expire
|
|
10
|
+
EC_Expire = 102
|
|
11
|
+
|
|
12
|
+
# aborted
|
|
13
|
+
EC_Aborted = 103
|
|
14
|
+
|
|
15
|
+
# reassigned by re-brokerage
|
|
16
|
+
EC_Reassigned = 105
|
|
17
|
+
|
|
18
|
+
# reassigned by server-side retry
|
|
19
|
+
EC_Retried = 106
|
|
20
|
+
|
|
21
|
+
# retried by pilot
|
|
22
|
+
EC_PilotRetried = 107
|
|
23
|
+
|
|
24
|
+
# retried for event service
|
|
25
|
+
EC_EventServiceRetried = 111
|
|
26
|
+
|
|
27
|
+
# merge for event service
|
|
28
|
+
EC_EventServiceMerge = 112
|
|
29
|
+
|
|
30
|
+
# merge job failed
|
|
31
|
+
EC_MergeFailed = 113
|
|
32
|
+
|
|
33
|
+
# max attempt reached for Event Service
|
|
34
|
+
EC_EventServiceMaxAttempt = 114
|
|
35
|
+
|
|
36
|
+
# do nothing since other consumers are still running
|
|
37
|
+
EC_EventServiceWaitOthers = 115
|
|
38
|
+
|
|
39
|
+
# killed since unused and unnecessary anymore
|
|
40
|
+
EC_EventServiceUnused = 116
|
|
41
|
+
|
|
42
|
+
# didn't process any events on WN
|
|
43
|
+
EC_EventServiceUnprocessed = 117
|
|
44
|
+
|
|
45
|
+
# didn't process any events on WN and last consumer
|
|
46
|
+
EC_EventServiceLastUnprocessed = 118
|
|
47
|
+
|
|
48
|
+
# all event ranges failed
|
|
49
|
+
EC_EventServiceAllFailed = 119
|
|
50
|
+
|
|
51
|
+
# associated consumer generated ES merge
|
|
52
|
+
EC_EventServiceKillOK = 120
|
|
53
|
+
|
|
54
|
+
# associated consumer failed
|
|
55
|
+
EC_EventServiceKillNG = 121
|
|
56
|
+
|
|
57
|
+
# killed for preemption
|
|
58
|
+
EC_EventServicePreemption = 122
|
|
59
|
+
|
|
60
|
+
# retried but didn't process any events on WN
|
|
61
|
+
EC_EventServiceNoEvent = 123
|
|
62
|
+
|
|
63
|
+
# input files inconsistent with JEDI
|
|
64
|
+
EC_EventServiceInconsistentIn = 124
|
|
65
|
+
|
|
66
|
+
# No event service queues available for new consumers
|
|
67
|
+
EC_EventServiceNoEsQueues = 125
|
|
68
|
+
|
|
69
|
+
# Closed in bad job status
|
|
70
|
+
EC_EventServiceBadStatus = 126
|
|
71
|
+
|
|
72
|
+
# Fast re-brokerage for overloaded
|
|
73
|
+
EC_FastRebrokerage = 130
|
|
74
|
+
|
|
75
|
+
# failed to lock semaphore for job cloning
|
|
76
|
+
EC_JobCloningUnlock = 200
|
|
77
|
+
|
|
78
|
+
# worker is done before job is done
|
|
79
|
+
EC_WorkerDone = 300
|
|
80
|
+
|
|
81
|
+
# http error codes
|
|
82
|
+
|
|
83
|
+
# forbidden request
|
|
84
|
+
EC_Forbidden = 403
|
|
85
|
+
|
|
86
|
+
# file not found
|
|
87
|
+
EC_NotFound = 404
|