From 0a67d6f7ccb59fe7b2a31b102392c48d425a328a Mon Sep 17 00:00:00 2001 From: Isaac Mungai Date: Fri, 5 Aug 2016 13:55:24 -0400 Subject: [PATCH] fix: deserialize details before get cert status Change-Id: Ia9b897d93b4af05fd131d0d87c36838587f109e9 --- poppy/dns/rackspace/services.py | 2 +- poppy/manager/base/providers.py | 2 - poppy/manager/default/services.py | 2 +- poppy/model/ssl_certificate.py | 4 +- poppy/storage/cassandra/certificates.py | 20 ++++-- .../model/helpers/test_ssl_certificate.py | 69 +++++++++++++++++++ 6 files changed, 87 insertions(+), 12 deletions(-) diff --git a/poppy/dns/rackspace/services.py b/poppy/dns/rackspace/services.py index c584d920..7748fdd6 100644 --- a/poppy/dns/rackspace/services.py +++ b/poppy/dns/rackspace/services.py @@ -202,7 +202,7 @@ class ServicesController(base.ServicesBase): yield '{0}{1}.{2}'.format(shard_prefix, shard_id, suffix) def generate_shared_ssl_domain_suffix(self): - """Rackespace DNS scheme to generate a shared ssl domain suffix, + """Rackspace DNS scheme to generate a shared ssl domain suffix, to be used with manager for shared ssl feature diff --git a/poppy/manager/base/providers.py b/poppy/manager/base/providers.py index 3cadd81d..02aa77e8 100644 --- a/poppy/manager/base/providers.py +++ b/poppy/manager/base/providers.py @@ -34,8 +34,6 @@ class ProviderWrapper(object): :param ext :param provider_details - :param service_old - :param service_updates :param service_obj """ diff --git a/poppy/manager/default/services.py b/poppy/manager/default/services.py index f8398754..fa980dbd 100644 --- a/poppy/manager/default/services.py +++ b/poppy/manager/default/services.py @@ -418,7 +418,7 @@ class DefaultServicesController(base.ServicesController): delattr(self, store) # check if the service domain names already exist - # existing ones does not count! + # existing shared domains do not count! for d in service_new.domains: if self.storage_controller.domain_exists_elsewhere( d.domain, diff --git a/poppy/model/ssl_certificate.py b/poppy/model/ssl_certificate.py index 9e1025a1..5ead6176 100644 --- a/poppy/model/ssl_certificate.py +++ b/poppy/model/ssl_certificate.py @@ -108,8 +108,8 @@ class SSLCertificate(common.DictSerializableModel): if first_provider_cert_details is None: return "create_in_progress" else: - result = first_provider_cert_details.get('status', - "create_in_progress") + result = first_provider_cert_details.get( + 'status', "create_in_progress") if result not in VALID_STATUS_IN_CERT_DETAIL: raise ValueError( u'Status in cert_details: {0} not in valid options: {1}'. diff --git a/poppy/storage/cassandra/certificates.py b/poppy/storage/cassandra/certificates.py index 21e2207a..b6b895d2 100644 --- a/poppy/storage/cassandra/certificates.py +++ b/poppy/storage/cassandra/certificates.py @@ -115,10 +115,19 @@ class CertificatesController(base.CertificatesController): CQL_CREATE_CERT, consistency_level=self._driver.consistency_level) self.session.execute(stmt, args) - self.insert_cert_status( - cert_obj.domain_name, - cert_obj.get_cert_status() - ) + + try: + provider_status = json.loads( + list(cert_obj.cert_details.values())[0] + ) + cert_status = provider_status['extra_info']['status'] + except (IndexError, IndexError, ValueError) as e: + LOG.error("Certificate details in inconsistent " + "state: {0}".format(cert_obj.cert_details)) + LOG.error(e) + else: + # insert/update for cassandra + self.insert_cert_status(cert_obj.domain_name, cert_status) def delete_certificate(self, project_id, domain_name, cert_type): args = { @@ -170,8 +179,7 @@ class CertificatesController(base.CertificatesController): provider_status = json.loads(list(cert_details.values())[0]) cert_status = provider_status['extra_info']['status'] except (IndexError, IndexError, ValueError) as e: - LOG.error("Certificate details " - "in inconsistent " + LOG.error("Certificate details in inconsistent " "state: {0}".format(cert_details)) LOG.error(e) else: diff --git a/tests/unit/model/helpers/test_ssl_certificate.py b/tests/unit/model/helpers/test_ssl_certificate.py index 0a3999cb..dddb272e 100644 --- a/tests/unit/model/helpers/test_ssl_certificate.py +++ b/tests/unit/model/helpers/test_ssl_certificate.py @@ -75,8 +75,77 @@ class TestSSLCertificate(base.TestCase): } ssl_cert.cert_details = cert_details self.assertEqual(ssl_cert.get_cert_status(), 'deployed') + # check san edge on cert_type custom + self.assertEqual(ssl_cert.get_san_edge_name(), None) cert_details['mock']['extra_info'] = { 'status': 'whatever' } self.assertRaises(ValueError, ssl_cert.get_cert_status) + + def test_get_cert_status_extra_info_none(self): + project_id = '12345' + cert_details = { + 'mock': { + 'extra_info': None + } + } + flavor_id = 'myflavor' + domain_name = 'www.mydomain.com' + cert_type = 'san' + + ssl_cert = ssl_certificate.SSLCertificate(project_id=project_id, + flavor_id=flavor_id, + domain_name=domain_name, + cert_type=cert_type, + cert_details=cert_details) + + self.assertEqual(ssl_cert.get_cert_status(), 'create_in_progress') + self.assertEqual(ssl_cert.get_san_edge_name(), None) + + def test_cert_details_is_none(self): + project_id = '12345' + cert_details = None + flavor_id = 'myflavor' + domain_name = 'www.mydomain.com' + cert_type = 'san' + + ssl_cert = ssl_certificate.SSLCertificate(project_id=project_id, + flavor_id=flavor_id, + domain_name=domain_name, + cert_type=cert_type, + cert_details=cert_details) + + self.assertEqual(ssl_cert.get_cert_status(), 'create_in_progress') + self.assertEqual(ssl_cert.get_san_edge_name(), None) + + def test_get_san_edge_positive(self): + project_id = '12345' + cert_details = { + 'mock': { + 'extra_info': { + 'san cert': 'secureX.sanX.content.com' + } + } + } + flavor_id = 'flavor' + domain_name = 'www.domain.com' + cert_type = 'san' + + ssl_cert = ssl_certificate.SSLCertificate(project_id=project_id, + flavor_id=flavor_id, + domain_name=domain_name, + cert_type=cert_type, + cert_details=cert_details) + self.assertEqual( + ssl_cert.get_san_edge_name(), 'secureX.sanX.content.com') + + def test_init_from_dict_positive(self): + ssl_cert = ssl_certificate.SSLCertificate.init_from_dict( + {'cert_type': 'san'}) + + self.assertIsNone(ssl_cert.flavor_id) + self.assertIsNone(ssl_cert.domain_name) + self.assertEqual('san', ssl_cert.cert_type) + self.assertEqual({}, ssl_cert.cert_details) + self.assertIsNone(ssl_cert.project_id)