Changes to Preferred CA Features
This commit contains the following updates related to preferred CAs - GET /cas/preferred/ and GET /cas/global-preferred/ now return a ca_ref, instead of the CA object - Functional tests are updated to receive that ref - Update the functional tests to reset state with regards to preferred and project CAs (each test cleans up after self) - Unskip tests that now pass - Remove test case that incorrectly represented behavior of /preferred/ - Use hard delete instead of soft delete for preferred CAs Partially-implements: blueprint add-cas Change-Id: Ie3beb5c2bd7583626c1ffac088386b1a4d3dbb19
This commit is contained in:
@@ -413,8 +413,10 @@ class CertificateAuthoritiesController(controllers.ACLMixin):
|
||||
if not pref_ca:
|
||||
pecan.abort(404, u._("No global preferred CA defined"))
|
||||
|
||||
ca = self.ca_repo.get(entity_id=pref_ca.ca_id)
|
||||
return ca.to_dict_fields()
|
||||
return {
|
||||
'ca_ref':
|
||||
hrefs.convert_certificate_authority_to_href(pref_ca.ca_id)
|
||||
}
|
||||
|
||||
@pecan.expose()
|
||||
@utils.allow_all_content_types
|
||||
@@ -442,12 +444,15 @@ class CertificateAuthoritiesController(controllers.ACLMixin):
|
||||
|
||||
project = res.get_or_create_project(external_project_id)
|
||||
|
||||
pref_ca = self.preferred_ca_repo.get_project_entities(project.id)
|
||||
if not pref_ca:
|
||||
pref_cas = self.preferred_ca_repo.get_project_entities(project.id)
|
||||
if not pref_cas:
|
||||
pecan.abort(404, u._("No preferred CA defined for this project"))
|
||||
|
||||
ca = self.ca_repo.get(entity_id=pref_ca[0].ca_id)
|
||||
return ca.to_dict_fields()
|
||||
ca = pref_cas[0]
|
||||
return {
|
||||
'ca_ref':
|
||||
hrefs.convert_certificate_authority_to_href(ca.ca_id)
|
||||
}
|
||||
|
||||
@index.when(method='POST', template='json')
|
||||
@controllers.handle_exceptions(u._('CA creation'))
|
||||
|
||||
@@ -935,7 +935,7 @@ class CertificateAuthorityMetadatum(BASE, ModelBase):
|
||||
}
|
||||
|
||||
|
||||
class ProjectCertificateAuthority(BASE, SoftDeleteMixIn, ModelBase):
|
||||
class ProjectCertificateAuthority(BASE, ModelBase):
|
||||
"""Stores CAs available for a project.
|
||||
|
||||
Admins can define a set of CAs that are available for use in a particular
|
||||
|
||||
@@ -1571,7 +1571,11 @@ class CertificateAuthorityMetadatumRepo(BaseRepo):
|
||||
|
||||
|
||||
class ProjectCertificateAuthorityRepo(BaseRepo):
|
||||
"""Repository for the ProjectCertificateAuthority entity."""
|
||||
"""Repository for the ProjectCertificateAuthority entity.
|
||||
|
||||
ProjectCertificateAuthority entries are not soft delete. So there is no
|
||||
need to have deleted=False filter in queries.
|
||||
"""
|
||||
|
||||
def get_by_create_date(self, offset_arg=None, limit_arg=None,
|
||||
project_id=None, ca_id=None,
|
||||
@@ -1631,7 +1635,7 @@ class ProjectCertificateAuthorityRepo(BaseRepo):
|
||||
:param session: existing db session reference.
|
||||
"""
|
||||
return session.query(models.ProjectCertificateAuthority).filter_by(
|
||||
project_id=project_id).filter_by(deleted=False)
|
||||
project_id=project_id)
|
||||
|
||||
|
||||
class PreferredCertificateAuthorityRepo(BaseRepo):
|
||||
|
||||
@@ -175,10 +175,10 @@ class WhenTestingCAsResource(utils.BarbicanAPIBaseTestCase):
|
||||
self.create_cas()
|
||||
|
||||
resp = self.app.get('/cas/global-preferred')
|
||||
self.assertEqual(self.global_preferred_ca.id,
|
||||
resp.namespace['ca_id'])
|
||||
self.assertEqual(self.global_preferred_ca.plugin_ca_id,
|
||||
resp.namespace['plugin_ca_id'])
|
||||
self.assertEqual(
|
||||
hrefs.convert_certificate_authority_to_href(
|
||||
self.global_preferred_ca.id),
|
||||
resp.namespace['ca_ref'])
|
||||
|
||||
def test_should_get_no_global_preferred_ca(self):
|
||||
resp = self.app.get('/cas/global-preferred', expect_errors=True)
|
||||
@@ -193,10 +193,10 @@ class WhenTestingCAsResource(utils.BarbicanAPIBaseTestCase):
|
||||
def test_should_get_preferred_ca(self):
|
||||
self.create_cas()
|
||||
resp = self.app.get('/cas/preferred')
|
||||
self.assertEqual(self.preferred_ca.id,
|
||||
resp.namespace['ca_id'])
|
||||
self.assertEqual(self.preferred_ca.plugin_ca_id,
|
||||
resp.namespace['plugin_ca_id'])
|
||||
self.assertEqual(
|
||||
hrefs.convert_certificate_authority_to_href(
|
||||
self.preferred_ca.id),
|
||||
resp.namespace['ca_ref'])
|
||||
|
||||
def test_should_get_ca(self):
|
||||
self.create_cas()
|
||||
|
||||
@@ -150,10 +150,11 @@ class CABehaviors(base_behaviors.BaseBehaviors):
|
||||
|
||||
def get_preferred(self, extra_headers=None, use_auth=True,
|
||||
user_name=None):
|
||||
return self.client.get('cas/preferred',
|
||||
resp = self.client.get('cas/preferred',
|
||||
response_model_type=ca_models.CAModel,
|
||||
extra_headers=extra_headers, use_auth=use_auth,
|
||||
user_name=user_name)
|
||||
return resp
|
||||
|
||||
def set_global_preferred(self, ca_ref, headers=None,
|
||||
use_auth=True, user_name=None):
|
||||
@@ -171,7 +172,8 @@ class CABehaviors(base_behaviors.BaseBehaviors):
|
||||
|
||||
def get_global_preferred(self, extra_headers=None,
|
||||
use_auth=True, user_name=None):
|
||||
return self.client.get('cas/global-preferred',
|
||||
resp = self.client.get('cas/global-preferred',
|
||||
response_model_type=ca_models.CAModel,
|
||||
extra_headers=extra_headers,
|
||||
use_auth=use_auth, user_name=user_name)
|
||||
return resp
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
import base64
|
||||
import copy
|
||||
import re
|
||||
import testtools
|
||||
|
||||
from OpenSSL import crypto
|
||||
|
||||
@@ -181,6 +180,9 @@ class CertificateAuthoritiesTestCase(CATestCommon):
|
||||
subject_dn=convert_to_X509Name(self.subca_subject),
|
||||
issuer_dn=root_subject)
|
||||
|
||||
resp = self.ca_behaviors.delete_ca(ca_ref=ca_ref)
|
||||
self.assertEqual(204, resp.status_code)
|
||||
|
||||
@depends_on_ca_plugins('snakeoil_ca')
|
||||
def test_create_subca_of_snakeoil_subca(self):
|
||||
parent_model = self.get_snakeoil_subca_model()
|
||||
@@ -197,6 +199,11 @@ class CertificateAuthoritiesTestCase(CATestCommon):
|
||||
subject_dn=convert_to_X509Name(self.subca_subca_subject),
|
||||
issuer_dn=parent_subject)
|
||||
|
||||
resp = self.ca_behaviors.delete_ca(ca_ref=child_ref)
|
||||
self.assertEqual(204, resp.status_code)
|
||||
resp = self.ca_behaviors.delete_ca(ca_ref=parent_ref)
|
||||
self.assertEqual(204, resp.status_code)
|
||||
|
||||
def test_create_subca_with_invalid_parent_ca_id(self):
|
||||
ca_model = self.get_snakeoil_subca_model()
|
||||
ca_model.parent_ca_ref = 'http://localhost:9311/cas/invalid_ref'
|
||||
@@ -222,15 +229,26 @@ class CertificateAuthoritiesTestCase(CATestCommon):
|
||||
self.assertEqual(201, resp.status_code)
|
||||
self.send_test_order(ca_ref)
|
||||
|
||||
# @depends_on_ca_plugins('snakeoil_ca')
|
||||
@testtools.skip("Skip test until ca behaviors tracks project cas")
|
||||
resp = self.ca_behaviors.delete_ca(ca_ref=ca_ref)
|
||||
self.assertEqual(204, resp.status_code)
|
||||
|
||||
@depends_on_ca_plugins('snakeoil_ca')
|
||||
def test_add_snakeoil_ca__to_project_and_get_preferred(self):
|
||||
ca_ref = self.get_snakeoil_root_ca_ref()
|
||||
resp = self.ca_behaviors.add_ca_to_project(ca_ref, user_name=admin_a)
|
||||
self.assertEqual(204, resp.status_code)
|
||||
|
||||
ca = self.ca_behaviors.get_preferred(user_name=admin_a)
|
||||
self.assertEqual(hrefs.get_ca_id_from_ref(ca_ref), ca.model.ca_id)
|
||||
resp = self.ca_behaviors.get_preferred(user_name=admin_a)
|
||||
self.assertEqual(200, resp.status_code)
|
||||
ca_id = hrefs.get_ca_id_from_ref(resp.model.ca_ref)
|
||||
self.assertEqual(hrefs.get_ca_id_from_ref(ca_ref), ca_id)
|
||||
|
||||
resp = self.ca_behaviors.remove_ca_from_project(
|
||||
ca_ref, user_name=admin_a)
|
||||
self.assertEqual(204, resp.status_code)
|
||||
|
||||
resp = self.ca_behaviors.get_preferred(user_name=admin_a)
|
||||
self.assertEqual(404, resp.status_code)
|
||||
|
||||
@depends_on_ca_plugins('snakeoil_ca')
|
||||
def test_create_and_delete_snakeoil_subca(self):
|
||||
@@ -258,6 +276,9 @@ class CertificateAuthoritiesTestCase(CATestCommon):
|
||||
self.assertEqual(200, resp.status_code)
|
||||
crypto.load_certificate(crypto.FILETYPE_PEM, resp.text)
|
||||
|
||||
resp = self.ca_behaviors.delete_ca(ca_ref=ca_ref)
|
||||
self.assertEqual(204, resp.status_code)
|
||||
|
||||
|
||||
class ListingCAsTestCase(CATestCommon):
|
||||
"""Tests for listing CAs.
|
||||
@@ -332,66 +353,50 @@ class GlobalPreferredCATestCase(CATestCommon):
|
||||
self.ca_ids = [hrefs.get_ca_id_from_ref(ref) for ref in self.cas]
|
||||
|
||||
def tearDown(self):
|
||||
self.ca_behaviors.unset_global_preferred(user_name=service_admin)
|
||||
super(CATestCommon, self).tearDown()
|
||||
|
||||
def test_global_preferred_no_project_admin_access(self):
|
||||
resp = self.ca_behaviors.get_global_preferred()
|
||||
self.assertEqual(403, resp.status_code)
|
||||
resp = self.ca_behaviors.set_global_preferred(ca_ref=self.cas[1])
|
||||
resp = self.ca_behaviors.set_global_preferred(ca_ref=self.cas[0])
|
||||
self.assertEqual(403, resp.status_code)
|
||||
resp = self.ca_behaviors.unset_global_preferred()
|
||||
self.assertEqual(403, resp.status_code)
|
||||
|
||||
def test_global_preferred_update(self):
|
||||
if self.num_cas < 2:
|
||||
self.skipTest("At least two CAs are required for this test")
|
||||
self.sTest("At least two CAs are required for this test")
|
||||
resp = self.ca_behaviors.set_global_preferred(
|
||||
ca_ref=self.cas[0], user_name=service_admin)
|
||||
self.assertEqual(204, resp.status_code)
|
||||
resp = self.ca_behaviors.get_global_preferred(user_name=service_admin)
|
||||
self.assertEqual(200, resp.status_code)
|
||||
self.assertEqual(self.ca_ids[0], resp.model.ca_id)
|
||||
ca_id = hrefs.get_ca_id_from_ref(resp.model.ca_ref)
|
||||
self.assertEqual(self.ca_ids[0], ca_id)
|
||||
|
||||
resp = self.ca_behaviors.set_global_preferred(
|
||||
ca_ref=self.cas[1], user_name=service_admin)
|
||||
self.assertEqual(204, resp.status_code)
|
||||
resp = self.ca_behaviors.get_global_preferred(user_name=service_admin)
|
||||
self.assertEqual(200, resp.status_code)
|
||||
self.assertEqual(self.ca_ids[1], resp.model.ca_id)
|
||||
ca_id = hrefs.get_ca_id_from_ref(resp.model.ca_ref)
|
||||
self.assertEqual(self.ca_ids[1], ca_id)
|
||||
|
||||
resp = self.ca_behaviors.unset_global_preferred(
|
||||
user_name=service_admin)
|
||||
self.assertEqual(204, resp.status_code)
|
||||
|
||||
def test_global_preferred_set_and_unset(self):
|
||||
resp = self.ca_behaviors.unset_global_preferred(
|
||||
user_name=service_admin)
|
||||
self.assertEqual(204, resp.status_code)
|
||||
resp = self.ca_behaviors.get_global_preferred(user_name=service_admin)
|
||||
self.assertEqual(404, resp.status_code)
|
||||
|
||||
resp = self.ca_behaviors.set_global_preferred(
|
||||
ca_ref=self.cas[0], user_name=service_admin)
|
||||
self.assertEqual(204, resp.status_code)
|
||||
resp = self.ca_behaviors.get_global_preferred(user_name=service_admin)
|
||||
self.assertEqual(200, resp.status_code)
|
||||
self.assertEqual(self.ca_ids[0], resp.model.ca_id)
|
||||
ca_id = hrefs.get_ca_id_from_ref(resp.model.ca_ref)
|
||||
self.assertEqual(self.ca_ids[0], ca_id)
|
||||
|
||||
resp = self.ca_behaviors.unset_global_preferred(
|
||||
user_name=service_admin)
|
||||
self.assertEqual(204, resp.status_code)
|
||||
resp = self.ca_behaviors.get_global_preferred(user_name=service_admin)
|
||||
self.assertEqual(404, resp.status_code)
|
||||
|
||||
@testtools.skip("Skip test until ca behaviors tracks project cas")
|
||||
def test_global_preferred_affects_project_preferred(self):
|
||||
if self.num_cas < 2:
|
||||
self.skipTest("At least two CAs are required for this test")
|
||||
resp = self.ca_behaviors.get_preferred(user_name=admin_a)
|
||||
self.assertEqual(200, resp.status_code)
|
||||
self.assertEqual(self.ca_ids[0], resp.model.ca_id)
|
||||
|
||||
resp = self.ca_behaviors.set_global_preferred(
|
||||
ca_ref=self.cas[1], user_name=service_admin)
|
||||
self.assertEqual(204, resp.status_code)
|
||||
|
||||
resp = self.ca_behaviors.get_preferred(user_name=admin_a)
|
||||
self.assertEqual(200, resp.status_code)
|
||||
self.assertEqual(self.ca_ids[1], resp.model.ca_id)
|
||||
|
||||
@@ -19,14 +19,15 @@ from functionaltests.api.v1.models.base_models import BaseModel
|
||||
|
||||
class CAModel(BaseModel):
|
||||
|
||||
def __init__(self, expiration=None, ca_id=None, status=None,
|
||||
updated=None, created=None, plugin_name=None,
|
||||
def __init__(self, expiration=None, ca_id=None, ca_ref=None,
|
||||
status=None, updated=None, created=None, plugin_name=None,
|
||||
plugin_ca_id=None, meta=None, parent_ca_ref=None,
|
||||
subject_dn=None, name=None, description=None):
|
||||
super(CAModel, self).__init__()
|
||||
|
||||
self.expiration = expiration
|
||||
self.ca_id = ca_id
|
||||
self.ca_ref = ca_ref
|
||||
self.status = status
|
||||
self.updated = updated
|
||||
self.created = created
|
||||
|
||||
@@ -29,7 +29,7 @@ retval=$?
|
||||
testr slowest
|
||||
|
||||
# run the tests in parallel
|
||||
SKIP=^\(\?\!\.\*\(ProjectQuotasPagingTestCase\|QuotaEnforcementTestCase\|ListingCAsTestCase\|ProjectCATestCase\|GlobalPreferredCATestCase\)\)
|
||||
SKIP=^\(\?\!\.\*\(ProjectQuotasPagingTestCase\|QuotaEnforcementTestCase\|ListingCAsTestCase\|ProjectCATestCase\|GlobalPreferredCATestCase\|CertificateAuthoritiesTestCase\)\)
|
||||
testr init
|
||||
testr run $SKIP --parallel --subunit | subunit-trace --no-failure-debug -f
|
||||
retval=$(($retval || $?))
|
||||
|
||||
Reference in New Issue
Block a user