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/common/schema/cms.py
DELETED
|
@@ -1,478 +0,0 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
3
|
-
#
|
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
# you may not use this file except in compliance with the License.
|
|
6
|
-
# You may obtain a copy of the License at
|
|
7
|
-
#
|
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
#
|
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
# See the License for the specific language governing permissions and
|
|
14
|
-
# limitations under the License.
|
|
15
|
-
|
|
16
|
-
from jsonschema import validate, ValidationError
|
|
17
|
-
|
|
18
|
-
from rucio.common.exception import InvalidObject
|
|
19
|
-
|
|
20
|
-
ACCOUNT_LENGTH = 25
|
|
21
|
-
|
|
22
|
-
ACCOUNT = {"description": "Account name",
|
|
23
|
-
"type": "string",
|
|
24
|
-
"pattern": "^[a-z0-9-_]{1,%s}$" % ACCOUNT_LENGTH}
|
|
25
|
-
|
|
26
|
-
ACCOUNTS = {"description": "Array of accounts",
|
|
27
|
-
"type": "array",
|
|
28
|
-
"items": ACCOUNT,
|
|
29
|
-
"minItems": 0,
|
|
30
|
-
"maxItems": 1000}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
ACCOUNT_TYPE = {"description": "Account type",
|
|
34
|
-
"type": "string",
|
|
35
|
-
"enum": ["USER", "GROUP", "SERVICE"]}
|
|
36
|
-
|
|
37
|
-
ACTIVITY = {"description": "Activity name",
|
|
38
|
-
"type": "string",
|
|
39
|
-
"enum": ["Data Brokering", "Data Consolidation", "Data rebalancing",
|
|
40
|
-
"Debug", "Express", "Functional Test", "Group Subscriptions",
|
|
41
|
-
"Production Input", "Production Output",
|
|
42
|
-
"Analysis Input", "Analysis Output", "Staging",
|
|
43
|
-
"T0 Export", "T0 Tape", "Upload/Download (Job)",
|
|
44
|
-
"Upload/Download (User)", "User Subscriptions", "Data Challenge"]}
|
|
45
|
-
|
|
46
|
-
SCOPE_LENGTH = 25
|
|
47
|
-
|
|
48
|
-
SCOPE = {"description": "Scope name",
|
|
49
|
-
"type": "string",
|
|
50
|
-
"pattern": r"^(cms)|(logs)|(user\.[a-z0-9-_]{1,%s})$" % (SCOPE_LENGTH - len('user.'))}
|
|
51
|
-
|
|
52
|
-
R_SCOPE = {"description": "Scope name",
|
|
53
|
-
"type": "string",
|
|
54
|
-
"pattern": "\\w"}
|
|
55
|
-
|
|
56
|
-
CMS_LFN_LENGTH = 500
|
|
57
|
-
CMS_DATASET_CORE = r'/[a-zA-Z0-9\-_]{1,99}/[a-zA-Z0-9\.\-_]{1,199}/[A-Z\-]{1,50}'
|
|
58
|
-
CMS_BLOCK_PART = r'[a-zA-Z0-9\.\-_]{1,100}'
|
|
59
|
-
|
|
60
|
-
CMS_DATASET = r'^%s$' % CMS_DATASET_CORE
|
|
61
|
-
CMS_BLOCK = r'^%s#%s$' % (CMS_DATASET_CORE, CMS_BLOCK_PART) # Valid dataset name and block separated by #
|
|
62
|
-
CMS_LFN = r'^\/store\/[A-Za-z0-9][A-Za-z0-9\.\-\_\/]{1,%s}$' % (CMS_LFN_LENGTH - len('/store/'))
|
|
63
|
-
|
|
64
|
-
CMS_BLOCK_LENGTH = 100 + 200 + 51 + 101
|
|
65
|
-
|
|
66
|
-
NAME = {"description": "Data Identifier name",
|
|
67
|
-
"type": "string",
|
|
68
|
-
"pattern": r"%s|%s|%s" % (CMS_DATASET, CMS_BLOCK, CMS_LFN)}
|
|
69
|
-
|
|
70
|
-
NAME_LENGTH = max(CMS_LFN_LENGTH, CMS_BLOCK_LENGTH)
|
|
71
|
-
|
|
72
|
-
# read name
|
|
73
|
-
R_NAME = NAME
|
|
74
|
-
|
|
75
|
-
LOCKED = {"description": "Rule locked status",
|
|
76
|
-
"type": ["boolean", "null"]}
|
|
77
|
-
|
|
78
|
-
ASK_APPROVAL = {"description": "Rule approval request",
|
|
79
|
-
"type": ["boolean", "null"]}
|
|
80
|
-
|
|
81
|
-
ASYNCHRONOUS = {"description": "Asynchronous rule creation",
|
|
82
|
-
"type": ["boolean", "null"]}
|
|
83
|
-
|
|
84
|
-
DELAY_INJECTION = {"description": "Time (in seconds) to wait before starting applying the rule. Implies asynchronous rule creation.",
|
|
85
|
-
"type": ["integer", "null"]}
|
|
86
|
-
|
|
87
|
-
PURGE_REPLICAS = {"description": "Rule purge replica status",
|
|
88
|
-
"type": "boolean"}
|
|
89
|
-
|
|
90
|
-
IGNORE_AVAILABILITY = {"description": "Rule ignore availability status",
|
|
91
|
-
"type": "boolean"}
|
|
92
|
-
|
|
93
|
-
RSE = {"description": "RSE name",
|
|
94
|
-
"type": "string",
|
|
95
|
-
"pattern": "^T[0-3]_[A-Z]{2}((_[A-Za-z0-9]+)+)$"}
|
|
96
|
-
|
|
97
|
-
RSE_ATTRIBUTE = {"description": "RSE attribute",
|
|
98
|
-
"type": "string",
|
|
99
|
-
"pattern": r'([A-Za-z0-9\._-]+[=<>][A-Za-z0-9_-]+)'}
|
|
100
|
-
|
|
101
|
-
DEFAULT_RSE_ATTRIBUTE = {"description": "Default RSE attribute",
|
|
102
|
-
"type": "string",
|
|
103
|
-
"pattern": r'([A-Z0-9]+([_-][A-Za-z0-9]+)*)'}
|
|
104
|
-
|
|
105
|
-
REPLICA_STATE = {"description": "Replica state",
|
|
106
|
-
"type": "string",
|
|
107
|
-
"enum": ["AVAILABLE", "UNAVAILABLE", "COPYING", "BEING_DELETED", "BAD", "SOURCE", "A", "U", "C", "B", "D", "S"]}
|
|
108
|
-
|
|
109
|
-
DATE = {"description": "Date",
|
|
110
|
-
"type": "string",
|
|
111
|
-
"pattern": r'((Mon)|(Tue)|(Wed)|(Thu)|(Fri)|(Sat)|(Sun))[,]\s\d{2}\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}\s(0\d|1\d|2[0-3])(\:)(0\d|1\d|2\d|3\d|4\d|5\d)(\:)(0\d|1\d|2\d|3\d|4\d|5\d)\s(UTC)'}
|
|
112
|
-
|
|
113
|
-
DID_TYPE = {"description": "DID type",
|
|
114
|
-
"type": "string",
|
|
115
|
-
"enum": ["DATASET", "CONTAINER", "FILE", "F"]}
|
|
116
|
-
|
|
117
|
-
GROUPING = {"description": "Rule grouping",
|
|
118
|
-
"type": ["string", "null"],
|
|
119
|
-
"enum": ["DATASET", "NONE", "ALL", None]}
|
|
120
|
-
|
|
121
|
-
NOTIFY = {"description": "Rule notification setting",
|
|
122
|
-
"type": ["string", "null"],
|
|
123
|
-
"enum": ["Y", "C", "N", "P", None]}
|
|
124
|
-
|
|
125
|
-
COMMENT = {"description": "Rule comment",
|
|
126
|
-
"type": ["string", "null"],
|
|
127
|
-
"maxLength": 250}
|
|
128
|
-
|
|
129
|
-
METADATA = {"description": "Rule wfms metadata",
|
|
130
|
-
"type": ["string", "null"],
|
|
131
|
-
"maxLength": 3999}
|
|
132
|
-
|
|
133
|
-
BYTES = {"description": "Size in bytes",
|
|
134
|
-
"type": "integer"}
|
|
135
|
-
|
|
136
|
-
ADLER32 = {"description": "adler32",
|
|
137
|
-
"type": "string",
|
|
138
|
-
"pattern": "^[a-fA-F\\d]{8}$"}
|
|
139
|
-
|
|
140
|
-
WEIGHT = {"description": "Rule weight",
|
|
141
|
-
"type": ["string", "null"]}
|
|
142
|
-
|
|
143
|
-
MD5 = {"description": "md5",
|
|
144
|
-
"type": "string",
|
|
145
|
-
"pattern": "^[a-fA-F\\d]{32}$"}
|
|
146
|
-
|
|
147
|
-
UUID = {"description": "Universally Unique Identifier (UUID)",
|
|
148
|
-
"type": "string",
|
|
149
|
-
"pattern": '^(\\{){0,1}[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}(\\}){0,1}$'}
|
|
150
|
-
|
|
151
|
-
META = {"description": "Data Identifier(DID) metadata",
|
|
152
|
-
"type": "object",
|
|
153
|
-
"properties": {"guid": UUID},
|
|
154
|
-
"additionalProperties": True}
|
|
155
|
-
|
|
156
|
-
PFN = {"description": "Physical File Name", "type": "string"}
|
|
157
|
-
|
|
158
|
-
COPIES = {"description": "Number of replica copies", "type": "integer"}
|
|
159
|
-
|
|
160
|
-
RSE_EXPRESSION = {"description": "RSE expression", "type": "string"}
|
|
161
|
-
|
|
162
|
-
SOURCE_REPLICA_EXPRESSION = {"description": "RSE expression", "type": ["string", "null"]}
|
|
163
|
-
|
|
164
|
-
LIFETIME = {"description": "Lifetime", "type": "number"}
|
|
165
|
-
|
|
166
|
-
RULE_LIFETIME = {"description": "Rule lifetime", "type": ["number", "null"]}
|
|
167
|
-
|
|
168
|
-
SUBSCRIPTION_ID = {"description": "Rule Subscription id", "type": ["string", "null"]}
|
|
169
|
-
|
|
170
|
-
PRIORITY = {"description": "Priority of the transfers",
|
|
171
|
-
"type": "integer"}
|
|
172
|
-
|
|
173
|
-
SPLIT_CONTAINER = {"description": "Rule split container mode",
|
|
174
|
-
"type": ["boolean", "null"]}
|
|
175
|
-
|
|
176
|
-
RULE = {"description": "Replication rule",
|
|
177
|
-
"type": "object",
|
|
178
|
-
"properties": {"dids": {"type": "array"},
|
|
179
|
-
"account": ACCOUNT,
|
|
180
|
-
"copies": COPIES,
|
|
181
|
-
"rse_expression": RSE_EXPRESSION,
|
|
182
|
-
"grouping": GROUPING,
|
|
183
|
-
"weight": WEIGHT,
|
|
184
|
-
"lifetime": RULE_LIFETIME,
|
|
185
|
-
"locked": LOCKED,
|
|
186
|
-
"subscription_id": SUBSCRIPTION_ID,
|
|
187
|
-
"source_replica_expression": SOURCE_REPLICA_EXPRESSION,
|
|
188
|
-
"activity": ACTIVITY,
|
|
189
|
-
"notify": NOTIFY,
|
|
190
|
-
"purge_replicas": PURGE_REPLICAS,
|
|
191
|
-
"ignore_availability": IGNORE_AVAILABILITY,
|
|
192
|
-
"comment": COMMENT,
|
|
193
|
-
"ask_approval": ASK_APPROVAL,
|
|
194
|
-
"asynchronous": ASYNCHRONOUS,
|
|
195
|
-
"delay_injection": DELAY_INJECTION,
|
|
196
|
-
"priority": PRIORITY,
|
|
197
|
-
'split_container': SPLIT_CONTAINER,
|
|
198
|
-
'meta': METADATA},
|
|
199
|
-
"required": ["dids", "copies", "rse_expression"],
|
|
200
|
-
"additionalProperties": False}
|
|
201
|
-
|
|
202
|
-
RULES = {"description": "Array of replication rules",
|
|
203
|
-
"type": "array",
|
|
204
|
-
"items": RULE,
|
|
205
|
-
"minItems": 1,
|
|
206
|
-
"maxItems": 1000}
|
|
207
|
-
|
|
208
|
-
COLLECTION_TYPE = {"description": "Dataset or container type",
|
|
209
|
-
"type": "string",
|
|
210
|
-
"enum": ["DATASET", "CONTAINER"]}
|
|
211
|
-
|
|
212
|
-
COLLECTION = {"description": "Dataset or container",
|
|
213
|
-
"type": "object",
|
|
214
|
-
"properties": {"scope": SCOPE,
|
|
215
|
-
"name": NAME,
|
|
216
|
-
"type": COLLECTION_TYPE,
|
|
217
|
-
"meta": META,
|
|
218
|
-
"rules": RULES},
|
|
219
|
-
"required": ["scope", "name", "type"],
|
|
220
|
-
"additionalProperties": False}
|
|
221
|
-
|
|
222
|
-
COLLECTIONS = {"description": "Array of datasets or containers",
|
|
223
|
-
"type": "array",
|
|
224
|
-
"items": COLLECTION,
|
|
225
|
-
"minItems": 1,
|
|
226
|
-
"maxItems": 1000}
|
|
227
|
-
|
|
228
|
-
# No else if in JSON Schema
|
|
229
|
-
# if type == container
|
|
230
|
-
# must match CMS dataset/container guidelines
|
|
231
|
-
# else if type == dataset
|
|
232
|
-
# must match CMS block guidelines
|
|
233
|
-
# else if type == file
|
|
234
|
-
# must match CMS LFN guidelines
|
|
235
|
-
# CMS scope must not be in /store/user
|
|
236
|
-
# user.jdoe scope must be in /store/user/rucio
|
|
237
|
-
# (making sure it's in /store/user/rucio/jdoe seems to be impossible in JSON Schema, handled outside)
|
|
238
|
-
DID = {"description": "Data Identifier(DID)",
|
|
239
|
-
"type": "object",
|
|
240
|
-
"properties": {"scope": SCOPE,
|
|
241
|
-
"name": NAME,
|
|
242
|
-
"type": DID_TYPE,
|
|
243
|
-
"meta": META,
|
|
244
|
-
"rules": RULES,
|
|
245
|
-
"bytes": BYTES,
|
|
246
|
-
"adler32": ADLER32,
|
|
247
|
-
"md5": MD5,
|
|
248
|
-
"state": REPLICA_STATE,
|
|
249
|
-
"pfn": PFN},
|
|
250
|
-
"allOf": [
|
|
251
|
-
{"if": {"properties": {"type": {"const": "CONTAINER"}}},
|
|
252
|
-
"then": {"properties": {"name": {"pattern": CMS_DATASET}}}},
|
|
253
|
-
{"if": {"properties": {"type": {"const": "DATASET"}}},
|
|
254
|
-
"then": {"properties": {"name": {"pattern": CMS_BLOCK}}}},
|
|
255
|
-
{"if": {"properties": {"type": {"const": "FILE"}}},
|
|
256
|
-
"then": {"properties": {"name": {"pattern": CMS_LFN}}}},
|
|
257
|
-
{"if": {"properties": {"type": {"const": "F"}}},
|
|
258
|
-
"then": {"properties": {"name": {"pattern": CMS_LFN}}}},
|
|
259
|
-
],
|
|
260
|
-
"required": ["scope", "name", "type"],
|
|
261
|
-
"additionalProperties": False}
|
|
262
|
-
|
|
263
|
-
DID_FILTERS = {"description": "Array to filter DIDs by metadata",
|
|
264
|
-
"type": "array",
|
|
265
|
-
"additionalProperties": True}
|
|
266
|
-
|
|
267
|
-
R_DID = {"description": "Data Identifier(DID)",
|
|
268
|
-
"type": "object",
|
|
269
|
-
"properties": {"scope": R_SCOPE,
|
|
270
|
-
"name": R_NAME,
|
|
271
|
-
"type": DID_TYPE,
|
|
272
|
-
"meta": META,
|
|
273
|
-
"rules": RULES,
|
|
274
|
-
"bytes": BYTES,
|
|
275
|
-
"adler32": ADLER32,
|
|
276
|
-
"md5": MD5,
|
|
277
|
-
"state": REPLICA_STATE,
|
|
278
|
-
"pfn": PFN},
|
|
279
|
-
"required": ["scope", "name"],
|
|
280
|
-
"additionalProperties": False}
|
|
281
|
-
|
|
282
|
-
DIDS = {"description": "Array of Data Identifiers(DIDs)",
|
|
283
|
-
"type": "array",
|
|
284
|
-
"items": DID,
|
|
285
|
-
"minItems": 1,
|
|
286
|
-
"maxItems": 3000} # Was 1000
|
|
287
|
-
|
|
288
|
-
R_DIDS = {"description": "Array of Data Identifiers(DIDs)",
|
|
289
|
-
"type": "array",
|
|
290
|
-
"items": R_DID,
|
|
291
|
-
"minItems": 1,
|
|
292
|
-
"maxItems": 30000}
|
|
293
|
-
|
|
294
|
-
ATTACHMENT = {"description": "Attachement",
|
|
295
|
-
"type": "object",
|
|
296
|
-
"properties": {"scope": SCOPE,
|
|
297
|
-
"name": NAME,
|
|
298
|
-
"rse": {"description": "RSE name",
|
|
299
|
-
"type": ["string", "null"],
|
|
300
|
-
"pattern": "^T[0-3]_[A-Z]{2}((_[A-Za-z0-9]+)+)$"},
|
|
301
|
-
"dids": R_DIDS}, # Loosen up, we're not creating these DIDs
|
|
302
|
-
"required": ["dids"],
|
|
303
|
-
"additionalProperties": False}
|
|
304
|
-
|
|
305
|
-
ATTACHMENTS = {"description": "Array of attachments",
|
|
306
|
-
"type": "array",
|
|
307
|
-
"items": ATTACHMENT,
|
|
308
|
-
"minItems": 1,
|
|
309
|
-
"maxItems": 3000} # Was 1000
|
|
310
|
-
|
|
311
|
-
SUBSCRIPTION_FILTER = {"type": "object",
|
|
312
|
-
"properties": {"datatype": {"type": "array"},
|
|
313
|
-
"prod_step": {"type": "array"},
|
|
314
|
-
"stream_name": {"type": "array"},
|
|
315
|
-
"project": {"type": "array"},
|
|
316
|
-
"scope": {"type": "array"},
|
|
317
|
-
"pattern": {"type": "string"},
|
|
318
|
-
"excluded_pattern": {"type": "string"},
|
|
319
|
-
"group": {"type": "string"},
|
|
320
|
-
"provenance": {"type": "string"},
|
|
321
|
-
"account": ACCOUNTS,
|
|
322
|
-
"grouping": {"type": "string"},
|
|
323
|
-
"split_rule": {"type": "boolean"}}}
|
|
324
|
-
|
|
325
|
-
ADD_REPLICA_FILE = {"description": "add replica file",
|
|
326
|
-
"type": "object",
|
|
327
|
-
"properties": {"scope": SCOPE,
|
|
328
|
-
"name": NAME,
|
|
329
|
-
"bytes": BYTES,
|
|
330
|
-
"adler32": ADLER32},
|
|
331
|
-
"required": ["scope", "name", "bytes", "adler32"]}
|
|
332
|
-
|
|
333
|
-
ADD_REPLICA_FILES = {"description": "add replica files",
|
|
334
|
-
"type": "array",
|
|
335
|
-
"items": ADD_REPLICA_FILE,
|
|
336
|
-
"minItems": 1,
|
|
337
|
-
"maxItems": 1000}
|
|
338
|
-
|
|
339
|
-
CACHE_ADD_REPLICAS = {"description": "rucio cache add replicas",
|
|
340
|
-
"type": "object",
|
|
341
|
-
"properties": {"files": ADD_REPLICA_FILES,
|
|
342
|
-
"rse": RSE,
|
|
343
|
-
"lifetime": LIFETIME,
|
|
344
|
-
"operation": {"enum": ["add_replicas"]}},
|
|
345
|
-
"required": ['files', 'rse', 'lifetime', 'operation']}
|
|
346
|
-
|
|
347
|
-
DELETE_REPLICA_FILE = {"description": "delete replica file",
|
|
348
|
-
"type": "object",
|
|
349
|
-
"properties": {"scope": SCOPE,
|
|
350
|
-
"name": NAME},
|
|
351
|
-
"required": ["scope", "name"]}
|
|
352
|
-
|
|
353
|
-
DELETE_REPLICA_FILES = {"description": "delete replica files",
|
|
354
|
-
"type": "array",
|
|
355
|
-
"items": DELETE_REPLICA_FILE,
|
|
356
|
-
"minItems": 1,
|
|
357
|
-
"maxItems": 1000}
|
|
358
|
-
|
|
359
|
-
CACHE_DELETE_REPLICAS = {"description": "rucio cache delete replicas",
|
|
360
|
-
"type": "object",
|
|
361
|
-
"properties": {"files": DELETE_REPLICA_FILES,
|
|
362
|
-
"rse": RSE,
|
|
363
|
-
"operation": {"enum": ["delete_replicas"]}},
|
|
364
|
-
"required": ['files', 'rse', 'operation']}
|
|
365
|
-
|
|
366
|
-
MESSAGE_OPERATION = {"type": "object",
|
|
367
|
-
"properties": {'operation': {"enum": ["add_replicas", "delete_replicas"]}}}
|
|
368
|
-
|
|
369
|
-
ACCOUNT_ATTRIBUTE = {"description": "Account attribute",
|
|
370
|
-
"type": "string",
|
|
371
|
-
"pattern": r'^[a-zA-Z0-9-_\\/\\.]{1,30}$'}
|
|
372
|
-
|
|
373
|
-
SCOPE_NAME_REGEXP = '/([^/]*)(?=/)(.*)'
|
|
374
|
-
|
|
375
|
-
DISTANCE = {"description": "RSE distance",
|
|
376
|
-
"type": "object",
|
|
377
|
-
"properties": {
|
|
378
|
-
"src_rse_id": {"type": "string"},
|
|
379
|
-
"dest_rse_id": {"type": "string"},
|
|
380
|
-
"ranking": {"type": "integer"}
|
|
381
|
-
},
|
|
382
|
-
"required": ["src_rse_id", "dest_rse_id", "ranking"],
|
|
383
|
-
"additionalProperties": True}
|
|
384
|
-
|
|
385
|
-
IMPORT = {"description": "import data into rucio.",
|
|
386
|
-
"type": "object",
|
|
387
|
-
"properties": {
|
|
388
|
-
"rses": {
|
|
389
|
-
"type": "object"
|
|
390
|
-
},
|
|
391
|
-
"distances": {
|
|
392
|
-
"type": "object"
|
|
393
|
-
}
|
|
394
|
-
}}
|
|
395
|
-
|
|
396
|
-
SCHEMAS = {'account': ACCOUNT,
|
|
397
|
-
'account_type': ACCOUNT_TYPE,
|
|
398
|
-
'activity': ACTIVITY,
|
|
399
|
-
'name': NAME,
|
|
400
|
-
'r_name': R_NAME,
|
|
401
|
-
'rse': RSE,
|
|
402
|
-
'rse_attribute': RSE_ATTRIBUTE,
|
|
403
|
-
'scope': SCOPE,
|
|
404
|
-
'r_scope': R_SCOPE,
|
|
405
|
-
'did': DID,
|
|
406
|
-
'did_filters': DID_FILTERS,
|
|
407
|
-
'r_did': R_DID,
|
|
408
|
-
'dids': DIDS,
|
|
409
|
-
'rule': RULE,
|
|
410
|
-
'r_dids': R_DIDS,
|
|
411
|
-
'collection': COLLECTION,
|
|
412
|
-
'collections': COLLECTIONS,
|
|
413
|
-
'attachment': ATTACHMENT,
|
|
414
|
-
'attachments': ATTACHMENTS,
|
|
415
|
-
'subscription_filter': SUBSCRIPTION_FILTER,
|
|
416
|
-
'cache_add_replicas': CACHE_ADD_REPLICAS,
|
|
417
|
-
'cache_delete_replicas': CACHE_DELETE_REPLICAS,
|
|
418
|
-
'account_attribute': ACCOUNT_ATTRIBUTE,
|
|
419
|
-
'import': IMPORT}
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
def validate_schema(name, obj):
|
|
423
|
-
"""
|
|
424
|
-
Validate object against json schema
|
|
425
|
-
|
|
426
|
-
:param name: The json schema name.
|
|
427
|
-
:param obj: The object to validate.
|
|
428
|
-
"""
|
|
429
|
-
try:
|
|
430
|
-
if obj:
|
|
431
|
-
validate(obj, SCHEMAS.get(name, {}))
|
|
432
|
-
except ValidationError as error: # NOQA, pylint: disable=W0612
|
|
433
|
-
raise InvalidObject(f'Problem validating {name}: {error}')
|
|
434
|
-
|
|
435
|
-
# Apply some extra constraints to CMS DIDs
|
|
436
|
-
if name.lower() in ['did']:
|
|
437
|
-
validate_cms_did(obj)
|
|
438
|
-
elif name.lower() in ['dids']:
|
|
439
|
-
for did in obj:
|
|
440
|
-
validate_cms_did(did)
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
def validate_cms_did(obj):
|
|
444
|
-
"""
|
|
445
|
-
Special checking for DIDs
|
|
446
|
-
Most of the checking is done with JSON schema, but this check
|
|
447
|
-
makes sure user LFNs are in the correct /store/user/rucio/USERNAME namespace
|
|
448
|
-
makes sure group LFNs are in the correct /store/group/rucio/GROUPNAME namespace
|
|
449
|
-
"""
|
|
450
|
-
if not obj:
|
|
451
|
-
return
|
|
452
|
-
|
|
453
|
-
did_type = obj['type']
|
|
454
|
-
lfn = obj['name']
|
|
455
|
-
scope = obj['scope']
|
|
456
|
-
|
|
457
|
-
if did_type != "FILE":
|
|
458
|
-
return
|
|
459
|
-
|
|
460
|
-
verify_scope_lfn_match(lfn, scope, "user")
|
|
461
|
-
verify_scope_lfn_match(lfn, scope, "group")
|
|
462
|
-
|
|
463
|
-
if scope == 'logs':
|
|
464
|
-
if not lfn.startswith('/store/logs/'):
|
|
465
|
-
raise InvalidObject(f'Problem with LFN {lfn}: Logs must start with /store/logs')
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
def verify_scope_lfn_match(lfn, scope, scope_type):
|
|
469
|
-
if lfn.startswith(f'/store/{scope_type}') and not lfn.startswith(f'/store/{scope_type}/rucio/'):
|
|
470
|
-
raise InvalidObject(f"Problem with LFN {lfn} : Legacy {scope_type} files are not managed with Rucio")
|
|
471
|
-
|
|
472
|
-
if lfn.startswith(f'/store/{scope_type}/rucio') and not scope.startswith(f'{scope_type}.'):
|
|
473
|
-
raise InvalidObject(f"Problem with LFN {lfn}: Only {scope_type} scopes allowed in /store/{scope_type}/rucio")
|
|
474
|
-
|
|
475
|
-
if scope.startswith(f'{scope_type}.'):
|
|
476
|
-
_, account = scope.split('.', 1)
|
|
477
|
-
if not lfn.startswith(f'/store/{scope_type}/rucio/{account}/'):
|
|
478
|
-
raise InvalidObject(f"Problem with LFN {lfn} : Not allowed for {scope_type} {account}")
|