Skip to content

Commit f2438e6

Browse files
author
Matthew Fisher
committed
ref(controller): rename DomainCert to Certificate
1 parent 9114020 commit f2438e6

7 files changed

Lines changed: 41 additions & 70 deletions

File tree

controller/api/models.py

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -112,14 +112,11 @@ def validate_domain(value):
112112
raise ValidationError('"{}" contains unexpected characters'.format(value))
113113

114114

115-
def validate_domain_certificate(value):
115+
def validate_certificate(value):
116116
try:
117-
cert = crypto.load_certificate(crypto.FILETYPE_PEM, value)
118-
Domain.objects.get(domain=cert.get_subject().CN)
117+
crypto.load_certificate(crypto.FILETYPE_PEM, value)
119118
except crypto.Error as e:
120119
raise ValidationError('Could not load certificate: {}'.format(e))
121-
except Domain.DoesNotExist:
122-
raise ValidationError('No matching domain was found for {}'.format(cert.get_subject().CN))
123120

124121

125122
class AuditedModel(models.Model):
@@ -832,20 +829,19 @@ class Domain(AuditedModel):
832829
owner = models.ForeignKey(settings.AUTH_USER_MODEL)
833830
app = models.ForeignKey('App')
834831
domain = models.TextField(blank=False, null=False, unique=True)
835-
cert = models.ForeignKey('DomainCert', null=True)
836832

837833
def __str__(self):
838834
return self.domain
839835

840836

841837
@python_2_unicode_compatible
842-
class DomainCert(AuditedModel):
838+
class Certificate(AuditedModel):
843839
"""
844840
Public and private key pair used to secure application traffic at the router.
845841
"""
846842
owner = models.ForeignKey(settings.AUTH_USER_MODEL)
847843
# there is no upper limit on the size of an x.509 certificate
848-
certificate = models.TextField(validators=[validate_domain_certificate])
844+
certificate = models.TextField(validators=[validate_certificate])
849845
key = models.TextField()
850846
# X.509 certificates allow any string of information as the common name.
851847
common_name = models.TextField(unique=True)
@@ -867,7 +863,7 @@ def save(self, *args, **kwargs):
867863
if not self.expires:
868864
# convert openssl's expiry date format to Django's DateTimeField format
869865
self.expires = datetime.strptime(certificate.get_notAfter(), '%Y%m%d%H%M%SZ')
870-
return super(DomainCert, self).save(*args, **kwargs)
866+
return super(Certificate, self).save(*args, **kwargs)
871867

872868

873869
@python_2_unicode_compatible
@@ -1011,9 +1007,9 @@ def _etcd_purge_domains(**kwargs):
10111007
post_save.connect(_log_release_created, sender=Release, dispatch_uid='api.models.log')
10121008
post_save.connect(_log_config_updated, sender=Config, dispatch_uid='api.models.log')
10131009
post_save.connect(_log_domain_added, sender=Domain, dispatch_uid='api.models.log')
1014-
post_save.connect(_log_cert_added, sender=DomainCert, dispatch_uid='api.models.log')
1010+
post_save.connect(_log_cert_added, sender=Certificate, dispatch_uid='api.models.log')
10151011
post_delete.connect(_log_domain_removed, sender=Domain, dispatch_uid='api.models.log')
1016-
post_delete.connect(_log_cert_removed, sender=DomainCert, dispatch_uid='api.models.log')
1012+
post_delete.connect(_log_cert_removed, sender=Certificate, dispatch_uid='api.models.log')
10171013

10181014

10191015
# automatically generate a new token on creation
@@ -1038,5 +1034,5 @@ def create_auth_token(sender, instance=None, created=False, **kwargs):
10381034
post_delete.connect(_etcd_purge_domains, sender=Domain, dispatch_uid='api.models')
10391035
post_save.connect(_etcd_create_app, sender=App, dispatch_uid='api.models')
10401036
post_delete.connect(_etcd_purge_app, sender=App, dispatch_uid='api.models')
1041-
post_save.connect(_etcd_publish_cert, sender=DomainCert, dispatch_uid='api.models')
1042-
post_delete.connect(_etcd_purge_cert, sender=DomainCert, dispatch_uid='api.models')
1037+
post_save.connect(_etcd_publish_cert, sender=Certificate, dispatch_uid='api.models')
1038+
post_delete.connect(_etcd_purge_cert, sender=Certificate, dispatch_uid='api.models')

controller/api/serializers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ def validate_domain(self, value):
260260
return value
261261

262262

263-
class DomainCertSerializer(ModelSerializer):
263+
class CertificateSerializer(ModelSerializer):
264264
"""Serialize a :class:`~api.models.Cert` model."""
265265

