|
26 | 26 | r'^(?P<cpu>(([-+]?[0-9]*\.?[0-9]+[m]?)(/([-+]?[0-9]*\.?[0-9]+[m]?))?))$') |
27 | 27 | TAGVAL_MATCH = re.compile(r'^(?:[a-zA-Z\d][-\.\w]{0,61})?[a-zA-Z\d]$') |
28 | 28 | CONFIGKEY_MATCH = re.compile(r'^[a-z_]+[a-z0-9_]*$', re.IGNORECASE) |
| 29 | +TERMINATION_GRACE_PERIOD_MATCH = re.compile(r'^[0-9]*$') |
29 | 30 | PROBE_SCHEMA = { |
30 | 31 | "$schema": "http://json-schema.org/schema#", |
31 | 32 |
|
@@ -218,6 +219,7 @@ class ConfigSerializer(serializers.ModelSerializer): |
218 | 219 | registry = JSONFieldSerializer(required=False, binary=True) |
219 | 220 | healthcheck = JSONFieldSerializer(convert_to_str=False, required=False, binary=True) |
220 | 221 | routable = serializers.BooleanField(required=False) |
| 222 | + termination_grace_period = JSONFieldSerializer(required=False, binary=True) |
221 | 223 |
|
222 | 224 | class Meta: |
223 | 225 | """Metadata options for a :class:`ConfigSerializer`.""" |
@@ -299,6 +301,21 @@ def validate_cpu(self, data): |
299 | 301 |
|
300 | 302 | return data |
301 | 303 |
|
| 304 | + def validate_termination_grace_period(self, data): |
| 305 | + for key, value in data.items(): |
| 306 | + if value is None: # use NoneType to unset an item |
| 307 | + continue |
| 308 | + |
| 309 | + if not re.match(PROCTYPE_MATCH, key): |
| 310 | + raise serializers.ValidationError(PROCTYPE_MISMATCH_MSG) |
| 311 | + |
| 312 | + timeout = re.match(TERMINATION_GRACE_PERIOD_MATCH, str(value)) |
| 313 | + if not timeout: |
| 314 | + raise serializers.ValidationError( |
| 315 | + "Termination Grace Period format: <value>, where value must be a numeric") |
| 316 | + |
| 317 | + return data |
| 318 | + |
302 | 319 | def validate_tags(self, data): |
303 | 320 | for key, value in data.items(): |
304 | 321 | if value is None: # use NoneType to unset an item |
|
0 commit comments