forked from rucio/rucio
/
rucio-atropos
executable file
·60 lines (51 loc) · 3.11 KB
/
rucio-atropos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/usr/bin/env python3
# Copyright European Organization for Nuclear Research (CERN) since 2012
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
'''
Atropos Daemon : End the life of the rules according to the Lifetime Model
'''
import argparse
import datetime
import signal
from rucio.daemons.atropos.atropos import run, stop
def get_parser() -> argparse.ArgumentParser:
"""
Returns the argparse parser.
"""
parser = argparse.ArgumentParser(description='The Atropos Daemon is responsible for the deletion of rules with expired eol_at (end the life at), according to the Lifetime Model. Once the rule is deleted, the replicas covered by the rule will not be protected anymore and eventually, will be deleted by another daemon.') # noqa E501
parser.add_argument("--run-once", action="store_true", default=False, help='Runs one loop iteration')
parser.add_argument("--dry-run", action="store_true", default=False, help='Dry run mode')
parser.add_argument("--threads", action="store", default=1, type=int, help='Concurrency control: number of threads')
parser.add_argument("--grace-period", action="store", default=86400, type=int, help='Grace period for the rules. In seconds !!!')
parser.add_argument("--date-check", action="store", help='Date when the lifetime model will be applied. Cannot be used for a date in the future if dry-run is not enabled',
default=datetime.datetime.utcnow(), type=lambda d: datetime.datetime.strptime(d, '%Y-%m-%d'))
parser.add_argument("--unlock-rules", action="store_true", default=False, help='Automatically unlock affected rules')
parser.add_argument("--spread-period", action="store", default=0, type=int, help='Set the rules to randomly expire over a period (in seconds). Uses a uniform distribution')
parser.add_argument("--purge-replicas", action="store_true", default=False, help='Set the replicas to be deleted instead of secondarised')
parser.add_argument('--sleep-time', action="store", default=60, type=int, help='Concurrency control: thread sleep time after each chunk of work')
return parser
if __name__ == "__main__":
# Bind our callback to the SIGTERM signal and run the daemon:
signal.signal(signal.SIGTERM, stop)
parser = get_parser()
args = parser.parse_args()
try:
run(threads=args.threads, date_check=args.date_check,
dry_run=args.dry_run, grace_period=args.grace_period,
once=args.run_once, unlock=args.unlock_rules,
spread_period=args.spread_period,
purge_replicas=args.purge_replicas,
sleep_time=args.sleep_time)
except KeyboardInterrupt:
stop()