Skip to content

Commit 6e8b0c1

Browse files
Gabriel Monroycarmstrong
authored andcommitted
refactor(domains): cleanup domain publishing logic and URLs
1 parent dbfed01 commit 6e8b0c1

4 files changed

Lines changed: 37 additions & 24 deletions

File tree

controller/api/models.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -567,13 +567,6 @@ def __str__(self):
567567
# define update/delete callbacks for synchronizing
568568
# models with the configuration management backend
569569

570-
def _publish_domains(**kwargs):
571-
app = kwargs['app']
572-
domains = kwargs['domains']
573-
_etcd_client.write(
574-
'/deis/domains/{}'.format(app),
575-
' '.join(str(i) for i in domains))
576-
577570
def _log_build_created(**kwargs):
578571
if kwargs.get('created'):
579572
build = kwargs['instance']
@@ -608,6 +601,16 @@ def _etcd_purge_user(**kwargs):
608601
_etcd_client.delete('/deis/builder/users/{}'.format(username), dir=True, recursive=True)
609602

610603

604+
def _etcd_publish_domains(**kwargs):
605+
app = kwargs['instance'].app
606+
app_domains = app.domain_set.all()
607+
if app_domains:
608+
_etcd_client.write('/deis/domains/{}'.format(app),
609+
' '.join(str(d.domain) for d in app_domains))
610+
else:
611+
_etcd_client.delete('/deis/domains/{}'.format(app))
612+
613+
611614
# Log significant app-related events
612615
post_save.connect(_log_build_created, sender=Build, dispatch_uid='api.models')
613616
post_save.connect(_log_release_created, sender=Release, dispatch_uid='api.models')
@@ -632,3 +635,5 @@ def _save_transition(**kwargs):
632635
post_save.connect(_etcd_publish_key, sender=Key, dispatch_uid='api.models')
633636
post_delete.connect(_etcd_purge_key, sender=Key, dispatch_uid='api.models')
634637
post_delete.connect(_etcd_purge_user, sender=User, dispatch_uid='api.models')
638+
post_save.connect(_etcd_publish_domains, sender=Domain, dispatch_uid='api.models')
639+
post_delete.connect(_etcd_publish_domains, sender=Domain, dispatch_uid='api.models')

controller/api/tests/test_domain.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,14 @@ def test_manage_domain(self):
4444
body = {'domain': 'test-domain.example.com'}
4545
response = self.client.post(url, json.dumps(body), content_type='application/json')
4646
self.assertEqual(response.status_code, 201)
47-
4847
url = '/api/apps/{app_id}/domains'.format(app_id=self.app_id)
4948
response = self.client.get(url, content_type='application/json')
5049
result = response.data['results'][0]
5150
self.assertEqual('test-domain.example.com', result['domain'])
52-
53-
url = '/api/domains/{hostname}'.format(hostname='test-domain.example.com')
51+
url = '/api/apps/{app_id}/domains/{hostname}'.format(hostname='test-domain.example.com',
52+
app_id=self.app_id)
5453
response = self.client.delete(url, content_type='application/json')
5554
self.assertEqual(response.status_code, 204)
56-
5755
url = '/api/apps/{app_id}/domains'.format(app_id=self.app_id)
5856
response = self.client.get(url, content_type='application/json')
5957
self.assertEqual(0, response.data['count'])
@@ -63,7 +61,6 @@ def test_manage_domain_invalid_app(self):
6361
body = {'domain': 'test-domain.example.com'}
6462
response = self.client.post(url, json.dumps(body), content_type='application/json')
6563
self.assertEqual(response.status_code, 404)
66-
6764
url = '/api/apps/{app_id}/domains'.format(app_id='this-app-does-not-exist')
6865
response = self.client.get(url, content_type='application/json')
6966
self.assertEqual(response.status_code, 404)
@@ -82,12 +79,10 @@ def test_manage_domain_invalid_domain(self):
8279
body = {'domain': 'this_is_an.invalid.domain'}
8380
response = self.client.post(url, json.dumps(body), content_type='application/json')
8481
self.assertEqual(response.status_code, 400)
85-
8682
url = '/api/apps/{app_id}/domains'.format(app_id=self.app_id)
8783
body = {'domain': 'this-is-an.invalid.a'}
8884
response = self.client.post(url, json.dumps(body), content_type='application/json')
8985
self.assertEqual(response.status_code, 400)
90-
9186
url = '/api/apps/{app_id}/domains'.format(app_id=self.app_id)
9287
body = {'domain': 'domain'}
9388
response = self.client.post(url, json.dumps(body), content_type='application/json')

