Skip to content

Commit 7647569

Browse files
author
Matthew Fisher
authored
fix(scheduler): cast port to an int from environment (#857)
kubernetes requires the port number to be an integer or else it assumes that it is a named port.
1 parent 1c28099 commit 7647569

2 files changed

Lines changed: 42 additions & 3 deletions

File tree

rootfs/api/models/release.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,11 +161,11 @@ def get_port(self, routable=False):
161161
return 5000
162162

163163
# User provided PORT
164-
return envs.get('PORT')
164+
return int(envs.get('PORT'))
165165

166166
# If the user provides PORT
167167
if envs.get('PORT', None):
168-
return envs.get('PORT')
168+
return int(envs.get('PORT'))
169169

170170
# discover port from docker image
171171
port = docker_get_port(self.image, deis_registry, creds)

rootfs/api/tests/test_release.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from unittest import mock
1515
from rest_framework.authtoken.models import Token
1616

17-
from api.models import Release
17+
from api.models import App, Release
1818
from scheduler import KubeHTTPException
1919
from . import adapter
2020
from . import mock_port
@@ -373,3 +373,42 @@ def test_release_no_change(self, mock_requests):
373373
body = {'values': json.dumps({'NEW_URL1': 'http://localhost:8080/'})}
374374
response = self.client.post(url, body)
375375
self.assertEqual(response.status_code, 409, response.data)
376+
377+
def test_release_get_port(self, mock_requests):
378+
"""
379+
Test that get_port always returns the proper value.
380+
"""
381+
url = '/v2/apps'
382+
response = self.client.post(url)
383+
self.assertEqual(response.status_code, 201, response.data)
384+
app_id = response.data['id']
385+
app = App.objects.get(id=app_id)
386+
387+
url = '/v2/apps/{app_id}/builds'.format(**locals())
388+
body = {'sha': '123456', 'image': 'autotest/example'}
389+
response = self.client.post(url, body)
390+
self.assertEqual(response.status_code, 201, response.data)
391+
release = app.release_set.latest()
392+
393+
# when app is not routable, returns None
394+
self.assertEqual(release.get_port(), None)
395+
396+
# when a buildpack type, default to 5000
397+
self.assertEqual(release.get_port(routable=True), 5000)
398+
399+
# switch to a dockerfile app or else it'll automatically default to 5000
400+
url = '/v2/apps/{app_id}/builds'.format(**locals())
401+
body = {'image': 'autotest/example'}
402+
response = self.client.post(url, body)
403+
self.assertEqual(response.status_code, 201, response.data)
404+
405+
url = '/v2/apps/{app_id}/config'.format(**locals())
406+
body = {'values': json.dumps({'PORT': '8080'})}
407+
response = self.client.post(url, body)
408+
self.assertEqual(response.status_code, 201, response.data)
409+
release = app.release_set.latest()
410+
411+
# check that the port number returned is an int, not a string
412+
self.assertEqual(release.get_port(routable=True), 8080)
413+
414+
# TODO(bacongobbler): test dockerfile ports

0 commit comments

Comments
 (0)