-
Notifications
You must be signed in to change notification settings - Fork 40
/
base.rb
153 lines (124 loc) · 3.44 KB
/
base.rb
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
# coding: utf-8
module Stoplight
module DataStore
class Base
# @return [Array<String>]
def names
fail NotImplementedError
end
# Deletes all green lights without failures.
def purge
fail NotImplementedError
end
# @param _name [String]
def delete(_name)
fail NotImplementedError
end
# @param _name [String]
# @return [String]
def color(_name)
fail NotImplementedError
end
# @param _name [String]
# @param _error [Exception]
def record_failure(_name, _error)
fail NotImplementedError
end
# @param _name [String]
def clear_failures(_name)
fail NotImplementedError
end
# @param _name [String]
# @return [Array<Failure>]
def failures(_name)
fail NotImplementedError
end
# @param _name [String]
# @return [Integer]
def threshold(_name)
fail NotImplementedError
end
# @param _name [String]
# @param _threshold [Integer]
# @return (see #threshold)
def set_threshold(_name, _threshold)
fail NotImplementedError
end
# @param _name [String]
# @return (see #attempts)
def record_attempt(_name)
fail NotImplementedError
end
# @param _name [String]
def clear_attempts(_name)
fail NotImplementedError
end
# @param _name [String]
# @return [Integer]
def attempts(_name)
fail NotImplementedError
end
# @param _name [String]
# @return [String]
def state(_name)
fail NotImplementedError
end
# @param _name [String]
# @param _state [String]
# @return [String]
def set_state(_name, _state)
# REVIEW: Should we clear failures here?
fail NotImplementedError
end
# @param _name [String]
# @return [Integer]
def timeout(_name)
fail NotImplementedError
end
# @param _name [String]
# @param _timeout [Integer]
# @return [Integer]
def set_timeout(_name, _timeout)
fail NotImplementedError
end
private
# rubocop:disable Metrics/CyclomaticComplexity
# rubocop:disable Metrics/PerceivedComplexity
def _color(failures, state, threshold, timeout)
return COLOR_GREEN if state == STATE_LOCKED_GREEN
return COLOR_RED if state == STATE_LOCKED_RED
threshold = threshold ? threshold.to_i : DEFAULT_THRESHOLD
return COLOR_GREEN if failures.size < threshold
# If the threshold is 0, the light is always red.
return COLOR_RED if failures.empty?
timeout = timeout ? timeout.to_i : DEFAULT_TIMEOUT
return COLOR_YELLOW if Time.now - failures.last.time > timeout
COLOR_RED
end
# rubocop:enable Metrics/CyclomaticComplexity
# rubocop:enable Metrics/PerceivedComplexity
def validate_state!(state)
return if DataStore::STATES.include?(state)
fail ArgumentError, 'Invalid state'
end
def attempts_key
key('attempts')
end
def failures_key(name)
key('failures', name)
end
def states_key
key('states')
end
def thresholds_key
key('thresholds')
end
def timeouts_key
key('timeouts')
end
def key(slug, name = nil)
[KEY_PREFIX, name, slug].compact.join(':')
end
end
end
end