12
12
# See the License for the specific language governing permissions and
13
13
# limitations under the License.
14
14
15
- from re import search , sub
16
- from typing import Optional
15
+ from re import search , sub , Match
16
+ from typing import Optional , Dict
17
17
18
18
from aws_advanced_python_wrapper .utils .rds_url_type import RdsUrlType
19
19
@@ -81,84 +81,101 @@ class RdsUtils:
81
81
r"(?P<dns>proxy-|cluster-|cluster-ro-|cluster-custom-)?" \
82
82
r"(?P<domain>[a-zA-Z0-9]+\." \
83
83
r"(?P<region>[a-zA-Z0-9\-]+)\.rds\.amazonaws\.com\.cn)"
84
- AURORA_CHINA_INSTANCE_PATTERN = r"(?P<instance>.+)\." \
85
- r"(?P<domain>[a-zA-Z0-9]+\." \
86
- r"(?P<region>[a-zA-Z0-9\-]+)\.rds\.amazonaws\.com\.cn)"
84
+ AURORA_OLD_CHINA_DNS_PATTERN = r"(?P<instance>.+)\." \
85
+ r"(?P<dns>proxy-|cluster-|cluster-ro-|cluster-custom-)?" \
86
+ r"(?P<domain>[a-zA-Z0-9]+\." \
87
+ r"rds\.(?P<region>[a-zA-Z0-9\-]+)\.amazonaws\.com\.cn)"
87
88
AURORA_CHINA_CLUSTER_PATTERN = r"(?P<instance>.+)\." \
88
89
r"(?P<dns>cluster-|cluster-ro-)+" \
89
90
r"(?P<domain>[a-zA-Z0-9]+\." \
90
91
r"(?P<region>[a-zA-Z0-9\-]+)\.rds\.amazonaws\.com\.cn)"
91
- AURORA_CHINA_CUSTOM_CLUSTER_PATTERN = r"(?P<instance>.+)\." \
92
- r"(?P<dns>cluster-custom-)+" \
93
- r"(?P<domain>[a-zA-Z0-9]+\." \
94
- r"(?P<region>[a-zA-Z0-9\-]+)\.rds\.amazonaws\.com\.cn)"
95
- AURORA_CHINA_PROXY_DNS_PATTERN = r"(?P<instance>.+)\." \
96
- r"(?P<dns>proxy-)+" \
97
- r"(?P<domain>[a-zA-Z0-9]+\." \
98
- r"(?P<region>[a-zA-Z0-9\-])+\.rds\.amazonaws\.com\.cn)"
92
+ AURORA_OLD_CHINA_CLUSTER_PATTERN = r"(?P<instance>.+)\." \
93
+ r"(?P<dns>cluster-|cluster-ro-)+" \
94
+ r"(?P<domain>[a-zA-Z0-9]+\." \
95
+ r"rds\.(?P<region>[a-zA-Z0-9\-]+)\.amazonaws\.com\.cn)"
96
+ AURORA_GOV_DNS_PATTERN = r"^(?P<instance>.+)\." \
97
+ r"(?P<dns>proxy-|cluster-|cluster-ro-|cluster-custom-|limitless-)?" \
98
+ r"(?P<domain>[a-zA-Z0-9]+\.rds\.(?P<region>[a-zA-Z0-9\-]+)" \
99
+ r"\.(amazonaws\.com|c2s\.ic\.gov|sc2s\.sgov\.gov))"
100
+ AURORA_GOV_CLUSTER_PATTERN = r"^(?P<instance>.+)\." \
101
+ r"(?P<dns>cluster-|cluster-ro-)+" \
102
+ r"(?P<domain>[a-zA-Z0-9]+\.rds\.(?P<region>[a-zA-Z0-9\-]+)" \
103
+ r"\.(amazonaws\.com|c2s\.ic\.gov|sc2s\.sgov\.gov))"
104
+ ELB_PATTERN = r"^(?<instance>.+)\.elb\.((?<region>[a-zA-Z0-9\-]+)\.amazonaws\.com)"
99
105
100
106
IP_V4 = r"^(([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){1}" \
101
- r"(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ "
107
+ r"(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
102
108
IP_V6 = r"^[0-9a-fA-F]{1,4}(:[0-9a-fA-F]{1,4}){7}$"
103
- IP_V6_COMPRESSED = r"^(([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){0,5})?)::(([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){0,5})?)$ "
109
+ IP_V6_COMPRESSED = r"^(([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){0,5})?)::(([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){0,5})?)"
104
110
105
111
DNS_GROUP = "dns"
106
112
DOMAIN_GROUP = "domain"
107
113
INSTANCE_GROUP = "instance"
108
114
REGION_GROUP = "region"
109
115
116
+ CACHE_DNS_PATTERNS : Dict [str , Match [str ]] = {}
117
+ CACHE_PATTERNS : Dict [str , str ] = {}
118
+
110
119
def is_rds_cluster_dns (self , host : str ) -> bool :
111
- return self ._contains (host , [self .AURORA_CLUSTER_PATTERN , self .AURORA_CHINA_CLUSTER_PATTERN ])
120
+ dns_group = self ._get_dns_group (host )
121
+ return dns_group is not None and dns_group .casefold () in ["cluster-" , "cluster-ro-" ]
112
122
113
123
def is_rds_custom_cluster_dns (self , host : str ) -> bool :
114
- return self ._contains (host , [self .AURORA_CUSTOM_CLUSTER_PATTERN , self .AURORA_CHINA_CUSTOM_CLUSTER_PATTERN ])
124
+ dns_group = self ._get_dns_group (host )
125
+ return dns_group is not None and dns_group .casefold () == "cluster-custom-"
115
126
116
127
def is_rds_dns (self , host : str ) -> bool :
117
- return self ._contains (host , [self .AURORA_DNS_PATTERN , self .AURORA_CHINA_DNS_PATTERN ])
128
+ if not host or not host .strip ():
129
+ return False
130
+
131
+ pattern = self ._find (host , [RdsUtils .AURORA_DNS_PATTERN ,
132
+ RdsUtils .AURORA_CHINA_DNS_PATTERN ,
133
+ RdsUtils .AURORA_OLD_CHINA_DNS_PATTERN ,
134
+ RdsUtils .AURORA_GOV_DNS_PATTERN ])
135
+ group = self ._get_regex_group (pattern , RdsUtils .DNS_GROUP )
136
+
137
+ if group :
138
+ RdsUtils .CACHE_PATTERNS [host ] = group
139
+
140
+ return pattern is not None
118
141
119
142
def is_rds_instance (self , host : str ) -> bool :
120
- return (self ._contains (host , [self .AURORA_INSTANCE_PATTERN , self .AURORA_CHINA_INSTANCE_PATTERN ])
121
- and self .is_rds_dns (host ))
143
+ return self ._get_dns_group (host ) is None and self .is_rds_dns (host )
122
144
123
145
def is_rds_proxy_dns (self , host : str ) -> bool :
124
- return self ._contains (host , [self .AURORA_PROXY_DNS_PATTERN , self .AURORA_CHINA_PROXY_DNS_PATTERN ])
146
+ dns_group = self ._get_dns_group (host )
147
+ return dns_group is not None and dns_group .casefold () == "proxy-"
125
148
126
149
def get_rds_instance_host_pattern (self , host : str ) -> str :
127
150
if not host or not host .strip ():
128
151
return "?"
129
152
130
- match = self ._find (host , [ self . AURORA_DNS_PATTERN , self . AURORA_CHINA_DNS_PATTERN ] )
153
+ match = self ._get_group (host , RdsUtils . DOMAIN_GROUP )
131
154
if match :
132
- return f"?.{ match . group ( self . DOMAIN_GROUP ) } "
155
+ return f"?.{ match } "
133
156
134
157
return "?"
135
158
136
159
def get_rds_region (self , host : Optional [str ]):
137
160
if not host or not host .strip ():
138
161
return None
139
162
140
- match = self ._find (host , [ self . AURORA_DNS_PATTERN , self . AURORA_CHINA_DNS_PATTERN ] )
141
- if match :
142
- return match . group ( self . REGION_GROUP )
163
+ group = self ._get_group (host , RdsUtils . REGION_GROUP )
164
+ if group :
165
+ return group
143
166
167
+ elb_matcher = search (RdsUtils .ELB_PATTERN , host )
168
+ if elb_matcher :
169
+ return elb_matcher .group (RdsUtils .REGION_GROUP )
144
170
return None
145
171
146
172
def is_writer_cluster_dns (self , host : str ) -> bool :
147
- if not host or not host .strip ():
148
- return False
149
-
150
- match = self ._find (host , [self .AURORA_CLUSTER_PATTERN , self .AURORA_CHINA_CLUSTER_PATTERN ])
151
- if match :
152
- return "cluster-" .casefold () == match .group (self .DNS_GROUP ).casefold ()
153
-
154
- return False
173
+ dns_group = self ._get_dns_group (host )
174
+ return dns_group is not None and dns_group .casefold () == "cluster-"
155
175
156
176
def is_reader_cluster_dns (self , host : str ) -> bool :
157
- match = self ._find (host , [self .AURORA_CLUSTER_PATTERN , self .AURORA_CHINA_CLUSTER_PATTERN ])
158
- if match :
159
- return "cluster-ro-" .casefold () == match .group (self .DNS_GROUP ).casefold ()
160
-
161
- return False
177
+ dns_group = self ._get_dns_group (host )
178
+ return dns_group is not None and dns_group .casefold () == "cluster-ro-"
162
179
163
180
def get_rds_cluster_host_url (self , host : str ):
164
181
if not host or not host .strip ():
@@ -173,20 +190,20 @@ def get_rds_cluster_host_url(self, host: str):
173
190
return None
174
191
175
192
def get_instance_id (self , host : str ) -> Optional [str ]:
176
- if not host or not host .strip ():
177
- return None
178
-
179
- match = self ._find (host , [self .AURORA_INSTANCE_PATTERN , self .AURORA_CHINA_INSTANCE_PATTERN ])
180
- if match :
181
- return match .group (self .INSTANCE_GROUP )
193
+ if self ._get_dns_group (host ) is None :
194
+ return self ._get_group (host , self .INSTANCE_GROUP )
182
195
183
196
return None
184
197
185
198
def is_ipv4 (self , host : str ) -> bool :
186
- return self ._contains (host , [self .IP_V4 ])
199
+ if host is None or not host .strip ():
200
+ return False
201
+ return search (RdsUtils .IP_V4 , host ) is not None
187
202
188
203
def is_ipv6 (self , host : str ) -> bool :
189
- return self ._contains (host , [self .IP_V6 , self .IP_V6_COMPRESSED ])
204
+ if host is None or not host .strip ():
205
+ return False
206
+ return search (RdsUtils .IP_V6_COMPRESSED , host ) is not None and search (RdsUtils .IP_V6 , host ) is not None
190
207
191
208
def is_dns_pattern_valid (self , host : str ) -> bool :
192
209
return "?" in host
@@ -210,17 +227,38 @@ def identify_rds_type(self, host: Optional[str]) -> RdsUrlType:
210
227
211
228
return RdsUrlType .OTHER
212
229
213
- def _contains (self , host : str , patterns : list ) -> bool :
214
- if not host or not host .strip ():
215
- return False
216
-
217
- return len ([pattern for pattern in patterns if search (pattern , host )]) > 0
218
-
219
230
def _find (self , host : str , patterns : list ):
220
231
if not host or not host .strip ():
221
232
return None
222
233
223
234
for pattern in patterns :
235
+ match = RdsUtils .CACHE_DNS_PATTERNS .get (host )
236
+ if match :
237
+ return match
238
+
224
239
match = search (pattern , host )
225
240
if match :
241
+ RdsUtils .CACHE_DNS_PATTERNS [host ] = match
226
242
return match
243
+
244
+ return None
245
+
246
+ def _get_regex_group (self , pattern : Match [str ], group_name : str ):
247
+ return pattern .group (group_name )
248
+
249
+ def _get_group (self , host : str , group : str ):
250
+ if not host or not host .strip ():
251
+ return None
252
+
253
+ pattern = self ._find (host , [RdsUtils .AURORA_DNS_PATTERN ,
254
+ RdsUtils .AURORA_CHINA_DNS_PATTERN ,
255
+ RdsUtils .AURORA_OLD_CHINA_DNS_PATTERN ,
256
+ RdsUtils .AURORA_GOV_DNS_PATTERN ])
257
+ return self ._get_regex_group (pattern , group )
258
+
259
+ def _get_dns_group (self , host : str ):
260
+ return self ._get_group (host , RdsUtils .DNS_GROUP )
261
+
262
+ @staticmethod
263
+ def clear_cache ():
264
+ RdsUtils .CACHE_PATTERNS .clear ()
0 commit comments