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,27 @@
|
|
|
1
|
+
from pandacommon.pandalogger import logger_utils
|
|
2
|
+
|
|
3
|
+
from pandajedi.jediconfig import jedi_config
|
|
4
|
+
from pandajedi.jedidaemons.utils import DaemonMaster
|
|
5
|
+
|
|
6
|
+
base_logger = logger_utils.setup_logger(__name__.split(".")[-1])
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# launch
|
|
10
|
+
def launcher(taskBufferIF, ddmIF):
|
|
11
|
+
tmp_log = logger_utils.make_logger(base_logger, method_name="launcher")
|
|
12
|
+
tmp_log.debug("start")
|
|
13
|
+
try:
|
|
14
|
+
jedi_config.daemon.config
|
|
15
|
+
except Exception as e:
|
|
16
|
+
tmp_log.error(f"failed to read config json file; should not happen... {e.__class__.__name__}: {e}")
|
|
17
|
+
raise e
|
|
18
|
+
# whether to run daemons
|
|
19
|
+
if not getattr(jedi_config.daemon, "enable", False):
|
|
20
|
+
tmp_log.debug("daemon disabled ; skipped")
|
|
21
|
+
return
|
|
22
|
+
# parameters
|
|
23
|
+
n_workers = getattr(jedi_config.daemon, "n_proc", 1)
|
|
24
|
+
worker_lifetime = getattr(jedi_config.daemon, "proc_lifetime", 28800)
|
|
25
|
+
# start
|
|
26
|
+
agent = DaemonMaster(logger=tmp_log, n_workers=n_workers, worker_lifetime=worker_lifetime, tbuf=taskBufferIF, ddmif=ddmIF)
|
|
27
|
+
agent.run()
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import random
|
|
2
|
+
import sys
|
|
3
|
+
import time
|
|
4
|
+
|
|
5
|
+
from pandajedi.jedicore import Interaction
|
|
6
|
+
from pandajedi.jedicore.ThreadUtils import ZombieCleaner
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class JediKnight(Interaction.CommandReceiveInterface):
|
|
10
|
+
# constructor
|
|
11
|
+
def __init__(self, commuChannel, taskBufferIF, ddmIF, logger, **kwargs):
|
|
12
|
+
Interaction.CommandReceiveInterface.__init__(self, commuChannel)
|
|
13
|
+
self.taskBufferIF = taskBufferIF
|
|
14
|
+
self.ddmIF = ddmIF
|
|
15
|
+
self.logger = logger
|
|
16
|
+
# intra-node message broker proxies
|
|
17
|
+
self.mb_proxy_dict = kwargs.get("mb_proxy_dict")
|
|
18
|
+
# start zombie cleaner
|
|
19
|
+
ZombieCleaner().start()
|
|
20
|
+
|
|
21
|
+
# start communication channel in a thread
|
|
22
|
+
def start(self):
|
|
23
|
+
# start communication channel
|
|
24
|
+
import threading
|
|
25
|
+
|
|
26
|
+
thr = threading.Thread(target=self.startImpl)
|
|
27
|
+
thr.start()
|
|
28
|
+
|
|
29
|
+
# implementation of start()
|
|
30
|
+
def startImpl(self):
|
|
31
|
+
try:
|
|
32
|
+
Interaction.CommandReceiveInterface.start(self)
|
|
33
|
+
except Exception:
|
|
34
|
+
errtype, errvalue = sys.exc_info()[:2]
|
|
35
|
+
self.logger.error(f"crashed in JediKnight.startImpl() with {errtype.__name__} {errvalue}")
|
|
36
|
+
|
|
37
|
+
# parse init params
|
|
38
|
+
def parseInit(self, par):
|
|
39
|
+
if isinstance(par, list):
|
|
40
|
+
return par
|
|
41
|
+
try:
|
|
42
|
+
return par.split("|")
|
|
43
|
+
except Exception:
|
|
44
|
+
return [par]
|
|
45
|
+
|
|
46
|
+
# sleep to avoid synchronization of loop
|
|
47
|
+
def randomSleep(self, min_val=0, default_max_val=30, max_val=None):
|
|
48
|
+
if max_val is None:
|
|
49
|
+
max_val = default_max_val
|
|
50
|
+
max_val = min(max_val, default_max_val)
|
|
51
|
+
time.sleep(random.randint(min_val, max_val))
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# install SCs
|
|
55
|
+
Interaction.installSC(JediKnight)
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
import grp
|
|
3
|
+
import multiprocessing
|
|
4
|
+
import optparse
|
|
5
|
+
import os
|
|
6
|
+
import pwd
|
|
7
|
+
import signal
|
|
8
|
+
import sys
|
|
9
|
+
import time
|
|
10
|
+
|
|
11
|
+
import daemon
|
|
12
|
+
from pandacommon.pandautils.PandaUtils import naive_utcnow
|
|
13
|
+
|
|
14
|
+
from pandajedi.jediconfig import jedi_config
|
|
15
|
+
from pandajedi.jedicore.JediTaskBufferInterface import JediTaskBufferInterface
|
|
16
|
+
from pandajedi.jedicore.ProcessUtils import ProcessWrapper
|
|
17
|
+
from pandajedi.jedicore.ThreadUtils import ZombieCleaner
|
|
18
|
+
from pandajedi.jediddm.DDMInterface import DDMInterface
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# the master class of JEDI which runs the main process
|
|
22
|
+
class JediMaster:
|
|
23
|
+
# constrictor
|
|
24
|
+
def __init__(self):
|
|
25
|
+
self.stopEventList = []
|
|
26
|
+
|
|
27
|
+
# spawn a knight to have own file descriptors
|
|
28
|
+
def launcher(self, moduleName, *args, **kwargs):
|
|
29
|
+
# import module
|
|
30
|
+
mod = __import__(moduleName)
|
|
31
|
+
for subModuleName in moduleName.split(".")[1:]:
|
|
32
|
+
mod = getattr(mod, subModuleName)
|
|
33
|
+
# launch
|
|
34
|
+
timeNow = naive_utcnow()
|
|
35
|
+
print(f"{str(timeNow)} {moduleName}: INFO start launcher with pid={os.getpid()}")
|
|
36
|
+
mod.launcher(*args, **kwargs)
|
|
37
|
+
|
|
38
|
+
# convert config parameters
|
|
39
|
+
def convParams(self, itemStr):
|
|
40
|
+
items = itemStr.split(":")
|
|
41
|
+
newItems = []
|
|
42
|
+
for item in items:
|
|
43
|
+
if item == "":
|
|
44
|
+
newItems.append(None)
|
|
45
|
+
elif "," in item:
|
|
46
|
+
newItems.append(item.split(","))
|
|
47
|
+
else:
|
|
48
|
+
try:
|
|
49
|
+
newItems.append(int(item))
|
|
50
|
+
except Exception:
|
|
51
|
+
newItems.append(item)
|
|
52
|
+
return newItems
|
|
53
|
+
|
|
54
|
+
# main loop
|
|
55
|
+
def start(self):
|
|
56
|
+
# start zombi cleaner
|
|
57
|
+
ZombieCleaner().start()
|
|
58
|
+
# setup DDM I/F
|
|
59
|
+
ddmIF = DDMInterface()
|
|
60
|
+
ddmIF.setupInterface()
|
|
61
|
+
# setup TaskBuffer I/F
|
|
62
|
+
taskBufferIF = JediTaskBufferInterface()
|
|
63
|
+
taskBufferIF.setupInterface()
|
|
64
|
+
# the list of JEDI knights
|
|
65
|
+
knightList = []
|
|
66
|
+
# setup TaskRefiner
|
|
67
|
+
for itemStr in jedi_config.taskrefine.procConfig.split(";"):
|
|
68
|
+
items = self.convParams(itemStr)
|
|
69
|
+
vo = items[0]
|
|
70
|
+
plabel = items[1]
|
|
71
|
+
nProc = items[2]
|
|
72
|
+
for iproc in range(nProc):
|
|
73
|
+
parent_conn, child_conn = multiprocessing.Pipe()
|
|
74
|
+
proc = multiprocessing.Process(target=self.launcher, args=("pandajedi.jediorder.TaskRefiner", child_conn, taskBufferIF, ddmIF, vo, plabel))
|
|
75
|
+
proc.start()
|
|
76
|
+
knightList.append(proc)
|
|
77
|
+
# setup TaskBrokerage
|
|
78
|
+
for itemStr in jedi_config.taskbroker.procConfig.split(";"):
|
|
79
|
+
items = self.convParams(itemStr)
|
|
80
|
+
vo = items[0]
|
|
81
|
+
plabel = items[1]
|
|
82
|
+
nProc = items[2]
|
|
83
|
+
for iproc in range(nProc):
|
|
84
|
+
parent_conn, child_conn = multiprocessing.Pipe()
|
|
85
|
+
proc = multiprocessing.Process(target=self.launcher, args=("pandajedi.jediorder.TaskBroker", child_conn, taskBufferIF, ddmIF, vo, plabel))
|
|
86
|
+
proc.start()
|
|
87
|
+
knightList.append(proc)
|
|
88
|
+
# setup ContentsFeeder
|
|
89
|
+
for itemStr in jedi_config.confeeder.procConfig.split(";"):
|
|
90
|
+
items = self.convParams(itemStr)
|
|
91
|
+
vo = items[0]
|
|
92
|
+
plabel = items[1]
|
|
93
|
+
nProc = items[2]
|
|
94
|
+
for iproc in range(nProc):
|
|
95
|
+
parent_conn, child_conn = multiprocessing.Pipe()
|
|
96
|
+
proc = multiprocessing.Process(target=self.launcher, args=("pandajedi.jediorder.ContentsFeeder", child_conn, taskBufferIF, ddmIF, vo, plabel))
|
|
97
|
+
proc.start()
|
|
98
|
+
knightList.append(proc)
|
|
99
|
+
# setup JobGenerator
|
|
100
|
+
for itemStr in jedi_config.jobgen.procConfig.split(";"):
|
|
101
|
+
items = self.convParams(itemStr)
|
|
102
|
+
vo = items[0]
|
|
103
|
+
plabel = items[1]
|
|
104
|
+
nProc = items[2]
|
|
105
|
+
cloud = items[3]
|
|
106
|
+
try:
|
|
107
|
+
loop_cycle = items[4]
|
|
108
|
+
except IndexError:
|
|
109
|
+
loop_cycle = None
|
|
110
|
+
|
|
111
|
+
if not isinstance(cloud, list):
|
|
112
|
+
cloud = [cloud]
|
|
113
|
+
for iproc in range(nProc):
|
|
114
|
+
parent_conn, child_conn = multiprocessing.Pipe()
|
|
115
|
+
proc = ProcessWrapper(
|
|
116
|
+
target=self.launcher, args=("pandajedi.jediorder.JobGenerator", child_conn, taskBufferIF, ddmIF, vo, plabel, cloud, True, True, loop_cycle)
|
|
117
|
+
)
|
|
118
|
+
proc.start()
|
|
119
|
+
knightList.append(proc)
|
|
120
|
+
# setup PostProcessor
|
|
121
|
+
for itemStr in jedi_config.postprocessor.procConfig.split(";"):
|
|
122
|
+
items = self.convParams(itemStr)
|
|
123
|
+
vo = items[0]
|
|
124
|
+
plabel = items[1]
|
|
125
|
+
nProc = items[2]
|
|
126
|
+
for iproc in range(nProc):
|
|
127
|
+
parent_conn, child_conn = multiprocessing.Pipe()
|
|
128
|
+
proc = multiprocessing.Process(target=self.launcher, args=("pandajedi.jediorder.PostProcessor", child_conn, taskBufferIF, ddmIF, vo, plabel))
|
|
129
|
+
proc.start()
|
|
130
|
+
knightList.append(proc)
|
|
131
|
+
# setup TaskCommando
|
|
132
|
+
for itemStr in jedi_config.tcommando.procConfig.split(";"):
|
|
133
|
+
items = self.convParams(itemStr)
|
|
134
|
+
vo = items[0]
|
|
135
|
+
plabel = items[1]
|
|
136
|
+
nProc = items[2]
|
|
137
|
+
for iproc in range(nProc):
|
|
138
|
+
parent_conn, child_conn = multiprocessing.Pipe()
|
|
139
|
+
proc = multiprocessing.Process(target=self.launcher, args=("pandajedi.jediorder.TaskCommando", child_conn, taskBufferIF, ddmIF, vo, plabel))
|
|
140
|
+
proc.start()
|
|
141
|
+
knightList.append(proc)
|
|
142
|
+
# setup WatchDog
|
|
143
|
+
for itemStr in jedi_config.watchdog.procConfig.split(";"):
|
|
144
|
+
items = self.convParams(itemStr)
|
|
145
|
+
vo = items[0]
|
|
146
|
+
plabel = items[1]
|
|
147
|
+
nProc = items[2]
|
|
148
|
+
subStr = items[3] if len(items) > 3 else None
|
|
149
|
+
period = items[4] if len(items) > 4 else None
|
|
150
|
+
for iproc in range(nProc):
|
|
151
|
+
parent_conn, child_conn = multiprocessing.Pipe()
|
|
152
|
+
proc = multiprocessing.Process(
|
|
153
|
+
target=self.launcher, args=("pandajedi.jediorder.WatchDog", child_conn, taskBufferIF, ddmIF, vo, plabel, subStr, period)
|
|
154
|
+
)
|
|
155
|
+
proc.start()
|
|
156
|
+
knightList.append(proc)
|
|
157
|
+
# setup JediMsgProcessor agent (only one system process)
|
|
158
|
+
if hasattr(jedi_config, "msgprocessor") and hasattr(jedi_config.msgprocessor, "configFile") and jedi_config.msgprocessor.configFile:
|
|
159
|
+
stop_event = multiprocessing.Event()
|
|
160
|
+
self.stopEventList.append(stop_event)
|
|
161
|
+
parent_conn, child_conn = multiprocessing.Pipe()
|
|
162
|
+
proc = multiprocessing.Process(target=self.launcher, args=("pandajedi.jediorder.JediMsgProcessor", stop_event))
|
|
163
|
+
proc.start()
|
|
164
|
+
knightList.append(proc)
|
|
165
|
+
# setup JediDaemon agent (only one system process)
|
|
166
|
+
if hasattr(jedi_config, "daemon") and hasattr(jedi_config.daemon, "enable") and jedi_config.daemon.enable:
|
|
167
|
+
parent_conn, child_conn = multiprocessing.Pipe()
|
|
168
|
+
proc = multiprocessing.Process(target=self.launcher, args=("pandajedi.jediorder.JediDaemon", taskBufferIF, ddmIF))
|
|
169
|
+
proc.start()
|
|
170
|
+
knightList.append(proc)
|
|
171
|
+
# check initial failures
|
|
172
|
+
time.sleep(5)
|
|
173
|
+
for knight in knightList:
|
|
174
|
+
if not knight.is_alive():
|
|
175
|
+
timeNow = naive_utcnow()
|
|
176
|
+
print(f"{str(timeNow)} {self.__class__.__name__}: ERROR pid={knight.pid} died in initialization")
|
|
177
|
+
os.killpg(os.getpgrp(), signal.SIGKILL)
|
|
178
|
+
# join
|
|
179
|
+
for knight in knightList:
|
|
180
|
+
knight.join()
|
|
181
|
+
|
|
182
|
+
# graceful stop
|
|
183
|
+
def stop(self):
|
|
184
|
+
for stop_event in self.stopEventList:
|
|
185
|
+
stop_event.set()
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
# kill whole process
|
|
189
|
+
def kill_whole(sig, frame):
|
|
190
|
+
# kill
|
|
191
|
+
os.killpg(os.getpgrp(), signal.SIGKILL)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
# main
|
|
195
|
+
if __name__ == "__main__":
|
|
196
|
+
# parse option
|
|
197
|
+
parser = optparse.OptionParser()
|
|
198
|
+
parser.add_option("--pid", action="store", dest="pid", default=None, help="pid filename")
|
|
199
|
+
options, args = parser.parse_args()
|
|
200
|
+
uid = None
|
|
201
|
+
gid = None
|
|
202
|
+
if "PANDA_NO_ROOT" not in os.environ:
|
|
203
|
+
if jedi_config.master.uname:
|
|
204
|
+
uid = pwd.getpwnam(jedi_config.master.uname).pw_uid
|
|
205
|
+
if jedi_config.master.gname:
|
|
206
|
+
gid = grp.getgrnam(jedi_config.master.gname).gr_gid
|
|
207
|
+
timeNow = naive_utcnow()
|
|
208
|
+
print(f"{str(timeNow)} JediMaster: INFO start")
|
|
209
|
+
# make daemon context
|
|
210
|
+
dc = daemon.DaemonContext(stdout=sys.stdout, stderr=sys.stderr, uid=uid, gid=gid)
|
|
211
|
+
with dc:
|
|
212
|
+
# record PID
|
|
213
|
+
go_ahead = True
|
|
214
|
+
try:
|
|
215
|
+
if options.pid: # pid files are no longer necessary in systemd
|
|
216
|
+
pidFile = open(options.pid, "x")
|
|
217
|
+
except FileExistsError:
|
|
218
|
+
print(f"{str(timeNow)} JediMaster: ERROR terminated since pid file {options.pid} already exists")
|
|
219
|
+
go_ahead = False
|
|
220
|
+
if go_ahead:
|
|
221
|
+
if options.pid: # pid files are no longer necessary in systemd
|
|
222
|
+
pidFile.write(f"{os.getpid()}")
|
|
223
|
+
pidFile.close()
|
|
224
|
+
|
|
225
|
+
# master
|
|
226
|
+
master = JediMaster()
|
|
227
|
+
|
|
228
|
+
# set handler
|
|
229
|
+
def catch_sig(sig, frame):
|
|
230
|
+
master.stop()
|
|
231
|
+
time.sleep(3)
|
|
232
|
+
kill_whole(sig, frame)
|
|
233
|
+
|
|
234
|
+
signal.signal(signal.SIGINT, catch_sig)
|
|
235
|
+
signal.signal(signal.SIGHUP, catch_sig)
|
|
236
|
+
signal.signal(signal.SIGTERM, catch_sig)
|
|
237
|
+
# start master
|
|
238
|
+
master.start()
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from pandacommon.pandalogger import logger_utils
|
|
2
|
+
from pandacommon.pandamsgbkr import msg_processor
|
|
3
|
+
|
|
4
|
+
from pandajedi.jediconfig import jedi_config
|
|
5
|
+
|
|
6
|
+
msg_processor.base_logger = logger_utils.setup_logger("JediMsgProcessor")
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# Main message processing agent
|
|
10
|
+
class MsgProcAgent(msg_processor.MsgProcAgentBase):
|
|
11
|
+
pass
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# launch
|
|
15
|
+
def launcher(stop_event):
|
|
16
|
+
tmp_log = logger_utils.make_logger(msg_processor.base_logger, method_name="launcher")
|
|
17
|
+
tmp_log.debug("start")
|
|
18
|
+
try:
|
|
19
|
+
config_file = jedi_config.msgprocessor.configFile
|
|
20
|
+
except Exception as e:
|
|
21
|
+
tmp_log.error(f"failed to read config json file; should not happen... {e.__class__.__name__}: {e}")
|
|
22
|
+
raise e
|
|
23
|
+
# start
|
|
24
|
+
agent = MsgProcAgent(config_file)
|
|
25
|
+
agent.start()
|
|
26
|
+
tmp_log.debug("started")
|
|
27
|
+
# wait for stop event
|
|
28
|
+
stop_event.wait()
|
|
29
|
+
# stop
|
|
30
|
+
tmp_log.debug("stopping")
|
|
31
|
+
agent.stop()
|
|
32
|
+
tmp_log.debug("stopped")
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from pandacommon.pandalogger.PandaLogger import PandaLogger
|
|
2
|
+
|
|
3
|
+
from pandajedi.jediconfig import jedi_config
|
|
4
|
+
from pandajedi.jedicore.FactoryBase import FactoryBase
|
|
5
|
+
|
|
6
|
+
logger = PandaLogger().getLogger(__name__.split(".")[-1])
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# factory class for job brokerage
|
|
10
|
+
class JobBroker(FactoryBase):
|
|
11
|
+
# constructor
|
|
12
|
+
def __init__(self, vo, sourceLabel):
|
|
13
|
+
FactoryBase.__init__(self, vo, sourceLabel, logger, jedi_config.jobbroker.modConfig)
|
|
14
|
+
|
|
15
|
+
# main
|
|
16
|
+
def doBrokerage(self, taskSpec, cloudName, inputChunk, taskParamMap):
|
|
17
|
+
return self.getImpl(taskSpec.vo, taskSpec.prodSourceLabel).doBrokerage(taskSpec, cloudName, inputChunk, taskParamMap)
|
|
18
|
+
|
|
19
|
+
# set live counter
|
|
20
|
+
def setLiveCounter(self, vo, sourceLabel, liveCounter):
|
|
21
|
+
self.getImpl(vo, sourceLabel).setLiveCounter(liveCounter)
|
|
22
|
+
|
|
23
|
+
# set lock ID
|
|
24
|
+
def setLockID(self, vo, sourceLabel, pid, tid):
|
|
25
|
+
self.getImpl(vo, sourceLabel).setLockID(pid, tid)
|
|
26
|
+
|
|
27
|
+
# get base lock ID
|
|
28
|
+
def getBaseLockID(self, vo, sourceLabel):
|
|
29
|
+
return self.getImpl(vo, sourceLabel).getBaseLockID()
|
|
30
|
+
|
|
31
|
+
# set test mode
|
|
32
|
+
def setTestMode(self, vo, sourceLabel):
|
|
33
|
+
self.getImpl(vo, sourceLabel).setTestMode()
|