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,175 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Resource type specification for JEDI
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from . import JobUtils
|
|
7
|
+
|
|
8
|
+
HIMEM_THRESHOLD = 2000 # MB per core
|
|
9
|
+
BASIC_RESOURCE_TYPE = "SCORE"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ResourceSpecMapper(object):
|
|
13
|
+
def __init__(self, resource_types):
|
|
14
|
+
"""
|
|
15
|
+
:param resource_types: list of ResourceSpec objects
|
|
16
|
+
"""
|
|
17
|
+
self.resource_types = resource_types
|
|
18
|
+
|
|
19
|
+
def is_single_core(self, resource_name):
|
|
20
|
+
for resource_type in self.resource_types:
|
|
21
|
+
if resource_type.resource_name == resource_name:
|
|
22
|
+
return resource_type.is_single_core()
|
|
23
|
+
return False
|
|
24
|
+
|
|
25
|
+
def is_multi_core(self, resource_name):
|
|
26
|
+
for resource_type in self.resource_types:
|
|
27
|
+
if resource_type.resource_name == resource_name:
|
|
28
|
+
return resource_type.is_multi_core()
|
|
29
|
+
return False
|
|
30
|
+
|
|
31
|
+
def is_high_memory(self, resource_name, memory_threshold=HIMEM_THRESHOLD):
|
|
32
|
+
for resource_type in self.resource_types:
|
|
33
|
+
if resource_type.resource_name == resource_name:
|
|
34
|
+
if resource_type.maxrampercore is None or resource_type.maxrampercore > memory_threshold:
|
|
35
|
+
return True
|
|
36
|
+
return False
|
|
37
|
+
|
|
38
|
+
def translate_resourcetype_to_cores(self, resource_name, cores_queue):
|
|
39
|
+
# if the resource type is multi-core, return the number of cores in the queue
|
|
40
|
+
if self.is_multi_core(resource_name):
|
|
41
|
+
return cores_queue
|
|
42
|
+
|
|
43
|
+
return 1
|
|
44
|
+
|
|
45
|
+
def filter_out_high_memory_resourcetypes(self, memory_threshold=HIMEM_THRESHOLD):
|
|
46
|
+
resource_names = list(
|
|
47
|
+
map(
|
|
48
|
+
lambda resource_type: resource_type.resource_name,
|
|
49
|
+
filter(lambda resource_type: not self.is_high_memory(resource_type.resource_name, memory_threshold=memory_threshold), self.resource_types),
|
|
50
|
+
)
|
|
51
|
+
)
|
|
52
|
+
return resource_names
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class ResourceSpec(object):
|
|
56
|
+
# attributes
|
|
57
|
+
attributes = (
|
|
58
|
+
"resource_name",
|
|
59
|
+
"mincore",
|
|
60
|
+
"maxcore",
|
|
61
|
+
"minrampercore",
|
|
62
|
+
"maxrampercore",
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
def __init__(self, resource_name, mincore, maxcore, minrampercore, maxrampercore):
|
|
66
|
+
object.__setattr__(self, "resource_name", resource_name)
|
|
67
|
+
object.__setattr__(self, "mincore", mincore)
|
|
68
|
+
object.__setattr__(self, "maxcore", maxcore)
|
|
69
|
+
object.__setattr__(self, "minrampercore", minrampercore)
|
|
70
|
+
object.__setattr__(self, "maxrampercore", maxrampercore)
|
|
71
|
+
|
|
72
|
+
def match_task(self, task_spec):
|
|
73
|
+
return self.match_task_basic(
|
|
74
|
+
task_spec.coreCount,
|
|
75
|
+
task_spec.ramCount,
|
|
76
|
+
task_spec.baseRamCount,
|
|
77
|
+
task_spec.ramUnit,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
def match_task_basic(self, corecount, ramcount, base_ramcount, ram_unit):
|
|
81
|
+
# Default parameters
|
|
82
|
+
if corecount is None: # corecount None is also used for 1
|
|
83
|
+
corecount = 1
|
|
84
|
+
elif corecount == 0: # corecount 0 means it can be anything. We will use 8 as a standard MCORE default
|
|
85
|
+
corecount = 8
|
|
86
|
+
|
|
87
|
+
if ramcount is None:
|
|
88
|
+
ramcount = 0
|
|
89
|
+
|
|
90
|
+
if base_ramcount is None:
|
|
91
|
+
base_ramcount = 0
|
|
92
|
+
|
|
93
|
+
# check min cores
|
|
94
|
+
if self.mincore is not None and corecount < self.mincore:
|
|
95
|
+
return False
|
|
96
|
+
|
|
97
|
+
# check max cores
|
|
98
|
+
if self.maxcore is not None and corecount > self.maxcore:
|
|
99
|
+
return False
|
|
100
|
+
|
|
101
|
+
if ram_unit in ("MBPerCore", "MBPerCoreFixed"):
|
|
102
|
+
ram_per_core = (ramcount * corecount + base_ramcount) / corecount
|
|
103
|
+
else:
|
|
104
|
+
ram_per_core = (ramcount + base_ramcount) / corecount
|
|
105
|
+
ram_per_core = JobUtils.compensate_ram_count(ram_per_core)
|
|
106
|
+
|
|
107
|
+
# check min ram
|
|
108
|
+
if self.minrampercore is not None and ram_per_core < self.minrampercore:
|
|
109
|
+
return False
|
|
110
|
+
|
|
111
|
+
# check max ram
|
|
112
|
+
if self.maxrampercore is not None and ram_per_core > self.maxrampercore:
|
|
113
|
+
return False
|
|
114
|
+
|
|
115
|
+
return True
|
|
116
|
+
|
|
117
|
+
def match_job(self, job_spec):
|
|
118
|
+
# Default parameters
|
|
119
|
+
if job_spec.coreCount in (None, "NULL"): # corecount None is also used for 1
|
|
120
|
+
corecount = 1
|
|
121
|
+
elif job_spec.coreCount == 0: # corecount 0 means it can be anything. We will use 8 as a standard MCORE default
|
|
122
|
+
corecount = 8
|
|
123
|
+
else:
|
|
124
|
+
corecount = job_spec.coreCount
|
|
125
|
+
|
|
126
|
+
if job_spec.minRamCount in (
|
|
127
|
+
None,
|
|
128
|
+
"NULL",
|
|
129
|
+
): # jobs come with ram already pre-calculated and in MB
|
|
130
|
+
ramcount = 0
|
|
131
|
+
else:
|
|
132
|
+
ramcount = job_spec.minRamCount
|
|
133
|
+
|
|
134
|
+
# check min cores
|
|
135
|
+
if self.mincore is not None and corecount < self.mincore:
|
|
136
|
+
return False
|
|
137
|
+
|
|
138
|
+
# check max cores
|
|
139
|
+
if self.maxcore is not None and corecount > self.maxcore:
|
|
140
|
+
return False
|
|
141
|
+
|
|
142
|
+
# We assume ram unit is always MB
|
|
143
|
+
ram_per_core = round(ramcount / corecount)
|
|
144
|
+
# check min ram
|
|
145
|
+
if self.minrampercore is not None and ram_per_core < self.minrampercore:
|
|
146
|
+
return False
|
|
147
|
+
|
|
148
|
+
# check max ram
|
|
149
|
+
if self.maxrampercore is not None and ram_per_core > self.maxrampercore:
|
|
150
|
+
return False
|
|
151
|
+
|
|
152
|
+
return True
|
|
153
|
+
|
|
154
|
+
def is_single_core(self):
|
|
155
|
+
if self.mincore is not None and self.mincore == 1 and self.maxcore is not None and self.maxcore == 1:
|
|
156
|
+
return True
|
|
157
|
+
return False
|
|
158
|
+
|
|
159
|
+
def is_multi_core(self):
|
|
160
|
+
if self.mincore is not None and self.mincore > 1:
|
|
161
|
+
return True
|
|
162
|
+
|
|
163
|
+
def column_names(cls, prefix=None):
|
|
164
|
+
"""
|
|
165
|
+
return column names for DB interactions
|
|
166
|
+
"""
|
|
167
|
+
ret = ""
|
|
168
|
+
for attr in cls.attributes:
|
|
169
|
+
if prefix is not None:
|
|
170
|
+
ret += f"{prefix}."
|
|
171
|
+
ret += f"{attr},"
|
|
172
|
+
ret = ret[:-1]
|
|
173
|
+
return ret
|
|
174
|
+
|
|
175
|
+
column_names = classmethod(column_names)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from pandacommon.pandalogger.PandaLogger import PandaLogger
|
|
2
|
+
|
|
3
|
+
# logger
|
|
4
|
+
_logger = PandaLogger().getLogger("SQLDumper")
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SQLDumper(object):
|
|
8
|
+
def __init__(self, cur):
|
|
9
|
+
self.cursor = cur
|
|
10
|
+
|
|
11
|
+
def __iter__(self):
|
|
12
|
+
return self.cursor.__iter__()
|
|
13
|
+
|
|
14
|
+
def next(self):
|
|
15
|
+
return self.cursor.next()
|
|
16
|
+
|
|
17
|
+
def my_execute(self, sql, var=None):
|
|
18
|
+
if var is None:
|
|
19
|
+
var = {}
|
|
20
|
+
_logger.debug(f"SQL={sql} var={str(var)}")
|
|
21
|
+
return self.cursor.execute(sql, var)
|
|
22
|
+
|
|
23
|
+
def my_executemany(self, sql, vars=None):
|
|
24
|
+
if vars is None:
|
|
25
|
+
vars = []
|
|
26
|
+
_logger.debug(f"SQL_many={sql} var_many={str(vars)}")
|
|
27
|
+
return self.cursor.executemany(sql, vars)
|
|
28
|
+
|
|
29
|
+
def __getattribute__(self, name):
|
|
30
|
+
if name == "execute":
|
|
31
|
+
return object.__getattribute__(self, "my_execute")
|
|
32
|
+
elif name == "executemany":
|
|
33
|
+
return object.__getattribute__(self, "my_executemany")
|
|
34
|
+
elif name in ["cursor", "__iter__", "next"]:
|
|
35
|
+
return object.__getattribute__(self, name)
|
|
36
|
+
else:
|
|
37
|
+
return getattr(self.cursor, name)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
class SQLQueryManager:
|
|
2
|
+
def __init__(self, sql_query):
|
|
3
|
+
self.sql_query = sql_query
|
|
4
|
+
|
|
5
|
+
def format_query(self):
|
|
6
|
+
"""Format the SQL query by removing line breaks and redundant spaces."""
|
|
7
|
+
# Replace newline characters with a single space
|
|
8
|
+
formatted_query = self.sql_query.replace('\n', ' ')
|
|
9
|
+
# Remove redundant spaces (more than one space in a row)
|
|
10
|
+
formatted_query = ' '.join(formatted_query.split())
|
|
11
|
+
return formatted_query
|
|
12
|
+
|
|
13
|
+
def set_query(self, sql_query):
|
|
14
|
+
"""Set a new SQL query."""
|
|
15
|
+
self.sql_query = sql_query
|
|
16
|
+
|
|
17
|
+
def get_query(self):
|
|
18
|
+
"""Get the current SQL query."""
|
|
19
|
+
return self.sql_query
|
|
20
|
+
|
|
21
|
+
def log_query(self):
|
|
22
|
+
"""Log the formatted SQL query."""
|
|
23
|
+
formatted_query = self.format_query()
|
|
24
|
+
print(f"SQL Query: {formatted_query}")
|
|
25
|
+
|
|
26
|
+
def append(self, sql_text):
|
|
27
|
+
"""Append more text to the existing SQL query."""
|
|
28
|
+
self.sql_query += ' ' + sql_text
|
|
29
|
+
|
|
30
|
+
def __str__(self):
|
|
31
|
+
"""Custom string representation of the SQLQueryManager instance."""
|
|
32
|
+
return self.format_query()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
# Example usage:
|
|
36
|
+
if __name__ == "__main__":
|
|
37
|
+
# Initialize the SQLQueryManager with an SQL query
|
|
38
|
+
sql_manager = SQLQueryManager("""
|
|
39
|
+
SELECT *
|
|
40
|
+
FROM your_table
|
|
41
|
+
WHERE condition = 'something'
|
|
42
|
+
ORDER BY column_name
|
|
43
|
+
""")
|
|
44
|
+
|
|
45
|
+
# Log the SQL query
|
|
46
|
+
print(sql_manager) # This will print the formatted SQL query
|
|
47
|
+
|
|
48
|
+
# Change the SQL query
|
|
49
|
+
new_query = """
|
|
50
|
+
SELECT id, name
|
|
51
|
+
FROM another_table
|
|
52
|
+
WHERE condition = 'another condition'
|
|
53
|
+
"""
|
|
54
|
+
sql_manager.set_query(new_query)
|
|
55
|
+
sql_manager.append("""
|
|
56
|
+
AND condition2 = 'more conditions'
|
|
57
|
+
""")
|
|
58
|
+
|
|
59
|
+
# Log the updated SQL query
|
|
60
|
+
print(sql_manager) # This will print the updated formatted SQL query
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"""
|
|
2
|
+
site specification
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import re
|
|
7
|
+
|
|
8
|
+
catchall_keys = {
|
|
9
|
+
k: k
|
|
10
|
+
for k in [
|
|
11
|
+
"useJumboJobs",
|
|
12
|
+
"gpu",
|
|
13
|
+
"grandly_unified",
|
|
14
|
+
"nSimEvents",
|
|
15
|
+
"minEventsForJumbo",
|
|
16
|
+
"maxDiskPerCore",
|
|
17
|
+
"use_only_local_data",
|
|
18
|
+
"disableReassign",
|
|
19
|
+
"jobChunkSize",
|
|
20
|
+
"bareNucleus",
|
|
21
|
+
"secondaryNucleus",
|
|
22
|
+
"allowed_processing",
|
|
23
|
+
"excluded_processing",
|
|
24
|
+
"per_core_attr",
|
|
25
|
+
"allow_no_pilot",
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class SiteSpec(object):
|
|
31
|
+
# attributes
|
|
32
|
+
_attributes = (
|
|
33
|
+
"sitename",
|
|
34
|
+
"nickname",
|
|
35
|
+
"dq2url",
|
|
36
|
+
"cloud",
|
|
37
|
+
"ddm",
|
|
38
|
+
"ddm_input",
|
|
39
|
+
"ddm_output",
|
|
40
|
+
"type",
|
|
41
|
+
"releases",
|
|
42
|
+
"memory",
|
|
43
|
+
"maxtime",
|
|
44
|
+
"status",
|
|
45
|
+
"setokens_input",
|
|
46
|
+
"setokens_output",
|
|
47
|
+
"defaulttoken",
|
|
48
|
+
"validatedreleases",
|
|
49
|
+
"maxinputsize",
|
|
50
|
+
"comment",
|
|
51
|
+
"statusmodtime",
|
|
52
|
+
"pledgedCPU",
|
|
53
|
+
"coreCount",
|
|
54
|
+
"reliabilityLevel",
|
|
55
|
+
"iscvmfs",
|
|
56
|
+
"transferringlimit",
|
|
57
|
+
"maxwdir",
|
|
58
|
+
"fairsharePolicy",
|
|
59
|
+
"mintime",
|
|
60
|
+
"allowfax",
|
|
61
|
+
"pandasite",
|
|
62
|
+
"corepower",
|
|
63
|
+
"wnconnectivity",
|
|
64
|
+
"catchall",
|
|
65
|
+
"role",
|
|
66
|
+
"pandasite_state",
|
|
67
|
+
"ddm_endpoints_input",
|
|
68
|
+
"ddm_endpoints_output",
|
|
69
|
+
"maxrss",
|
|
70
|
+
"minrss",
|
|
71
|
+
"direct_access_lan",
|
|
72
|
+
"direct_access_wan",
|
|
73
|
+
"tier",
|
|
74
|
+
"objectstores",
|
|
75
|
+
"is_unified",
|
|
76
|
+
"unified_name",
|
|
77
|
+
"jobseed",
|
|
78
|
+
"capability",
|
|
79
|
+
"num_slots_map",
|
|
80
|
+
"workflow",
|
|
81
|
+
"maxDiskio",
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# constructor
|
|
85
|
+
def __init__(self):
|
|
86
|
+
# install attributes
|
|
87
|
+
for attr in self._attributes:
|
|
88
|
+
setattr(self, attr, None)
|
|
89
|
+
|
|
90
|
+
# serialize
|
|
91
|
+
def __str__(self):
|
|
92
|
+
str = ""
|
|
93
|
+
for attr in self._attributes:
|
|
94
|
+
str += f"{attr}:{getattr(self, attr)} "
|
|
95
|
+
return str
|
|
96
|
+
|
|
97
|
+
# check if direct IO is used when tasks allow it
|
|
98
|
+
def isDirectIO(self):
|
|
99
|
+
if self.direct_access_lan is True:
|
|
100
|
+
return True
|
|
101
|
+
return False
|
|
102
|
+
|
|
103
|
+
# check what type of jobs are allowed
|
|
104
|
+
def getJobSeed(self):
|
|
105
|
+
tmpVal = self.jobseed
|
|
106
|
+
if tmpVal is None:
|
|
107
|
+
return "std"
|
|
108
|
+
return tmpVal
|
|
109
|
+
|
|
110
|
+
# get value from catchall
|
|
111
|
+
def getValueFromCatchall(self, key):
|
|
112
|
+
if self.catchall is None:
|
|
113
|
+
return None
|
|
114
|
+
if key not in catchall_keys:
|
|
115
|
+
return None
|
|
116
|
+
key = catchall_keys[key]
|
|
117
|
+
for tmpItem in self.catchall.split(","):
|
|
118
|
+
tmpMatch = re.search(f"^{key}=(.+)", tmpItem)
|
|
119
|
+
if tmpMatch is not None:
|
|
120
|
+
return tmpMatch.group(1)
|
|
121
|
+
return None
|
|
122
|
+
|
|
123
|
+
# has value in catchall
|
|
124
|
+
def hasValueInCatchall(self, key):
|
|
125
|
+
if self.catchall is None:
|
|
126
|
+
return False
|
|
127
|
+
if key not in catchall_keys:
|
|
128
|
+
return False
|
|
129
|
+
key = catchall_keys[key]
|
|
130
|
+
for tmpItem in self.catchall.split(","):
|
|
131
|
+
tmpMatch = re.search(f"^{key}(=|)*", tmpItem)
|
|
132
|
+
if tmpMatch is not None:
|
|
133
|
+
return True
|
|
134
|
+
return False
|
|
135
|
+
|
|
136
|
+
# allow WAN input access
|
|
137
|
+
def allowWanInputAccess(self):
|
|
138
|
+
return self.direct_access_lan is True and self.direct_access_wan is True
|
|
139
|
+
|
|
140
|
+
# use jumbo jobs
|
|
141
|
+
def useJumboJobs(self):
|
|
142
|
+
return self.hasValueInCatchall("useJumboJobs")
|
|
143
|
+
|
|
144
|
+
# GPU
|
|
145
|
+
def isGPU(self):
|
|
146
|
+
return self.hasValueInCatchall("gpu")
|
|
147
|
+
|
|
148
|
+
def is_grandly_unified(self):
|
|
149
|
+
if self.hasValueInCatchall("grandly_unified") or self.type == "unified":
|
|
150
|
+
return True
|
|
151
|
+
return False
|
|
152
|
+
|
|
153
|
+
def runs_production(self):
|
|
154
|
+
if self.type == "production" or self.is_grandly_unified():
|
|
155
|
+
return True
|
|
156
|
+
return False
|
|
157
|
+
|
|
158
|
+
def runs_analysis(self):
|
|
159
|
+
if self.type == "analysis" or self.is_grandly_unified():
|
|
160
|
+
return True
|
|
161
|
+
return False
|
|
162
|
+
|
|
163
|
+
# get unified name
|
|
164
|
+
def get_unified_name(self):
|
|
165
|
+
if self.unified_name is None:
|
|
166
|
+
return self.sitename
|
|
167
|
+
return self.unified_name
|
|
168
|
+
|
|
169
|
+
# get number of simulated events for dynamic number of events
|
|
170
|
+
def get_n_sim_events(self):
|
|
171
|
+
tmpVal = self.getValueFromCatchall("nSimEvents")
|
|
172
|
+
if tmpVal is None:
|
|
173
|
+
return None
|
|
174
|
+
return int(tmpVal)
|
|
175
|
+
|
|
176
|
+
# get minimum of remaining events for jumbo jobs
|
|
177
|
+
def getMinEventsForJumbo(self):
|
|
178
|
+
tmpVal = self.getValueFromCatchall("minEventsForJumbo")
|
|
179
|
+
if tmpVal is None:
|
|
180
|
+
return None
|
|
181
|
+
return int(tmpVal)
|
|
182
|
+
|
|
183
|
+
# check if opportunistic
|
|
184
|
+
def is_opportunistic(self):
|
|
185
|
+
return self.pledgedCPU == -1
|
|
186
|
+
|
|
187
|
+
# get number of jobs for standby
|
|
188
|
+
def getNumStandby(self, sw_id, resource_type):
|
|
189
|
+
numMap = self.num_slots_map
|
|
190
|
+
# neither gshare or workqueue is definied
|
|
191
|
+
if sw_id not in numMap:
|
|
192
|
+
if None in numMap:
|
|
193
|
+
sw_id = None
|
|
194
|
+
else:
|
|
195
|
+
return None
|
|
196
|
+
# give the total if resource type is undefined
|
|
197
|
+
if resource_type is None:
|
|
198
|
+
return sum(numMap[sw_id].values())
|
|
199
|
+
# give the number for the resource type
|
|
200
|
+
if resource_type in numMap[sw_id]:
|
|
201
|
+
return numMap[sw_id][resource_type]
|
|
202
|
+
elif None in numMap[sw_id]:
|
|
203
|
+
return numMap[sw_id][None]
|
|
204
|
+
return None
|
|
205
|
+
|
|
206
|
+
# get max disk per core
|
|
207
|
+
def get_max_disk_per_core(self):
|
|
208
|
+
tmpVal = self.getValueFromCatchall("maxDiskPerCore")
|
|
209
|
+
try:
|
|
210
|
+
return int(tmpVal)
|
|
211
|
+
except Exception:
|
|
212
|
+
pass
|
|
213
|
+
return None
|
|
214
|
+
|
|
215
|
+
# use local data only
|
|
216
|
+
def use_only_local_data(self):
|
|
217
|
+
return self.hasValueInCatchall("use_only_local_data")
|
|
218
|
+
|
|
219
|
+
# check if use VP
|
|
220
|
+
def use_vp(self, scope):
|
|
221
|
+
# use default scope if missing
|
|
222
|
+
if scope not in self.ddm_endpoints_input:
|
|
223
|
+
scope = "default"
|
|
224
|
+
# check if VP_DISK is associated
|
|
225
|
+
if scope in self.ddm_endpoints_input and [i for i in self.ddm_endpoints_input[scope].getAllEndPoints() if i.endswith("_VP_DISK")]:
|
|
226
|
+
return True
|
|
227
|
+
return False
|
|
228
|
+
|
|
229
|
+
# check if always uses direct IO
|
|
230
|
+
def always_use_direct_io(self):
|
|
231
|
+
return self.maxinputsize == -1
|
|
232
|
+
|
|
233
|
+
# disable reassign
|
|
234
|
+
def disable_reassign(self):
|
|
235
|
+
if self.hasValueInCatchall("disableReassign"):
|
|
236
|
+
return True
|
|
237
|
+
self.status == "paused"
|
|
238
|
+
|
|
239
|
+
# get job chunk size
|
|
240
|
+
def get_job_chunk_size(self):
|
|
241
|
+
try:
|
|
242
|
+
return int(self.getValueFromCatchall("jobChunkSize"))
|
|
243
|
+
except Exception:
|
|
244
|
+
return None
|
|
245
|
+
|
|
246
|
+
# get WN connectivity
|
|
247
|
+
def get_wn_connectivity(self):
|
|
248
|
+
if self.wnconnectivity is None:
|
|
249
|
+
return None
|
|
250
|
+
items = self.wnconnectivity.split("#")
|
|
251
|
+
if not items or not items[0]:
|
|
252
|
+
return None
|
|
253
|
+
else:
|
|
254
|
+
return items[0]
|
|
255
|
+
|
|
256
|
+
# get IP stack
|
|
257
|
+
def get_ipstack(self):
|
|
258
|
+
if self.wnconnectivity is None:
|
|
259
|
+
return None
|
|
260
|
+
items = self.wnconnectivity.split("#")
|
|
261
|
+
if len(items) == 2 and items[-1]:
|
|
262
|
+
return items[-1]
|
|
263
|
+
else:
|
|
264
|
+
return None
|
|
265
|
+
|
|
266
|
+
# get bare nucleus mode
|
|
267
|
+
def bare_nucleus_mode(self):
|
|
268
|
+
mode = self.getValueFromCatchall("bareNucleus")
|
|
269
|
+
if mode in ["only", "allow"]:
|
|
270
|
+
return mode
|
|
271
|
+
return None
|
|
272
|
+
|
|
273
|
+
# get secondary nucleus
|
|
274
|
+
def secondary_nucleus(self):
|
|
275
|
+
n = self.getValueFromCatchall("secondaryNucleus")
|
|
276
|
+
if n:
|
|
277
|
+
return n
|
|
278
|
+
return None
|
|
279
|
+
|
|
280
|
+
# get allowed processing types
|
|
281
|
+
def get_allowed_processing_types(self):
|
|
282
|
+
"""
|
|
283
|
+
Get allowed processing types for processing type-based job brokerage to access only tasks with specific processing types.
|
|
284
|
+
They are defined in the catchall field as a pipe-separated list with the key "allowed_processing".
|
|
285
|
+
"""
|
|
286
|
+
n = self.getValueFromCatchall("allowed_processing")
|
|
287
|
+
if n:
|
|
288
|
+
return n.split("|")
|
|
289
|
+
return None
|
|
290
|
+
|
|
291
|
+
# get excluded process types
|
|
292
|
+
def get_excluded_processing_types(self):
|
|
293
|
+
"""
|
|
294
|
+
Get excluded processing types for processing type-based job brokerage to exclude tasks with specific processing types.
|
|
295
|
+
They are defined in the catchall field as a pipe-separated list with the key "excluded_processing".
|
|
296
|
+
"""
|
|
297
|
+
n = self.getValueFromCatchall("excluded_processing")
|
|
298
|
+
if n:
|
|
299
|
+
return n.split("|")
|
|
300
|
+
return None
|
|
301
|
+
|
|
302
|
+
# use per-core attributes
|
|
303
|
+
def use_per_core_attr(self):
|
|
304
|
+
return self.hasValueInCatchall("per_core_attr")
|