|
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`.""" |
@@ -372,6 +374,21 @@ def validate_healthcheck(self, data): |
372 | 374 |
|
373 | 375 | return data |
374 | 376 |
|
| 377 | + def validate_termination_grace_period(self, data): |
| 378 | + for key, value in data.items(): |
| 379 | + if value is None: # use NoneType to unset an item |
| 380 | + continue |
| 381 | + |
| 382 | + if not re.match(PROCTYPE_MATCH, key): |
| 383 | + raise serializers.ValidationError(PROCTYPE_MISMATCH_MSG) |
| 384 | + |
| 385 | + timeout = re.match(TERMINATION_GRACE_PERIOD_MATCH, value) |
| 386 | + if not timeout: |
| 387 | + raise serializers.ValidationError( |
| 388 | + "Termination Grace Period format: <value>, where value must be a numeric") |
| 389 | + |
| 390 | + return data |
| 391 | + |
375 | 392 |
|
376 | 393 | class ReleaseSerializer(serializers.ModelSerializer): |
377 | 394 | """Serialize a :class:`~api.models.Release` model.""" |
|
0 commit comments