rucio-clients 36.5.0__tar.gz → 37.0.0rc2__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.
Potentially problematic release.
This version of rucio-clients might be problematic. Click here for more details.
- rucio_clients-37.0.0rc2/ChangeLog +1 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/PKG-INFO +20 -18
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/bin/rucio +6 -6
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/bin/rucio-admin +8 -14
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/etc/rucio.cfg.template +1 -18
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/alembicrevision.py +1 -1
- rucio_clients-37.0.0rc2/lib/rucio/cli/__init__.py +14 -0
- rucio_clients-37.0.0rc2/lib/rucio/cli/account.py +216 -0
- {rucio_clients-36.5.0/lib/rucio/client/commands → rucio_clients-37.0.0rc2/lib/rucio/cli}/bin_legacy/rucio.py +16 -16
- {rucio_clients-36.5.0/lib/rucio/client/commands → rucio_clients-37.0.0rc2/lib/rucio/cli}/bin_legacy/rucio_admin.py +1 -1
- rucio_clients-37.0.0rc2/lib/rucio/cli/command.py +272 -0
- rucio_clients-37.0.0rc2/lib/rucio/cli/config.py +72 -0
- rucio_clients-37.0.0rc2/lib/rucio/cli/did.py +191 -0
- rucio_clients-37.0.0rc2/lib/rucio/cli/download.py +128 -0
- rucio_clients-37.0.0rc2/lib/rucio/cli/lifetime_exception.py +33 -0
- rucio_clients-37.0.0rc2/lib/rucio/cli/replica.py +162 -0
- rucio_clients-37.0.0rc2/lib/rucio/cli/rse.py +293 -0
- rucio_clients-37.0.0rc2/lib/rucio/cli/rule.py +158 -0
- rucio_clients-37.0.0rc2/lib/rucio/cli/scope.py +40 -0
- rucio_clients-37.0.0rc2/lib/rucio/cli/subscription.py +73 -0
- rucio_clients-37.0.0rc2/lib/rucio/cli/upload.py +60 -0
- {rucio_clients-36.5.0/lib/rucio/client/commands → rucio_clients-37.0.0rc2/lib/rucio/cli}/utils.py +11 -11
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/didclient.py +5 -3
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/uploadclient.py +22 -11
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/checksum.py +27 -10
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/exception.py +10 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/policy.py +12 -3
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/schema/__init__.py +15 -7
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/schema/generic.py +0 -17
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/schema/generic_multi_vo.py +0 -17
- rucio_clients-37.0.0rc2/lib/rucio/common/stomp_utils.py +423 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/test_rucio_server.py +5 -5
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/types.py +24 -2
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/utils.py +22 -5
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/bittorrent.py +0 -3
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/cache.py +0 -11
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/dummy.py +0 -11
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/gfal.py +6 -2
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/globus.py +1 -1
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/http_cache.py +1 -1
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/posix.py +1 -1
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/protocol.py +72 -23
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/rfio.py +1 -1
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/storm.py +2 -13
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/rsemanager.py +160 -46
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/translation.py +38 -51
- rucio_clients-37.0.0rc2/lib/rucio/vcsversion.py +11 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio_clients.egg-info/SOURCES.txt +17 -20
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/pyproject.toml +3 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/requirements/requirements.client.txt +10 -9
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/setup.cfg +1 -3
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/setup.py +5 -7
- rucio_clients-37.0.0rc2/setuputil.py +126 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_cli_client_structure.py +142 -90
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_conveyor.py +1 -1
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_curl.py +6 -1
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_daemons.py +0 -2
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_did_meta_plugins.py +116 -2
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_impl_upload_download.py +2 -2
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_lifetime.py +4 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_policy_package.py +6 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_rucio_server.py +4 -4
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_rule.py +3 -9
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_trace.py +38 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_transfer_plugins.py +61 -1
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_undertaker.py +2 -5
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_upload.py +13 -3
- rucio_clients-36.5.0/ChangeLog +0 -1
- rucio_clients-36.5.0/lib/rucio/client/commands/__init__.py +0 -25
- rucio_clients-36.5.0/lib/rucio/client/commands/account.py +0 -221
- rucio_clients-36.5.0/lib/rucio/client/commands/command.py +0 -263
- rucio_clients-36.5.0/lib/rucio/client/commands/command_base.py +0 -193
- rucio_clients-36.5.0/lib/rucio/client/commands/config.py +0 -58
- rucio_clients-36.5.0/lib/rucio/client/commands/did.py +0 -202
- rucio_clients-36.5.0/lib/rucio/client/commands/download.py +0 -92
- rucio_clients-36.5.0/lib/rucio/client/commands/lifetime_exception.py +0 -53
- rucio_clients-36.5.0/lib/rucio/client/commands/replica.py +0 -166
- rucio_clients-36.5.0/lib/rucio/client/commands/rse.py +0 -287
- rucio_clients-36.5.0/lib/rucio/client/commands/rule.py +0 -123
- rucio_clients-36.5.0/lib/rucio/client/commands/scope.py +0 -51
- rucio_clients-36.5.0/lib/rucio/client/commands/subscription.py +0 -72
- rucio_clients-36.5.0/lib/rucio/client/commands/upload.py +0 -62
- rucio_clients-36.5.0/lib/rucio/common/stomp_utils.py +0 -159
- rucio_clients-36.5.0/lib/rucio/rse/protocols/gsiftp.py +0 -107
- rucio_clients-36.5.0/lib/rucio/vcsversion.py +0 -11
- rucio_clients-36.5.0/pylintrc +0 -507
- rucio_clients-36.5.0/setuputil.py +0 -176
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/AUTHORS.rst +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/LICENSE +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/MANIFEST.in +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/README.md +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/etc/rse-accounts.cfg.template +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/__init__.py +0 -0
- {rucio_clients-36.5.0/lib/rucio/client/commands → rucio_clients-37.0.0rc2/lib/rucio/cli}/bin_legacy/__init__.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/__init__.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/accountclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/accountlimitclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/baseclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/client.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/configclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/credentialclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/diracclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/downloadclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/exportclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/fileclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/importclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/lifetimeclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/lockclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/metaconventionsclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/pingclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/replicaclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/requestclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/richclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/rseclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/ruleclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/scopeclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/subscriptionclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/client/touchclient.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/__init__.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/bittorrent.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/cache.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/client.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/config.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/constants.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/constraints.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/didtype.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/extra.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/logging.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/pcache.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/plugins.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/common/stopwatch.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/__init__.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/__init__.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/mock.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/ngarc.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/rclone.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/srm.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/ssh.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/webdav.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/rse/protocols/xrootd.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/lib/rucio/version.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_abacus_account.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_abacus_collection_replica.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_abacus_rse.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_account.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_account_limits.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_archive.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_auditor.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_auditor_hdfs.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_auditor_srmdumps.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_authentication.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_automatix.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_bad_replica.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_bb8.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_belleii.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_bin_rucio.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_boolean.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_clients.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_config.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_conveyor_submitter.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_counter.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_credential.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_dataset_replicas.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_db.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_did.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_download.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_dumper.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_filter_engine.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_gateway_external_representation.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_heartbeat.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_hermes.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_identity.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_import_export.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_judge_cleaner.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_judge_evaluator.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_judge_injector.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_judge_repairer.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_message.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_meta_conventions.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_meta_did.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_module_import.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_monitor.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_multi_vo.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_naming_convention.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_oauthmanager.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_oidc.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_permission.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_pfns.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_ping.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_preparer.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_qos.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_quarantined_replica.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_reaper.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_redirect.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_replica.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_replica_recoverer.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_replica_sorting.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_request.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_root_proxy.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_rse.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_rse_expression_parser.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_rse_lfn2path.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_rse_protocol_gfal2.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_rse_protocol_gfal2_impl.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_rse_protocol_posix.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_rse_protocol_rclone.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_rse_protocol_rsync.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_rse_protocol_srm.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_rse_protocol_ssh.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_rse_protocol_webdav.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_rse_protocol_xrootd.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_rse_selector.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_scope.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_subscription.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_throttler.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_tpc.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_transfer.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tests/test_utils.py +0 -0
- {rucio_clients-36.5.0 → rucio_clients-37.0.0rc2}/tools/merge_rucio_configs.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Release notes may be found at: https://rucio.cern.ch/documentation/release-notes/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: rucio-clients
|
|
3
|
-
Version:
|
|
3
|
+
Version: 37.0.0rc2
|
|
4
4
|
Summary: Rucio Client Lite Package
|
|
5
5
|
Home-page: https://rucio.cern.ch/
|
|
6
6
|
Author: Rucio
|
|
@@ -19,33 +19,35 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
19
19
|
Requires-Python: >=3.9, <4
|
|
20
20
|
License-File: LICENSE
|
|
21
21
|
License-File: AUTHORS.rst
|
|
22
|
-
Requires-Dist: requests
|
|
23
|
-
Requires-Dist: urllib3
|
|
24
|
-
Requires-Dist: dogpile-cache
|
|
25
|
-
Requires-Dist:
|
|
26
|
-
Requires-Dist:
|
|
27
|
-
Requires-Dist:
|
|
28
|
-
Requires-Dist:
|
|
29
|
-
Requires-Dist:
|
|
22
|
+
Requires-Dist: requests
|
|
23
|
+
Requires-Dist: urllib3
|
|
24
|
+
Requires-Dist: dogpile-cache<=1.2.2
|
|
25
|
+
Requires-Dist: packaging
|
|
26
|
+
Requires-Dist: tabulate
|
|
27
|
+
Requires-Dist: jsonschema
|
|
28
|
+
Requires-Dist: dataclasses
|
|
29
|
+
Requires-Dist: rich
|
|
30
|
+
Requires-Dist: typing_extensions
|
|
30
31
|
Provides-Extra: ssh
|
|
31
|
-
Requires-Dist: paramiko
|
|
32
|
+
Requires-Dist: paramiko; extra == "ssh"
|
|
32
33
|
Provides-Extra: kerberos
|
|
33
|
-
Requires-Dist: kerberos
|
|
34
|
-
Requires-Dist: pykerberos
|
|
35
|
-
Requires-Dist: requests-kerberos
|
|
34
|
+
Requires-Dist: kerberos; extra == "kerberos"
|
|
35
|
+
Requires-Dist: pykerberos; extra == "kerberos"
|
|
36
|
+
Requires-Dist: requests-kerberos; extra == "kerberos"
|
|
36
37
|
Provides-Extra: swift
|
|
37
|
-
Requires-Dist: python-swiftclient
|
|
38
|
+
Requires-Dist: python-swiftclient; extra == "swift"
|
|
38
39
|
Provides-Extra: argcomplete
|
|
39
|
-
Requires-Dist: argcomplete
|
|
40
|
+
Requires-Dist: argcomplete; extra == "argcomplete"
|
|
40
41
|
Provides-Extra: sftp
|
|
41
|
-
Requires-Dist: paramiko
|
|
42
|
+
Requires-Dist: paramiko; extra == "sftp"
|
|
42
43
|
Provides-Extra: dumper
|
|
43
|
-
Requires-Dist: python-magic
|
|
44
|
+
Requires-Dist: python-magic; extra == "dumper"
|
|
44
45
|
Dynamic: author
|
|
45
46
|
Dynamic: author-email
|
|
46
47
|
Dynamic: classifier
|
|
47
48
|
Dynamic: home-page
|
|
48
49
|
Dynamic: license
|
|
50
|
+
Dynamic: license-file
|
|
49
51
|
Dynamic: provides-extra
|
|
50
52
|
Dynamic: requires-dist
|
|
51
53
|
Dynamic: requires-python
|
|
@@ -17,8 +17,8 @@ import argparse
|
|
|
17
17
|
import sys
|
|
18
18
|
from typing import TYPE_CHECKING, Optional
|
|
19
19
|
|
|
20
|
-
from rucio.
|
|
21
|
-
from rucio.
|
|
20
|
+
from rucio.cli.bin_legacy.rucio import main as main_legacy
|
|
21
|
+
from rucio.cli.command import main
|
|
22
22
|
from rucio.common.utils import setup_logger
|
|
23
23
|
|
|
24
24
|
if TYPE_CHECKING:
|
|
@@ -60,7 +60,7 @@ def map_legacy_command() -> Optional[list[str]]:
|
|
|
60
60
|
"detach": ["did", "content", "remove"],
|
|
61
61
|
"ls": ["did", "list"],
|
|
62
62
|
"list-dids": ["did", "list"],
|
|
63
|
-
"list-parent-dids": ["did", "
|
|
63
|
+
"list-parent-dids": ["did", "list", "--parent"],
|
|
64
64
|
"list-scopes": ["scope", "list"],
|
|
65
65
|
"close": ["did", "update", "--close"],
|
|
66
66
|
"reopen": ["did", "update", "--open"],
|
|
@@ -83,7 +83,7 @@ def map_legacy_command() -> Optional[list[str]]:
|
|
|
83
83
|
"list-rules": ["rule", "list"],
|
|
84
84
|
"list-rules-history": ["rule", "history"],
|
|
85
85
|
"update-rule": ["rule", "update"],
|
|
86
|
-
"move-rule": ["rule", "
|
|
86
|
+
"move-rule": ["rule", "move"],
|
|
87
87
|
"list-rses": ["rse", "list"],
|
|
88
88
|
"list-suspicious-replicas": ["replica", "state", "suspicious"],
|
|
89
89
|
"list-rse-attributes": ["rse", "attribute", "list"],
|
|
@@ -115,7 +115,7 @@ if __name__ == "__main__":
|
|
|
115
115
|
main_legacy()
|
|
116
116
|
|
|
117
117
|
elif (any(arg in commands for arg in sys.argv)) or args.help or args.version:
|
|
118
|
-
main()
|
|
118
|
+
main() # pylint: disable=E1120
|
|
119
119
|
|
|
120
120
|
else:
|
|
121
121
|
make_warning(logger)
|
|
@@ -130,4 +130,4 @@ if __name__ == "__main__":
|
|
|
130
130
|
else:
|
|
131
131
|
sys.argv = ["rucio", "-h"]
|
|
132
132
|
|
|
133
|
-
main()
|
|
133
|
+
main() # pylint: disable=E1120
|
|
@@ -12,9 +12,10 @@
|
|
|
12
12
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
|
+
|
|
15
16
|
import sys
|
|
16
17
|
|
|
17
|
-
from rucio.
|
|
18
|
+
from rucio.cli.bin_legacy.rucio_admin import main as main_legacy
|
|
18
19
|
from rucio.common.utils import setup_logger
|
|
19
20
|
|
|
20
21
|
|
|
@@ -32,7 +33,7 @@ def make_warning():
|
|
|
32
33
|
except IndexError:
|
|
33
34
|
second_command = "-h"
|
|
34
35
|
|
|
35
|
-
if first_command not in ("-h", "--version", "--help"):
|
|
36
|
+
if (first_command not in ("-h", "--version", "--help")) and (first_command is not None):
|
|
36
37
|
command_map = {
|
|
37
38
|
"data": {"import": "upload", "export": "download"},
|
|
38
39
|
"account": {
|
|
@@ -44,8 +45,8 @@ def make_warning():
|
|
|
44
45
|
"set-limits": "account limit add",
|
|
45
46
|
"get-limits": "account limit list",
|
|
46
47
|
"delete-limits": "account limit remove",
|
|
47
|
-
"ban": "account update --ban
|
|
48
|
-
"unban": "account update --
|
|
48
|
+
"ban": "account update --ban",
|
|
49
|
+
"unban": "account update --unban",
|
|
49
50
|
"list-attributes": "account attribute list",
|
|
50
51
|
"add-attribute": "account attribute add",
|
|
51
52
|
"delete-attribute": "account attribute remove",
|
|
@@ -60,7 +61,8 @@ def make_warning():
|
|
|
60
61
|
"set-attribute": "rse attribute add",
|
|
61
62
|
"delete-attribute": "rse attribute remove",
|
|
62
63
|
"delete-distance": "rse distance remove",
|
|
63
|
-
"get-distance": "rse distance
|
|
64
|
+
"get-distance": "rse distance show",
|
|
65
|
+
"set-distance": "rse distance update",
|
|
64
66
|
"get-attribute": "rse attribute list",
|
|
65
67
|
"add-protocol": "rse protocol add",
|
|
66
68
|
"delete-protocol": "rse protocol remove",
|
|
@@ -75,15 +77,7 @@ def make_warning():
|
|
|
75
77
|
"scope": {"-h": "scope -h", "add": "scope add", "list": "scope list"},
|
|
76
78
|
"config": {"-h": "config -h", "get": "config list", "set": "config add", "delete": "config remove"},
|
|
77
79
|
"subscription": {"-h": "subscription -h", "add": "subscription add", "list": "subscription", "update": "subscription update", "reevaluate": "subscription touch"},
|
|
78
|
-
"replicas": {
|
|
79
|
-
"-h": "replica -h",
|
|
80
|
-
"quarantine": "replica state quarantine",
|
|
81
|
-
"declare-bad": "replica state bad",
|
|
82
|
-
"declare-temporary-unavailable":
|
|
83
|
-
"replica state unavailable",
|
|
84
|
-
"set-tombstone": "replica remove",
|
|
85
|
-
"list-pfns": "replica list file --pfns"
|
|
86
|
-
},
|
|
80
|
+
"replicas": {"-h": "replica -h", "quarantine": "replica state update quarantine", "declare-bad": "replica state update bad", "declare-temporary-unavailable": "replica state update unavailable", "set-tombstone": "replica remove"},
|
|
87
81
|
}
|
|
88
82
|
try:
|
|
89
83
|
new_command = command_map[first_command]
|
|
@@ -77,7 +77,7 @@ default = sqlite:////tmp/rucio.db
|
|
|
77
77
|
#default = oracle://_____________:___________@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=______))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=_____________)))
|
|
78
78
|
#schema=atlas_rucio # only for cern oracle
|
|
79
79
|
#default = mysql+pymysql://rucio:rucio@localhost/rucio
|
|
80
|
-
#default = postgresql://rucio:rucio@localhost/rucio
|
|
80
|
+
#default = postgresql+psycopg://rucio:rucio@localhost/rucio
|
|
81
81
|
pool_recycle=3600
|
|
82
82
|
echo=0
|
|
83
83
|
pool_reset_on_return=rollback
|
|
@@ -211,23 +211,6 @@ fts_servers = https://fts3-pilot.cern.ch:8446, https://fts3-devel.cern.ch:8446,
|
|
|
211
211
|
cache = /opt/rucio/auditor-cache
|
|
212
212
|
results = /opt/rucio/auditor-results
|
|
213
213
|
|
|
214
|
-
[c3po]
|
|
215
|
-
placement_algorithm = t2_free_space
|
|
216
|
-
elastic_url = http://aianalytics01.cern.ch:9200
|
|
217
|
-
redis_host = localhost
|
|
218
|
-
redis_port = 6379
|
|
219
|
-
|
|
220
|
-
[c3po-popularity]
|
|
221
|
-
elastic_url = http://rucio-logger-prod-01.cern.ch:9200
|
|
222
|
-
|
|
223
|
-
[c3po-site-mapper]
|
|
224
|
-
panda_url = http://atlas-agis-api.cern.ch/request/pandaqueue/query/list/?json
|
|
225
|
-
ddm_url = http://atlas-agis-api.cern.ch/request/ddmendpoint/query/list/?json
|
|
226
|
-
|
|
227
|
-
[c3po-workload]
|
|
228
|
-
panda_url = http://bigpanda.cern.ch/jobs/?category=analysis&jobstatus=running
|
|
229
|
-
window = 604800
|
|
230
|
-
|
|
231
214
|
[policy]
|
|
232
215
|
package = atlas_rucio_policy_package
|
|
233
216
|
permission = atlas
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
from rucio.cli import command # noqa: F401
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
import click
|
|
15
|
+
|
|
16
|
+
from rucio.cli.bin_legacy.rucio import list_account_usage
|
|
17
|
+
from rucio.cli.bin_legacy.rucio_admin import (
|
|
18
|
+
add_account,
|
|
19
|
+
add_account_attribute,
|
|
20
|
+
ban_account,
|
|
21
|
+
delete_account,
|
|
22
|
+
delete_account_attribute,
|
|
23
|
+
delete_limits,
|
|
24
|
+
identity_delete,
|
|
25
|
+
info_account,
|
|
26
|
+
list_account_attributes,
|
|
27
|
+
list_accounts,
|
|
28
|
+
list_identities,
|
|
29
|
+
set_limits,
|
|
30
|
+
unban_account,
|
|
31
|
+
update_account,
|
|
32
|
+
)
|
|
33
|
+
from rucio.cli.bin_legacy.rucio_admin import identity_add as legacy_identity_add
|
|
34
|
+
from rucio.cli.utils import Arguments
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@click.group()
|
|
38
|
+
def account():
|
|
39
|
+
"""Methods to add or change accounts for users, groups, and services. Used to assign privileges"""
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@account.command("add")
|
|
43
|
+
@click.argument("account-name")
|
|
44
|
+
@click.argument("account-type", type=click.Choice(["USER", "GROUP", "SERVICE"]))
|
|
45
|
+
@click.option("--email", type=str, help="Email address associated with the account")
|
|
46
|
+
@click.pass_context
|
|
47
|
+
def add_(ctx, account_type, account_name, email):
|
|
48
|
+
"""Add an account of type [ACCOUNT-TYPE] with the name [ACCOUNT-NAME]
|
|
49
|
+
|
|
50
|
+
\b
|
|
51
|
+
Example:
|
|
52
|
+
$ rucio account add
|
|
53
|
+
"""
|
|
54
|
+
args = Arguments({"account_type": account_type, "account": account_name, "email": email})
|
|
55
|
+
add_account(args, ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@account.command("list")
|
|
59
|
+
@click.option("--type", "type_", type=click.Choice(["USER", "GROUP", "SERVICE"]))
|
|
60
|
+
@click.option("--id", help="Filter by identity (e.g. DN)")
|
|
61
|
+
@click.option("--filter", help="Filter arguments in form `key=value,another_key=next_value`") # TODO Explicit numeration of these possible keys
|
|
62
|
+
@click.pass_context
|
|
63
|
+
def list_(ctx, type_, id, filter):
|
|
64
|
+
"""List all accounts that match given filters"""
|
|
65
|
+
args = Arguments({"account_type": type_, "identity": id, "filters": filter})
|
|
66
|
+
list_accounts(args, ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@account.command("show")
|
|
70
|
+
@click.argument("account-name")
|
|
71
|
+
@click.pass_context
|
|
72
|
+
def show(ctx, account_name):
|
|
73
|
+
"""
|
|
74
|
+
Show info about a single account
|
|
75
|
+
"""
|
|
76
|
+
info_account(Arguments({"account": account_name}), ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@account.command("remove")
|
|
80
|
+
@click.argument("account-name")
|
|
81
|
+
@click.pass_context
|
|
82
|
+
def remove(ctx, account_name):
|
|
83
|
+
"""
|
|
84
|
+
Remove an account
|
|
85
|
+
(WARNING: Permanently disables the account. If you want to temporarily disable, use `account update [account-name] --ban`)
|
|
86
|
+
"""
|
|
87
|
+
delete_account(Arguments({"account": account_name}), ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@account.command("update")
|
|
91
|
+
@click.argument("account-name")
|
|
92
|
+
@click.option("--email", help="Email address associated with the account")
|
|
93
|
+
@click.option("--ban/--unban", default=None, help="Temporarily disable/enable an account")
|
|
94
|
+
@click.pass_context
|
|
95
|
+
def update(ctx, ban, account_name, email):
|
|
96
|
+
"""Update account settings"""
|
|
97
|
+
args = Arguments({"account": account_name, "key": "email", "value": email})
|
|
98
|
+
if ban is not None:
|
|
99
|
+
if ban:
|
|
100
|
+
ban_account(args, ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
101
|
+
else:
|
|
102
|
+
unban_account(args, ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
103
|
+
else:
|
|
104
|
+
update_account(args, ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@account.group()
|
|
108
|
+
def attribute():
|
|
109
|
+
"""View or modify account attributes"""
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
@attribute.command("list")
|
|
113
|
+
@click.argument("account-name")
|
|
114
|
+
@click.pass_context
|
|
115
|
+
def attribute_list(ctx, account_name):
|
|
116
|
+
"List the attributes for a given account"
|
|
117
|
+
list_account_attributes(Arguments({"account": account_name}), ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@attribute.command("add")
|
|
121
|
+
@click.argument("account-name")
|
|
122
|
+
@click.option('--key', help='Attribute key', required=True)
|
|
123
|
+
@click.option('--value', help='Attribute value', required=True)
|
|
124
|
+
@click.pass_context
|
|
125
|
+
def attribute_add(ctx, account_name, key, value):
|
|
126
|
+
"""Add a new attribute [key] to an account"""
|
|
127
|
+
add_account_attribute(Arguments({"account": account_name, "key": key, "value": value}), ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
@attribute.command("remove")
|
|
131
|
+
@click.argument("account-name")
|
|
132
|
+
@click.option("--key", help="Attribute key", required=True)
|
|
133
|
+
@click.pass_context
|
|
134
|
+
def attribute_remove(ctx, account_name, key):
|
|
135
|
+
"""Remove an attribute from an account without reassigning it"""
|
|
136
|
+
delete_account_attribute(Arguments({"account": account_name, "key": key}), ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
@account.group("limit")
|
|
140
|
+
def limit():
|
|
141
|
+
"""View or modify account limits - limit how much data an account can store on an RSE"""
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
@limit.command("list", help="Shows the space used, the quota limit and the quota left for an account for every RSE where the user have quota.")
|
|
145
|
+
@click.argument("account-name")
|
|
146
|
+
@click.option("--rse", "--rse-name", help="Show usage for only for this RSE.")
|
|
147
|
+
@click.pass_context
|
|
148
|
+
def limit_list(ctx, account_name, rse):
|
|
149
|
+
"""List the limits and current usage for an account"""
|
|
150
|
+
args = Arguments({"usage_account": account_name, "rse": rse})
|
|
151
|
+
list_account_usage(args, ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
@limit.command("add")
|
|
155
|
+
@click.argument(
|
|
156
|
+
"account-name",
|
|
157
|
+
)
|
|
158
|
+
@click.option("--rse", "--rse-name", help="Full RSE name", required=True) # TODO Separate RSE (local) and RSE Expression (global)
|
|
159
|
+
@click.option("--bytes", "bytes_", help='Value of the limit; can be specified in bytes ("10000"), with a storage unit ("10GB"), or "infinity"', required=True)
|
|
160
|
+
@click.option("--locality", type=click.Choice(["local", "global"]), help="Global or local limit scope", default="local")
|
|
161
|
+
@click.pass_context
|
|
162
|
+
def limit_add(ctx, account_name, rse, bytes_, locality):
|
|
163
|
+
"""Add a new limit for an account on an RSE. An account can have both local and global limits on the same RSE."""
|
|
164
|
+
args = Arguments({"account": account_name, "rse": rse, "bytes": bytes_, "locality": locality})
|
|
165
|
+
set_limits(args, ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
@limit.command("remove")
|
|
169
|
+
@click.argument(
|
|
170
|
+
"account-name",
|
|
171
|
+
)
|
|
172
|
+
@click.option("--rse", "--rse-name", help="Full RSE name", required=True)
|
|
173
|
+
@click.option("--locality", type=click.Choice(["local", "global"]), help="Global or local limit scope", default="local")
|
|
174
|
+
@click.pass_context
|
|
175
|
+
def limit_remove(ctx, account_name, rse, locality):
|
|
176
|
+
"""Remove existing limits for an account on an RSE"""
|
|
177
|
+
args = Arguments({"account": account_name, "rse": rse, "locality": locality})
|
|
178
|
+
delete_limits(args, ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
@account.group("identity")
|
|
182
|
+
def identity():
|
|
183
|
+
"""Manage identities for an account - used to login"""
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
@identity.command("list")
|
|
187
|
+
@click.argument("account-name", required=True)
|
|
188
|
+
@click.pass_context
|
|
189
|
+
def identity_list(ctx, account_name):
|
|
190
|
+
"""See all the IDs for [account-name]"""
|
|
191
|
+
args = Arguments({"account": account_name})
|
|
192
|
+
list_identities(args, ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
@identity.command("add")
|
|
196
|
+
@click.argument("account-name", required=True)
|
|
197
|
+
@click.option("--type", "type_", type=click.Choice(["X509", "GSS", "USERPASS", "SSH", "SAML", "OIDC"]), help="Authentication type", required=True)
|
|
198
|
+
@click.option("--id", help="Identity", required=True)
|
|
199
|
+
@click.option("--email", help="Email address associated with the identity", required=True)
|
|
200
|
+
@click.option("--password", help="Password if authtype is USERPASS")
|
|
201
|
+
@click.pass_context
|
|
202
|
+
def identity_add(ctx, account_name, type_, id, email, password):
|
|
203
|
+
"""Add a new identity for [account-name]"""
|
|
204
|
+
args = Arguments({"account": account_name, "authtype": type_, "identity": id, "email": email, "password": password})
|
|
205
|
+
legacy_identity_add(args, ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
@identity.command("remove")
|
|
209
|
+
@click.argument("account-name", required=True)
|
|
210
|
+
@click.option("--type", "type_", type=click.Choice(["X509", "GSS", "USERPASS", "SSH", "SAML", "OIDC"]), help="Authentication type", required=True)
|
|
211
|
+
@click.option("--id", help="Identity", required=True)
|
|
212
|
+
@click.pass_context
|
|
213
|
+
def identity_remove(ctx, account_name, type_, id):
|
|
214
|
+
"""Revoke a given ID's access from an account"""
|
|
215
|
+
args = Arguments({"account": account_name, "authtype": type_, "id": id})
|
|
216
|
+
identity_delete(args, ctx.obj.client, ctx.obj.logger, ctx.obj.console, ctx.obj.spinner)
|
|
@@ -39,7 +39,7 @@ from tabulate import tabulate
|
|
|
39
39
|
|
|
40
40
|
# rucio module has the same name as this executable module, so this rule fails. pylint: disable=no-name-in-module
|
|
41
41
|
from rucio import version
|
|
42
|
-
from rucio.
|
|
42
|
+
from rucio.cli.utils import exception_handler, get_client, setup_gfal2_logger, signal_handler
|
|
43
43
|
from rucio.client.richclient import MAX_TRACEBACK_WIDTH, MIN_CONSOLE_WIDTH, CLITheme, generate_table, get_cli_config, get_pager, print_output, setup_rich_logger
|
|
44
44
|
from rucio.common.client import detect_client_location
|
|
45
45
|
from rucio.common.config import config_get, config_get_float
|
|
@@ -1993,15 +1993,16 @@ def add_lifetime_exception(args, client, logger, console, spinner):
|
|
|
1993
1993
|
dids_list = []
|
|
1994
1994
|
containers = []
|
|
1995
1995
|
datasets = []
|
|
1996
|
-
error_types = ['Total DIDs',
|
|
1997
|
-
'DID not submitted because it is a file',
|
|
1998
|
-
'DID that are containers and were resolved',
|
|
1999
|
-
'DID not submitted because it is not part of the lifetime campaign',
|
|
2000
|
-
'DID successfully submitted including the one from containers resolved']
|
|
2001
1996
|
for did in dids:
|
|
2002
1997
|
scope, name = get_scope(did, client)
|
|
2003
1998
|
dids_list.append({'scope': scope, 'name': name})
|
|
2004
|
-
|
|
1999
|
+
error_summary = {
|
|
2000
|
+
"total_dids": {"description": "Total DIDs", "count": len(dids_list)},
|
|
2001
|
+
"files_ignored": {"description": "DID not submitted because it is a file", "count": 0},
|
|
2002
|
+
"containers_resolved": {"description": "DID that are containers and were resolved", "count": 0},
|
|
2003
|
+
"not_in_lifetime_model": {"description": "DID not submitted because it is not part of the lifetime campaign", "count": 0},
|
|
2004
|
+
"successfully_submitted": {"description": "DID successfully submitted including the one from containers resolved", "count": 0},
|
|
2005
|
+
}
|
|
2005
2006
|
chunk_limit = 500 # Server should be able to accept 1000
|
|
2006
2007
|
dids_list_copy = deepcopy(dids_list)
|
|
2007
2008
|
for chunk in chunks(dids_list_copy, chunk_limit):
|
|
@@ -2010,18 +2011,18 @@ def add_lifetime_exception(args, client, logger, console, spinner):
|
|
|
2010
2011
|
dids_list.remove({'scope': scope, 'name': name})
|
|
2011
2012
|
if meta['did_type'] == 'FILE':
|
|
2012
2013
|
logger.warning('%s:%s is a file. Will be ignored' % (scope, name))
|
|
2013
|
-
|
|
2014
|
+
error_summary["files_ignored"]["count"] += 1
|
|
2014
2015
|
elif meta['did_type'] == 'CONTAINER':
|
|
2015
2016
|
logger.warning('%s:%s is a container. It needs to be resolved' % (scope, name))
|
|
2016
2017
|
containers.append({'scope': scope, 'name': name})
|
|
2017
|
-
|
|
2018
|
+
error_summary["containers_resolved"]["count"] += 1
|
|
2018
2019
|
elif not meta['eol_at']:
|
|
2019
2020
|
logger.warning('%s:%s is not affected by the lifetime model' % (scope, name))
|
|
2020
|
-
|
|
2021
|
+
error_summary["not_in_lifetime_model"]["count"] += 1
|
|
2021
2022
|
else:
|
|
2022
2023
|
logger.info('%s:%s will be declared' % (scope, name))
|
|
2023
2024
|
datasets.append({'scope': scope, 'name': name})
|
|
2024
|
-
|
|
2025
|
+
error_summary["successfully_submitted"]["count"] += 1
|
|
2025
2026
|
|
|
2026
2027
|
for did in dids_list:
|
|
2027
2028
|
scope = did['scope']
|
|
@@ -2039,12 +2040,11 @@ def add_lifetime_exception(args, client, logger, console, spinner):
|
|
|
2039
2040
|
logger.debug('%s:%s' % (scope, name))
|
|
2040
2041
|
if not meta['eol_at']:
|
|
2041
2042
|
logger.warning('%s:%s is not affected by the lifetime model' % (scope, name))
|
|
2042
|
-
|
|
2043
|
+
error_summary["not_in_lifetime_model"]["count"] += 1
|
|
2043
2044
|
else:
|
|
2044
2045
|
logger.info('%s:%s will be declared' % (scope, name))
|
|
2045
2046
|
datasets.append({'scope': scope, 'name': name})
|
|
2046
|
-
|
|
2047
|
-
|
|
2047
|
+
error_summary["successfully_submitted"]["count"] += 1
|
|
2048
2048
|
if not datasets:
|
|
2049
2049
|
logger.error('Nothing to submit')
|
|
2050
2050
|
return SUCCESS
|
|
@@ -2066,8 +2066,8 @@ def add_lifetime_exception(args, client, logger, console, spinner):
|
|
|
2066
2066
|
return FAILURE
|
|
2067
2067
|
|
|
2068
2068
|
logger.info('Exception successfully submitted. Summary below:')
|
|
2069
|
-
for
|
|
2070
|
-
print('{0:100} {1:6d}'.format(
|
|
2069
|
+
for key, data in error_summary.items():
|
|
2070
|
+
print('{0:100} {1:6d}'.format(data["description"], data["count"]))
|
|
2071
2071
|
return SUCCESS
|
|
2072
2072
|
|
|
2073
2073
|
|
|
@@ -33,7 +33,7 @@ from rich.tree import Tree
|
|
|
33
33
|
from tabulate import tabulate
|
|
34
34
|
|
|
35
35
|
from rucio import version
|
|
36
|
-
from rucio.
|
|
36
|
+
from rucio.cli.utils import exception_handler, get_client, setup_gfal2_logger, signal_handler
|
|
37
37
|
from rucio.client.richclient import MAX_TRACEBACK_WIDTH, MIN_CONSOLE_WIDTH, CLITheme, generate_table, get_cli_config, get_pager, print_output, setup_rich_logger
|
|
38
38
|
from rucio.common.constants import RseAttr
|
|
39
39
|
from rucio.common.exception import (
|