/
influxdb_retention_policy.py
162 lines (132 loc) · 5.1 KB
/
influxdb_retention_policy.py
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# -*- coding: utf-8 -*-
'''
Management of Influxdb retention policies
=========================================
.. versionadded:: 2017.7.0
(compatible with InfluxDB version 0.9+)
'''
# Import Python libs
from __future__ import absolute_import, print_function, unicode_literals
def __virtual__():
'''
Only load if the influxdb module is available
'''
if 'influxdb.db_exists' in __salt__:
return 'influxdb_retention_policy'
return False
def convert_duration(duration):
'''
Convert the a duration string into XXhYYmZZs format
duration
Duration to convert
Returns: duration_string
String representation of duration in XXhYYmZZs format
'''
# durations must be specified in days, weeks or hours
if duration.endswith('h'):
hours = int(duration.split('h'))
elif duration.endswith('d'):
days = duration.split('d')
hours = int(days[0]) * 24
elif duration.endswith('w'):
weeks = duration.split('w')
hours = int(weeks[0]) * 24 * 7
duration_string = str(hours)+'h0m0s'
return duration_string
def present(name, database, duration="7d",
replication=1, default=False,
**client_args):
'''
Ensure that given retention policy is present.
name
Name of the retention policy to create.
database
Database to create retention policy on.
'''
ret = {'name': name,
'changes': {},
'result': True,
'comment': 'retention policy {0} is already present'.format(name)}
if not __salt__['influxdb.retention_policy_exists'](name=name,
database=database,
**client_args):
if __opts__['test']:
ret['result'] = None
ret['comment'] = ' {0} is absent and will be created'\
.format(name)
return ret
if __salt__['influxdb.create_retention_policy'](
database, name,
duration, replication, default, **client_args
):
ret['comment'] = 'retention policy {0} has been created'\
.format(name)
ret['changes'][name] = 'Present'
return ret
else:
ret['comment'] = 'Failed to create retention policy {0}'\
.format(name)
ret['result'] = False
return ret
else:
current_policy = __salt__['influxdb.get_retention_policy'](database=database, name=name, **client_args)
update_policy = False
if current_policy['duration'] != convert_duration(duration):
update_policy = True
ret['changes']['duration'] = "Retention changed from {0} to {1}.".format(current_policy['duration'], duration)
if current_policy['replicaN'] != replication:
update_policy = True
ret['changes']['replication'] = "Replication changed from {0} to {1}.".format(current_policy['replicaN'], replication)
if current_policy['default'] != default:
update_policy = True
ret['changes']['default'] = "Default changed from {0} to {1}.".format(current_policy['default'], default)
if update_policy:
if __opts__['test']:
ret['result'] = None
ret['comment'] = ' {0} is present and set to be changed'\
.format(name)
return ret
else:
if __salt__['influxdb.alter_retention_policy'](
database, name,
duration, replication, default, **client_args
):
ret['comment'] = 'retention policy {0} has been changed'\
.format(name)
return ret
else:
ret['comment'] = 'Failed to update retention policy {0}'\
.format(name)
ret['result'] = False
return ret
return ret
def absent(name, database, **client_args):
'''
Ensure that given retention policy is absent.
name
Name of the retention policy to remove.
database
Name of the database that the retention policy was defined on.
'''
ret = {'name': name,
'changes': {},
'result': True,
'comment': 'retention policy {0} is not present'.format(name)}
if __salt__['influxdb.retention_policy_exists'](database, name, **client_args):
if __opts__['test']:
ret['result'] = None
ret['comment'] = (
'retention policy {0} is present and needs to be removed'
).format(name)
return ret
if __salt__['influxdb.drop_retention_policy'](database, name, **client_args):
ret['comment'] = 'retention policy {0} has been removed'\
.format(name)
ret['changes'][name] = 'Absent'
return ret
else:
ret['comment'] = 'Failed to remove retention policy {0}'\
.format(name)
ret['result'] = False
return ret
return ret