rucio 32.8.6__py3-none-any.whl → 35.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.
Potentially problematic release.
This version of rucio might be problematic. Click here for more details.
- rucio/__init__.py +0 -1
- rucio/alembicrevision.py +1 -2
- rucio/client/__init__.py +0 -1
- rucio/client/accountclient.py +45 -25
- rucio/client/accountlimitclient.py +37 -9
- rucio/client/baseclient.py +199 -154
- rucio/client/client.py +2 -3
- rucio/client/configclient.py +19 -6
- rucio/client/credentialclient.py +9 -4
- rucio/client/didclient.py +238 -63
- rucio/client/diracclient.py +13 -5
- rucio/client/downloadclient.py +162 -51
- rucio/client/exportclient.py +4 -4
- rucio/client/fileclient.py +3 -4
- rucio/client/importclient.py +4 -4
- rucio/client/lifetimeclient.py +21 -5
- rucio/client/lockclient.py +18 -8
- rucio/client/{metaclient.py → metaconventionsclient.py} +18 -15
- rucio/client/pingclient.py +0 -1
- rucio/client/replicaclient.py +15 -5
- rucio/client/requestclient.py +35 -19
- rucio/client/rseclient.py +133 -51
- rucio/client/ruleclient.py +29 -22
- rucio/client/scopeclient.py +8 -6
- rucio/client/subscriptionclient.py +47 -35
- rucio/client/touchclient.py +8 -4
- rucio/client/uploadclient.py +166 -82
- rucio/common/__init__.py +0 -1
- rucio/common/cache.py +4 -4
- rucio/common/config.py +52 -47
- rucio/common/constants.py +69 -2
- rucio/common/constraints.py +0 -1
- rucio/common/didtype.py +24 -22
- rucio/common/dumper/__init__.py +70 -41
- rucio/common/dumper/consistency.py +26 -22
- rucio/common/dumper/data_models.py +16 -23
- rucio/common/dumper/path_parsing.py +0 -1
- rucio/common/exception.py +281 -222
- rucio/common/extra.py +0 -1
- rucio/common/logging.py +54 -38
- rucio/common/pcache.py +122 -101
- rucio/common/plugins.py +153 -0
- rucio/common/policy.py +4 -4
- rucio/common/schema/__init__.py +17 -10
- rucio/common/schema/atlas.py +7 -5
- rucio/common/schema/belleii.py +7 -5
- rucio/common/schema/domatpc.py +7 -5
- rucio/common/schema/escape.py +7 -5
- rucio/common/schema/generic.py +8 -6
- rucio/common/schema/generic_multi_vo.py +7 -5
- rucio/common/schema/icecube.py +7 -5
- rucio/common/stomp_utils.py +0 -1
- rucio/common/stopwatch.py +0 -1
- rucio/common/test_rucio_server.py +2 -2
- rucio/common/types.py +262 -17
- rucio/common/utils.py +743 -451
- rucio/core/__init__.py +0 -1
- rucio/core/account.py +99 -29
- rucio/core/account_counter.py +89 -24
- rucio/core/account_limit.py +90 -24
- rucio/core/authentication.py +86 -29
- rucio/core/config.py +108 -38
- rucio/core/credential.py +14 -7
- rucio/core/did.py +680 -782
- rucio/core/did_meta_plugins/__init__.py +8 -6
- rucio/core/did_meta_plugins/did_column_meta.py +17 -12
- rucio/core/did_meta_plugins/did_meta_plugin_interface.py +60 -11
- rucio/core/did_meta_plugins/filter_engine.py +90 -50
- rucio/core/did_meta_plugins/json_meta.py +41 -16
- rucio/core/did_meta_plugins/mongo_meta.py +25 -8
- rucio/core/did_meta_plugins/postgres_meta.py +3 -4
- rucio/core/dirac.py +46 -17
- rucio/core/distance.py +66 -43
- rucio/core/exporter.py +5 -5
- rucio/core/heartbeat.py +181 -81
- rucio/core/identity.py +22 -12
- rucio/core/importer.py +23 -12
- rucio/core/lifetime_exception.py +32 -32
- rucio/core/lock.py +244 -142
- rucio/core/message.py +79 -38
- rucio/core/{meta.py → meta_conventions.py} +57 -44
- rucio/core/monitor.py +19 -13
- rucio/core/naming_convention.py +68 -27
- rucio/core/nongrid_trace.py +17 -5
- rucio/core/oidc.py +151 -29
- rucio/core/permission/__init__.py +18 -6
- rucio/core/permission/atlas.py +50 -35
- rucio/core/permission/belleii.py +6 -5
- rucio/core/permission/escape.py +8 -6
- rucio/core/permission/generic.py +82 -80
- rucio/core/permission/generic_multi_vo.py +9 -7
- rucio/core/quarantined_replica.py +91 -58
- rucio/core/replica.py +1303 -772
- rucio/core/replica_sorter.py +10 -12
- rucio/core/request.py +1133 -285
- rucio/core/rse.py +142 -102
- rucio/core/rse_counter.py +49 -18
- rucio/core/rse_expression_parser.py +6 -7
- rucio/core/rse_selector.py +41 -16
- rucio/core/rule.py +1538 -474
- rucio/core/rule_grouping.py +213 -68
- rucio/core/scope.py +50 -22
- rucio/core/subscription.py +92 -44
- rucio/core/topology.py +66 -24
- rucio/core/trace.py +42 -28
- rucio/core/transfer.py +543 -259
- rucio/core/vo.py +36 -18
- rucio/core/volatile_replica.py +59 -32
- rucio/daemons/__init__.py +0 -1
- rucio/daemons/abacus/__init__.py +0 -1
- rucio/daemons/abacus/account.py +29 -19
- rucio/daemons/abacus/collection_replica.py +21 -10
- rucio/daemons/abacus/rse.py +22 -12
- rucio/daemons/atropos/__init__.py +0 -1
- rucio/daemons/atropos/atropos.py +1 -2
- rucio/daemons/auditor/__init__.py +56 -28
- rucio/daemons/auditor/hdfs.py +17 -6
- rucio/daemons/auditor/srmdumps.py +116 -45
- rucio/daemons/automatix/__init__.py +0 -1
- rucio/daemons/automatix/automatix.py +30 -18
- rucio/daemons/badreplicas/__init__.py +0 -1
- rucio/daemons/badreplicas/minos.py +29 -18
- rucio/daemons/badreplicas/minos_temporary_expiration.py +5 -7
- rucio/daemons/badreplicas/necromancer.py +9 -13
- rucio/daemons/bb8/__init__.py +0 -1
- rucio/daemons/bb8/bb8.py +10 -13
- rucio/daemons/bb8/common.py +151 -154
- rucio/daemons/bb8/nuclei_background_rebalance.py +15 -9
- rucio/daemons/bb8/t2_background_rebalance.py +15 -8
- rucio/daemons/c3po/__init__.py +0 -1
- rucio/daemons/c3po/algorithms/__init__.py +0 -1
- rucio/daemons/c3po/algorithms/simple.py +8 -5
- rucio/daemons/c3po/algorithms/t2_free_space.py +10 -7
- rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +10 -7
- rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +30 -15
- rucio/daemons/c3po/c3po.py +81 -52
- rucio/daemons/c3po/collectors/__init__.py +0 -1
- rucio/daemons/c3po/collectors/agis.py +17 -17
- rucio/daemons/c3po/collectors/free_space.py +32 -13
- rucio/daemons/c3po/collectors/jedi_did.py +14 -5
- rucio/daemons/c3po/collectors/mock_did.py +11 -6
- rucio/daemons/c3po/collectors/network_metrics.py +12 -4
- rucio/daemons/c3po/collectors/workload.py +21 -19
- rucio/daemons/c3po/utils/__init__.py +0 -1
- rucio/daemons/c3po/utils/dataset_cache.py +15 -5
- rucio/daemons/c3po/utils/expiring_dataset_cache.py +16 -5
- rucio/daemons/c3po/utils/expiring_list.py +6 -7
- rucio/daemons/c3po/utils/popularity.py +5 -2
- rucio/daemons/c3po/utils/timeseries.py +25 -12
- rucio/daemons/cache/__init__.py +0 -1
- rucio/daemons/cache/consumer.py +21 -15
- rucio/daemons/common.py +42 -18
- rucio/daemons/conveyor/__init__.py +0 -1
- rucio/daemons/conveyor/common.py +69 -37
- rucio/daemons/conveyor/finisher.py +83 -46
- rucio/daemons/conveyor/poller.py +101 -69
- rucio/daemons/conveyor/preparer.py +35 -28
- rucio/daemons/conveyor/receiver.py +64 -21
- rucio/daemons/conveyor/stager.py +33 -28
- rucio/daemons/conveyor/submitter.py +71 -47
- rucio/daemons/conveyor/throttler.py +99 -35
- rucio/daemons/follower/__init__.py +0 -1
- rucio/daemons/follower/follower.py +12 -8
- rucio/daemons/hermes/__init__.py +0 -1
- rucio/daemons/hermes/hermes.py +57 -21
- rucio/daemons/judge/__init__.py +0 -1
- rucio/daemons/judge/cleaner.py +27 -17
- rucio/daemons/judge/evaluator.py +31 -18
- rucio/daemons/judge/injector.py +31 -23
- rucio/daemons/judge/repairer.py +28 -18
- rucio/daemons/oauthmanager/__init__.py +0 -1
- rucio/daemons/oauthmanager/oauthmanager.py +7 -8
- rucio/daemons/reaper/__init__.py +0 -1
- rucio/daemons/reaper/dark_reaper.py +15 -9
- rucio/daemons/reaper/reaper.py +109 -67
- rucio/daemons/replicarecoverer/__init__.py +0 -1
- rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +255 -116
- rucio/{api → daemons/rsedecommissioner}/__init__.py +0 -1
- rucio/daemons/rsedecommissioner/config.py +81 -0
- rucio/daemons/rsedecommissioner/profiles/__init__.py +24 -0
- rucio/daemons/rsedecommissioner/profiles/atlas.py +60 -0
- rucio/daemons/rsedecommissioner/profiles/generic.py +451 -0
- rucio/daemons/rsedecommissioner/profiles/types.py +92 -0
- rucio/daemons/rsedecommissioner/rse_decommissioner.py +280 -0
- rucio/daemons/storage/__init__.py +0 -1
- rucio/daemons/storage/consistency/__init__.py +0 -1
- rucio/daemons/storage/consistency/actions.py +152 -59
- rucio/daemons/tracer/__init__.py +0 -1
- rucio/daemons/tracer/kronos.py +47 -24
- rucio/daemons/transmogrifier/__init__.py +0 -1
- rucio/daemons/transmogrifier/transmogrifier.py +35 -26
- rucio/daemons/undertaker/__init__.py +0 -1
- rucio/daemons/undertaker/undertaker.py +10 -10
- rucio/db/__init__.py +0 -1
- rucio/db/sqla/__init__.py +16 -2
- rucio/db/sqla/constants.py +10 -1
- rucio/db/sqla/migrate_repo/__init__.py +0 -1
- rucio/db/sqla/migrate_repo/env.py +0 -1
- rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +0 -1
- rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +1 -3
- rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -3
- rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +1 -4
- rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +0 -1
- rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +0 -2
- rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +0 -1
- rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +0 -1
- rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +0 -2
- rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -1
- rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +0 -1
- rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +0 -3
- rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -1
- rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +1 -2
- rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +0 -1
- rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +0 -3
- rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +1 -4
- rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +0 -2
- rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +0 -3
- rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +1 -2
- rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +0 -1
- rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -1
- rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +0 -2
- rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +0 -3
- rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +0 -2
- rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +1 -4
- rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +0 -3
- rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +1 -4
- rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +0 -1
- rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +1 -3
- rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +0 -2
- rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +1 -3
- rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +1 -2
- rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +1 -3
- rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +0 -2
- rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +2 -3
- rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -3
- rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +1 -4
- rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -1
- rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +0 -1
- rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +0 -3
- rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +0 -1
- rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +0 -2
- rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +0 -3
- rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +0 -2
- rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +2 -4
- rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -2
- rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +1 -4
- rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +0 -3
- rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +0 -2
- rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -3
- rucio/db/sqla/migrate_repo/versions/4df2c5ddabc0_remove_temporary_dids.py +55 -0
- rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +0 -2
- rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +0 -2
- rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +0 -3
- rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +1 -2
- rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +0 -3
- rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +1 -3
- rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +1 -3
- rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +1 -2
- rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +0 -3
- rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +1 -2
- rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +2 -4
- rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +0 -1
- rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +1 -4
- rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -2
- rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +1 -2
- rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +0 -3
- rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +1 -3
- rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -3
- rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -1
- rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +1 -2
- rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -2
- rucio/db/sqla/migrate_repo/versions/a08fa8de1545_transfer_stats_table.py +55 -0
- rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +1 -3
- rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +0 -2
- rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +1 -4
- rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +0 -1
- rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -1
- rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +1 -4
- rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +0 -1
- rucio/db/sqla/migrate_repo/versions/b0070f3695c8_add_deletedidmeta_table.py +57 -0
- rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +0 -3
- rucio/db/sqla/migrate_repo/versions/b5493606bbf5_fix_primary_key_for_subscription_history.py +41 -0
- rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +1 -2
- rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +1 -3
- rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +1 -5
- rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +1 -3
- rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +0 -3
- rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +1 -3
- rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +1 -2
- rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -3
- rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +1 -4
- rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +1 -2
- rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +1 -4
- rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +1 -3
- rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +1 -4
- rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +0 -2
- rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +1 -3
- rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -1
- rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +1 -2
- rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +1 -3
- rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -2
- rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +0 -1
- rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +1 -2
- rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +0 -3
- rucio/db/sqla/models.py +122 -216
- rucio/db/sqla/sautils.py +12 -5
- rucio/db/sqla/session.py +71 -43
- rucio/db/sqla/types.py +3 -4
- rucio/db/sqla/util.py +91 -69
- rucio/gateway/__init__.py +13 -0
- rucio/{api → gateway}/account.py +119 -46
- rucio/{api → gateway}/account_limit.py +12 -13
- rucio/{api → gateway}/authentication.py +106 -33
- rucio/{api → gateway}/config.py +12 -13
- rucio/{api → gateway}/credential.py +15 -4
- rucio/{api → gateway}/did.py +384 -140
- rucio/{api → gateway}/dirac.py +16 -6
- rucio/{api → gateway}/exporter.py +3 -4
- rucio/{api → gateway}/heartbeat.py +17 -5
- rucio/{api → gateway}/identity.py +63 -19
- rucio/{api → gateway}/importer.py +3 -4
- rucio/{api → gateway}/lifetime_exception.py +35 -10
- rucio/{api → gateway}/lock.py +34 -12
- rucio/{api/meta.py → gateway/meta_conventions.py} +18 -16
- rucio/{api → gateway}/permission.py +4 -5
- rucio/{api → gateway}/quarantined_replica.py +13 -4
- rucio/{api → gateway}/replica.py +12 -11
- rucio/{api → gateway}/request.py +129 -28
- rucio/{api → gateway}/rse.py +11 -12
- rucio/{api → gateway}/rule.py +117 -35
- rucio/{api → gateway}/scope.py +24 -14
- rucio/{api → gateway}/subscription.py +65 -43
- rucio/{api → gateway}/vo.py +17 -7
- rucio/rse/__init__.py +3 -4
- rucio/rse/protocols/__init__.py +0 -1
- rucio/rse/protocols/bittorrent.py +184 -0
- rucio/rse/protocols/cache.py +1 -2
- rucio/rse/protocols/dummy.py +1 -2
- rucio/rse/protocols/gfal.py +12 -10
- rucio/rse/protocols/globus.py +7 -7
- rucio/rse/protocols/gsiftp.py +2 -3
- rucio/rse/protocols/http_cache.py +1 -2
- rucio/rse/protocols/mock.py +1 -2
- rucio/rse/protocols/ngarc.py +1 -2
- rucio/rse/protocols/posix.py +12 -13
- rucio/rse/protocols/protocol.py +116 -52
- rucio/rse/protocols/rclone.py +6 -7
- rucio/rse/protocols/rfio.py +4 -5
- rucio/rse/protocols/srm.py +9 -10
- rucio/rse/protocols/ssh.py +8 -9
- rucio/rse/protocols/storm.py +2 -3
- rucio/rse/protocols/webdav.py +17 -14
- rucio/rse/protocols/xrootd.py +23 -17
- rucio/rse/rsemanager.py +19 -7
- rucio/tests/__init__.py +0 -1
- rucio/tests/common.py +43 -17
- rucio/tests/common_server.py +3 -3
- rucio/transfertool/__init__.py +0 -1
- rucio/transfertool/bittorrent.py +199 -0
- rucio/transfertool/bittorrent_driver.py +52 -0
- rucio/transfertool/bittorrent_driver_qbittorrent.py +133 -0
- rucio/transfertool/fts3.py +250 -138
- rucio/transfertool/fts3_plugins.py +152 -0
- rucio/transfertool/globus.py +9 -8
- rucio/transfertool/globus_library.py +1 -2
- rucio/transfertool/mock.py +21 -12
- rucio/transfertool/transfertool.py +33 -24
- rucio/vcsversion.py +4 -4
- rucio/version.py +5 -13
- rucio/web/__init__.py +0 -1
- rucio/web/rest/__init__.py +0 -1
- rucio/web/rest/flaskapi/__init__.py +0 -1
- rucio/web/rest/flaskapi/authenticated_bp.py +0 -1
- rucio/web/rest/flaskapi/v1/__init__.py +0 -1
- rucio/web/rest/flaskapi/v1/accountlimits.py +15 -13
- rucio/web/rest/flaskapi/v1/accounts.py +49 -48
- rucio/web/rest/flaskapi/v1/archives.py +12 -10
- rucio/web/rest/flaskapi/v1/auth.py +146 -144
- rucio/web/rest/flaskapi/v1/common.py +82 -41
- rucio/web/rest/flaskapi/v1/config.py +5 -6
- rucio/web/rest/flaskapi/v1/credentials.py +7 -8
- rucio/web/rest/flaskapi/v1/dids.py +158 -28
- rucio/web/rest/flaskapi/v1/dirac.py +8 -8
- rucio/web/rest/flaskapi/v1/export.py +3 -5
- rucio/web/rest/flaskapi/v1/heartbeats.py +3 -5
- rucio/web/rest/flaskapi/v1/identities.py +3 -5
- rucio/web/rest/flaskapi/v1/import.py +3 -4
- rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +6 -9
- rucio/web/rest/flaskapi/v1/locks.py +2 -4
- rucio/web/rest/flaskapi/v1/main.py +10 -2
- rucio/web/rest/flaskapi/v1/{meta.py → meta_conventions.py} +26 -11
- rucio/web/rest/flaskapi/v1/metrics.py +1 -2
- rucio/web/rest/flaskapi/v1/nongrid_traces.py +4 -4
- rucio/web/rest/flaskapi/v1/ping.py +6 -7
- rucio/web/rest/flaskapi/v1/redirect.py +8 -9
- rucio/web/rest/flaskapi/v1/replicas.py +43 -19
- rucio/web/rest/flaskapi/v1/requests.py +178 -21
- rucio/web/rest/flaskapi/v1/rses.py +61 -26
- rucio/web/rest/flaskapi/v1/rules.py +48 -18
- rucio/web/rest/flaskapi/v1/scopes.py +3 -5
- rucio/web/rest/flaskapi/v1/subscriptions.py +22 -18
- rucio/web/rest/flaskapi/v1/traces.py +4 -4
- rucio/web/rest/flaskapi/v1/types.py +20 -0
- rucio/web/rest/flaskapi/v1/vos.py +3 -5
- rucio/web/rest/main.py +0 -1
- rucio/web/rest/metrics.py +0 -1
- rucio/web/rest/ping.py +27 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/ldap.cfg.template +1 -1
- rucio-35.8.0.data/data/rucio/requirements.server.txt +268 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/bootstrap.py +3 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/merge_rucio_configs.py +2 -5
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/reset_database.py +3 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio +87 -85
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-account +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-collection-replica +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-rse +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-admin +45 -32
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-atropos +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-auditor +13 -7
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-automatix +1 -2
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-bb8 +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-c3po +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-cache-client +2 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-cache-consumer +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-finisher +1 -2
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-poller +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-preparer +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-receiver +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-stager +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-submitter +2 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-throttler +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-dark-reaper +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-dumper +11 -10
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-follower +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-hermes +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-cleaner +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-evaluator +2 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-injector +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-repairer +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-kronos +1 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-minos +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-minos-temporary-expiration +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-necromancer +1 -2
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-oauth-manager +2 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-reaper +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-replica-recoverer +6 -7
- rucio-35.8.0.data/scripts/rucio-rse-decommissioner +66 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-storage-consistency-actions +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-transmogrifier +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-undertaker +1 -2
- rucio-35.8.0.dist-info/METADATA +72 -0
- rucio-35.8.0.dist-info/RECORD +493 -0
- {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/WHEEL +1 -1
- {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/licenses/AUTHORS.rst +3 -0
- rucio/api/temporary_did.py +0 -49
- rucio/common/schema/cms.py +0 -478
- rucio/common/schema/lsst.py +0 -423
- rucio/core/permission/cms.py +0 -1166
- rucio/core/temporary_did.py +0 -188
- rucio/daemons/reaper/light_reaper.py +0 -255
- rucio/web/rest/flaskapi/v1/tmp_dids.py +0 -115
- rucio-32.8.6.data/data/rucio/requirements.txt +0 -55
- rucio-32.8.6.data/scripts/rucio-light-reaper +0 -53
- rucio-32.8.6.dist-info/METADATA +0 -83
- rucio-32.8.6.dist-info/RECORD +0 -481
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/alembic.ini.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/alembic_offline.ini.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/globus-config.yml.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rse-accounts.cfg.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio.cfg.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio_multi_vo.cfg.template +0 -0
- {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/licenses/LICENSE +0 -0
- {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/top_level.txt +0 -0
rucio/{api → gateway}/did.py
RENAMED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
3
2
|
#
|
|
4
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -13,27 +12,40 @@
|
|
|
13
12
|
# See the License for the specific language governing permissions and
|
|
14
13
|
# limitations under the License.
|
|
15
14
|
|
|
15
|
+
from collections.abc import Iterable, Iterator, Mapping, Sequence
|
|
16
16
|
from copy import deepcopy
|
|
17
|
-
from typing import TYPE_CHECKING
|
|
17
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
18
18
|
|
|
19
|
-
import rucio.
|
|
19
|
+
import rucio.gateway.permission
|
|
20
20
|
from rucio.common.constants import RESERVED_KEYS
|
|
21
|
-
from rucio.common.exception import RucioException
|
|
21
|
+
from rucio.common.exception import AccessDenied, InvalidObject, RucioException
|
|
22
22
|
from rucio.common.schema import validate_schema
|
|
23
23
|
from rucio.common.types import InternalAccount, InternalScope
|
|
24
|
-
from rucio.common.utils import
|
|
25
|
-
from rucio.core import did, naming_convention
|
|
24
|
+
from rucio.common.utils import gateway_update_return_dict
|
|
25
|
+
from rucio.core import did, naming_convention
|
|
26
|
+
from rucio.core import meta_conventions as meta_convention_core
|
|
26
27
|
from rucio.core.rse import get_rse_id
|
|
27
28
|
from rucio.db.sqla.constants import DIDType
|
|
28
29
|
from rucio.db.sqla.session import read_session, stream_session, transactional_session
|
|
29
30
|
|
|
30
31
|
if TYPE_CHECKING:
|
|
31
|
-
from typing import Any, Optional
|
|
32
32
|
from sqlalchemy.orm import Session
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
@stream_session
|
|
36
|
-
def list_dids(
|
|
36
|
+
def list_dids(
|
|
37
|
+
scope: str,
|
|
38
|
+
filters: Mapping[Any, Any],
|
|
39
|
+
did_type: str = 'collection',
|
|
40
|
+
ignore_case: bool = False,
|
|
41
|
+
limit: Optional[int] = None,
|
|
42
|
+
offset: Optional[int] = None,
|
|
43
|
+
long: bool = False,
|
|
44
|
+
recursive: bool = False,
|
|
45
|
+
vo: str = 'def',
|
|
46
|
+
*,
|
|
47
|
+
session: "Session"
|
|
48
|
+
) -> Iterator[dict[str, Any]]:
|
|
37
49
|
"""
|
|
38
50
|
List dids in a scope.
|
|
39
51
|
|
|
@@ -48,7 +60,7 @@ def list_dids(scope, filters, did_type='collection', ignore_case=False, limit=No
|
|
|
48
60
|
:param vo: The VO to act on.
|
|
49
61
|
:param session: The database session in use.
|
|
50
62
|
"""
|
|
51
|
-
|
|
63
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
52
64
|
|
|
53
65
|
# replace account and scope in filters with internal representation
|
|
54
66
|
for or_group in filters:
|
|
@@ -57,15 +69,30 @@ def list_dids(scope, filters, did_type='collection', ignore_case=False, limit=No
|
|
|
57
69
|
if 'scope' in or_group:
|
|
58
70
|
or_group['account'] = InternalScope(or_group['scope'], vo=vo)
|
|
59
71
|
|
|
60
|
-
result = did.list_dids(scope=
|
|
72
|
+
result = did.list_dids(scope=internal_scope, filters=filters, did_type=did_type, ignore_case=ignore_case,
|
|
61
73
|
limit=limit, offset=offset, long=long, recursive=recursive, session=session)
|
|
62
74
|
|
|
63
75
|
for d in result:
|
|
64
|
-
yield
|
|
76
|
+
yield gateway_update_return_dict(d, session=session)
|
|
65
77
|
|
|
66
78
|
|
|
67
79
|
@transactional_session
|
|
68
|
-
def add_did(
|
|
80
|
+
def add_did(
|
|
81
|
+
scope: str,
|
|
82
|
+
name: str,
|
|
83
|
+
did_type: str,
|
|
84
|
+
issuer: str,
|
|
85
|
+
account: Optional[str] = None,
|
|
86
|
+
statuses: Optional[dict[str, str]] = None,
|
|
87
|
+
meta: Optional[dict[str, str]] = None,
|
|
88
|
+
rules: Optional[Sequence[dict[str, Any]]] = None,
|
|
89
|
+
lifetime: Optional[str] = None,
|
|
90
|
+
dids: Optional[Sequence[dict[str, Any]]] = None,
|
|
91
|
+
rse: Optional[str] = None,
|
|
92
|
+
vo: str = 'def',
|
|
93
|
+
*,
|
|
94
|
+
session: "Session"
|
|
95
|
+
) -> None:
|
|
69
96
|
"""
|
|
70
97
|
Add data did.
|
|
71
98
|
|
|
@@ -83,18 +110,21 @@ def add_did(scope, name, did_type, issuer, account=None, statuses={}, meta={}, r
|
|
|
83
110
|
:param vo: The VO to act on.
|
|
84
111
|
:param session: The database session in use.
|
|
85
112
|
"""
|
|
113
|
+
statuses = statuses or {}
|
|
114
|
+
meta = meta or {}
|
|
115
|
+
rules = rules or []
|
|
116
|
+
dids = dids or []
|
|
86
117
|
v_did = {'name': name, 'type': did_type.upper(), 'scope': scope}
|
|
87
118
|
validate_schema(name='did', obj=v_did, vo=vo)
|
|
88
119
|
validate_schema(name='dids', obj=dids, vo=vo)
|
|
89
120
|
validate_schema(name='rse', obj=rse, vo=vo)
|
|
90
121
|
kwargs = {'scope': scope, 'name': name, 'type': did_type, 'issuer': issuer, 'account': account, 'statuses': statuses, 'meta': meta, 'rules': rules, 'lifetime': lifetime}
|
|
91
|
-
if not rucio.
|
|
92
|
-
raise
|
|
122
|
+
if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='add_did', kwargs=kwargs, session=session):
|
|
123
|
+
raise AccessDenied('Account %s can not add data identifier to scope %s' % (issuer, scope))
|
|
93
124
|
|
|
94
|
-
if account is
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
scope = InternalScope(scope, vo=vo)
|
|
125
|
+
owner_account = None if account is None else InternalAccount(account, vo=vo)
|
|
126
|
+
issuer_account = InternalAccount(issuer, vo=vo)
|
|
127
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
98
128
|
for d in dids:
|
|
99
129
|
d['scope'] = InternalScope(d['scope'], vo=vo)
|
|
100
130
|
for r in rules:
|
|
@@ -106,7 +136,7 @@ def add_did(scope, name, did_type, issuer, account=None, statuses={}, meta={}, r
|
|
|
106
136
|
|
|
107
137
|
if did_type == 'DATASET':
|
|
108
138
|
# naming_convention validation
|
|
109
|
-
extra_meta = naming_convention.validate_name(scope=
|
|
139
|
+
extra_meta = naming_convention.validate_name(scope=internal_scope, name=name, did_type='D', session=session)
|
|
110
140
|
|
|
111
141
|
# merge extra_meta with meta
|
|
112
142
|
for k in extra_meta or {}:
|
|
@@ -114,18 +144,24 @@ def add_did(scope, name, did_type, issuer, account=None, statuses={}, meta={}, r
|
|
|
114
144
|
meta[k] = extra_meta[k]
|
|
115
145
|
elif meta[k] != extra_meta[k]:
|
|
116
146
|
print("Provided metadata %s doesn't match the naming convention: %s != %s" % (k, meta[k], extra_meta[k]))
|
|
117
|
-
raise
|
|
147
|
+
raise InvalidObject("Provided metadata %s doesn't match the naming convention: %s != %s" % (k, meta[k], extra_meta[k]))
|
|
118
148
|
|
|
119
149
|
# Validate metadata
|
|
120
|
-
|
|
150
|
+
meta_convention_core.validate_meta(meta=meta, did_type=DIDType[did_type.upper()], session=session)
|
|
121
151
|
|
|
122
|
-
return did.add_did(scope=
|
|
152
|
+
return did.add_did(scope=internal_scope, name=name, did_type=DIDType[did_type.upper()], account=owner_account or issuer_account,
|
|
123
153
|
statuses=statuses, meta=meta, rules=rules, lifetime=lifetime,
|
|
124
154
|
dids=dids, rse_id=rse_id, session=session)
|
|
125
155
|
|
|
126
156
|
|
|
127
157
|
@transactional_session
|
|
128
|
-
def add_dids(
|
|
158
|
+
def add_dids(
|
|
159
|
+
dids: Sequence[dict[str, Any]],
|
|
160
|
+
issuer: str,
|
|
161
|
+
vo: str = 'def',
|
|
162
|
+
*,
|
|
163
|
+
session: "Session"
|
|
164
|
+
) -> None:
|
|
129
165
|
"""
|
|
130
166
|
Bulk Add did.
|
|
131
167
|
|
|
@@ -142,10 +178,10 @@ def add_dids(dids, issuer, vo='def', *, session: "Session"):
|
|
|
142
178
|
d['rse_id'] = rse_id
|
|
143
179
|
|
|
144
180
|
kwargs = {'issuer': issuer, 'dids': dids}
|
|
145
|
-
if not rucio.
|
|
146
|
-
raise
|
|
181
|
+
if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='add_dids', kwargs=kwargs, session=session):
|
|
182
|
+
raise AccessDenied('Account %s can not bulk add data identifier' % (issuer))
|
|
147
183
|
|
|
148
|
-
|
|
184
|
+
issuer_account = InternalAccount(issuer, vo=vo)
|
|
149
185
|
for d in dids:
|
|
150
186
|
d['scope'] = InternalScope(d['scope'], vo=vo)
|
|
151
187
|
if 'account' in d.keys():
|
|
@@ -153,11 +189,19 @@ def add_dids(dids, issuer, vo='def', *, session: "Session"):
|
|
|
153
189
|
if 'dids' in d.keys():
|
|
154
190
|
for child in d['dids']:
|
|
155
191
|
child['scope'] = InternalScope(child['scope'], vo=vo)
|
|
156
|
-
return did.add_dids(dids, account=
|
|
192
|
+
return did.add_dids(dids, account=issuer_account, session=session)
|
|
157
193
|
|
|
158
194
|
|
|
159
195
|
@transactional_session
|
|
160
|
-
def attach_dids(
|
|
196
|
+
def attach_dids(
|
|
197
|
+
scope: str,
|
|
198
|
+
name: str,
|
|
199
|
+
attachment: dict[str, Any],
|
|
200
|
+
issuer: str,
|
|
201
|
+
vo='def',
|
|
202
|
+
*,
|
|
203
|
+
session: "Session"
|
|
204
|
+
) -> None:
|
|
161
205
|
"""
|
|
162
206
|
Append content to data did.
|
|
163
207
|
|
|
@@ -175,11 +219,11 @@ def attach_dids(scope, name, attachment, issuer, vo='def', *, session: "Session"
|
|
|
175
219
|
attachment['rse_id'] = rse_id
|
|
176
220
|
|
|
177
221
|
kwargs = {'scope': scope, 'name': name, 'attachment': attachment}
|
|
178
|
-
if not rucio.
|
|
179
|
-
raise
|
|
222
|
+
if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='attach_dids', kwargs=kwargs, session=session):
|
|
223
|
+
raise AccessDenied('Account %s can not add data identifiers to %s:%s' % (issuer, scope, name))
|
|
180
224
|
|
|
181
|
-
|
|
182
|
-
|
|
225
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
226
|
+
issuer_account = InternalAccount(issuer, vo=vo)
|
|
183
227
|
if 'account' in attachment.keys():
|
|
184
228
|
attachment['account'] = InternalAccount(attachment['account'], vo=vo)
|
|
185
229
|
for d in attachment['dids']:
|
|
@@ -188,17 +232,24 @@ def attach_dids(scope, name, attachment, issuer, vo='def', *, session: "Session"
|
|
|
188
232
|
d['account'] = InternalAccount(d['account'], vo=vo)
|
|
189
233
|
|
|
190
234
|
if rse_id is not None:
|
|
191
|
-
dids = did.attach_dids(scope=
|
|
192
|
-
account=attachment.get('account',
|
|
235
|
+
dids = did.attach_dids(scope=internal_scope, name=name, dids=attachment['dids'],
|
|
236
|
+
account=attachment.get('account', issuer_account), rse_id=rse_id, session=session)
|
|
193
237
|
else:
|
|
194
|
-
dids = did.attach_dids(scope=
|
|
195
|
-
account=attachment.get('account',
|
|
238
|
+
dids = did.attach_dids(scope=internal_scope, name=name, dids=attachment['dids'],
|
|
239
|
+
account=attachment.get('account', issuer_account), session=session)
|
|
196
240
|
|
|
197
241
|
return dids
|
|
198
242
|
|
|
199
243
|
|
|
200
244
|
@transactional_session
|
|
201
|
-
def attach_dids_to_dids(
|
|
245
|
+
def attach_dids_to_dids(
|
|
246
|
+
attachments: Sequence[dict[str, Any]],
|
|
247
|
+
issuer: str,
|
|
248
|
+
ignore_duplicate: bool = False,
|
|
249
|
+
vo: str = 'def',
|
|
250
|
+
*,
|
|
251
|
+
session: "Session"
|
|
252
|
+
) -> None:
|
|
202
253
|
"""
|
|
203
254
|
Append content to dids.
|
|
204
255
|
|
|
@@ -217,10 +268,10 @@ def attach_dids_to_dids(attachments, issuer, ignore_duplicate=False, vo='def', *
|
|
|
217
268
|
rse_id = get_rse_id(rse=a['rse'], vo=vo, session=session)
|
|
218
269
|
a['rse_id'] = rse_id
|
|
219
270
|
|
|
220
|
-
if not rucio.
|
|
221
|
-
raise
|
|
271
|
+
if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='attach_dids_to_dids', kwargs={'attachments': attachments}, session=session):
|
|
272
|
+
raise AccessDenied('Account %s can not add data identifiers' % (issuer))
|
|
222
273
|
|
|
223
|
-
|
|
274
|
+
issuer_account = InternalAccount(issuer, vo=vo)
|
|
224
275
|
for attachment in attachments:
|
|
225
276
|
attachment['scope'] = InternalScope(attachment['scope'], vo=vo)
|
|
226
277
|
for d in attachment['dids']:
|
|
@@ -228,12 +279,20 @@ def attach_dids_to_dids(attachments, issuer, ignore_duplicate=False, vo='def', *
|
|
|
228
279
|
if 'account' in d.keys():
|
|
229
280
|
d['account'] = InternalAccount(d['account'], vo=vo)
|
|
230
281
|
|
|
231
|
-
return did.attach_dids_to_dids(attachments=attachments, account=
|
|
282
|
+
return did.attach_dids_to_dids(attachments=attachments, account=issuer_account,
|
|
232
283
|
ignore_duplicate=ignore_duplicate, session=session)
|
|
233
284
|
|
|
234
285
|
|
|
235
286
|
@transactional_session
|
|
236
|
-
def detach_dids(
|
|
287
|
+
def detach_dids(
|
|
288
|
+
scope: str,
|
|
289
|
+
name: str,
|
|
290
|
+
dids: Sequence[dict[str, Any]],
|
|
291
|
+
issuer: str,
|
|
292
|
+
vo: str = 'def',
|
|
293
|
+
*,
|
|
294
|
+
session: "Session"
|
|
295
|
+
) -> None:
|
|
237
296
|
"""
|
|
238
297
|
Detach data identifier
|
|
239
298
|
|
|
@@ -245,18 +304,26 @@ def detach_dids(scope, name, dids, issuer, vo='def', *, session: "Session"):
|
|
|
245
304
|
:param session: The database session in use.
|
|
246
305
|
"""
|
|
247
306
|
kwargs = {'scope': scope, 'name': name, 'dids': dids, 'issuer': issuer}
|
|
248
|
-
if not rucio.
|
|
249
|
-
raise
|
|
307
|
+
if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='detach_dids', kwargs=kwargs, session=session):
|
|
308
|
+
raise AccessDenied('Account %s can not detach data identifiers from %s:%s' % (issuer, scope, name))
|
|
250
309
|
|
|
251
|
-
|
|
310
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
252
311
|
for d in dids:
|
|
253
312
|
d['scope'] = InternalScope(d['scope'], vo=vo)
|
|
254
313
|
|
|
255
|
-
return did.detach_dids(scope=
|
|
314
|
+
return did.detach_dids(scope=internal_scope, name=name, dids=dids, session=session)
|
|
256
315
|
|
|
257
316
|
|
|
258
317
|
@stream_session
|
|
259
|
-
def list_new_dids(
|
|
318
|
+
def list_new_dids(
|
|
319
|
+
did_type: Optional[str] = None,
|
|
320
|
+
thread: Optional[int] = None,
|
|
321
|
+
total_threads: Optional[int] = None,
|
|
322
|
+
chunk_size: int = 1000,
|
|
323
|
+
vo: str = 'def',
|
|
324
|
+
*,
|
|
325
|
+
session: "Session"
|
|
326
|
+
) -> Iterator[dict[str, Any]]:
|
|
260
327
|
"""
|
|
261
328
|
List recent identifiers.
|
|
262
329
|
|
|
@@ -270,11 +337,17 @@ def list_new_dids(did_type=None, thread=None, total_threads=None, chunk_size=100
|
|
|
270
337
|
dids = did.list_new_dids(did_type=did_type and DIDType[did_type.upper()], thread=thread, total_threads=total_threads, chunk_size=chunk_size, session=session)
|
|
271
338
|
for d in dids:
|
|
272
339
|
if d['scope'].vo == vo:
|
|
273
|
-
yield
|
|
340
|
+
yield gateway_update_return_dict(d, session=session)
|
|
274
341
|
|
|
275
342
|
|
|
276
343
|
@transactional_session
|
|
277
|
-
def set_new_dids(
|
|
344
|
+
def set_new_dids(
|
|
345
|
+
dids: Sequence[dict[str, Any]],
|
|
346
|
+
new_flag: bool = True,
|
|
347
|
+
vo: str = 'def',
|
|
348
|
+
*,
|
|
349
|
+
session: "Session"
|
|
350
|
+
) -> bool:
|
|
278
351
|
"""
|
|
279
352
|
Set/reset the flag new
|
|
280
353
|
|
|
@@ -291,7 +364,13 @@ def set_new_dids(dids, new_flag=True, vo='def', *, session: "Session"):
|
|
|
291
364
|
|
|
292
365
|
|
|
293
366
|
@stream_session
|
|
294
|
-
def list_content(
|
|
367
|
+
def list_content(
|
|
368
|
+
scope: str,
|
|
369
|
+
name: str,
|
|
370
|
+
vo: str = 'def',
|
|
371
|
+
*,
|
|
372
|
+
session: "Session"
|
|
373
|
+
) -> Iterator[dict[str, Any]]:
|
|
295
374
|
"""
|
|
296
375
|
List data identifier contents.
|
|
297
376
|
|
|
@@ -301,15 +380,21 @@ def list_content(scope, name, vo='def', *, session: "Session"):
|
|
|
301
380
|
:param session: The database session in use.
|
|
302
381
|
"""
|
|
303
382
|
|
|
304
|
-
|
|
383
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
305
384
|
|
|
306
|
-
dids = did.list_content(scope=
|
|
385
|
+
dids = did.list_content(scope=internal_scope, name=name, session=session)
|
|
307
386
|
for d in dids:
|
|
308
|
-
yield
|
|
387
|
+
yield gateway_update_return_dict(d, session=session)
|
|
309
388
|
|
|
310
389
|
|
|
311
390
|
@stream_session
|
|
312
|
-
def list_content_history(
|
|
391
|
+
def list_content_history(
|
|
392
|
+
scope: str,
|
|
393
|
+
name: str,
|
|
394
|
+
vo='def',
|
|
395
|
+
*,
|
|
396
|
+
session: "Session"
|
|
397
|
+
) -> Iterator[dict[str, Any]]:
|
|
313
398
|
"""
|
|
314
399
|
List data identifier contents history.
|
|
315
400
|
|
|
@@ -319,16 +404,47 @@ def list_content_history(scope, name, vo='def', *, session: "Session"):
|
|
|
319
404
|
:param session: The database session in use.
|
|
320
405
|
"""
|
|
321
406
|
|
|
322
|
-
|
|
407
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
323
408
|
|
|
324
|
-
dids = did.list_content_history(scope=
|
|
409
|
+
dids = did.list_content_history(scope=internal_scope, name=name, session=session)
|
|
325
410
|
|
|
326
411
|
for d in dids:
|
|
327
|
-
yield
|
|
412
|
+
yield gateway_update_return_dict(d, session=session)
|
|
328
413
|
|
|
329
414
|
|
|
330
415
|
@stream_session
|
|
331
|
-
def
|
|
416
|
+
def bulk_list_files(
|
|
417
|
+
dids: Iterable[dict[str, Any]],
|
|
418
|
+
long: bool = False,
|
|
419
|
+
vo: str = 'def',
|
|
420
|
+
*,
|
|
421
|
+
session: "Session"
|
|
422
|
+
) -> Iterator[dict[str, Any]]:
|
|
423
|
+
"""
|
|
424
|
+
List file contents of a list of data identifiers.
|
|
425
|
+
|
|
426
|
+
:param dids: A list of DIDs.
|
|
427
|
+
:param long: A boolean to choose if more metadata are returned or not.
|
|
428
|
+
:param vo: The VO to act on.
|
|
429
|
+
:param session: The database session in use.
|
|
430
|
+
"""
|
|
431
|
+
|
|
432
|
+
for did_ in dids:
|
|
433
|
+
did_['scope'] = InternalScope(did_['scope'], vo=vo)
|
|
434
|
+
|
|
435
|
+
for file_ in did.bulk_list_files(dids=dids, long=long, session=session):
|
|
436
|
+
yield gateway_update_return_dict(file_, session=session)
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
@stream_session
|
|
440
|
+
def list_files(
|
|
441
|
+
scope: str,
|
|
442
|
+
name: str,
|
|
443
|
+
long: bool,
|
|
444
|
+
vo: str = 'def',
|
|
445
|
+
*,
|
|
446
|
+
session: "Session"
|
|
447
|
+
) -> Iterator[dict[str, Any]]:
|
|
332
448
|
"""
|
|
333
449
|
List data identifier file contents.
|
|
334
450
|
|
|
@@ -339,16 +455,23 @@ def list_files(scope, name, long, vo='def', *, session: "Session"):
|
|
|
339
455
|
:param session: The database session in use.
|
|
340
456
|
"""
|
|
341
457
|
|
|
342
|
-
|
|
458
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
343
459
|
|
|
344
|
-
dids = did.list_files(scope=
|
|
460
|
+
dids = did.list_files(scope=internal_scope, name=name, long=long, session=session)
|
|
345
461
|
|
|
346
462
|
for d in dids:
|
|
347
|
-
yield
|
|
463
|
+
yield gateway_update_return_dict(d, session=session)
|
|
348
464
|
|
|
349
465
|
|
|
350
466
|
@stream_session
|
|
351
|
-
def scope_list(
|
|
467
|
+
def scope_list(
|
|
468
|
+
scope: str,
|
|
469
|
+
name: Optional[str] = None,
|
|
470
|
+
recursive: bool = False,
|
|
471
|
+
vo: str = 'def',
|
|
472
|
+
*,
|
|
473
|
+
session: "Session"
|
|
474
|
+
) -> Iterator[dict[str, Any]]:
|
|
352
475
|
"""
|
|
353
476
|
List data identifiers in a scope.
|
|
354
477
|
|
|
@@ -359,9 +482,9 @@ def scope_list(scope, name=None, recursive=False, vo='def', *, session: "Session
|
|
|
359
482
|
:param session: The database session in use.
|
|
360
483
|
"""
|
|
361
484
|
|
|
362
|
-
|
|
485
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
363
486
|
|
|
364
|
-
dids = did.scope_list(
|
|
487
|
+
dids = did.scope_list(internal_scope, name=name, recursive=recursive, session=session)
|
|
365
488
|
|
|
366
489
|
for d in dids:
|
|
367
490
|
ret_did = deepcopy(d)
|
|
@@ -372,7 +495,7 @@ def scope_list(scope, name=None, recursive=False, vo='def', *, session: "Session
|
|
|
372
495
|
|
|
373
496
|
|
|
374
497
|
@read_session
|
|
375
|
-
def get_did(scope: str, name: str, dynamic_depth:
|
|
498
|
+
def get_did(scope: str, name: str, dynamic_depth: Optional[DIDType] = None, vo: str = 'def', *, session: "Session") -> "dict[str, Any]":
|
|
376
499
|
"""
|
|
377
500
|
Retrieve a single data did.
|
|
378
501
|
|
|
@@ -386,14 +509,24 @@ def get_did(scope: str, name: str, dynamic_depth: "Optional[DIDType]" = None, vo
|
|
|
386
509
|
:param session: The database session in use.
|
|
387
510
|
"""
|
|
388
511
|
|
|
389
|
-
|
|
512
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
390
513
|
|
|
391
|
-
d = did.get_did(scope=
|
|
392
|
-
return
|
|
514
|
+
d = did.get_did(scope=internal_scope, name=name, dynamic_depth=dynamic_depth, session=session)
|
|
515
|
+
return gateway_update_return_dict(d, session=session)
|
|
393
516
|
|
|
394
517
|
|
|
395
518
|
@transactional_session
|
|
396
|
-
def set_metadata(
|
|
519
|
+
def set_metadata(
|
|
520
|
+
scope: str,
|
|
521
|
+
name: str,
|
|
522
|
+
key: str,
|
|
523
|
+
value: Any,
|
|
524
|
+
issuer: str,
|
|
525
|
+
recursive: bool = False,
|
|
526
|
+
vo: str = 'def',
|
|
527
|
+
*,
|
|
528
|
+
session: "Session"
|
|
529
|
+
) -> None:
|
|
397
530
|
"""
|
|
398
531
|
Add metadata to data did.
|
|
399
532
|
|
|
@@ -409,17 +542,26 @@ def set_metadata(scope, name, key, value, issuer, recursive=False, vo='def', *,
|
|
|
409
542
|
kwargs = {'scope': scope, 'name': name, 'key': key, 'value': value, 'issuer': issuer}
|
|
410
543
|
|
|
411
544
|
if key in RESERVED_KEYS:
|
|
412
|
-
raise
|
|
545
|
+
raise AccessDenied('Account %s can not change this metadata value to data identifier %s:%s' % (issuer, scope, name))
|
|
413
546
|
|
|
414
|
-
if not rucio.
|
|
415
|
-
raise
|
|
547
|
+
if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='set_metadata', kwargs=kwargs, session=session):
|
|
548
|
+
raise AccessDenied('Account %s can not add metadata to data identifier %s:%s' % (issuer, scope, name))
|
|
416
549
|
|
|
417
|
-
|
|
418
|
-
return did.set_metadata(scope=
|
|
550
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
551
|
+
return did.set_metadata(scope=internal_scope, name=name, key=key, value=value, recursive=recursive, session=session)
|
|
419
552
|
|
|
420
553
|
|
|
421
554
|
@transactional_session
|
|
422
|
-
def set_metadata_bulk(
|
|
555
|
+
def set_metadata_bulk(
|
|
556
|
+
scope: str,
|
|
557
|
+
name: str,
|
|
558
|
+
meta: dict[str, Any],
|
|
559
|
+
issuer: str,
|
|
560
|
+
recursive: bool = False,
|
|
561
|
+
vo: str = 'def',
|
|
562
|
+
*,
|
|
563
|
+
session: "Session"
|
|
564
|
+
) -> None:
|
|
423
565
|
"""
|
|
424
566
|
Add metadata to data did.
|
|
425
567
|
|
|
@@ -435,17 +577,24 @@ def set_metadata_bulk(scope, name, meta, issuer, recursive=False, vo='def', *, s
|
|
|
435
577
|
|
|
436
578
|
for key in meta:
|
|
437
579
|
if key in RESERVED_KEYS:
|
|
438
|
-
raise
|
|
580
|
+
raise AccessDenied('Account %s can not change the value of the metadata key %s to data identifier %s:%s' % (issuer, key, scope, name))
|
|
439
581
|
|
|
440
|
-
if not rucio.
|
|
441
|
-
raise
|
|
582
|
+
if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='set_metadata_bulk', kwargs=kwargs, session=session):
|
|
583
|
+
raise AccessDenied('Account %s can not add metadata to data identifier %s:%s' % (issuer, scope, name))
|
|
442
584
|
|
|
443
|
-
|
|
444
|
-
return did.set_metadata_bulk(scope=
|
|
585
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
586
|
+
return did.set_metadata_bulk(scope=internal_scope, name=name, meta=meta, recursive=recursive, session=session)
|
|
445
587
|
|
|
446
588
|
|
|
447
589
|
@transactional_session
|
|
448
|
-
def set_dids_metadata_bulk(
|
|
590
|
+
def set_dids_metadata_bulk(
|
|
591
|
+
dids: Iterable[dict[str, Any]],
|
|
592
|
+
issuer: str,
|
|
593
|
+
recursive: bool = False,
|
|
594
|
+
vo: str = 'def',
|
|
595
|
+
*,
|
|
596
|
+
session: "Session"
|
|
597
|
+
) -> None:
|
|
449
598
|
"""
|
|
450
599
|
Add metadata to a list of data identifiers.
|
|
451
600
|
|
|
@@ -458,19 +607,26 @@ def set_dids_metadata_bulk(dids, issuer, recursive=False, vo='def', *, session:
|
|
|
458
607
|
|
|
459
608
|
for entry in dids:
|
|
460
609
|
kwargs = {'scope': entry['scope'], 'name': entry['name'], 'meta': entry['meta'], 'issuer': issuer}
|
|
461
|
-
if not rucio.
|
|
462
|
-
raise
|
|
610
|
+
if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='set_metadata_bulk', kwargs=kwargs, session=session):
|
|
611
|
+
raise AccessDenied('Account %s can not add metadata to data identifier %s:%s' % (issuer, entry['scope'], entry['name']))
|
|
463
612
|
entry['scope'] = InternalScope(entry['scope'], vo=vo)
|
|
464
613
|
meta = entry['meta']
|
|
465
614
|
for key in meta:
|
|
466
615
|
if key in RESERVED_KEYS:
|
|
467
|
-
raise
|
|
616
|
+
raise AccessDenied('Account %s can not change the value of the metadata key %s to data identifier %s:%s' % (issuer, key, entry['scope'], entry['name']))
|
|
468
617
|
|
|
469
618
|
return did.set_dids_metadata_bulk(dids=dids, recursive=recursive, session=session)
|
|
470
619
|
|
|
471
620
|
|
|
472
621
|
@read_session
|
|
473
|
-
def get_metadata(
|
|
622
|
+
def get_metadata(
|
|
623
|
+
scope: str,
|
|
624
|
+
name: str,
|
|
625
|
+
plugin: str = 'DID_COLUMN',
|
|
626
|
+
vo: str = 'def',
|
|
627
|
+
*,
|
|
628
|
+
session: "Session"
|
|
629
|
+
) -> dict[str, Any]:
|
|
474
630
|
"""
|
|
475
631
|
Get data identifier metadata
|
|
476
632
|
|
|
@@ -480,14 +636,20 @@ def get_metadata(scope, name, plugin='DID_COLUMN', vo='def', *, session: "Sessio
|
|
|
480
636
|
:param session: The database session in use.
|
|
481
637
|
"""
|
|
482
638
|
|
|
483
|
-
|
|
639
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
484
640
|
|
|
485
|
-
d = did.get_metadata(scope=
|
|
486
|
-
return
|
|
641
|
+
d = did.get_metadata(scope=internal_scope, name=name, plugin=plugin, session=session)
|
|
642
|
+
return gateway_update_return_dict(d, session=session)
|
|
487
643
|
|
|
488
644
|
|
|
489
645
|
@stream_session
|
|
490
|
-
def get_metadata_bulk(
|
|
646
|
+
def get_metadata_bulk(
|
|
647
|
+
dids: Iterable[dict[str, Any]],
|
|
648
|
+
inherit: bool = False,
|
|
649
|
+
vo: str = 'def',
|
|
650
|
+
*,
|
|
651
|
+
session: "Session"
|
|
652
|
+
) -> Iterator[dict[str, Any]]:
|
|
491
653
|
"""
|
|
492
654
|
Get metadata for a list of dids
|
|
493
655
|
:param dids: A list of dids.
|
|
@@ -501,11 +663,18 @@ def get_metadata_bulk(dids, inherit=False, vo='def', *, session: "Session"):
|
|
|
501
663
|
entry['scope'] = InternalScope(entry['scope'], vo=vo)
|
|
502
664
|
meta = did.get_metadata_bulk(dids, inherit=inherit, session=session)
|
|
503
665
|
for met in meta:
|
|
504
|
-
yield
|
|
666
|
+
yield gateway_update_return_dict(met, session=session)
|
|
505
667
|
|
|
506
668
|
|
|
507
669
|
@transactional_session
|
|
508
|
-
def delete_metadata(
|
|
670
|
+
def delete_metadata(
|
|
671
|
+
scope: str,
|
|
672
|
+
name: str,
|
|
673
|
+
key: str,
|
|
674
|
+
vo: str = 'def',
|
|
675
|
+
*,
|
|
676
|
+
session: "Session"
|
|
677
|
+
) -> None:
|
|
509
678
|
"""
|
|
510
679
|
Delete a key from the metadata column
|
|
511
680
|
|
|
@@ -516,12 +685,20 @@ def delete_metadata(scope, name, key, vo='def', *, session: "Session"):
|
|
|
516
685
|
:param session: The database session in use.
|
|
517
686
|
"""
|
|
518
687
|
|
|
519
|
-
|
|
520
|
-
return did.delete_metadata(scope=
|
|
688
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
689
|
+
return did.delete_metadata(scope=internal_scope, name=name, key=key, session=session)
|
|
521
690
|
|
|
522
691
|
|
|
523
692
|
@transactional_session
|
|
524
|
-
def set_status(
|
|
693
|
+
def set_status(
|
|
694
|
+
scope: str,
|
|
695
|
+
name: str,
|
|
696
|
+
issuer: str,
|
|
697
|
+
vo: str = 'def',
|
|
698
|
+
*,
|
|
699
|
+
session: "Session",
|
|
700
|
+
**kwargs
|
|
701
|
+
) -> None:
|
|
525
702
|
"""
|
|
526
703
|
Set data identifier status
|
|
527
704
|
|
|
@@ -533,16 +710,21 @@ def set_status(scope, name, issuer, vo='def', *, session: "Session", **kwargs):
|
|
|
533
710
|
:param session: The database session in use.
|
|
534
711
|
"""
|
|
535
712
|
|
|
536
|
-
if not rucio.
|
|
537
|
-
raise
|
|
713
|
+
if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='set_status', kwargs={'scope': scope, 'name': name, 'issuer': issuer}, session=session):
|
|
714
|
+
raise AccessDenied('Account %s can not set status on data identifier %s:%s' % (issuer, scope, name))
|
|
538
715
|
|
|
539
|
-
|
|
716
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
540
717
|
|
|
541
|
-
return did.set_status(scope=
|
|
718
|
+
return did.set_status(scope=internal_scope, name=name, session=session, **kwargs)
|
|
542
719
|
|
|
543
720
|
|
|
544
721
|
@stream_session
|
|
545
|
-
def get_dataset_by_guid(
|
|
722
|
+
def get_dataset_by_guid(
|
|
723
|
+
guid: str,
|
|
724
|
+
vo: str = 'def',
|
|
725
|
+
*,
|
|
726
|
+
session: "Session"
|
|
727
|
+
) -> Iterator[dict[str, Any]]:
|
|
546
728
|
"""
|
|
547
729
|
Get the parent datasets for a given GUID.
|
|
548
730
|
:param guid: The GUID.
|
|
@@ -556,11 +738,17 @@ def get_dataset_by_guid(guid, vo='def', *, session: "Session"):
|
|
|
556
738
|
for d in dids:
|
|
557
739
|
if d['scope'].vo != vo:
|
|
558
740
|
raise RucioException('GUID unavailable on VO {}'.format(vo))
|
|
559
|
-
yield
|
|
741
|
+
yield gateway_update_return_dict(d, session=session)
|
|
560
742
|
|
|
561
743
|
|
|
562
744
|
@stream_session
|
|
563
|
-
def list_parent_dids(
|
|
745
|
+
def list_parent_dids(
|
|
746
|
+
scope: str,
|
|
747
|
+
name: str,
|
|
748
|
+
vo: str = 'def',
|
|
749
|
+
*,
|
|
750
|
+
session: "Session"
|
|
751
|
+
) -> Iterator[dict[str, Any]]:
|
|
564
752
|
"""
|
|
565
753
|
List parent datasets and containers of a did.
|
|
566
754
|
|
|
@@ -570,16 +758,26 @@ def list_parent_dids(scope, name, vo='def', *, session: "Session"):
|
|
|
570
758
|
:param session: The database session in use.
|
|
571
759
|
"""
|
|
572
760
|
|
|
573
|
-
|
|
761
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
574
762
|
|
|
575
|
-
dids = did.list_parent_dids(scope=
|
|
763
|
+
dids = did.list_parent_dids(scope=internal_scope, name=name, session=session)
|
|
576
764
|
|
|
577
765
|
for d in dids:
|
|
578
|
-
yield
|
|
766
|
+
yield gateway_update_return_dict(d, session=session)
|
|
579
767
|
|
|
580
768
|
|
|
581
769
|
@transactional_session
|
|
582
|
-
def create_did_sample(
|
|
770
|
+
def create_did_sample(
|
|
771
|
+
input_scope: str,
|
|
772
|
+
input_name: str,
|
|
773
|
+
output_scope: str,
|
|
774
|
+
output_name: str,
|
|
775
|
+
issuer: str,
|
|
776
|
+
nbfiles: str,
|
|
777
|
+
vo: str = 'def',
|
|
778
|
+
*,
|
|
779
|
+
session: "Session"
|
|
780
|
+
):
|
|
583
781
|
"""
|
|
584
782
|
Create a sample from an input collection.
|
|
585
783
|
|
|
@@ -594,20 +792,26 @@ def create_did_sample(input_scope, input_name, output_scope, output_name, issuer
|
|
|
594
792
|
:param session: The database session in use.
|
|
595
793
|
"""
|
|
596
794
|
kwargs = {'issuer': issuer, 'scope': output_scope}
|
|
597
|
-
if not rucio.
|
|
598
|
-
raise
|
|
795
|
+
if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='create_did_sample', kwargs=kwargs, session=session):
|
|
796
|
+
raise AccessDenied('Account %s can not bulk add data identifier' % (issuer))
|
|
599
797
|
|
|
600
|
-
|
|
601
|
-
|
|
798
|
+
input_internal_scope = InternalScope(input_scope, vo=vo)
|
|
799
|
+
output_internal_scope = InternalScope(output_scope, vo=vo)
|
|
602
800
|
|
|
603
|
-
|
|
801
|
+
issuer_account = InternalAccount(issuer, vo=vo)
|
|
604
802
|
|
|
605
|
-
return did.create_did_sample(input_scope=
|
|
606
|
-
account=
|
|
803
|
+
return did.create_did_sample(input_scope=input_internal_scope, input_name=input_name, output_scope=output_internal_scope, output_name=output_name,
|
|
804
|
+
account=issuer_account, nbfiles=nbfiles, session=session)
|
|
607
805
|
|
|
608
806
|
|
|
609
807
|
@transactional_session
|
|
610
|
-
def resurrect(
|
|
808
|
+
def resurrect(
|
|
809
|
+
dids: Iterable[dict[str, Any]],
|
|
810
|
+
issuer: str,
|
|
811
|
+
vo: str = 'def',
|
|
812
|
+
*,
|
|
813
|
+
session: "Session"
|
|
814
|
+
) -> None:
|
|
611
815
|
"""
|
|
612
816
|
Resurrect DIDs.
|
|
613
817
|
|
|
@@ -617,8 +821,8 @@ def resurrect(dids, issuer, vo='def', *, session: "Session"):
|
|
|
617
821
|
:param session: The database session in use.
|
|
618
822
|
"""
|
|
619
823
|
kwargs = {'issuer': issuer}
|
|
620
|
-
if not rucio.
|
|
621
|
-
raise
|
|
824
|
+
if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='resurrect', kwargs=kwargs, session=session):
|
|
825
|
+
raise AccessDenied('Account %s can not resurrect data identifiers' % (issuer))
|
|
622
826
|
validate_schema(name='dids', obj=dids, vo=vo)
|
|
623
827
|
|
|
624
828
|
for d in dids:
|
|
@@ -628,7 +832,13 @@ def resurrect(dids, issuer, vo='def', *, session: "Session"):
|
|
|
628
832
|
|
|
629
833
|
|
|
630
834
|
@stream_session
|
|
631
|
-
def list_archive_content(
|
|
835
|
+
def list_archive_content(
|
|
836
|
+
scope: str,
|
|
837
|
+
name: str,
|
|
838
|
+
vo: str = 'def',
|
|
839
|
+
*,
|
|
840
|
+
session: "Session"
|
|
841
|
+
) -> Iterator[dict[str, Any]]:
|
|
632
842
|
"""
|
|
633
843
|
List archive contents.
|
|
634
844
|
|
|
@@ -638,15 +848,22 @@ def list_archive_content(scope, name, vo='def', *, session: "Session"):
|
|
|
638
848
|
:param session: The database session in use.
|
|
639
849
|
"""
|
|
640
850
|
|
|
641
|
-
|
|
851
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
642
852
|
|
|
643
|
-
dids = did.list_archive_content(scope=
|
|
853
|
+
dids = did.list_archive_content(scope=internal_scope, name=name, session=session)
|
|
644
854
|
for d in dids:
|
|
645
|
-
yield
|
|
855
|
+
yield gateway_update_return_dict(d, session=session)
|
|
646
856
|
|
|
647
857
|
|
|
648
858
|
@transactional_session
|
|
649
|
-
def add_did_to_followed(
|
|
859
|
+
def add_did_to_followed(
|
|
860
|
+
scope: str,
|
|
861
|
+
name: str,
|
|
862
|
+
account: str,
|
|
863
|
+
*,
|
|
864
|
+
session: "Session",
|
|
865
|
+
vo: str = 'def'
|
|
866
|
+
) -> None:
|
|
650
867
|
"""
|
|
651
868
|
Mark a did as followed by the given account
|
|
652
869
|
|
|
@@ -655,13 +872,19 @@ def add_did_to_followed(scope, name, account, *, session: "Session", vo='def'):
|
|
|
655
872
|
:param account: The account owner.
|
|
656
873
|
:param session: The database session in use.
|
|
657
874
|
"""
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
return did.add_did_to_followed(scope=
|
|
875
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
876
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
877
|
+
return did.add_did_to_followed(scope=internal_scope, name=name, account=internal_account, session=session)
|
|
661
878
|
|
|
662
879
|
|
|
663
880
|
@transactional_session
|
|
664
|
-
def add_dids_to_followed(
|
|
881
|
+
def add_dids_to_followed(
|
|
882
|
+
dids: Iterable[Mapping[str, Any]],
|
|
883
|
+
account: str,
|
|
884
|
+
*,
|
|
885
|
+
session: "Session",
|
|
886
|
+
vo: str = 'def'
|
|
887
|
+
) -> None:
|
|
665
888
|
"""
|
|
666
889
|
Bulk mark datasets as followed
|
|
667
890
|
|
|
@@ -669,12 +892,18 @@ def add_dids_to_followed(dids, account, *, session: "Session", vo='def'):
|
|
|
669
892
|
:param account: The account owner.
|
|
670
893
|
:param session: The database session in use.
|
|
671
894
|
"""
|
|
672
|
-
|
|
673
|
-
return did.add_dids_to_followed(dids=dids, account=
|
|
895
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
896
|
+
return did.add_dids_to_followed(dids=dids, account=internal_account, session=session)
|
|
674
897
|
|
|
675
898
|
|
|
676
899
|
@stream_session
|
|
677
|
-
def get_users_following_did(
|
|
900
|
+
def get_users_following_did(
|
|
901
|
+
name: str,
|
|
902
|
+
scope: str,
|
|
903
|
+
*,
|
|
904
|
+
session: "Session",
|
|
905
|
+
vo: str = 'def'
|
|
906
|
+
) -> Iterator[dict[str, str]]:
|
|
678
907
|
"""
|
|
679
908
|
Return list of users following a did
|
|
680
909
|
|
|
@@ -682,15 +911,23 @@ def get_users_following_did(name, scope, *, session: "Session", vo='def'):
|
|
|
682
911
|
:param name: The data identifier name.
|
|
683
912
|
:param session: The database session in use.
|
|
684
913
|
"""
|
|
685
|
-
|
|
686
|
-
users = did.get_users_following_did(name=name, scope=
|
|
914
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
915
|
+
users = did.get_users_following_did(name=name, scope=internal_scope, session=session)
|
|
687
916
|
for user in users:
|
|
688
917
|
user['user'] = user['user'].external
|
|
689
918
|
yield user
|
|
690
919
|
|
|
691
920
|
|
|
692
921
|
@transactional_session
|
|
693
|
-
def remove_did_from_followed(
|
|
922
|
+
def remove_did_from_followed(
|
|
923
|
+
scope: str,
|
|
924
|
+
name: str,
|
|
925
|
+
account: str,
|
|
926
|
+
issuer: str,
|
|
927
|
+
*,
|
|
928
|
+
session: "Session",
|
|
929
|
+
vo: str = 'def'
|
|
930
|
+
) -> None:
|
|
694
931
|
"""
|
|
695
932
|
Mark a did as not followed
|
|
696
933
|
|
|
@@ -701,16 +938,23 @@ def remove_did_from_followed(scope, name, account, issuer, *, session: "Session"
|
|
|
701
938
|
:param issuer: The issuer account
|
|
702
939
|
"""
|
|
703
940
|
kwargs = {'scope': scope, 'issuer': issuer}
|
|
704
|
-
if not rucio.
|
|
705
|
-
raise
|
|
941
|
+
if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='remove_did_from_followed', kwargs=kwargs, session=session):
|
|
942
|
+
raise AccessDenied('Account %s can not remove data identifiers from followed table' % (issuer))
|
|
706
943
|
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
return did.remove_did_from_followed(scope=
|
|
944
|
+
internal_scope = InternalScope(scope, vo=vo)
|
|
945
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
946
|
+
return did.remove_did_from_followed(scope=internal_scope, name=name, account=internal_account, session=session)
|
|
710
947
|
|
|
711
948
|
|
|
712
949
|
@transactional_session
|
|
713
|
-
def remove_dids_from_followed(
|
|
950
|
+
def remove_dids_from_followed(
|
|
951
|
+
dids: Iterable[Mapping[str, Any]],
|
|
952
|
+
account: str,
|
|
953
|
+
issuer: str,
|
|
954
|
+
*,
|
|
955
|
+
session: "Session",
|
|
956
|
+
vo: str = 'def'
|
|
957
|
+
) -> None:
|
|
714
958
|
"""
|
|
715
959
|
Bulk mark datasets as not followed
|
|
716
960
|
|
|
@@ -719,8 +963,8 @@ def remove_dids_from_followed(dids, account, issuer, *, session: "Session", vo='
|
|
|
719
963
|
:param session: The database session in use.
|
|
720
964
|
"""
|
|
721
965
|
kwargs = {'dids': dids, 'issuer': issuer}
|
|
722
|
-
if not rucio.
|
|
723
|
-
raise
|
|
966
|
+
if not rucio.gateway.permission.has_permission(issuer=issuer, vo=vo, action='remove_dids_from_followed', kwargs=kwargs, session=session):
|
|
967
|
+
raise AccessDenied('Account %s can not bulk remove data identifiers from followed table' % (issuer))
|
|
724
968
|
|
|
725
|
-
|
|
726
|
-
return did.remove_dids_from_followed(dids=dids, account=
|
|
969
|
+
internal_account = InternalAccount(account, vo=vo)
|
|
970
|
+
return did.remove_dids_from_followed(dids=dids, account=internal_account, session=session)
|