panda-server 0.4.0__tar.gz → 0.4.2__tar.gz
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-0.4.0 → panda_server-0.4.2}/PKG-INFO +1 -2
- panda_server-0.4.2/PandaPkgInfo.py +1 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/package/hatch_build.py +2 -1
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/brokerage/SiteMapper.py +1 -1
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/configurator/Configurator.py +2 -17
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/utils.py +95 -36
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/setupper_atlas_plugin.py +20 -20
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/jobdispatcher/JobDispatcher.py +1 -69
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/server/panda.py +0 -2
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/srvcore/allowed_methods.py +0 -2
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/OraDBProxy.py +61 -1690
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/TaskBuffer.py +4 -321
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/WrappedCursor.py +30 -17
- panda_server-0.4.2/pandaserver/test/test_error_classification.py +71 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/userinterface/Client.py +38 -15
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/userinterface/UserIF.py +2 -16
- {panda_server-0.4.0 → panda_server-0.4.2}/templates/panda_server.cfg.rpmnew.template +0 -10
- panda_server-0.4.0/PandaPkgInfo.py +0 -1
- panda_server-0.4.0/pandaserver/test/test_error_classification.py +0 -38
- {panda_server-0.4.0 → panda_server-0.4.2}/.pre-commit-config.yaml +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/ChangeLog.txt +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/Dockerfile +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/INSTALL.md +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/INSTALL_ATLAS.md +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/LICENSE.txt +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/MANIFEST.in +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/README.md +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/panda-server.spec +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/__init__.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/brokerage/__init__.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/brokerage/broker.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/config/__init__.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/config/config_utils.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/config/daemon_config.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/config/panda_config.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/configurator/Carbon.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/configurator/__init__.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/configurator/aux.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/__init__.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/master.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/master_systemd.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/__init__.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/add_main.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/add_sub.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/cache_pilots.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/cache_schedconfig.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/carbon.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/configurator.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/copyArchive.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/datasetManager.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/dummy_test.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/evpPD2P.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/metric_collector.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/panda_activeusers_query.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/pilotStreaming.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/process_workflow_files_daemon.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/recover_lost_files_daemon.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/task_evaluator.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/tmpwatch.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/daemons/scripts/worker_synchronization.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/DataServiceUtils.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/ErrorCode.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/RecoverLostFilesCore.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/__init__.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/activator.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/adder_atlas_plugin.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/adder_dummy_plugin.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/adder_gen.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/adder_plugin_base.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/adder_result.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/adder_simple_plugin.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/closer.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/closer_atlas_plugin.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/ddm.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/ddm_handler.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/dyn_data_distributer.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/event_lookup_client_ei.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/event_picker.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/finisher.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/setupper.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/setupper_dummy_plugin.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/dataservice/setupper_plugin_base.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/jobdispatcher/DispatcherUtils.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/jobdispatcher/ErrorCode.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/jobdispatcher/Protocol.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/jobdispatcher/Watcher.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/jobdispatcher/__init__.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/proxycache/__init__.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/proxycache/panda_proxy_cache.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/proxycache/token_cache.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/server/.gacl +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/srvcore/CoreUtils.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/srvcore/MailUtils.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/srvcore/__init__.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/srvcore/oidc_utils.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/srvcore/panda_request.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/srvcore/srv_msg_utils.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/ConBridge.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/DBProxyPool.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/DatasetSpec.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/DdmSpec.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/ErrorCode.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/EventServiceUtils.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/FileSpec.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/GlobalShares.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/HarvesterMetricsSpec.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/Initializer.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/JobSpec.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/JobUtils.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/NucleusSpec.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/PanDAMsgProcessor.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/PandaDBSchemaInfo.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/PickleFileSpec.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/PickleJobSpec.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/PrioUtil.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/ProcessGroups.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/ResourceSpec.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/SQLDumper.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/SQLManager.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/SiteSpec.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/SupErrors.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/TaskBufferInterface.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/Utils.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/WorkerSpec.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/WrappedPickle.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/WrappedPostgresConn.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/__init__.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/retryModule.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/task_split_rules.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/workflow_processor.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/taskbuffer/wrapped_oracle_conn.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/SchemaChecker.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/__init__.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/alice/README.txt +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/alice/mysetup +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/alice/titan_testScript_ec2_alice_1.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/alice/titan_testScript_ec2_alice_2.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/banUser.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/boostPrio.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/boostUser.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/callbackDDM.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/daod_on_demand.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/finishJob.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/finishTaskJEDI.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/getJobs.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/killJob.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/killJobLowPrio.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/killJobsInTask.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/killProdJobs.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/killTask.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/killTaskJEDI.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/killUser.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/lsst/README.txt +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/lsst/lsstSubmit.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/lsst/lsstSubmitMERGEtest.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/lsst/lsstSubmitPhosim332.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/lsst/prepare-client-tarball-from-bigpanda-server.sh +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/reassignJobs.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/reassignSite.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/reassignTask.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/reassignWaiting.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/recoverLostFiles.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/reloadInputDS.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/sendCommandToJob.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/setDebugMode.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/setPriority.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/testEvgen.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/testEvgen17.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/testG4sim.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/testG4sim17.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/testGetCriteriaForGlobalShares.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/testGlobalShares.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/testJobFlowATLAS.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/testReco.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/testSimulReco14.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/testSiteMap.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/testUpdateWorkerPilotStatus.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/test/testutils.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/userinterface/__init__.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/workflow/__init__.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/workflow/pcwl_test.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/workflow/pcwl_utils.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/workflow/psnakemake_container.json +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/workflow/psnakemake_task.json +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/workflow/psnakemake_test.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/workflow/snakeparser/__init__.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/workflow/snakeparser/extensions.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/workflow/snakeparser/log.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/workflow/snakeparser/names.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/workflow/snakeparser/parser.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/workflow/snakeparser/utils.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pandaserver/workflow/workflow_utils.py +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/pyproject.toml +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/templates/bin/panda_server-makeSlsXml.exe.template +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/templates/bin/panda_server-vomsrenew.exe.template +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/templates/conda_meta.yaml.template +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/templates/init.d/panda_daemon.exe.template +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/templates/init.d/panda_httpd.exe.template +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/templates/init.d/panda_server.exe.template +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/templates/logrotate.d/panda_server.logrotate.template +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/templates/panda_server-httpd-FastCGI.conf.rpmnew.template +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/templates/panda_server-httpd.conf.rpmnew.template +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/templates/sysconfig/panda_server.sysconfig.rpmnew.template +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/templates/sysconfig/panda_server.sysconfig_for_systemd.template +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/templates/sysconfig/panda_server_env.systemd.rpmnew.template +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/templates/systemd/panda.service.template +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/templates/systemd/panda_daemon.service.template +0 -0
- {panda_server-0.4.0 → panda_server-0.4.2}/templates/systemd/panda_httpd.service.template +0 -0
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: panda-server
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.2
|
|
4
4
|
Summary: PanDA Server Package
|
|
5
5
|
Project-URL: Homepage, https://panda-wms.readthedocs.io/en/latest/
|
|
6
6
|
Author-email: PanDA Team <panda-support@cern.ch>
|
|
7
7
|
License: Apache-2.0
|
|
8
|
-
License-File: LICENSE.txt
|
|
9
8
|
Requires-Python: >=3.8
|
|
10
9
|
Requires-Dist: cwl-utils>=0.13
|
|
11
10
|
Requires-Dist: idds-atlas
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
release_version = "0.4.2"
|
|
@@ -16,6 +16,7 @@ import requests
|
|
|
16
16
|
from hatchling.builders.hooks.plugin.interface import BuildHookInterface
|
|
17
17
|
|
|
18
18
|
PACKAGE_EMOJI = ":panda_face:"
|
|
19
|
+
PACKAGE_NAME = "panda-server"
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
def get_user():
|
|
@@ -76,7 +77,7 @@ def mm_notification():
|
|
|
76
77
|
# On the repository name we enter an empty space to prevent the URLs to preview on Mattermost
|
|
77
78
|
# We shorten the commit hash to the first seven characters, as they are usually enough to identify a commit
|
|
78
79
|
mm_message = {
|
|
79
|
-
"text": f"{PACKAGE_EMOJI}**
|
|
80
|
+
"text": f"{PACKAGE_EMOJI}**{PACKAGE_NAME}@{branch_name} upgrade on:** `{server_name}` by `{user}`.",
|
|
80
81
|
"props": {
|
|
81
82
|
"card": f"""
|
|
82
83
|
| **Property** | **Value** |
|
|
@@ -167,7 +167,7 @@ class SiteMapper:
|
|
|
167
167
|
# calculate the minRSS for the child queue
|
|
168
168
|
if resource_spec.minrampercore is not None:
|
|
169
169
|
child_site_spec.minrss = max(
|
|
170
|
-
child_site_spec.coreCount * resource_spec.minrampercore,
|
|
170
|
+
child_site_spec.coreCount * resource_spec.minrampercore - child_site_spec.coreCount + 1,
|
|
171
171
|
site_spec.minrss * child_site_spec.coreCount / core_count,
|
|
172
172
|
)
|
|
173
173
|
else:
|
|
@@ -560,7 +560,7 @@ class NetworkConfigurator(threading.Thread):
|
|
|
560
560
|
if hasattr(panda_config, "NWS_URL"):
|
|
561
561
|
self.NWS_URL = panda_config.NWS_URL
|
|
562
562
|
else:
|
|
563
|
-
self.NWS_URL = "
|
|
563
|
+
self.NWS_URL = "https://atlas-rucio-network-metrics.cern.ch/metrics.json"
|
|
564
564
|
|
|
565
565
|
if hasattr(panda_config, "CRIC_URL_CM"):
|
|
566
566
|
self.CRIC_URL_CM = panda_config.CRIC_URL_CM
|
|
@@ -705,21 +705,6 @@ class NetworkConfigurator(threading.Thread):
|
|
|
705
705
|
except KeyError:
|
|
706
706
|
pass
|
|
707
707
|
|
|
708
|
-
# PerfSonar latency and packetloss
|
|
709
|
-
for metric in [LATENCY, PACKETLOSS]:
|
|
710
|
-
try:
|
|
711
|
-
struc = self.nws_dump[src_dst][metric]
|
|
712
|
-
try:
|
|
713
|
-
updated_at = datetime.strptime(struc[TIMESTAMP], "%Y-%m-%dT%H:%M:%S")
|
|
714
|
-
if updated_at > latest_validity:
|
|
715
|
-
value = struc[LATEST]
|
|
716
|
-
data.append((source, destination, metric, value, updated_at))
|
|
717
|
-
except KeyError:
|
|
718
|
-
self.log_stream.debug(f"Entry {struc} ({source}->{destination}) does not follow {metric} standards")
|
|
719
|
-
pass
|
|
720
|
-
except KeyError:
|
|
721
|
-
continue
|
|
722
|
-
|
|
723
708
|
return data
|
|
724
709
|
|
|
725
710
|
def process_CRIC_cm_dump(self):
|
|
@@ -842,7 +827,7 @@ class SWTagsDumper(threading.Thread):
|
|
|
842
827
|
else:
|
|
843
828
|
self.log_stream = _logger
|
|
844
829
|
|
|
845
|
-
if hasattr(panda_config, "
|
|
830
|
+
if hasattr(panda_config, "CRIC_URL_TAGS"):
|
|
846
831
|
self.CRIC_URL_TAGS = panda_config.CRIC_URL_TAGS
|
|
847
832
|
else:
|
|
848
833
|
self.CRIC_URL_TAGS = "https://atlas-cric.cern.ch/api/atlas/pandaqueue/query/?json&preset=tags"
|
|
@@ -39,11 +39,10 @@ CMD_STOP = "__STOP"
|
|
|
39
39
|
# epoch datetime
|
|
40
40
|
EPOCH = datetime.datetime.fromtimestamp(0)
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
# requester id for taskbuffer
|
|
43
43
|
requester_id = GenericThread().get_full_id(__name__, sys.modules[__name__].__file__)
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
# kill process tree
|
|
47
46
|
def kill_proc_tree(pid, sig=signal.SIGKILL, include_parent=True, timeout=None, on_terminate=None):
|
|
48
47
|
"""
|
|
49
48
|
Kill a process tree (including grandchildren) with signal "sig" and return a (gone, still_alive) tuple.
|
|
@@ -63,8 +62,10 @@ def kill_proc_tree(pid, sig=signal.SIGKILL, include_parent=True, timeout=None, o
|
|
|
63
62
|
return (gone, alive)
|
|
64
63
|
|
|
65
64
|
|
|
66
|
-
# worker process loop of daemon
|
|
67
65
|
def daemon_loop(dem_config, msg_queue, pipe_conn, worker_lifetime, tbuf=None, lock_pool=None):
|
|
66
|
+
"""
|
|
67
|
+
Main loop of daemon worker process
|
|
68
|
+
"""
|
|
68
69
|
# pid of the worker
|
|
69
70
|
my_pid = os.getpid()
|
|
70
71
|
my_full_pid = f"{socket.getfqdn().split('.')[0]}-{os.getpgrp()}-{my_pid}"
|
|
@@ -79,6 +80,7 @@ def daemon_loop(dem_config, msg_queue, pipe_conn, worker_lifetime, tbuf=None, lo
|
|
|
79
80
|
|
|
80
81
|
for sig in END_SIGNALS:
|
|
81
82
|
signal.signal(sig, got_end_sig)
|
|
83
|
+
|
|
82
84
|
# dict of all daemons and their script module object
|
|
83
85
|
module_map = {}
|
|
84
86
|
# package of daemon scripts
|
|
@@ -271,9 +273,6 @@ def daemon_loop(dem_config, msg_queue, pipe_conn, worker_lifetime, tbuf=None, lo
|
|
|
271
273
|
# send daemon status back to master
|
|
272
274
|
status_tuple = (dem_name, to_run_daemon, has_run, last_run_start_ts, last_run_end_ts)
|
|
273
275
|
pipe_conn.send(status_tuple)
|
|
274
|
-
# FIXME: stop and spawn worker in every run for now since some script breaks the worker without exception
|
|
275
|
-
# tmp_log.info('as script done, stop this worker')
|
|
276
|
-
# break
|
|
277
276
|
else:
|
|
278
277
|
# got invalid message
|
|
279
278
|
tmp_log.warning(f'got invalid message "{one_msg}", skipped it')
|
|
@@ -281,8 +280,11 @@ def daemon_loop(dem_config, msg_queue, pipe_conn, worker_lifetime, tbuf=None, lo
|
|
|
281
280
|
time.sleep(2**-5)
|
|
282
281
|
|
|
283
282
|
|
|
284
|
-
# worker class of daemon process for PanDA server
|
|
285
283
|
class DaemonWorker(object):
|
|
284
|
+
"""
|
|
285
|
+
Class of worker process of PanDA daemon
|
|
286
|
+
"""
|
|
287
|
+
|
|
286
288
|
__slots__ = (
|
|
287
289
|
"pid",
|
|
288
290
|
"parent_conn",
|
|
@@ -308,17 +310,23 @@ class DaemonWorker(object):
|
|
|
308
310
|
lock_pool=lock_pool,
|
|
309
311
|
)
|
|
310
312
|
|
|
311
|
-
# make pipe connection pairs for the worker
|
|
312
313
|
def _make_pipe(self):
|
|
314
|
+
"""
|
|
315
|
+
make pipe connection pairs between master and this worker
|
|
316
|
+
"""
|
|
313
317
|
self.parent_conn, self.child_conn = multiprocessing.Pipe()
|
|
314
318
|
|
|
315
|
-
# close pipe connections
|
|
316
319
|
def _close_pipe(self):
|
|
320
|
+
"""
|
|
321
|
+
close pipe connection pairs between master and this worker
|
|
322
|
+
"""
|
|
317
323
|
self.parent_conn.close()
|
|
318
324
|
self.child_conn.close()
|
|
319
325
|
|
|
320
|
-
# make associated process
|
|
321
326
|
def _make_process(self, dem_config, msg_queue, worker_lifetime, tbuf, lock_pool):
|
|
327
|
+
"""
|
|
328
|
+
make associate process of this worker
|
|
329
|
+
"""
|
|
322
330
|
args = (
|
|
323
331
|
dem_config,
|
|
324
332
|
msg_queue,
|
|
@@ -329,39 +337,54 @@ class DaemonWorker(object):
|
|
|
329
337
|
)
|
|
330
338
|
self.process = multiprocessing.Process(target=daemon_loop, args=args)
|
|
331
339
|
|
|
332
|
-
# start worker process
|
|
333
340
|
def start(self):
|
|
341
|
+
"""
|
|
342
|
+
start the worker process
|
|
343
|
+
"""
|
|
334
344
|
self.unset_dem()
|
|
335
345
|
self.process.start()
|
|
336
346
|
self.pid = self.process.pid
|
|
337
347
|
|
|
338
|
-
# whether worker process is alive
|
|
339
348
|
def is_alive(self):
|
|
349
|
+
"""
|
|
350
|
+
whether the worker process is alive
|
|
351
|
+
"""
|
|
340
352
|
return self.process.is_alive()
|
|
341
353
|
|
|
342
|
-
# kill the worker process and all its subprocesses
|
|
343
354
|
def kill(self):
|
|
355
|
+
"""
|
|
356
|
+
kill the worker process and all its subprocesses
|
|
357
|
+
"""
|
|
344
358
|
self._close_pipe()
|
|
345
359
|
return kill_proc_tree(self.process.pid)
|
|
346
360
|
|
|
347
|
-
# whether the worker is running daemon
|
|
348
361
|
def is_running_dem(self):
|
|
362
|
+
"""
|
|
363
|
+
whether the worker is still running a daemon script
|
|
364
|
+
"""
|
|
349
365
|
return not (self.dem_name is None and self.dem_ts is None)
|
|
350
366
|
|
|
351
|
-
# set current running daemon in this worker
|
|
352
367
|
def set_dem(self, dem_name, dem_ts):
|
|
368
|
+
"""
|
|
369
|
+
set current running daemon in this worker
|
|
370
|
+
"""
|
|
353
371
|
if not self.is_running_dem() or dem_ts >= self.dem_ts:
|
|
354
372
|
self.dem_name = dem_name
|
|
355
373
|
self.dem_ts = dem_ts
|
|
356
374
|
|
|
357
|
-
# unset current running daemon in this worker
|
|
358
375
|
def unset_dem(self):
|
|
376
|
+
"""
|
|
377
|
+
unset current running daemon in this worker
|
|
378
|
+
"""
|
|
359
379
|
self.dem_ts = None
|
|
360
380
|
self.dem_name = None
|
|
361
381
|
|
|
362
382
|
|
|
363
|
-
# master class of main daemon process for PanDA server
|
|
364
383
|
class DaemonMaster(object):
|
|
384
|
+
"""
|
|
385
|
+
Class of master process of PanDA daemon
|
|
386
|
+
"""
|
|
387
|
+
|
|
365
388
|
# constructor
|
|
366
389
|
def __init__(self, logger, n_workers=1, n_dbconn=1, worker_lifetime=28800, use_tbif=False):
|
|
367
390
|
# logger
|
|
@@ -400,11 +423,16 @@ class DaemonMaster(object):
|
|
|
400
423
|
self._spawn_workers(self.n_workers)
|
|
401
424
|
|
|
402
425
|
def _reset_msg_queue(self):
|
|
426
|
+
"""
|
|
427
|
+
reset the message queue for sending commands to workers
|
|
428
|
+
"""
|
|
403
429
|
self.msg_queue = multiprocessing.Queue()
|
|
404
430
|
self.logger.info(f"reset message queue (qid={id(self.msg_queue)})")
|
|
405
431
|
|
|
406
|
-
# make common taskBuffer interface for daemon workers
|
|
407
432
|
def _make_tbif(self):
|
|
433
|
+
"""
|
|
434
|
+
make common taskBuffer interface for daemon workers
|
|
435
|
+
"""
|
|
408
436
|
try:
|
|
409
437
|
# import is always required to have reserveChangedState consistent in *Spec
|
|
410
438
|
from pandaserver.taskbuffer.TaskBuffer import TaskBuffer
|
|
@@ -430,8 +458,10 @@ class DaemonMaster(object):
|
|
|
430
458
|
self.logger.error(f"failed to initialize taskBuffer interface with {e.__class__.__name__}: {e} ; terminated")
|
|
431
459
|
raise e
|
|
432
460
|
|
|
433
|
-
# spawn new workers and put into worker pool
|
|
434
461
|
def _spawn_workers(self, n_workers=1, auto_start=False):
|
|
462
|
+
"""
|
|
463
|
+
spawn new workers and put them into worker pool
|
|
464
|
+
"""
|
|
435
465
|
for j in range(n_workers):
|
|
436
466
|
with self._worker_lock:
|
|
437
467
|
if self.use_tbif:
|
|
@@ -450,13 +480,17 @@ class DaemonMaster(object):
|
|
|
450
480
|
worker.start()
|
|
451
481
|
self.logger.debug(f"launched new worker_pid={worker.pid}")
|
|
452
482
|
|
|
453
|
-
# remove a worker from pool
|
|
454
483
|
def _remove_worker(self, worker):
|
|
484
|
+
"""
|
|
485
|
+
remove a worker from pool
|
|
486
|
+
"""
|
|
455
487
|
with self._worker_lock:
|
|
456
488
|
self.worker_pool.discard(worker)
|
|
457
489
|
|
|
458
|
-
# parse daemon config
|
|
459
490
|
def _parse_config(self):
|
|
491
|
+
"""
|
|
492
|
+
parse configuration of PanDA daemon
|
|
493
|
+
"""
|
|
460
494
|
try:
|
|
461
495
|
config_json = daemon_config.config
|
|
462
496
|
config_dict = json.loads(config_json)
|
|
@@ -495,8 +529,10 @@ class DaemonMaster(object):
|
|
|
495
529
|
tb = traceback.format_exc()
|
|
496
530
|
self.logger.error(f"failed to parse daemon config, {e.__class__.__name__}: {e}\n{tb}\n")
|
|
497
531
|
|
|
498
|
-
# make daemon run status map
|
|
499
532
|
def _make_dem_run_map(self):
|
|
533
|
+
"""
|
|
534
|
+
initialize daemon run status map
|
|
535
|
+
"""
|
|
500
536
|
dem_run_map = {}
|
|
501
537
|
for dem in self.dem_config:
|
|
502
538
|
attrs = {}
|
|
@@ -507,8 +543,21 @@ class DaemonMaster(object):
|
|
|
507
543
|
dem_run_map[dem] = attrs
|
|
508
544
|
self.dem_run_map = dem_run_map
|
|
509
545
|
|
|
510
|
-
|
|
546
|
+
def _kill_one_worker(self, worker):
|
|
547
|
+
"""
|
|
548
|
+
kill one (stuck) worker (and new worker will be re-spawned in scheduler cycle)
|
|
549
|
+
"""
|
|
550
|
+
# kill worker process and remove it from pool
|
|
551
|
+
worker.kill()
|
|
552
|
+
self._remove_worker(worker)
|
|
553
|
+
# reset daemon run status map of the daemon run by the worker
|
|
554
|
+
self.dem_run_map[worker.dem_name]["msg_ongoing"] = False
|
|
555
|
+
self.dem_run_map[worker.dem_name]["dem_running"] = False
|
|
556
|
+
|
|
511
557
|
def _scheduler_cycle(self):
|
|
558
|
+
"""
|
|
559
|
+
main scheduler cycle
|
|
560
|
+
"""
|
|
512
561
|
now_ts = int(time.time())
|
|
513
562
|
# check last run time from pipes
|
|
514
563
|
for worker in list(self.worker_pool):
|
|
@@ -561,10 +610,7 @@ class DaemonMaster(object):
|
|
|
561
610
|
timeout=run_timeout,
|
|
562
611
|
)
|
|
563
612
|
)
|
|
564
|
-
|
|
565
|
-
self._remove_worker(worker)
|
|
566
|
-
self.dem_run_map[worker.dem_name]["msg_ongoing"] = False
|
|
567
|
-
self.dem_run_map[worker.dem_name]["dem_running"] = False
|
|
613
|
+
self._kill_one_worker(worker)
|
|
568
614
|
# counter for super delayed daemons
|
|
569
615
|
n_super_delayed_dems = 0
|
|
570
616
|
# send message to workers
|
|
@@ -607,19 +653,28 @@ class DaemonMaster(object):
|
|
|
607
653
|
# sleep
|
|
608
654
|
time.sleep(0.5)
|
|
609
655
|
|
|
610
|
-
|
|
611
|
-
|
|
656
|
+
def _stop_all_workers(self):
|
|
657
|
+
"""
|
|
658
|
+
stop all workers gracefully by sending stop command to them
|
|
659
|
+
"""
|
|
660
|
+
# send stop command
|
|
612
661
|
for worker in self.worker_pool:
|
|
613
662
|
worker.parent_conn.send(CMD_STOP)
|
|
614
663
|
self.logger.debug(f"sent stop command to worker_pid={worker.pid}")
|
|
664
|
+
# reset daemon run status map of all daemons
|
|
665
|
+
for dem_name in self.dem_config:
|
|
666
|
+
self.dem_run_map[dem_name]["msg_ongoing"] = False
|
|
667
|
+
self.dem_run_map[dem_name]["dem_running"] = False
|
|
615
668
|
|
|
616
|
-
# stop master
|
|
617
669
|
def stop(self):
|
|
670
|
+
"""
|
|
671
|
+
stop the master (and all workers)
|
|
672
|
+
"""
|
|
618
673
|
self.logger.info("daemon master got stop")
|
|
619
674
|
# stop scheduler from sending more message
|
|
620
675
|
self.to_stop_scheduler = True
|
|
621
|
-
#
|
|
622
|
-
self.
|
|
676
|
+
# stop all workers gracefully
|
|
677
|
+
self._stop_all_workers()
|
|
623
678
|
# wait a bit
|
|
624
679
|
time.sleep(1)
|
|
625
680
|
# close message queue
|
|
@@ -630,11 +685,13 @@ class DaemonMaster(object):
|
|
|
630
685
|
# wait a bit
|
|
631
686
|
time.sleep(2)
|
|
632
687
|
|
|
633
|
-
# revive: kill all workers, reset a new message queue, and spawn new workers with new queue
|
|
634
688
|
def revive(self):
|
|
689
|
+
"""
|
|
690
|
+
revive: kill all workers, reset a new message queue, and spawn new workers with new queue
|
|
691
|
+
"""
|
|
635
692
|
self.logger.info("daemon master reviving")
|
|
636
|
-
#
|
|
637
|
-
self.
|
|
693
|
+
# stop all workers gracefully
|
|
694
|
+
self._stop_all_workers()
|
|
638
695
|
# wait a bit
|
|
639
696
|
time.sleep(3)
|
|
640
697
|
# kill and remove workers
|
|
@@ -650,8 +707,10 @@ class DaemonMaster(object):
|
|
|
650
707
|
# done
|
|
651
708
|
self.logger.info("daemon master revived")
|
|
652
709
|
|
|
653
|
-
# run
|
|
654
710
|
def run(self):
|
|
711
|
+
"""
|
|
712
|
+
main function to run the master
|
|
713
|
+
"""
|
|
655
714
|
# master pid
|
|
656
715
|
master_pid = os.getpid()
|
|
657
716
|
self.logger.info(f"daemon master started ; master_pid={master_pid}")
|
|
@@ -338,8 +338,7 @@ class SetupperAtlasPlugin(SetupperPluginBase):
|
|
|
338
338
|
self.replica_map[job.dispatchDBlock][file.dataset] = self.all_replica_map[file.dataset]
|
|
339
339
|
|
|
340
340
|
# register dispatch dataset
|
|
341
|
-
disp_list = self.register_dispatch_datasets(file_list, use_zip_to_pin_map, ds_task_map, tmp_logger, disp_error,
|
|
342
|
-
jedi_task_id)
|
|
341
|
+
disp_list = self.register_dispatch_datasets(file_list, use_zip_to_pin_map, ds_task_map, tmp_logger, disp_error, jedi_task_id)
|
|
343
342
|
# insert datasets to DB
|
|
344
343
|
self.task_buffer.insertDatasets(prod_list + disp_list)
|
|
345
344
|
# job status
|
|
@@ -356,13 +355,13 @@ class SetupperAtlasPlugin(SetupperPluginBase):
|
|
|
356
355
|
del prod_error
|
|
357
356
|
|
|
358
357
|
def register_dispatch_datasets(
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
358
|
+
self,
|
|
359
|
+
file_list: Dict[str, Dict[str, List[str]]],
|
|
360
|
+
use_zip_to_pin_map: Dict[str, bool],
|
|
361
|
+
ds_task_map: Dict[str, int],
|
|
362
|
+
tmp_logger: LogWrapper,
|
|
363
|
+
disp_error: Dict[str, str],
|
|
364
|
+
jedi_task_id: Optional[int],
|
|
366
365
|
) -> List[DatasetSpec]:
|
|
367
366
|
"""
|
|
368
367
|
Register dispatch datasets in Rucio.
|
|
@@ -396,10 +395,10 @@ class SetupperAtlasPlugin(SetupperPluginBase):
|
|
|
396
395
|
tmp_zip_out = {}
|
|
397
396
|
dis_files = {"lfns": [], "guids": [], "fsizes": [], "chksums": []}
|
|
398
397
|
for tmp_lfn, tmp_guid, tmp_file_size, tmp_checksum in zip(
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
398
|
+
file_list[dispatch_data_block]["lfns"],
|
|
399
|
+
file_list[dispatch_data_block]["guids"],
|
|
400
|
+
file_list[dispatch_data_block]["fsizes"],
|
|
401
|
+
file_list[dispatch_data_block]["chksums"],
|
|
403
402
|
):
|
|
404
403
|
if tmp_lfn in tmp_zip_out:
|
|
405
404
|
tmp_zip_file_name = f"{tmp_zip_out[tmp_lfn]['scope']}:{tmp_zip_out[tmp_lfn]['name']}"
|
|
@@ -444,9 +443,7 @@ class SetupperAtlasPlugin(SetupperPluginBase):
|
|
|
444
443
|
self.logger.debug(f"sleep {attempt}/{max_attempt}")
|
|
445
444
|
time.sleep(10)
|
|
446
445
|
if not is_ok:
|
|
447
|
-
disp_error[
|
|
448
|
-
dispatch_data_block] = "setupper.setup_source() could not register dispatch_data_block with {0}".format(
|
|
449
|
-
err_str.split("\n")[-1])
|
|
446
|
+
disp_error[dispatch_data_block] = "setupper.setup_source() could not register dispatch_data_block with {0}".format(err_str.split("\n")[-1])
|
|
450
447
|
continue
|
|
451
448
|
tmp_logger.debug(out)
|
|
452
449
|
new_out = out
|
|
@@ -464,8 +461,7 @@ class SetupperAtlasPlugin(SetupperPluginBase):
|
|
|
464
461
|
time.sleep(10)
|
|
465
462
|
if not status:
|
|
466
463
|
tmp_logger.error(out)
|
|
467
|
-
disp_error[
|
|
468
|
-
dispatch_data_block] = f"setupper.setup_source() could not freeze dispatch_data_block with {out}"
|
|
464
|
+
disp_error[dispatch_data_block] = f"setupper.setup_source() could not freeze dispatch_data_block with {out}"
|
|
469
465
|
continue
|
|
470
466
|
|
|
471
467
|
# get VUID
|
|
@@ -479,8 +475,7 @@ class SetupperAtlasPlugin(SetupperPluginBase):
|
|
|
479
475
|
dataset.status = "defined"
|
|
480
476
|
dataset.numberfiles = len(file_list[dispatch_data_block]["lfns"])
|
|
481
477
|
try:
|
|
482
|
-
dataset.currentfiles = int(
|
|
483
|
-
sum(filter(None, file_list[dispatch_data_block]["fsizes"])) / 1024 / 1024)
|
|
478
|
+
dataset.currentfiles = int(sum(filter(None, file_list[dispatch_data_block]["fsizes"])) / 1024 / 1024)
|
|
484
479
|
except Exception:
|
|
485
480
|
dataset.currentfiles = 0
|
|
486
481
|
if jedi_task_id is not None:
|
|
@@ -774,6 +769,11 @@ class SetupperAtlasPlugin(SetupperPluginBase):
|
|
|
774
769
|
# set new destDBlock
|
|
775
770
|
if dest in newname_list:
|
|
776
771
|
file.destinationDBlock = newname_list[dest]
|
|
772
|
+
# update job status if failed and increment number of files
|
|
773
|
+
for job in jobs_list:
|
|
774
|
+
# ignore failed jobs
|
|
775
|
+
if job.jobStatus in ["failed", "cancelled"] or job.isCancelled():
|
|
776
|
+
continue
|
|
777
777
|
for file in job.Files:
|
|
778
778
|
dest = (
|
|
779
779
|
file.destinationDBlock,
|
|
@@ -20,10 +20,9 @@ from pandacommon.pandalogger.PandaLogger import PandaLogger
|
|
|
20
20
|
from pandaserver.brokerage.SiteMapper import SiteMapper
|
|
21
21
|
from pandaserver.config import panda_config
|
|
22
22
|
from pandaserver.dataservice.adder_gen import AdderGen
|
|
23
|
-
from pandaserver.jobdispatcher import
|
|
23
|
+
from pandaserver.jobdispatcher import Protocol
|
|
24
24
|
from pandaserver.proxycache import panda_proxy_cache, token_cache
|
|
25
25
|
from pandaserver.srvcore import CoreUtils
|
|
26
|
-
from pandaserver.taskbuffer import EventServiceUtils
|
|
27
26
|
|
|
28
27
|
# logger
|
|
29
28
|
_logger = PandaLogger().getLogger("JobDispatcher")
|
|
@@ -164,7 +163,6 @@ class JobDispatcher:
|
|
|
164
163
|
):
|
|
165
164
|
t_getJob_start = time.time()
|
|
166
165
|
jobs = []
|
|
167
|
-
useProxyCache = False
|
|
168
166
|
try:
|
|
169
167
|
tmpNumJobs = int(nJobs)
|
|
170
168
|
except Exception:
|
|
@@ -237,55 +235,6 @@ class JobDispatcher:
|
|
|
237
235
|
response.appendNode("secrets", secrets_map[tmpJob.prodUserName])
|
|
238
236
|
if panda_config.pilot_secrets in secrets_map and secrets_map[panda_config.pilot_secrets]:
|
|
239
237
|
response.appendNode("pilotSecrets", secrets_map[panda_config.pilot_secrets])
|
|
240
|
-
# check if proxy cache is used
|
|
241
|
-
if hasattr(panda_config, "useProxyCache") and panda_config.useProxyCache is True:
|
|
242
|
-
self.specialDispatchParams.update()
|
|
243
|
-
if "proxyCacheSites" not in self.specialDispatchParams:
|
|
244
|
-
proxyCacheSites = {}
|
|
245
|
-
else:
|
|
246
|
-
proxyCacheSites = self.specialDispatchParams["proxyCacheSites"]
|
|
247
|
-
if siteName in proxyCacheSites:
|
|
248
|
-
useProxyCache = True
|
|
249
|
-
# set proxy
|
|
250
|
-
if useProxyCache:
|
|
251
|
-
try:
|
|
252
|
-
# get compact
|
|
253
|
-
compactDN = self.taskBuffer.cleanUserID(realDN)
|
|
254
|
-
# check permission
|
|
255
|
-
self.specialDispatchParams.update()
|
|
256
|
-
if "allowProxy" not in self.specialDispatchParams:
|
|
257
|
-
allowProxy = []
|
|
258
|
-
else:
|
|
259
|
-
allowProxy = self.specialDispatchParams["allowProxy"]
|
|
260
|
-
if compactDN not in allowProxy:
|
|
261
|
-
tmpLog.warning(f"{siteName} {node} '{compactDN}' no permission to retrieve user proxy")
|
|
262
|
-
else:
|
|
263
|
-
if useProxyCache:
|
|
264
|
-
tmpStat, tmpOut = self.set_user_proxy(
|
|
265
|
-
response,
|
|
266
|
-
proxyCacheSites[siteName]["dn"],
|
|
267
|
-
proxyCacheSites[siteName]["role"],
|
|
268
|
-
)
|
|
269
|
-
else:
|
|
270
|
-
tmpStat, tmpOut = self.set_user_proxy(response)
|
|
271
|
-
if not tmpStat:
|
|
272
|
-
tmpLog.warning(f"{siteName} {node} failed to get user proxy : {tmpOut}")
|
|
273
|
-
except Exception as e:
|
|
274
|
-
tmpLog.warning(f"{siteName} {node} failed to get user proxy with {str(e)}")
|
|
275
|
-
# panda proxy
|
|
276
|
-
if (
|
|
277
|
-
"pandaProxySites" in self.specialDispatchParams
|
|
278
|
-
and siteName in self.specialDispatchParams["pandaProxySites"]
|
|
279
|
-
and (EventServiceUtils.isEventServiceJob(tmpJob) or EventServiceUtils.isEventServiceMerge(tmpJob))
|
|
280
|
-
):
|
|
281
|
-
# get secret key
|
|
282
|
-
tmpSecretKey, tmpErrMsg = DispatcherUtils.getSecretKey(tmpJob.PandaID)
|
|
283
|
-
if tmpSecretKey is None:
|
|
284
|
-
tmpLog.warning(f"PandaID={tmpJob.PandaID} site={siteName} failed to get panda proxy secret key : {tmpErrMsg}")
|
|
285
|
-
else:
|
|
286
|
-
# set secret key
|
|
287
|
-
tmpLog.debug(f"PandaID={tmpJob.PandaID} set key={tmpSecretKey}")
|
|
288
|
-
response.setPandaProxySecretKey(tmpSecretKey)
|
|
289
238
|
# add
|
|
290
239
|
responseList.append(response.data)
|
|
291
240
|
# make response for bulk
|
|
@@ -648,14 +597,6 @@ class JobDispatcher:
|
|
|
648
597
|
# return
|
|
649
598
|
return response.encode(accept_json)
|
|
650
599
|
|
|
651
|
-
# get DNs authorized for S3
|
|
652
|
-
def getDNsForS3(self):
|
|
653
|
-
# check permission
|
|
654
|
-
self.specialDispatchParams.update()
|
|
655
|
-
allowKey = self.specialDispatchParams.get("allowKeyPair", [])
|
|
656
|
-
# return
|
|
657
|
-
return json.dumps(allowKey)
|
|
658
|
-
|
|
659
600
|
# get site mapper
|
|
660
601
|
def getSiteMapper(self):
|
|
661
602
|
return True, SiteMapper(self.taskBuffer)
|
|
@@ -1549,15 +1490,6 @@ def checkPilotPermission(req):
|
|
|
1549
1490
|
return True, None
|
|
1550
1491
|
|
|
1551
1492
|
|
|
1552
|
-
def getDNsForS3(req):
|
|
1553
|
-
"""
|
|
1554
|
-
# get DNs authorized for S3
|
|
1555
|
-
:param req:
|
|
1556
|
-
:return:
|
|
1557
|
-
"""
|
|
1558
|
-
return jobDispatcher.getDNsForS3()
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
1493
|
def getCommands(req, harvester_id, n_commands, timeout=30):
|
|
1562
1494
|
"""
|
|
1563
1495
|
This function checks the permissions and retrieves the commands for a specified harvester instance.
|
|
@@ -35,7 +35,6 @@ from pandaserver.jobdispatcher.JobDispatcher import (
|
|
|
35
35
|
get_max_worker_id,
|
|
36
36
|
get_token_key,
|
|
37
37
|
getCommands,
|
|
38
|
-
getDNsForS3,
|
|
39
38
|
getEventRanges,
|
|
40
39
|
getJob,
|
|
41
40
|
getKeyPair,
|
|
@@ -125,7 +124,6 @@ from pandaserver.userinterface.UserIF import (
|
|
|
125
124
|
relay_idds_command,
|
|
126
125
|
release_task,
|
|
127
126
|
reloadInput,
|
|
128
|
-
reportWorkerStats,
|
|
129
127
|
reportWorkerStats_jobtype,
|
|
130
128
|
resumeTask,
|
|
131
129
|
retryTask,
|
|
@@ -29,7 +29,6 @@ allowed_methods += [
|
|
|
29
29
|
"updateEventRange",
|
|
30
30
|
"getKeyPair",
|
|
31
31
|
"updateEventRanges",
|
|
32
|
-
"getDNsForS3",
|
|
33
32
|
"getProxy",
|
|
34
33
|
"get_access_token",
|
|
35
34
|
"get_token_key",
|
|
@@ -83,7 +82,6 @@ allowed_methods += [
|
|
|
83
82
|
"getTaskParamsMap",
|
|
84
83
|
"updateWorkers",
|
|
85
84
|
"harvesterIsAlive",
|
|
86
|
-
"reportWorkerStats",
|
|
87
85
|
"reportWorkerStats_jobtype",
|
|
88
86
|
"getWorkerStats",
|
|
89
87
|
"addHarvesterDialogs",
|