Skip to content

Commit 72c7ca4

Browse files
committed
chore(controller): add validate metric
1 parent 677a310 commit 72c7ca4

1 file changed

Lines changed: 26 additions & 8 deletions

File tree

rootfs/api/serializers.py

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""
22
Classes to serialize the RESTful representation of Drycc API models.
33
"""
4-
4+
import time
55
import json
66
import logging
77
import jmespath
@@ -35,6 +35,7 @@
3535
TERMINATION_GRACE_PERIOD_MATCH = re.compile(r'^[0-9]*$')
3636
VOLUME_SIZE_MATCH = re.compile(r'^(?P<volume>([1-9][0-9]*[mgMG]))$', re.IGNORECASE)
3737
VOLUME_PATH = re.compile(r'^\/(\w+\/?)+$', re.IGNORECASE)
38+
METRIC_EVERY = re.compile(r'^[1-9][0-9]*m$')
3839

3940
PROBE_SCHEMA = {
4041
"$schema": "http://json-schema.org/schema#",
@@ -742,10 +743,27 @@ def update(self, instance, validated_data):
742743

743744

744745
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

Comments
 (0)