Skip to content

Commit 23e70e8

Browse files
committed
chore(models): add procfile_type check
1 parent 8aeab3c commit 23e70e8

20 files changed

Lines changed: 156 additions & 53 deletions
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Generated by Django 4.2.10 on 2024-05-15 04:19
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('api', '0007_domain_procfile_type'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='domain',
15+
name='procfile_type',
16+
field=models.CharField(max_length=63),
17+
),
18+
migrations.AlterField(
19+
model_name='route',
20+
name='procfile_type',
21+
field=models.CharField(max_length=63),
22+
),
23+
migrations.AlterField(
24+
model_name='service',
25+
name='procfile_type',
26+
field=models.CharField(max_length=63),
27+
),
28+
]

rootfs/api/models/app.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,18 @@
2525
from api.utils import generate_app_name, apply_tasks
2626
from scheduler import KubeHTTPException, KubeException
2727
from scheduler.resources.pod import DEFAULT_CONTAINER_PORT
28-
from .gateway import Gateway, Route, DEFAULT_HTTP_PORT
28+
from .gateway import Gateway, Route
2929
from .limit import LimitPlan
3030
from .config import Config
3131
from .service import Service
3232
from .release import Release
3333
from .tls import TLS
3434
from .appsettings import AppSettings
3535
from .volume import Volume
36-
from .base import UuidAuditedModel
36+
from .base import UuidAuditedModel, PROCFILE_TYPE_WEB, PROCFILE_TYPE_RUN, DEFAULT_HTTP_PORT
3737

3838
User = get_user_model()
3939
logger = logging.getLogger(__name__)
40-
PROCFILE_TYPE_WEB = "web"
41-
PROCFILE_TYPE_RUN = "run"
4240

4341

4442
# http://kubernetes.io/v1.1/docs/design/identifiers.html

rootfs/api/models/base.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@
2727
"access_token", "expires_in", "token_type", "scope", "refresh_token"
2828
],
2929
}
30+
PROCFILE_TYPE_WEB = "web"
31+
PROCFILE_TYPE_RUN = "run"
32+
DEFAULT_HTTP_PORT = 80
33+
DEFAULT_HTTPS_PORT = 443
34+
PROCFILE_TYPE_MIN_LENGTH = 3
35+
PROCFILE_TYPE_MAX_LENGTH = 63
3036

3137

3238
def get_anonymous_user_instance(user): return user(id=-1, username=settings.ANONYMOUS_USER_NAME)

rootfs/api/models/domain.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from django.db import models
22
from django.db import transaction
33
from django.contrib.auth import get_user_model
4-
from .base import AuditedModel
4+
from .base import AuditedModel, PROCFILE_TYPE_MAX_LENGTH
55

66
User = get_user_model()
77

@@ -21,7 +21,7 @@ class Domain(AuditedModel):
2121
blank=True,
2222
null=True
2323
)
24-
procfile_type = models.TextField()
24+
procfile_type = models.CharField(max_length=PROCFILE_TYPE_MAX_LENGTH)
2525

2626
class Meta:
2727
ordering = ['domain', 'certificate']

rootfs/api/models/gateway.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,10 @@
88
from api.exceptions import ServiceUnavailable
99
from scheduler import KubeException
1010

11-
from .base import AuditedModel
11+
from .base import AuditedModel, DEFAULT_HTTP_PORT, DEFAULT_HTTPS_PORT, PROCFILE_TYPE_MAX_LENGTH
1212

1313
User = get_user_model()
1414
logger = logging.getLogger(__name__)
15-
DEFAULT_HTTP_PORT = 80
16-
DEFAULT_HTTPS_PORT = 443
1715

1816
TLS_PROTOCOLS = ("HTTPS", "TLS")
1917
HOSTNAME_PROTOCOLS = TLS_PROTOCOLS + ("HTTP", )
@@ -190,7 +188,7 @@ class Route(AuditedModel):
190188
rules = models.JSONField(default=list)
191189
routable = models.BooleanField(default=True)
192190
parent_refs = models.JSONField(default=list)
193-
procfile_type = models.TextField()
191+
procfile_type = models.CharField(max_length=PROCFILE_TYPE_MAX_LENGTH)
194192

195193
@property
196194
def protocols(self):

rootfs/api/models/service.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from api.utils import validate_json
77
from api.exceptions import ServiceUnavailable
88
from scheduler import KubeException
9-
from .base import AuditedModel
9+
from .base import AuditedModel, PROCFILE_TYPE_MAX_LENGTH
1010

1111

1212
User = get_user_model()
@@ -34,7 +34,7 @@ class Service(AuditedModel):
3434
ports = models.JSONField(
3535
default=list, validators=[partial(validate_json, schema=service_ports_schema)])
3636
canary = models.BooleanField(default=False)
37-
procfile_type = models.TextField()
37+
procfile_type = models.CharField(max_length=PROCFILE_TYPE_MAX_LENGTH)
3838

3939
class Meta:
4040
get_latest_by = 'created'

rootfs/api/serializers/__init__.py

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from api import models
1818
from api.utils import validate_json
1919
from api.exceptions import DryccException
20+
from api.models.base import PROCFILE_TYPE_MIN_LENGTH, PROCFILE_TYPE_MAX_LENGTH
2021
from scheduler.resources.pod import DEFAULT_CONTAINER_PORT
2122
from .schemas.rules import SCHEMA as RULES_SCHEMA
2223
from .schemas.volumes import SCHEMA as VOLUMES_SCHEMA
@@ -69,6 +70,16 @@
6970
HEALTHCHECK_MISMATCH_MSG = "Healthcheck pattern: %s" % HEALTHCHECK_MATCH.pattern
7071