controller/api/urls.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,23 @@
9494
List all :class:`~api.models.Container`\s.
9595
9696
97+
Application Domains
98+
-------------------
99+
100+
101+
.. http:delete:: /api/apps/(string:id)/domains/(string:hostname)
102+
103+
Destroy a :class:`~api.models.Domain` by its `hostname`
104+
105+
.. http:get:: /api/apps/(string:id)/domains/
106+
107+
List all :class:`~api.models.Domain`\s.
108+
109+
.. http:post:: /api/apps/(string:id)/domains/
110+
111+
Create a new :class:`~api.models.Domain`\s.
112+
113+
97114
Application Actions
98115
-------------------
99116
@@ -233,12 +250,6 @@
233250
'get': 'retrieve', 'patch': 'partial_update', 'delete': 'destroy'})),
234251
url(r'^clusters/?',
235252
views.ClusterViewSet.as_view({'get': 'list', 'post': 'create'})),
236-
# application domains
237-
url(r'^domains/(?P<id>[-\._\w]+)/?',
238-
views.DomainViewSet.as_view({'delete': 'destroy'})),
239-
url(r'^apps/(?P<id>[-_\w]+)/domains/?',
240-
views.DomainViewSet.as_view({'post': 'create',
241-
'get': 'list'})),
242253
# application release components
243254
url(r'^apps/(?P<id>[-_\w]+)/config/?',
244255
views.AppConfigViewSet.as_view({'get': 'retrieve', 'post': 'create'})),
@@ -259,6 +270,11 @@
259270
views.AppContainerViewSet.as_view({'get': 'list'})),
260271
url(r'^apps/(?P<id>[-_\w]+)/containers/?',
261272
views.AppContainerViewSet.as_view({'get': 'list'})),
273+
# application domains
274+
url(r'^apps/(?P<id>[-_\w]+)/domains/(?P<domain>[-\._\w]+)/?',
275+
views.DomainViewSet.as_view({'delete': 'destroy'})),
276+
url(r'^apps/(?P<id>[-_\w]+)/domains/?',
277+
views.DomainViewSet.as_view({'post': 'create', 'get': 'list'})),
262278
# application actions
263279
url(r'^apps/(?P<id>[-_\w]+)/scale/?',
264280
views.AppViewSet.as_view({'post': 'scale'})),

controller/api/views.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -466,16 +466,13 @@ class DomainViewSet(OwnerViewSet):
466466

467467
def create(self, request, *args, **kwargs):
468468
app = get_object_or_404(models.App, id=self.kwargs['id'])
469+
# TODO: allow non-owners to manage domains
469470
if request.user != app.owner:
470471
return Response(status=status.HTTP_403_FORBIDDEN)
471472
request._data = request.DATA.copy()
472473
request.DATA['app'] = app
473474
return super(DomainViewSet, self).create(request, *args, **kwargs)
474475

475-
def post_save(self, domain, created=False):
476-
if created:
477-
domain.create()
478-
479476
def get_queryset(self, **kwargs):
480477
app = get_object_or_404(models.App, id=self.kwargs['id'])
481478
qs = self.model.objects.filter(app=app)

0 commit comments

Comments
 (0)