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,531 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from collections import namedtuple
|
|
3
|
+
from dataclasses import MISSING, InitVar, asdict, dataclass, field
|
|
4
|
+
from datetime import datetime, timedelta
|
|
5
|
+
from typing import Any, Dict, List
|
|
6
|
+
|
|
7
|
+
# from pandacommon.pandalogger.PandaLogger import PandaLogger
|
|
8
|
+
from pandacommon.pandautils.base import SpecBase
|
|
9
|
+
|
|
10
|
+
from pandaserver.config import panda_config
|
|
11
|
+
|
|
12
|
+
# main logger
|
|
13
|
+
# logger = PandaLogger().getLogger(__name__.split(".")[-1])
|
|
14
|
+
|
|
15
|
+
# named tuple for attribute with type
|
|
16
|
+
AttributeWithType = namedtuple("AttributeWithType", ["attribute", "type"])
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# ==== Status of Entities ======================================
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class WorkflowStatus(object):
|
|
23
|
+
"""
|
|
24
|
+
Class to define the status of workflows
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
registered = "registered"
|
|
28
|
+
parsed = "parsed"
|
|
29
|
+
checking = "checking"
|
|
30
|
+
checked = "checked"
|
|
31
|
+
starting = "starting"
|
|
32
|
+
running = "running"
|
|
33
|
+
done = "done"
|
|
34
|
+
failed = "failed"
|
|
35
|
+
cancelled = "cancelled"
|
|
36
|
+
|
|
37
|
+
active_statuses = (registered, parsed, checking, checked, starting, running)
|
|
38
|
+
final_statuses = (done, failed, cancelled)
|
|
39
|
+
transient_statuses = (parsed, checking, checked, starting)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class WFStepStatus(object):
|
|
43
|
+
"""
|
|
44
|
+
Class to define the status of workflow steps
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
registered = "registered"
|
|
48
|
+
checking = "checking"
|
|
49
|
+
checked_true = "checked_true"
|
|
50
|
+
checked_false = "checked_false"
|
|
51
|
+
pending = "pending"
|
|
52
|
+
ready = "ready"
|
|
53
|
+
starting = "starting"
|
|
54
|
+
running = "running"
|
|
55
|
+
done = "done"
|
|
56
|
+
failed = "failed"
|
|
57
|
+
closed = "closed"
|
|
58
|
+
cancelled = "cancelled"
|
|
59
|
+
|
|
60
|
+
checked_statuses = (checked_true, checked_false)
|
|
61
|
+
to_advance_step_statuses = (registered, checking, checked_true, checked_false, pending, ready, starting)
|
|
62
|
+
after_starting_statuses = (running, done, failed, cancelled)
|
|
63
|
+
after_starting_uninterrupted_statuses = (running, done, failed)
|
|
64
|
+
after_running_statuses = (done, failed, cancelled)
|
|
65
|
+
final_statuses = (done, failed, closed, cancelled)
|
|
66
|
+
transient_statuses = (checked_true, checked_false, ready)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class WFDataStatus(object):
|
|
70
|
+
"""
|
|
71
|
+
Class to define the status of workflow data
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
registered = "registered"
|
|
75
|
+
checking = "checking"
|
|
76
|
+
checked_nonexist = "checked_nonexist" # data does not exist
|
|
77
|
+
checked_insuffi = "checked_insuffi" # data available but insufficient to be step input
|
|
78
|
+
checked_suffice = "checked_suffice" # data partially available and sufficient to be step input
|
|
79
|
+
checked_complete = "checked_complete" # data completely available
|
|
80
|
+
binding = "binding" # data being bound to a step to generate
|
|
81
|
+
generating_bound = "generating_bound"
|
|
82
|
+
generating_insuffi = "generating_insuffi"
|
|
83
|
+
generating_suffice = "generating_suffice"
|
|
84
|
+
waiting_insuffi = "waiting_insuffi"
|
|
85
|
+
waiting_suffice = "waiting_suffice"
|
|
86
|
+
done_generated = "done_generated"
|
|
87
|
+
done_waited = "done_waited"
|
|
88
|
+
done_skipped = "done_skipped"
|
|
89
|
+
cancelled = "cancelled"
|
|
90
|
+
retired = "retired"
|
|
91
|
+
|
|
92
|
+
checked_statuses = (checked_nonexist, checked_insuffi, checked_suffice, checked_complete)
|
|
93
|
+
generating_statuses = (generating_bound, generating_insuffi, generating_suffice)
|
|
94
|
+
waiting_statuses = (waiting_insuffi, waiting_suffice)
|
|
95
|
+
done_statuses = (done_generated, done_waited, done_skipped)
|
|
96
|
+
good_input_statuses = (generating_suffice, waiting_suffice, done_generated, done_waited, done_skipped)
|
|
97
|
+
good_output_statuses = (done_generated, done_waited, done_skipped)
|
|
98
|
+
after_generating_bound_statuses = (generating_suffice, done_generated, cancelled)
|
|
99
|
+
after_generating_suffice_statuses = (done_generated, cancelled)
|
|
100
|
+
after_waiting_suffice_statuses = (done_waited, cancelled)
|
|
101
|
+
terminated_statuses = (done_generated, done_waited, done_skipped, cancelled, retired)
|
|
102
|
+
nonreusable_statuses = (cancelled, retired)
|
|
103
|
+
transient_statuses = (checked_nonexist, checked_insuffi, checked_suffice, checked_complete)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
# ==== Types ===================================================
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class WFStepType(object):
|
|
110
|
+
"""
|
|
111
|
+
Class to define the types of workflow steps
|
|
112
|
+
"""
|
|
113
|
+
|
|
114
|
+
...
|
|
115
|
+
ordinary = "ordinary"
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
class WFDataType(object):
|
|
119
|
+
"""
|
|
120
|
+
Class to define the types of workflow data
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
input = "input"
|
|
124
|
+
output = "output"
|
|
125
|
+
mid = "mid"
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
# ==== Specifications ==========================================
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class WorkflowBaseSpec(SpecBase):
|
|
132
|
+
"""
|
|
133
|
+
Base class for workflow related specifications
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def parameter_map(self) -> dict:
|
|
138
|
+
"""
|
|
139
|
+
Get the dictionary parsed by the parameters attribute in JSON
|
|
140
|
+
Possible parameters:
|
|
141
|
+
...
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
dict : dict of parameters if it is JSON or empty dict if null
|
|
145
|
+
"""
|
|
146
|
+
if self.parameters is None:
|
|
147
|
+
return {}
|
|
148
|
+
else:
|
|
149
|
+
return json.loads(self.parameters)
|
|
150
|
+
|
|
151
|
+
@parameter_map.setter
|
|
152
|
+
def parameter_map(self, value_map: dict):
|
|
153
|
+
"""
|
|
154
|
+
Set the dictionary and store in parameters attribute in JSON
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
value_map (dict): dict to set the parameter map
|
|
158
|
+
"""
|
|
159
|
+
self.parameters = json.dumps(value_map)
|
|
160
|
+
|
|
161
|
+
def get_parameter(self, param: str) -> Any:
|
|
162
|
+
"""
|
|
163
|
+
Get the value of one parameter. None as default
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
param (str): parameter name
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
Any : value of the parameter; None if parameter not set
|
|
170
|
+
"""
|
|
171
|
+
tmp_dict = self.parameter_map
|
|
172
|
+
return tmp_dict.get(param)
|
|
173
|
+
|
|
174
|
+
def set_parameter(self, param: str, value):
|
|
175
|
+
"""
|
|
176
|
+
Set the value of one parameter and store in parameters attribute in JSON
|
|
177
|
+
|
|
178
|
+
Args:
|
|
179
|
+
param (str): parameter name
|
|
180
|
+
value (Any): value of the parameter to set; must be JSON-serializable
|
|
181
|
+
"""
|
|
182
|
+
tmp_dict = self.parameter_map
|
|
183
|
+
tmp_dict[param] = value
|
|
184
|
+
self.parameter_map = tmp_dict
|
|
185
|
+
|
|
186
|
+
def update_parameters(self, params: dict):
|
|
187
|
+
"""
|
|
188
|
+
Update values of parameters with a dict and store in parameters attribute in JSON
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
params (dict): dict of parameter names and values to set
|
|
192
|
+
"""
|
|
193
|
+
tmp_dict = self.parameter_map
|
|
194
|
+
tmp_dict.update(params)
|
|
195
|
+
self.parameter_map = tmp_dict
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
class WorkflowSpec(WorkflowBaseSpec):
|
|
199
|
+
"""
|
|
200
|
+
Workflow specification
|
|
201
|
+
"""
|
|
202
|
+
|
|
203
|
+
# attributes with types
|
|
204
|
+
attributes_with_types = (
|
|
205
|
+
AttributeWithType("workflow_id", int),
|
|
206
|
+
AttributeWithType("name", str),
|
|
207
|
+
AttributeWithType("parent_id", int),
|
|
208
|
+
AttributeWithType("loop_count", int),
|
|
209
|
+
AttributeWithType("status", str),
|
|
210
|
+
AttributeWithType("prodsourcelabel", str),
|
|
211
|
+
AttributeWithType("username", str),
|
|
212
|
+
AttributeWithType("creation_time", datetime),
|
|
213
|
+
AttributeWithType("start_time", datetime),
|
|
214
|
+
AttributeWithType("end_time", datetime),
|
|
215
|
+
AttributeWithType("modification_time", datetime),
|
|
216
|
+
AttributeWithType("check_time", datetime),
|
|
217
|
+
AttributeWithType("locked_by", str),
|
|
218
|
+
AttributeWithType("lock_time", datetime),
|
|
219
|
+
AttributeWithType("raw_request_json", str),
|
|
220
|
+
AttributeWithType("definition_json", str),
|
|
221
|
+
AttributeWithType("parameters", str),
|
|
222
|
+
)
|
|
223
|
+
# attributes
|
|
224
|
+
attributes = tuple([attr.attribute for attr in attributes_with_types])
|
|
225
|
+
# attributes which have 0 by default
|
|
226
|
+
_zeroAttrs = ()
|
|
227
|
+
# attributes to force update
|
|
228
|
+
_forceUpdateAttrs = ()
|
|
229
|
+
# mapping between sequence and attr
|
|
230
|
+
_seqAttrMap = {"workflow_id": f"{panda_config.schemaJEDI}.WORKFLOW_ID_SEQ.nextval"}
|
|
231
|
+
|
|
232
|
+
@property
|
|
233
|
+
def raw_request_json_map(self) -> dict:
|
|
234
|
+
"""
|
|
235
|
+
Get the dictionary parsed by raw_request_json attribute in JSON
|
|
236
|
+
|
|
237
|
+
Returns:
|
|
238
|
+
dict : dict of raw_request_json if it is JSON or empty dict if null
|
|
239
|
+
"""
|
|
240
|
+
if self.raw_request_json is None:
|
|
241
|
+
return {}
|
|
242
|
+
else:
|
|
243
|
+
return json.loads(self.raw_request_json)
|
|
244
|
+
|
|
245
|
+
@raw_request_json_map.setter
|
|
246
|
+
def raw_request_json_map(self, value_map: dict):
|
|
247
|
+
"""
|
|
248
|
+
Set the dictionary and store in raw_request_json attribute in JSON
|
|
249
|
+
|
|
250
|
+
Args:
|
|
251
|
+
value_map (dict): dict to set the raw_request_json map
|
|
252
|
+
"""
|
|
253
|
+
self.raw_request_json = json.dumps(value_map)
|
|
254
|
+
|
|
255
|
+
@property
|
|
256
|
+
def definition_json_map(self) -> dict:
|
|
257
|
+
"""
|
|
258
|
+
Get the dictionary parsed by definition_json attribute in JSON
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
dict : dict of definition_json if it is JSON or empty dict if null
|
|
262
|
+
"""
|
|
263
|
+
if self.definition_json is None:
|
|
264
|
+
return {}
|
|
265
|
+
else:
|
|
266
|
+
return json.loads(self.definition_json)
|
|
267
|
+
|
|
268
|
+
@definition_json_map.setter
|
|
269
|
+
def definition_json_map(self, value_map: dict):
|
|
270
|
+
"""
|
|
271
|
+
Set the dictionary and store in definition_json attribute in JSON
|
|
272
|
+
|
|
273
|
+
Args:
|
|
274
|
+
value_map (dict): dict to set the definition_json map
|
|
275
|
+
"""
|
|
276
|
+
self.definition_json = json.dumps(value_map)
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
class WFStepSpec(WorkflowBaseSpec):
|
|
280
|
+
"""
|
|
281
|
+
Workflow Step specification
|
|
282
|
+
"""
|
|
283
|
+
|
|
284
|
+
# attributes with types
|
|
285
|
+
attributes_with_types = (
|
|
286
|
+
AttributeWithType("step_id", int),
|
|
287
|
+
AttributeWithType("name", str),
|
|
288
|
+
AttributeWithType("workflow_id", int),
|
|
289
|
+
AttributeWithType("member_id", int),
|
|
290
|
+
AttributeWithType("type", str),
|
|
291
|
+
AttributeWithType("status", str),
|
|
292
|
+
AttributeWithType("flavor", str),
|
|
293
|
+
AttributeWithType("target_id", str),
|
|
294
|
+
AttributeWithType("creation_time", datetime),
|
|
295
|
+
AttributeWithType("start_time", datetime),
|
|
296
|
+
AttributeWithType("end_time", datetime),
|
|
297
|
+
AttributeWithType("modification_time", datetime),
|
|
298
|
+
AttributeWithType("check_time", datetime),
|
|
299
|
+
AttributeWithType("locked_by", str),
|
|
300
|
+
AttributeWithType("lock_time", datetime),
|
|
301
|
+
AttributeWithType("definition_json", str),
|
|
302
|
+
AttributeWithType("parameters", str),
|
|
303
|
+
)
|
|
304
|
+
# attributes
|
|
305
|
+
attributes = tuple([attr.attribute for attr in attributes_with_types])
|
|
306
|
+
# attributes which have 0 by default
|
|
307
|
+
_zeroAttrs = ()
|
|
308
|
+
# attributes to force update
|
|
309
|
+
_forceUpdateAttrs = ()
|
|
310
|
+
# mapping between sequence and attr
|
|
311
|
+
_seqAttrMap = {"step_id": f"{panda_config.schemaJEDI}.WORKFLOW_STEP_ID_SEQ.nextval"}
|
|
312
|
+
|
|
313
|
+
@property
|
|
314
|
+
def definition_json_map(self) -> dict:
|
|
315
|
+
"""
|
|
316
|
+
Get the dictionary parsed by definition_json attribute in JSON
|
|
317
|
+
|
|
318
|
+
Returns:
|
|
319
|
+
dict : dict of definition_json if it is JSON or empty dict if null
|
|
320
|
+
"""
|
|
321
|
+
if self.definition_json is None:
|
|
322
|
+
return {}
|
|
323
|
+
else:
|
|
324
|
+
return json.loads(self.definition_json)
|
|
325
|
+
|
|
326
|
+
@definition_json_map.setter
|
|
327
|
+
def definition_json_map(self, value_map: dict):
|
|
328
|
+
"""
|
|
329
|
+
Set the dictionary and store in definition_json attribute in JSON
|
|
330
|
+
|
|
331
|
+
Args:
|
|
332
|
+
value_map (dict): dict to set the definition_json map
|
|
333
|
+
"""
|
|
334
|
+
self.definition_json = json.dumps(value_map)
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
class WFDataSpec(WorkflowBaseSpec):
|
|
338
|
+
"""
|
|
339
|
+
Workflow Data specification
|
|
340
|
+
"""
|
|
341
|
+
|
|
342
|
+
# attributes with types
|
|
343
|
+
attributes_with_types = (
|
|
344
|
+
AttributeWithType("data_id", int),
|
|
345
|
+
AttributeWithType("name", str),
|
|
346
|
+
AttributeWithType("workflow_id", int),
|
|
347
|
+
AttributeWithType("source_step_id", int),
|
|
348
|
+
AttributeWithType("type", str),
|
|
349
|
+
AttributeWithType("status", str),
|
|
350
|
+
AttributeWithType("flavor", str),
|
|
351
|
+
AttributeWithType("target_id", str),
|
|
352
|
+
AttributeWithType("creation_time", datetime),
|
|
353
|
+
AttributeWithType("start_time", datetime),
|
|
354
|
+
AttributeWithType("end_time", datetime),
|
|
355
|
+
AttributeWithType("modification_time", datetime),
|
|
356
|
+
AttributeWithType("check_time", datetime),
|
|
357
|
+
AttributeWithType("locked_by", str),
|
|
358
|
+
AttributeWithType("lock_time", datetime),
|
|
359
|
+
AttributeWithType("metadata", str),
|
|
360
|
+
AttributeWithType("parameters", str),
|
|
361
|
+
)
|
|
362
|
+
# attributes
|
|
363
|
+
attributes = tuple([attr.attribute for attr in attributes_with_types])
|
|
364
|
+
# attributes which have 0 by default
|
|
365
|
+
_zeroAttrs = ()
|
|
366
|
+
# attributes to force update
|
|
367
|
+
_forceUpdateAttrs = ()
|
|
368
|
+
# mapping between sequence and attr
|
|
369
|
+
_seqAttrMap = {"data_id": f"{panda_config.schemaJEDI}.WORKFLOW_DATA_ID_SEQ.nextval"}
|
|
370
|
+
|
|
371
|
+
@property
|
|
372
|
+
def metadata_map(self) -> dict:
|
|
373
|
+
"""
|
|
374
|
+
Get the dictionary parsed by metadata attribute in JSON
|
|
375
|
+
|
|
376
|
+
Returns:
|
|
377
|
+
dict : dict of metadata if it is JSON or empty dict if null
|
|
378
|
+
"""
|
|
379
|
+
if self.metadata is None:
|
|
380
|
+
return {}
|
|
381
|
+
else:
|
|
382
|
+
return json.loads(self.metadata)
|
|
383
|
+
|
|
384
|
+
@metadata_map.setter
|
|
385
|
+
def metadata_map(self, value_map: dict):
|
|
386
|
+
"""
|
|
387
|
+
Set the dictionary and store in metadata attribute in JSON
|
|
388
|
+
|
|
389
|
+
Args:
|
|
390
|
+
value_map (dict): dict to set the metadata map
|
|
391
|
+
"""
|
|
392
|
+
self.metadata = json.dumps(value_map)
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
# === Return objects of core methods which process status ======
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
@dataclass(slots=True)
|
|
399
|
+
class WFDataProcessResult:
|
|
400
|
+
"""
|
|
401
|
+
Result of processing data.
|
|
402
|
+
|
|
403
|
+
Fields:
|
|
404
|
+
success (bool | None): Indicates if the processing was successful.
|
|
405
|
+
new_status (WFDataStatus | None): The new status of the data after processing, None if no change.
|
|
406
|
+
message (str): A message providing additional information about the processing result.
|
|
407
|
+
"""
|
|
408
|
+
|
|
409
|
+
success: bool | None = None
|
|
410
|
+
new_status: WFDataStatus | None = None
|
|
411
|
+
message: str = ""
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
@dataclass(slots=True)
|
|
415
|
+
class WFStepProcessResult:
|
|
416
|
+
"""
|
|
417
|
+
Result of processing a step.
|
|
418
|
+
|
|
419
|
+
Fields:
|
|
420
|
+
success (bool | None): Indicates if the processing was successful.
|
|
421
|
+
new_status (WFStepStatus | None): The new status of the step after processing, None if no change.
|
|
422
|
+
message (str): A message providing additional information about the processing result.
|
|
423
|
+
"""
|
|
424
|
+
|
|
425
|
+
success: bool | None = None
|
|
426
|
+
new_status: WFStepStatus | None = None
|
|
427
|
+
message: str = ""
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
@dataclass(slots=True)
|
|
431
|
+
class WorkflowProcessResult:
|
|
432
|
+
"""
|
|
433
|
+
Result of processing a workflow.
|
|
434
|
+
|
|
435
|
+
Fields:
|
|
436
|
+
success (bool | None): Indicates if the processing was successful.
|
|
437
|
+
new_status (WorkflowStatus | None): The new status of the workflow after processing, None if no change.
|
|
438
|
+
message (str): A message providing additional information about the processing result.
|
|
439
|
+
"""
|
|
440
|
+
|
|
441
|
+
success: bool | None = None
|
|
442
|
+
new_status: WorkflowStatus | None = None
|
|
443
|
+
message: str = ""
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
# === Return objects of step handler methods ===================
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
@dataclass(slots=True)
|
|
450
|
+
class WFStepTargetSubmitResult:
|
|
451
|
+
"""
|
|
452
|
+
Result of submitting a target of a step.
|
|
453
|
+
|
|
454
|
+
Fields:
|
|
455
|
+
success (bool | None): Indicates if the submission was successful.
|
|
456
|
+
target_id (str | None): The ID of the submitted target (e.g., task ID).
|
|
457
|
+
message (str): A message providing additional information about the submission result.
|
|
458
|
+
"""
|
|
459
|
+
|
|
460
|
+
success: bool | None = None
|
|
461
|
+
target_id: str | None = None
|
|
462
|
+
message: str = ""
|
|
463
|
+
|
|
464
|
+
|
|
465
|
+
@dataclass(slots=True)
|
|
466
|
+
class WFStepTargetCheckResult:
|
|
467
|
+
"""
|
|
468
|
+
Result of checking the status of a submitted target.
|
|
469
|
+
|
|
470
|
+
Fields:
|
|
471
|
+
success (bool | None): Indicates if the status check was successful.
|
|
472
|
+
status (WFStepStatus | None): The status of the step to move to.
|
|
473
|
+
native_status (str | None): The native status string from the target system.
|
|
474
|
+
message (str): A message providing additional information about the status check result.
|
|
475
|
+
"""
|
|
476
|
+
|
|
477
|
+
success: bool | None = None
|
|
478
|
+
step_status: WFStepStatus | None = None
|
|
479
|
+
native_status: str | None = None
|
|
480
|
+
message: str = ""
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
@dataclass(slots=True)
|
|
484
|
+
class WFStepTargetCancelResult:
|
|
485
|
+
"""
|
|
486
|
+
Result of cancelling a target of a step.
|
|
487
|
+
|
|
488
|
+
Fields:
|
|
489
|
+
success (bool | None): Indicates if the cancellation was successful.
|
|
490
|
+
target_id (str | None): The ID of the cancelled target (e.g., task ID).
|
|
491
|
+
message (str): A message providing additional information about the cancellation result.
|
|
492
|
+
"""
|
|
493
|
+
|
|
494
|
+
success: bool | None = None
|
|
495
|
+
target_id: str | None = None
|
|
496
|
+
message: str = ""
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
# ==== Return objects of data handler methods ==================
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
class WFDataTargetCheckStatus:
|
|
503
|
+
"""
|
|
504
|
+
Possible statuses returned by data target check
|
|
505
|
+
"""
|
|
506
|
+
|
|
507
|
+
complete = "complete" # data completely exists
|
|
508
|
+
suffice = "suffice" # data partially exists and suffices to be step input
|
|
509
|
+
insuffi = "insuffi" # data partially exists but is insufficient to be step input
|
|
510
|
+
nonexist = "nonexist" # data does not exist
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
@dataclass(slots=True)
|
|
514
|
+
class WFDataTargetCheckResult:
|
|
515
|
+
"""
|
|
516
|
+
Result of checking the status of a data target.
|
|
517
|
+
|
|
518
|
+
Fields:
|
|
519
|
+
success (bool | None): Indicates if the status check was successful.
|
|
520
|
+
check_status (WFDataTargetCheckStatus | None): The status of the data target.
|
|
521
|
+
metadata (dict | None): The native metadata from the target system.
|
|
522
|
+
message (str): A message providing additional information about the status check result.
|
|
523
|
+
"""
|
|
524
|
+
|
|
525
|
+
success: bool | None = None
|
|
526
|
+
check_status: WFDataTargetCheckStatus | None = None
|
|
527
|
+
metadata: dict | None = None
|
|
528
|
+
message: str = ""
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
# ==============================================================
|