|
1 | 1 | """ |
2 | 2 | Classes to serialize the RESTful representation of Drycc API models. |
3 | 3 | """ |
4 | | - |
| 4 | +import time |
5 | 5 | import json |
6 | 6 | import logging |
7 | 7 | import jmespath |
|
35 | 35 | TERMINATION_GRACE_PERIOD_MATCH = re.compile(r'^[0-9]*$') |
36 | 36 | VOLUME_SIZE_MATCH = re.compile(r'^(?P<volume>([1-9][0-9]*[mgMG]))$', re.IGNORECASE) |
37 | 37 | VOLUME_PATH = re.compile(r'^\/(\w+\/?)+$', re.IGNORECASE) |
| 38 | +METRIC_EVERY = re.compile(r'^[1-9][0-9]*m$') |
38 | 39 |
|
39 | 40 | PROBE_SCHEMA = { |
40 | 41 | "$schema": "http://json-schema.org/schema#", |
@@ -742,10 +743,27 @@ def update(self, instance, validated_data): |
742 | 743 |
|
743 | 744 |
|
744 | 745 | class MetricSerializer(serializers.Serializer): |
745 | | - import time |
746 | | - now = int(time.time()) |
747 | | - default_start = (now - now % 3600) - 3600 |
748 | | - default_stop = now - now % 3600 |
749 | | - start = serializers.IntegerField(min_value=946656000, max_value=4102416000, required=False, default=default_start) # noqa |
750 | | - stop = serializers.IntegerField(min_value=946656000, max_value=4102416000, required=False, default=default_stop) # noqa |
751 | | - every = serializers.CharField(max_length=50, required=False, default='5m') # noqa |
| 746 | + start = serializers.IntegerField( |
| 747 | + min_value=946656000, max_value=lambda: time.time(), |
| 748 | + required=False, default=lambda: int(time.time() - 3600)) |
| 749 | + stop = serializers.IntegerField( |
| 750 | + min_value=946656000, max_value=4102416000, |
| 751 | + required=False, default=lambda: int(time.time())) |
| 752 | + every = serializers.CharField(max_length=50, required=False, default='5m') |
| 753 | + |
| 754 | + def validate(self, attrs): |
| 755 | + if not re.match(METRIC_EVERY, attrs["every"]): |
| 756 | + raise serializers.ValidationError( |
| 757 | + "The format of every is:%s" % METRIC_EVERY.pattern |
| 758 | + ) |
| 759 | + interval = attrs.get("stop") - attrs.get("start") |
| 760 | + if interval < 0 or interval > 3600 * 24: |
| 761 | + raise serializers.ValidationError( |
| 762 | + 'The start and stop intervals must be within 24 hour.' |
| 763 | + ) |
| 764 | + quantity = interval / (int(attrs["every"][:-1]) * 60) |
| 765 | + if quantity > 100: |
| 766 | + raise serializers.ValidationError( |
| 767 | + 'The amount of data requested is too large.' |
| 768 | + ) |
| 769 | + return attrs |
0 commit comments