Skip to content

Commit 2c72ff2

Browse files
Gabriel MonroyMatthew Fisher
authored andcommitted
refactor(builder): improve build + config = release
- add release version as header on build and config creation - provide dynamic output on build/config CLI, including resulting release - add `deis push` CLI shortcut for builds:create
1 parent d4e13a4 commit 2c72ff2

4 files changed

Lines changed: 67 additions & 14 deletions

File tree

client/deis.py

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,31 @@ def builds(self, args):
758758
"""
759759
return self.builds_list(args)
760760

761+
def builds_create(self, args):
762+
"""
763+
Create a new build of an application
764+
765+
Usage: deis builds:create <image> [--app=<app>]
766+
"""
767+
app = args.get('--app')
768+
if not app:
769+
app = self._session.app
770+
body = {'image': args['<image>']}
771+
sys.stdout.write('Creating build... ')
772+
sys.stdout.flush()
773+
try:
774+
progress = TextProgress()
775+
progress.start()
776+
response = self._dispatch('post', "/api/apps/{}/builds".format(app), json.dumps(body))
777+
finally:
778+
progress.cancel()
779+
progress.join()
780+
if response.status_code == requests.codes.created: # @UndefinedVariable
781+
version = response.headers['x-deis-release']
782+
print("done, v{}".format(version))
783+
else:
784+
raise ResponseError(response)
785+
761786
def builds_list(self, args):
762787
"""
763788
List build history for an application
@@ -984,10 +1009,18 @@ def config_set(self, args):
9841009
if not app:
9851010
app = self._session.app
9861011
body = {'values': json.dumps(dictify(args['<var>=<value>']))}
987-
response = self._dispatch('post',
988-
"/api/apps/{}/config".format(app),
989-
json.dumps(body))
1012+
sys.stdout.write('Creating config... ')
1013+
sys.stdout.flush()
1014+
try:
1015+
progress = TextProgress()
1016+
progress.start()
1017+
response = self._dispatch('post', "/api/apps/{}/config".format(app), json.dumps(body))
1018+
finally:
1019+
progress.cancel()
1020+
progress.join()
9901021
if response.status_code == requests.codes.created: # @UndefinedVariable
1022+
version = response.headers['x-deis-release']
1023+
print("done, v{}\n".format(version))
9911024
config = response.json()
9921025
values = json.loads(config['values'])
9931026
print("=== {}".format(app))
@@ -1013,10 +1046,18 @@ def config_unset(self, args):
10131046
for k in args.get('<key>'):
10141047
values[k] = None
10151048
body = {'values': json.dumps(values)}
1016-
response = self._dispatch('post',
1017-
"/api/apps/{}/config".format(app),
1018-
json.dumps(body))
1049+
sys.stdout.write('Creating config... ')
1050+
sys.stdout.flush()
1051+
try:
1052+
progress = TextProgress()
1053+
progress.start()
1054+
response = self._dispatch('post', "/api/apps/{}/config".format(app), json.dumps(body))
1055+
finally:
1056+
progress.cancel()
1057+
progress.join()
10191058
if response.status_code == requests.codes.created: # @UndefinedVariable
1059+
version = response.headers['x-deis-release']
1060+
print("done, v{}\n".format(version))
10201061
config = response.json()
10211062
values = json.loads(config['values'])
10221063
print("=== {}".format(app))

controller/api/tests/test_build.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ def test_build(self):
6262
body = {'image': 'autotest/example'}
6363
response = self.client.post(url, json.dumps(body), content_type='application/json')
6464
self.assertEqual(response.status_code, 201)
65+
self.assertIn('x-deis-release', response._headers)
6566
build3 = response.data
6667
self.assertEqual(response.data['image'], body['image'])
6768
self.assertNotEqual(build2['uuid'], build3['uuid'])

controller/api/tests/test_config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def test_config(self):
5151
body = {'values': json.dumps({'NEW_URL1': 'http://localhost:8080/'})}
5252
response = self.client.post(url, json.dumps(body), content_type='application/json')
5353
self.assertEqual(response.status_code, 201)
54+
self.assertIn('x-deis-release', response._headers)
5455
config2 = response.data
5556
self.assertNotEqual(config1['uuid'], config2['uuid'])
5657
self.assertIn('NEW_URL1', json.loads(response.data['values']))

controller/api/views.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -345,11 +345,16 @@ class AppBuildViewSet(BaseAppViewSet):
345345
model = models.Build
346346
serializer_class = serializers.BuildSerializer
347347

348-
def post_save(self, obj, created=False):
348+
def post_save(self, build, created=False):
349349
if created:
350-
release = obj.app.release_set.latest()
351-
new_release = release.new(self.request.user, build=obj)
352-
obj.app.deploy(new_release)
350+
release = build.app.release_set.latest()
351+
self.release = release.new(self.request.user, build=build)
352+
build.app.deploy(self.release)
353+
354+
def get_success_headers(self, data):
355+
headers = super(AppBuildViewSet, self).get_success_headers(data)
356+
headers.update({'X-Deis-Release': self.release.version})
357+
return headers
353358

354359
def create(self, request, *args, **kwargs):
355360
app = get_object_or_404(models.App, id=self.kwargs['id'])
@@ -372,11 +377,16 @@ def get_object(self, *args, **kwargs):
372377
return app.release_set.latest().config
373378
raise PermissionDenied()
374379

375-
def post_save(self, obj, created=False):
380+
def post_save(self, config, created=False):
376381
if created:
377-
release = obj.app.release_set.latest()
378-
new_release = release.new(self.request.user, config=obj)
379-
obj.app.deploy(new_release)
382+
release = config.app.release_set.latest()
383+
self.release = release.new(self.request.user, config=config)
384+
config.app.deploy(self.release)
385+
386+
def get_success_headers(self, data):
387+
headers = super(AppConfigViewSet, self).get_success_headers(data)
388+
headers.update({'X-Deis-Release': self.release.version})
389+
return headers
380390

381391
def create(self, request, *args, **kwargs):
382392
request._data = request.DATA.copy()

0 commit comments

Comments
 (0)