266266
expires = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
@@ -269,7 +269,7 @@ class DomainCertSerializer(ModelSerializer):
269269

270270
class Meta:
271271
"""Metadata options for a DomainCertSerializer."""
272-
model = models.DomainCert
272+
model = models.Certificate
273273
extra_kwargs = {'certificate': {'write_only': True},
274274
'key': {'write_only': True}}
275275
read_only_fields = ['owner', 'common_name', 'expires', 'created', 'updated']

controller/api/south_migrations/0021_auto__add_domaincert__add_field_domain_cert.py renamed to controller/api/south_migrations/0021_auto__add_certificate.py

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
class Migration(SchemaMigration):
99

1010
def forwards(self, orm):
11-
# Adding model 'DomainCert'
12-
db.create_table(u'api_domaincert', (
11+
# Adding model 'Certificate'
12+
db.create_table(u'api_certificate', (
1313
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
1414
('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
1515
('updated', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
@@ -19,27 +19,19 @@ def forwards(self, orm):
1919
('common_name', self.gf('django.db.models.fields.TextField')(unique=True)),
2020
('expires', self.gf('django.db.models.fields.DateTimeField')()),
2121
))
22-
db.send_create_signal(u'api', ['DomainCert'])
23-
24-
# Adding field 'Domain.cert'
25-
db.add_column(u'api_domain', 'cert',
26-
self.gf('django.db.models.fields.related.ForeignKey')(to=orm['api.DomainCert'], null=True),
27-
keep_default=False)
22+
db.send_create_signal(u'api', ['Certificate'])
2823

2924

3025
def backwards(self, orm):
31-
# Deleting model 'DomainCert'
32-
db.delete_table(u'api_domaincert')
33-
34-
# Deleting field 'Domain.cert'
35-
db.delete_column(u'api_domain', 'cert_id')
26+
# Deleting model 'Certificate'
27+
db.delete_table(u'api_certificate')
3628

3729

3830
models = {
3931
u'api.app': {
4032
'Meta': {'object_name': 'App'},
4133
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
42-
'id': ('django.db.models.fields.SlugField', [], {'default': "'dogged-quotient'", 'unique': 'True', 'max_length': '64'}),
34+
'id': ('django.db.models.fields.SlugField', [], {'default': "'tender-jamboree'", 'unique': 'True', 'max_length': '64'}),
4335
'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
4436
'structure': ('json_field.fields.JSONField', [], {'default': '{}', 'blank': 'True'}),
4537
'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
@@ -57,6 +49,17 @@ def backwards(self, orm):
5749
'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
5850
'uuid': ('api.fields.UuidField', [], {'unique': 'True', 'max_length': '32', 'primary_key': 'True'})
5951
},
52+
u'api.certificate': {
53+
'Meta': {'object_name': 'Certificate'},
54+
'certificate': ('django.db.models.fields.TextField', [], {}),
55+
'common_name': ('django.db.models.fields.TextField', [], {'unique': 'True'}),
56+
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
57+
'expires': ('django.db.models.fields.DateTimeField', [], {}),
58+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
59+
'key': ('django.db.models.fields.TextField', [], {}),
60+
'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
61+
'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
62+
},
6063
u'api.config': {
6164
'Meta': {'ordering': "[u'-created']", 'unique_together': "((u'app', u'uuid'),)", 'object_name': 'Config'},
6265
'app': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['api.App']"}),
@@ -83,24 +86,12 @@ def backwards(self, orm):
8386
u'api.domain': {
8487
'Meta': {'object_name': 'Domain'},
8588
'app': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['api.App']"}),
86-
'cert': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['api.DomainCert']", 'null': 'True'}),
8789
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
8890
'domain': ('django.db.models.fields.TextField', [], {'unique': 'True'}),
8991
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
9092
'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
9193
'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
9294
},
93-
u'api.domaincert': {
94-
'Meta': {'object_name': 'DomainCert'},
95-
'certificate': ('django.db.models.fields.TextField', [], {}),
96-
'common_name': ('django.db.models.fields.TextField', [], {'unique': 'True'}),
97-
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
98-
'expires': ('django.db.models.fields.DateTimeField', [], {}),
99-
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
100-
'key': ('django.db.models.fields.TextField', [], {}),
101-
'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
102-
'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
103-
},
10495
u'api.key': {
10596
'Meta': {'unique_together': "((u'owner', u'id'),)", 'object_name': 'Key'},
10697
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),

controller/api/tests/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def run_tests(self, test_labels, extra_tests=None, **kwargs):
5252
from .test_build import * # noqa
5353
from .test_config import * # noqa
5454
from .test_domain import * # noqa
55-
from .test_domain_cert import * # noqa
55+
from .test_certificate import * # noqa
5656
from .test_container import * # noqa
5757
from .test_hooks import * # noqa
5858
from .test_key import * # noqa
Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
from django.test import TestCase
77
from rest_framework.authtoken.models import Token
88

9-
from api.models import App, Domain, DomainCert
9+
from api.models import App, Certificate
1010

1111

12-
class DomainCertTest(TestCase):
12+
class CertificateTest(TestCase):
1313

1414
"""Tests creation of domain SSL certificates"""
1515

@@ -22,8 +22,6 @@ def setUp(self):
2222
self.token2 = Token.objects.get(user=self.user).key
2323
self.url = '/v1/certs'
2424
self.app = App.objects.create(owner=self.user, id='test-app')
25-
self.domain = Domain.objects.create(owner=self.user, app=self.app,
26-
domain='autotest.example.com')
2725
self.key = """-----BEGIN RSA PRIVATE KEY-----
2826
MIIEogIBAAKCAQEAwyLIwjpUQkAmh/z6JvQMAtvNu/dBuCt+R8cnQMEw4VglglMw
2927
YKAm2ZXA03LYWk5EO52YaDZKPAqjng+m4k+B0ble5XG4vFRTlBhln0cR3UAYlm7Z
@@ -76,7 +74,7 @@ def setUp(self):
7674
-----END CERTIFICATE-----"""
7775

7876
def test_create_certificate_with_domain(self):
79-
"""Tests creating a domain cert when the domain is present."""
77+
"""Tests creating a certificate."""
8078
body = {'certificate': self.autotest_example_com_cert, 'key': self.key}
8179
response = self.client.post(self.url, json.dumps(body), content_type='application/json',
8280
HTTP_AUTHORIZATION='token {}'.format(self.token))
@@ -105,24 +103,10 @@ def test_certficate_denied_requests(self):
105103
self.assertEqual(response.status_code, 405)
106104

107105
def test_delete_certificate(self):
108-
"""Destroying a domain cert should generate a 204 response"""
109-
DomainCert.objects.create(owner=self.user,
110-
common_name='autotest.example.com',
111-
certificate=self.autotest_example_com_cert)
106+
"""Destroying a certificate should generate a 204 response"""
107+
Certificate.objects.create(owner=self.user,
108+
common_name='autotest.example.com',
109+
certificate=self.autotest_example_com_cert)
112110
url = '/v1/certs/autotest.example.com'
113111
response = self.client.delete(url, HTTP_AUTHORIZATION='token {}'.format(self.token))
114112
self.assertEqual(response.status_code, 204)
115-
116-
def test_create_certificate_without_domain_present(self):
117-
"""
118-
When a domain cert is being created without the corresponding domain in place, the request
119-
should be denied and no domain certificate should be created.
120-
"""
121-
self.domain.delete()
122-
body = {'certificate': self.autotest_example_com_cert, 'key': self.key}
123-
response = self.client.post(self.url, json.dumps(body), content_type='application/json',
124-
HTTP_AUTHORIZATION='token {}'.format(self.token))
125-
self.assertEqual(response.status_code, 400)
126-
self.assertEqual(response.data, {'certificate': ['No matching domain was found '
127-
'for autotest.example.com']})
128-
self.assertEqual(len(DomainCert.objects.all()), 0)

controller/api/urls.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
url(r'^admin/perms/?',
8484
views.AdminPermsViewSet.as_view({'get': 'list', 'post': 'create'})),
8585
url(r'^certs/(?P<common_name>[-_.\w]+)/?'.format(settings.APP_URL_REGEX),
86-
views.DomainCertViewSet.as_view({'get': 'retrieve', 'delete': 'destroy'})),
86+
views.CertificateViewSet.as_view({'get': 'retrieve', 'delete': 'destroy'})),
8787
url(r'^certs/?',
88-
views.DomainCertViewSet.as_view({'get': 'list', 'post': 'create'})),
88+
views.CertificateViewSet.as_view({'get': 'list', 'post': 'create'})),
8989
)

controller/api/views.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,10 +221,10 @@ def get_object(self, **kwargs):
221221
return self.get_queryset(**kwargs)
222222

223223

224-
class DomainCertViewSet(BaseDeisViewSet):
224+
class CertificateViewSet(BaseDeisViewSet):
225225
"""A viewset for interacting with Domain objects."""
226-
model = models.DomainCert
227-
serializer_class = serializers.DomainCertSerializer
226+
model = models.Certificate
227+
serializer_class = serializers.CertificateSerializer
228228

229229
def get_object(self, **kwargs):
230230
"""Retrieve domain certificate by common name"""

0 commit comments

Comments
 (0)