7172

73+
def validate_procfile_type(value):
74+
if not re.match(PROCTYPE_MATCH, value):
75+
raise serializers.ValidationError(PROCTYPE_MISMATCH_MSG)
76+
if len(value) < PROCFILE_TYPE_MIN_LENGTH or len(value) > PROCFILE_TYPE_MAX_LENGTH:
77+
raise serializers.ValidationError(
78+
"The length of procfile_type must be between {} and {}".format(
79+
PROCFILE_TYPE_MIN_LENGTH, PROCFILE_TYPE_MAX_LENGTH))
80+
return value
81+
82+
7283
class JSONFieldSerializer(serializers.JSONField):
7384
def __init__(self, *args, **kwargs):
7485
self.convert_to_str = kwargs.pop('convert_to_str', True)
@@ -199,16 +210,17 @@ def validate_procfile(data):
199210
for key, value in data.items():
200211
if value is None or value == "":
201212
raise serializers.ValidationError("Command can't be empty for process type")
202-
203-
if not re.match(PROCTYPE_MATCH, key):
204-
raise serializers.ValidationError(PROCTYPE_MISMATCH_MSG)
205-
213+
validate_procfile_type(key)
206214
return data
207215

208216
@staticmethod
209217
def validate_dryccfile(data):
210218
if data:
211-
return validate_json(data, DRYCCFILE_SCHEMA, serializers.ValidationError)
219+
validate_json(data, DRYCCFILE_SCHEMA, serializers.ValidationError)
220+
procfile_types = set().union(data.get("deploy", {}).keys())
221+
procfile_types = procfile_types.union(data.get("build", {}).get("docker", {}).keys())
222+
for procfile_type in procfile_types:
223+
validate_procfile_type(procfile_type)
212224
return data
213225

214226

@@ -460,12 +472,7 @@ def ToACE(x): return idna.alabel(x).decode("utf-8", "strict")
460472

461473
return aceValue
462474

463-
@staticmethod
464-
def validate_procfile_type(value):
465-
if not re.match(PROCTYPE_MATCH, value):
466-
raise serializers.ValidationError(PROCTYPE_MISMATCH_MSG)
467-
468-
return value
475+
validate_procfile_type = staticmethod(validate_procfile_type)
469476

470477

471478
class ServiceSerializer(serializers.ModelSerializer):
@@ -502,12 +509,7 @@ def validate_protocol(value):
502509
def validate_target_port(cls, value):
503510
return cls.validate_port(value)
504511

505-
@staticmethod
506-
def validate_procfile_type(value):
507-
if not re.match(PROCTYPE_MATCH, value):
508-
raise serializers.ValidationError(PROCTYPE_MISMATCH_MSG)
509-
510-
return value
512+
validate_procfile_type = staticmethod(validate_procfile_type)
511513

512514

513515
class CertificateSerializer(serializers.ModelSerializer):
@@ -719,12 +721,7 @@ def validate_protocol(value):
719721
raise serializers.ValidationError(GATEWAY_PROTOCOL_MISMATCH_MSG)
720722
return value
721723

722-
@staticmethod
723-
def validate_procfile_type(value):
724-
if not re.match(PROCTYPE_MATCH, value):
725-
raise serializers.ValidationError(PROCTYPE_MISMATCH_MSG)
726-
727-
return value
724+
validate_procfile_type = staticmethod(validate_procfile_type)
728725

729726

730727
class RouteSerializer(serializers.Serializer):
@@ -751,12 +748,7 @@ def validate_kind(value):
751748
raise serializers.ValidationError(ROUTE_PROTOCOL_MISMATCH_MSG)
752749
return value
753750

754-
@staticmethod
755-
def validate_procfile_type(value):
756-
if not re.match(PROCTYPE_MATCH, value):
757-
raise serializers.ValidationError(PROCTYPE_MISMATCH_MSG)
758-
759-
return value
751+
validate_procfile_type = staticmethod(validate_procfile_type)
760752

761753
@staticmethod
762754
def validate_rules(value):

rootfs/api/tests/test_app.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
from django.core.cache import cache
1616
from django.test.utils import override_settings
1717

18-
from api.models.app import App, PROCFILE_TYPE_WEB
18+
from api.models.app import App
19+
from api.models.base import PROCFILE_TYPE_WEB
1920
from api.models.config import Config
2021
from scheduler import KubeException, KubeHTTPException
2122

rootfs/api/tests/test_build.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
from unittest import mock
1212

1313
from api.models.build import Build
14-
from api.models.app import App, PROCFILE_TYPE_WEB
14+
from api.models.app import App
15+
from api.models.base import PROCFILE_TYPE_WEB
1516
from scheduler import KubeException
1617

1718
from api.tests import adapter, DryccTransactionTestCase

rootfs/api/tests/test_certificate_use_case_1.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from django.contrib.auth import get_user_model
22
from django.core.cache import cache
33

4-
from api.models.app import App, PROCFILE_TYPE_WEB
4+
from api.models.app import App
5+
from api.models.base import PROCFILE_TYPE_WEB
56
from api.models.certificate import Certificate
67
from api.models.domain import Domain
78
from api.tests import TEST_ROOT, DryccTestCase

0 commit comments

Comments
 (0)