Skip to content

Commit 5839f1f

Browse files
committed
ref(build): give Build model awareness of what type it is and what version it is
1 parent 26b8e4d commit 5839f1f

4 files changed

Lines changed: 42 additions & 32 deletions

File tree

rootfs/api/models/app.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from api.models import UuidAuditedModel, log_event, AlreadyExists, \
1919
DeisException, ServiceUnavailable
2020

21-
from api.utils import generate_app_name, app_build_type
21+
from api.utils import generate_app_name
2222
from api.models.release import Release
2323
from api.models.config import Config
2424
from api.models.domain import Domain
@@ -307,7 +307,6 @@ def scale(self, user, structure): # noqa
307307

308308
def _scale_pods(self, scale_types):
309309
release = self.release_set.latest()
310-
build_type = app_build_type(release)
311310
for scale_type, replicas in scale_types.items():
312311
image = release.image
313312
version = "v{}".format(release.version)
@@ -319,7 +318,7 @@ def _scale_pods(self, scale_types):
319318
'version': version,
320319
'replicas': replicas,
321320
'app_type': scale_type,
322-
'build_type': build_type,
321+
'build_type': release.build.type,
323322
'healthcheck': release.config.healthcheck(),
324323
# http://docs.deis.io/en/latest/using_deis/process-types/#web-vs-cmd-process-types
325324
'routable': True if scale_type in ['web', 'cmd'] else False
@@ -356,7 +355,6 @@ def deploy(self, release):
356355

357356
# deploy application to k8s. Also handles initial scaling
358357
deploys = {}
359-
build_type = app_build_type(release)
360358
for scale_type, replicas in self.structure.items():
361359
deploys[scale_type] = {
362360
'memory': release.config.memory,
@@ -367,7 +365,7 @@ def deploy(self, release):
367365
'replicas': replicas,
368366
'version': "v{}".format(release.version),
369367
'app_type': scale_type,
370-
'build_type': build_type,
368+
'build_type': release.build.type,
371369
'healthcheck': release.config.healthcheck(),
372370
# http://docs.deis.io/en/latest/using_deis/process-types/#web-vs-cmd-process-types
373371
'routable': True if scale_type in ['web', 'cmd'] else False,

rootfs/api/models/build.py

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,37 @@ class Meta:
2727
ordering = ['-created']
2828
unique_together = (('app', 'uuid'),)
2929

30+
@property
31+
def type(self):
32+
"""Figures out what kind of build type is being deal it with"""
33+
if self.dockerfile:
34+
return 'dockerfile'
35+
elif self.sha:
36+
return 'buildpack'
37+
else:
38+
# docker image (or any sort of image) used via deis pull
39+
return 'image'
40+
41+
@property
42+
def source_based(self):
43+
"""
44+
Checks if a build is source (has a sha) based or not
45+
If True then the Build is coming from the deis builder or something that
46+
built from git / svn / hg / etc directly
47+
"""
48+
return self.sha != ''
49+
50+
@property
51+
def version(self):
52+
return 'git-{}'.format(self.sha) if self.source_based else 'latest'
53+
3054
def create(self, user, *args, **kwargs):
3155
latest_release = self.app.release_set.latest()
32-
source_version = 'latest'
33-
if self.sha:
34-
source_version = 'git-{}'.format(self.sha)
35-
3656
new_release = latest_release.new(
3757
user,
3858
build=self,
3959
config=latest_release.config,
40-
source_version=source_version
60+
source_version=self.version
4161
)
4262

4363
try:
@@ -62,6 +82,7 @@ def save(self, **kwargs):
6282
self.app.scale(self.owner, removed)
6383
except Build.DoesNotExist:
6484
pass
85+
6586
return super(Build, self).save(**kwargs)
6687

6788
def __str__(self):

rootfs/api/models/release.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,17 @@ def image(self):
4545
image = self.build.image.replace('{}/'.format(settings.REGISTRY_URL), '')
4646
return image.replace('{}/'.format(settings.REGISTRY_HOST), '')
4747

48-
if not self.build.dockerfile:
49-
# Deis Pull
50-
if not self.build.sha:
51-
return '{}/{}:v{}'.format(settings.REGISTRY_URL, self.app.id, str(self.version))
52-
48+
# Sort out image information based on build type
49+
if self.build.type == 'dockerfile':
50+
# DockerFile
51+
return '{}/{}:git-{}'.format(settings.REGISTRY_URL, self.app.id, str(self.build.sha))
52+
elif self.build.type == 'image':
53+
# Deis Pull, docker image in local registry
54+
return '{}/{}:v{}'.format(settings.REGISTRY_URL, self.app.id, str(self.version))
55+
elif self.build.type == 'buildpack':
5356
# Build Pack - Registry URL not prepended since slugrunner image will download slug
5457
return self.build.image
5558

56-
# DockerFile
57-
return '{}/{}:git-{}'.format(settings.REGISTRY_URL, self.app.id, str(self.build.sha))
58-
5959
def new(self, user, config, build, summary=None, source_version='latest'):
6060
"""
6161
Create a new application release using the provided Build and Config
@@ -83,12 +83,12 @@ def new(self, user, config, build, summary=None, source_version='latest'):
8383

8484
return release
8585

86-
def publish(self, source_version='latest'):
86+
def publish(self):
8787
if self.build is None:
8888
raise DeisException('No build associated with this release to publish')
8989

9090
# If the build has a SHA, assume it's from deis-builder and in the deis-registry already
91-
if self.build.dockerfile or self.build.sha:
91+
if self.build.source_based:
9292
return
9393

9494
source_image = self.build.image
@@ -102,8 +102,7 @@ def publish(self, source_version='latest'):
102102

103103
# add tag if it was not provided
104104
if ':' not in source_image:
105-
source_tag = 'git-{}'.format(self.build.sha) if self.build.sha else source_version
106-
source_image = "{}:{}".format(source_image, source_tag)
105+
source_image = "{}:{}".format(source_image, self.build.version)
107106

108107
# gather custom login information for registry if needed
109108
auth = None
@@ -114,7 +113,8 @@ def publish(self, source_version='latest'):
114113
'email': self.owner.email
115114
}
116115

117-
deis_registry = bool(self.build.sha)
116+
# if build is source based then it was pushed into the deis registry
117+
deis_registry = bool(self.build.source_based)
118118
publish_release(source_image, self.image, deis_registry, auth)
119119

120120
def previous(self):

rootfs/api/utils.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,6 @@ def fingerprint(key):
109109
return ':'.join(a + b for a, b in zip(fp_plain[::2], fp_plain[1::2]))
110110

111111

112-
def app_build_type(release):
113-
if not release.build.dockerfile:
114-
if not release.build.sha:
115-
return "deispull"
116-
else:
117-
return "buildpack"
118-
return "dockerfile"
119-
120-
121112
def dict_merge(origin, merge):
122113
"""
123114
Recursively merges dict's. not just simple a["key"] = b["key"], if

0 commit comments

Comments
 (0)