Skip to content

Commit 4fb008d

Browse files
committed
chore(controller): modify query latest release
1 parent ce6d45a commit 4fb008d

5 files changed

Lines changed: 37 additions & 32 deletions

File tree

rootfs/api/models/app.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ def restart(self, **kwargs): # noqa
269269

270270
def scale(self, user, structure):
271271
err_msg = None
272-
release = self.release_set.filter(failed=False).latest()
272+
release = Release.latest(self)
273273
if (PTYPE_RUN in structure or release.build is None):
274274
if PTYPE_RUN in structure:
275275
err_msg = 'Cannot set scale for reserved types, procfile type is: run'
@@ -348,9 +348,9 @@ def deploy(self, release, ptypes=None, force_deploy=False, rollback_on_failure=T
348348
release.clean(ptypes)
349349

350350
def mount(self, user, volume, structure=None):
351-
if self.release_set.filter(failed=False).latest().build is None:
351+
release = Release.latest(self)
352+
if release is None or release.build is None:
352353
raise DryccException('No build associated with this release')
353-
release = self.release_set.filter(failed=False).latest()
354354
app_settings = self.appsettings_set.latest()
355355
self._mount(user, volume, release, app_settings, structure=structure)
356356

@@ -387,8 +387,8 @@ def pod_name(size=5, chars=string.ascii_lowercase + string.digits):
387387
return ''.join(random.choice(chars) for _ in range(size))
388388

389389
"""Run a one-off command in an ephemeral app container."""
390-
release = self.release_set.filter(failed=False).latest()
391-
if release.build is None:
390+
release = Release.latest(self)
391+
if release is None or release.build is None:
392392
raise DryccException('No build associated with this release to run this command')
393393

394394
app_settings = self.appsettings_set.latest()
@@ -656,8 +656,8 @@ def image_pull_secret(self, namespace, registry, image):
656656
return name
657657

658658
def state_to_k8s(self):
659-
release = self.release_set.filter(failed=False).latest()
660-
if release.build is None:
659+
release = Release.latest(self)
660+
if release is None or release.build is None:
661661
self.log('the last release does not have a build, skipping deployment...')
662662
return
663663
ptypes = set()

rootfs/api/models/build.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from api.exceptions import DryccException
55
from .base import UuidAuditedModel, PTYPE_WEB
66
from .config import Config
7+
from .release import Release
78

89
User = get_user_model()
910
logger = logging.getLogger(__name__)
@@ -72,7 +73,7 @@ def get_image(self, ptype, default_image=None):
7273
return default_image if default_image else self.image
7374

7475
def create_release(self, user, *args, **kwargs):
75-
latest_release = self.app.release_set.filter(failed=False).latest()
76+
latest_release = Release.latest(self.app)
7677
try:
7778
new_release = latest_release.new(
7879
user,
@@ -109,7 +110,7 @@ def _get_or_create_config(self):
109110
"""
110111
dryccfile to config
111112
"""
112-
latest_release = self.app.release_set.filter(failed=False).latest()
113+
latest_release = Release.latest(self.app)
113114
config_values, config_values_ref, config_healthcheck = [], {}, {}
114115
for group, values in self.dryccfile.get('config', {}).items():
115116
for value in values:

rootfs/api/models/config.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,10 @@ def save(self, ignore_update_fields=None, *args, **kwargs):
125125
"""merge the old config with the new"""
126126
try:
127127
# Get config from the latest available release
128-
try:
129-
previous_config = self.app.release_set.filter(failed=False).latest().config
130-
except Release.DoesNotExist:
128+
latest_releases = Release.latest(self.app)
129+
if latest_releases:
130+
previous_config = latest_releases.config
131+
else:
131132
# If that doesn't exist then fallback on app config
132133
# usually means a totally new app
133134
previous_config = self.app.config_set.latest()

rootfs/api/models/release.py

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -211,28 +211,31 @@ def deploy(self, ptypes=None, force_deploy=False):
211211
raise DryccException(f"{msg}: {lock.locked(ptypes)}")
212212
run_pipeline.delay(self, ptypes, force_deploy)
213213

214-
def previous(self, state="succeed"):
215-
"""
216-
Return the previous Release to this one.
217-
218-
:return: the previous :class:`Release`, or None
219-
"""
220-
releases = self.app.release_set
221-
if self.pk:
222-
releases = releases.exclude(pk=self.pk)
214+
@classmethod
215+
def latest(cls, app, state=None, exclude_pk=None):
216+
releases = app.release_set
217+
if exclude_pk:
218+
releases = releases.exclude(pk=exclude_pk)
223219
q = Q(failed=False, state="succeed") if state else Q(failed=False)
224220
try:
225-
app_settings = self.app.appsettings_set.latest()
221+
app_settings = app.appsettings_set.latest()
226222
if app_settings.autorollback is False:
227-
q = Q(state__in=["crashed", "succeed"])
223+
q = Q()
228224
except AppSettings.DoesNotExist:
229225
pass
230226
try:
231227
# Get the Release previous to this one
232-
prev_release = releases.filter(q).latest()
228+
release = releases.filter(q).latest()
233229
except Release.DoesNotExist:
234-
prev_release = None
235-
return prev_release
230+
release = None
231+
return release
232+
233+
def previous(self, state="succeed"):
234+
"""
235+
Return the previous Release to this one.
236+
:return: the previous :class:`Release`, or None
237+
"""
238+
return self.latest(self.app, state, self.pk)
236239

237240
def rollback(self, user, ptypes=None, version=None):
238241
try:

rootfs/api/views.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ def get_object(self):
279279
release = get_object_or_404(
280280
models.release.Release, app=self.get_app(), version=int(version))
281281
else:
282-
release = self.get_app().release_set.filter(failed=False).latest()
282+
release = models.release.Release.latest(self.get_app())
283283
return getattr(release, self.model.__name__.lower())
284284

285285

@@ -321,7 +321,7 @@ def run(self, request, **kwargs):
321321
expires = settings.KUBERNETES_JOB_MAX_TTL_SECONDS_AFTER_FINISHED
322322
if not command:
323323
raise DryccException('command is a required field, or it can be defined in Procfile')
324-
release = app.release_set.filter(failed=False).latest()
324+
release = models.release.Release.latest(app)
325325
if release.build is None:
326326
raise DryccException('no build available, please deploy a release')
327327
volumes = request.data.get('volumes', None)
@@ -417,7 +417,7 @@ def delete(self, request, **kwargs):
417417
return Response(status=status.HTTP_200_OK)
418418

419419
def post_save(self, config):
420-
latest_release = config.app.release_set.filter(failed=False).latest()
420+
latest_release = models.release.Release.latest(self.get_app())
421421
try:
422422
release = latest_release.new(
423423
self.request.user, config=config, build=latest_release.build)
@@ -673,7 +673,7 @@ def rollback(self, request, **kwargs):
673673
Create a new release as a copy of the state of the compiled slug and config vars of a
674674
previous release.
675675
"""
676-
latest_release = self.get_app().release_set.filter(failed=False).latest()
676+
latest_release = models.release.Release.latest(self.get_app())
677677
ptypes = set(
678678
[ptype for ptype in request.data.get("ptypes", "").split(",") if ptype])
679679
ptypes = latest_release.app.check_ptypes(ptypes)
@@ -786,7 +786,7 @@ def create(self, request, *args, **kwargs):
786786
# return the application databag
787787
response = {
788788
'release': {
789-
'version': app.release_set.filter(failed=False).latest().version
789+
'version': models.release.Release.latest(app).version
790790
}
791791
}
792792
return Response(response, status=status.HTTP_200_OK)
@@ -807,7 +807,7 @@ def create(self, request, *args, **kwargs):
807807
has_permission, message = permissions.has_app_permission(request.user, app, request.method)
808808
if not has_permission:
809809
return Response(message, status=status.HTTP_403_FORBIDDEN)
810-
config = app.release_set.filter(failed=False).latest().config
810+
config = models.release.Release.latest(app).config
811811
serializer = self.get_serializer(config)
812812
return Response(serializer.data, status=status.HTTP_200_OK)
813813

0 commit comments

Comments
 (0)