1
1
use crate :: TimeProvider ;
2
2
use aws_sdk_ssm:: types:: ParameterMetadata ;
3
3
use chrono:: { DateTime , Duration } ;
4
+ use regex:: Regex ;
4
5
5
6
pub fn filter_old_parameters < T : TimeProvider > (
6
7
parameters : & [ ParameterMetadata ] ,
7
8
time_provider : & T ,
8
9
older_than_seconds : f64 ,
9
- ) -> Vec < String > {
10
+ pattern : & str ,
11
+ ) -> Result < Vec < String > , regex:: Error > {
10
12
let threshold = time_provider. now ( ) - Duration :: seconds ( older_than_seconds as i64 ) ;
13
+ let regex = Regex :: new ( pattern) ?;
11
14
let mut parameters_to_delete = Vec :: new ( ) ;
12
15
13
16
for parameter in parameters {
@@ -17,13 +20,15 @@ pub fn filter_old_parameters<T: TimeProvider>(
17
20
18
21
if last_modified_time < threshold {
19
22
if let Some ( name) = parameter. name ( ) {
20
- parameters_to_delete. push ( name. to_string ( ) ) ;
23
+ if regex. is_match ( name) {
24
+ parameters_to_delete. push ( name. to_string ( ) ) ;
25
+ }
21
26
}
22
27
}
23
28
}
24
29
}
25
30
26
- parameters_to_delete
31
+ Ok ( parameters_to_delete)
27
32
}
28
33
29
34
#[ cfg( test) ]
@@ -54,7 +59,7 @@ mod tests {
54
59
let parameters = vec ! [ ] ;
55
60
let time_provider = MockTimeProvider :: new ( Utc :: now ( ) ) ;
56
61
57
- let result = filter_old_parameters ( & parameters, & time_provider, 86400.0 ) ; // 1 day in seconds
62
+ let result = filter_old_parameters ( & parameters, & time_provider, 86400.0 , ".*" ) . unwrap ( ) ; // 1 day in seconds
58
63
59
64
assert_eq ! ( result. len( ) , 0 ) ;
60
65
}
@@ -72,7 +77,7 @@ mod tests {
72
77
let time_provider = MockTimeProvider :: new ( now) ;
73
78
let parameters = vec ! [ parameter] ;
74
79
75
- let result = filter_old_parameters ( & parameters, & time_provider, 86400.0 ) ; // 1 day in seconds
80
+ let result = filter_old_parameters ( & parameters, & time_provider, 86400.0 , ".*" ) . unwrap ( ) ; // 1 day in seconds
76
81
77
82
assert_eq ! ( result. len( ) , 0 ) ;
78
83
}
@@ -90,7 +95,7 @@ mod tests {
90
95
let time_provider = MockTimeProvider :: new ( now) ;
91
96
let parameters = vec ! [ parameter] ;
92
97
93
- let result = filter_old_parameters ( & parameters, & time_provider, 86400.0 ) ; // 1 day in seconds
98
+ let result = filter_old_parameters ( & parameters, & time_provider, 86400.0 , ".*" ) . unwrap ( ) ; // 1 day in seconds
94
99
95
100
assert_eq ! ( result. len( ) , 1 ) ;
96
101
assert_eq ! ( result[ 0 ] , "old-param" ) ;
@@ -115,7 +120,7 @@ mod tests {
115
120
let time_provider = MockTimeProvider :: new ( now) ;
116
121
let parameters = vec ! [ old_parameter, recent_parameter] ;
117
122
118
- let result = filter_old_parameters ( & parameters, & time_provider, 172800.0 ) ; // 2 days in seconds
123
+ let result = filter_old_parameters ( & parameters, & time_provider, 172800.0 , ".*" ) . unwrap ( ) ; // 2 days in seconds
119
124
120
125
assert_eq ! ( result. len( ) , 1 ) ;
121
126
assert_eq ! ( result[ 0 ] , "old-param" ) ;
@@ -130,7 +135,7 @@ mod tests {
130
135
let time_provider = MockTimeProvider :: new ( Utc :: now ( ) ) ;
131
136
let parameters = vec ! [ parameter] ;
132
137
133
- let result = filter_old_parameters ( & parameters, & time_provider, 86400.0 ) ; // 1 day in seconds
138
+ let result = filter_old_parameters ( & parameters, & time_provider, 86400.0 , ".*" ) . unwrap ( ) ; // 1 day in seconds
134
139
135
140
assert_eq ! ( result. len( ) , 0 ) ;
136
141
}
@@ -147,7 +152,51 @@ mod tests {
147
152
let time_provider = MockTimeProvider :: new ( now) ;
148
153
let parameters = vec ! [ parameter] ;
149
154
150
- let result = filter_old_parameters ( & parameters, & time_provider, 86400.0 ) ; // 1 day in seconds
155
+ let result = filter_old_parameters ( & parameters, & time_provider, 86400.0 , ".*" ) . unwrap ( ) ; // 1 day in seconds
156
+
157
+ assert_eq ! ( result. len( ) , 0 ) ;
158
+ }
159
+
160
+ #[ test]
161
+ fn test_filter_old_parameters_with_pattern_match ( ) {
162
+ let now = Utc :: now ( ) ;
163
+ let old_time = now - Duration :: days ( 5 ) ;
164
+
165
+ let matching_parameter = ParameterMetadata :: builder ( )
166
+ . name ( "gh-ci-i-test-param" )
167
+ . last_modified_date ( AwsDateTime :: from_secs ( old_time. timestamp ( ) ) )
168
+ . build ( ) ;
169
+
170
+ let non_matching_parameter = ParameterMetadata :: builder ( )
171
+ . name ( "other-param" )
172
+ . last_modified_date ( AwsDateTime :: from_secs ( old_time. timestamp ( ) ) )
173
+ . build ( ) ;
174
+
175
+ let time_provider = MockTimeProvider :: new ( now) ;
176
+ let parameters = vec ! [ matching_parameter, non_matching_parameter] ;
177
+
178
+ let result =
179
+ filter_old_parameters ( & parameters, & time_provider, 86400.0 , "gh-ci-i-.*" ) . unwrap ( ) ; // 1 day in seconds
180
+
181
+ assert_eq ! ( result. len( ) , 1 ) ;
182
+ assert_eq ! ( result[ 0 ] , "gh-ci-i-test-param" ) ;
183
+ }
184
+
185
+ #[ test]
186
+ fn test_filter_old_parameters_with_pattern_no_match ( ) {
187
+ let now = Utc :: now ( ) ;
188
+ let old_time = now - Duration :: days ( 5 ) ;
189
+
190
+ let parameter = ParameterMetadata :: builder ( )
191
+ . name ( "other-param" )
192
+ . last_modified_date ( AwsDateTime :: from_secs ( old_time. timestamp ( ) ) )
193
+ . build ( ) ;
194
+
195
+ let time_provider = MockTimeProvider :: new ( now) ;
196
+ let parameters = vec ! [ parameter] ;
197
+
198
+ let result =
199
+ filter_old_parameters ( & parameters, & time_provider, 86400.0 , "gh-ci-i-.*" ) . unwrap ( ) ; // 1 day in seconds
151
200
152
201
assert_eq ! ( result. len( ) , 0 ) ;
153
202
}
0 commit comments