Merge "Remove ProjectSecret table-related code"
This commit is contained in:
commit
2aaf6c7b40
@ -49,8 +49,7 @@ class SecretACLsController(controllers.ACLMixin):
|
|||||||
|
|
||||||
def __init__(self, secret):
|
def __init__(self, secret):
|
||||||
self.secret = secret
|
self.secret = secret
|
||||||
self.secret_project_id = (self.secret.project_assocs[0].
|
self.secret_project_id = self.secret.project.external_id
|
||||||
projects.external_id)
|
|
||||||
self.acl_repo = repo.get_secret_acl_repository()
|
self.acl_repo = repo.get_secret_acl_repository()
|
||||||
self.validator = validators.ACLValidator()
|
self.validator = validators.ACLValidator()
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ class SecretController(controllers.ACLMixin):
|
|||||||
|
|
||||||
def get_acl_tuple(self, req, **kwargs):
|
def get_acl_tuple(self, req, **kwargs):
|
||||||
d = self.get_acl_dict_for_user(req, self.secret.secret_acls)
|
d = self.get_acl_dict_for_user(req, self.secret.secret_acls)
|
||||||
d['project_id'] = self.secret.project_assocs[0].projects.external_id
|
d['project_id'] = self.secret.project.external_id
|
||||||
d['creator_id'] = self.secret.creator_id
|
d['creator_id'] = self.secret.creator_id
|
||||||
return 'secret', d
|
return 'secret', d
|
||||||
|
|
||||||
@ -124,7 +124,7 @@ class SecretController(controllers.ACLMixin):
|
|||||||
# project associated with secret. The lookup project_id needs to be
|
# project associated with secret. The lookup project_id needs to be
|
||||||
# derived from the secret's data considering authorization is already
|
# derived from the secret's data considering authorization is already
|
||||||
# done.
|
# done.
|
||||||
external_project_id = secret.project_assocs[0].projects.external_id
|
external_project_id = secret.project.external_id
|
||||||
project = res.get_or_create_project(external_project_id)
|
project = res.get_or_create_project(external_project_id)
|
||||||
|
|
||||||
# default to application/octet-stream if there is no Accept header
|
# default to application/octet-stream if there is no Accept header
|
||||||
|
@ -0,0 +1,50 @@
|
|||||||
|
"""remove ProjectSecret table
|
||||||
|
|
||||||
|
Revision ID: 1bece815014f
|
||||||
|
Revises: 161f8aceb687
|
||||||
|
Create Date: 2015-06-23 16:17:50.805295
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = '1bece815014f'
|
||||||
|
down_revision = '161f8aceb687'
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
from sqlalchemy.dialects import postgresql
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
op.drop_table('project_secret')
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
op.create_table(
|
||||||
|
'project_secret',
|
||||||
|
sa.Column('id', sa.VARCHAR(length=36), autoincrement=False,
|
||||||
|
nullable=False),
|
||||||
|
sa.Column('created_at', postgresql.TIMESTAMP(), autoincrement=False,
|
||||||
|
nullable=False),
|
||||||
|
sa.Column('updated_at', postgresql.TIMESTAMP(), autoincrement=False,
|
||||||
|
nullable=False),
|
||||||
|
sa.Column('deleted_at', postgresql.TIMESTAMP(), autoincrement=False,
|
||||||
|
nullable=True),
|
||||||
|
sa.Column('deleted', sa.BOOLEAN(), autoincrement=False,
|
||||||
|
nullable=False),
|
||||||
|
sa.Column('status', sa.VARCHAR(length=20), autoincrement=False,
|
||||||
|
nullable=False),
|
||||||
|
sa.Column('role', sa.VARCHAR(length=255), autoincrement=False,
|
||||||
|
nullable=True),
|
||||||
|
sa.Column('project_id', sa.VARCHAR(length=36), autoincrement=False,
|
||||||
|
nullable=False),
|
||||||
|
sa.Column('secret_id', sa.VARCHAR(length=36), autoincrement=False,
|
||||||
|
nullable=False),
|
||||||
|
sa.ForeignKeyConstraint(['project_id'], [u'projects.id'],
|
||||||
|
name=u'project_secret_project_fk'),
|
||||||
|
sa.ForeignKeyConstraint(['secret_id'], [u'secrets.id'],
|
||||||
|
name=u'project_secret_secret_fk'),
|
||||||
|
sa.PrimaryKeyConstraint('id', name=u'project_secret_pkey'),
|
||||||
|
sa.UniqueConstraint('project_id', 'secret_id',
|
||||||
|
name=u'_project_secret_uc')
|
||||||
|
)
|
@ -215,28 +215,6 @@ class SoftDeleteMixIn(object):
|
|||||||
self._do_delete_children(session)
|
self._do_delete_children(session)
|
||||||
|
|
||||||
|
|
||||||
class ProjectSecret(BASE, SoftDeleteMixIn, ModelBase):
|
|
||||||
"""Represents an association between a Project and a Secret."""
|
|
||||||
|
|
||||||
__tablename__ = 'project_secret'
|
|
||||||
|
|
||||||
role = sa.Column(sa.String(255))
|
|
||||||
secret = orm.relationship("Secret", backref="project_assocs")
|
|
||||||
project_id = sa.Column(
|
|
||||||
sa.String(36),
|
|
||||||
sa.ForeignKey('projects.id', name='project_secret_project_fk'),
|
|
||||||
index=True,
|
|
||||||
nullable=False)
|
|
||||||
secret_id = sa.Column(
|
|
||||||
sa.String(36),
|
|
||||||
sa.ForeignKey('secrets.id', name='project_secret_secret_fk'),
|
|
||||||
index=True,
|
|
||||||
nullable=False)
|
|
||||||
|
|
||||||
__table_args__ = (sa.UniqueConstraint(
|
|
||||||
'project_id', 'secret_id', name='_project_secret_uc'),)
|
|
||||||
|
|
||||||
|
|
||||||
class ContainerSecret(BASE, SoftDeleteMixIn, ModelBase):
|
class ContainerSecret(BASE, SoftDeleteMixIn, ModelBase):
|
||||||
"""Represents an association between a Container and a Secret."""
|
"""Represents an association between a Container and a Secret."""
|
||||||
|
|
||||||
@ -272,7 +250,6 @@ class Project(BASE, SoftDeleteMixIn, ModelBase):
|
|||||||
|
|
||||||
orders = orm.relationship("Order", backref="project")
|
orders = orm.relationship("Order", backref="project")
|
||||||
secrets = orm.relationship("Secret", backref="project")
|
secrets = orm.relationship("Secret", backref="project")
|
||||||
old_secrets = orm.relationship("ProjectSecret", backref="projects")
|
|
||||||
keks = orm.relationship("KEKDatum", backref="project")
|
keks = orm.relationship("KEKDatum", backref="project")
|
||||||
containers = orm.relationship("Container", backref="project")
|
containers = orm.relationship("Container", backref="project")
|
||||||
cas = orm.relationship("ProjectCertificateAuthority", backref="project")
|
cas = orm.relationship("ProjectCertificateAuthority", backref="project")
|
||||||
@ -305,7 +282,7 @@ class Secret(BASE, SoftDeleteMixIn, ModelBase):
|
|||||||
sa.String(36),
|
sa.String(36),
|
||||||
sa.ForeignKey('projects.id', name='secrets_project_fk'),
|
sa.ForeignKey('projects.id', name='secrets_project_fk'),
|
||||||
index=True,
|
index=True,
|
||||||
nullable=True)
|
nullable=False)
|
||||||
|
|
||||||
# TODO(jwood): Performance - Consider avoiding full load of all
|
# TODO(jwood): Performance - Consider avoiding full load of all
|
||||||
# datum attributes here. This is only being done to support the
|
# datum attributes here. This is only being done to support the
|
||||||
@ -337,6 +314,7 @@ class Secret(BASE, SoftDeleteMixIn, ModelBase):
|
|||||||
self.bit_length = parsed_request.get('bit_length')
|
self.bit_length = parsed_request.get('bit_length')
|
||||||
self.mode = parsed_request.get('mode')
|
self.mode = parsed_request.get('mode')
|
||||||
self.creator_id = parsed_request.get('creator_id')
|
self.creator_id = parsed_request.get('creator_id')
|
||||||
|
self.project_id = parsed_request.get('project_id')
|
||||||
|
|
||||||
self.status = States.ACTIVE
|
self.status = States.ACTIVE
|
||||||
|
|
||||||
|
@ -61,7 +61,6 @@ _ORDER_RETRY_TASK_REPOSITORY = None
|
|||||||
_PREFERRED_CA_REPOSITORY = None
|
_PREFERRED_CA_REPOSITORY = None
|
||||||
_PROJECT_REPOSITORY = None
|
_PROJECT_REPOSITORY = None
|
||||||
_PROJECT_CA_REPOSITORY = None
|
_PROJECT_CA_REPOSITORY = None
|
||||||
_PROJECT_SECRET_REPOSITORY = None
|
|
||||||
_SECRET_ACL_REPOSITORY = None
|
_SECRET_ACL_REPOSITORY = None
|
||||||
_SECRET_META_REPOSITORY = None
|
_SECRET_META_REPOSITORY = None
|
||||||
_SECRET_REPOSITORY = None
|
_SECRET_REPOSITORY = None
|
||||||
@ -313,9 +312,6 @@ def delete_all_project_resources(project_id):
|
|||||||
kek_repo = get_kek_datum_repository()
|
kek_repo = get_kek_datum_repository()
|
||||||
kek_repo.delete_project_entities(
|
kek_repo.delete_project_entities(
|
||||||
project_id, suppress_exception=False, session=session)
|
project_id, suppress_exception=False, session=session)
|
||||||
project_secret_repo = get_project_secret_repository()
|
|
||||||
project_secret_repo.delete_project_entities(
|
|
||||||
project_id, suppress_exception=False, session=session)
|
|
||||||
project_repo = get_project_repository()
|
project_repo = get_project_repository()
|
||||||
project_repo.delete_project_entities(
|
project_repo.delete_project_entities(
|
||||||
project_id, suppress_exception=False, session=session)
|
project_id, suppress_exception=False, session=session)
|
||||||
@ -610,59 +606,25 @@ class SecretRepo(BaseRepo):
|
|||||||
if secret_type:
|
if secret_type:
|
||||||
query = query.filter(models.Secret.secret_type == secret_type)
|
query = query.filter(models.Secret.secret_type == secret_type)
|
||||||
|
|
||||||
query_projects, query_old_project_assoc = (
|
query = query.join(models.Project)
|
||||||
self._build_filter_secrets_by_project_queries(
|
query = query.filter(models.Project.external_id == external_project_id)
|
||||||
query, external_project_id))
|
|
||||||
|
|
||||||
total, entities = self._page_old_and_new_secret_project_assocs(
|
total = query.count()
|
||||||
query_projects, query_old_project_assoc, offset, limit)
|
end_offset = offset + limit
|
||||||
|
|
||||||
|
LOG.debug('Retrieving from %s to %s', offset, end_offset)
|
||||||
|
|
||||||
|
query = query.limit(limit).offset(offset)
|
||||||
|
entities = query.all()
|
||||||
|
|
||||||
|
LOG.debug('Number entities retrieved: %s out of %s',
|
||||||
|
len(entities), total)
|
||||||
|
|
||||||
if total <= 0 and not suppress_exception:
|
if total <= 0 and not suppress_exception:
|
||||||
_raise_no_entities_found(self._do_entity_name())
|
_raise_no_entities_found(self._do_entity_name())
|
||||||
|
|
||||||
return entities, offset, limit, total
|
return entities, offset, limit, total
|
||||||
|
|
||||||
def _build_filter_secrets_by_project_queries(self, query, project_id):
|
|
||||||
query_projects = query.filter(models.Secret.project_id == project_id)
|
|
||||||
|
|
||||||
query_old_project_assoc = query.join(models.ProjectSecret,
|
|
||||||
models.Secret.project_assocs)
|
|
||||||
query_old_project_assoc = query_old_project_assoc.join(
|
|
||||||
models.Project, models.ProjectSecret.projects)
|
|
||||||
query_old_project_assoc = query_old_project_assoc.filter(
|
|
||||||
models.Project.external_id == project_id)
|
|
||||||
|
|
||||||
return query_projects, query_old_project_assoc
|
|
||||||
|
|
||||||
def _page_old_and_new_secret_project_assocs(
|
|
||||||
self, query_projects, query_old_project_assoc, offset, limit):
|
|
||||||
project_count = query_projects.count()
|
|
||||||
old_project_count = query_old_project_assoc.count()
|
|
||||||
|
|
||||||
total = project_count + old_project_count
|
|
||||||
end_offset = offset + limit
|
|
||||||
LOG.debug('Retrieving from %s to %s', offset, end_offset)
|
|
||||||
# Page over new-association secrets first, then old-association secrets
|
|
||||||
if end_offset < project_count:
|
|
||||||
query_project = query_projects.limit(limit).offset(offset)
|
|
||||||
entities = query_project.all()
|
|
||||||
elif offset >= project_count:
|
|
||||||
query_old_project_assoc = (
|
|
||||||
query_old_project_assoc.limit(limit).offset(
|
|
||||||
offset - project_count))
|
|
||||||
entities = query_old_project_assoc.all()
|
|
||||||
else:
|
|
||||||
query_project = query_projects.limit(limit).offset(offset)
|
|
||||||
entities = query_project.all()
|
|
||||||
query_old_project_assoc = query_old_project_assoc.limit(
|
|
||||||
end_offset - project_count + 1).offset(0)
|
|
||||||
entities.extend(query_old_project_assoc.all())
|
|
||||||
|
|
||||||
LOG.debug('Number entities retrieved: %s out of %s',
|
|
||||||
len(entities), total)
|
|
||||||
|
|
||||||
return total, entities
|
|
||||||
|
|
||||||
def _do_entity_name(self):
|
def _do_entity_name(self):
|
||||||
"""Sub-class hook: return entity name, such as for debugging."""
|
"""Sub-class hook: return entity name, such as for debugging."""
|
||||||
return "Secret"
|
return "Secret"
|
||||||
@ -679,14 +641,9 @@ class SecretRepo(BaseRepo):
|
|||||||
query = session.query(models.Secret)
|
query = session.query(models.Secret)
|
||||||
query = query.filter_by(id=entity_id, deleted=False)
|
query = query.filter_by(id=entity_id, deleted=False)
|
||||||
query = query.filter(expiration_filter)
|
query = query.filter(expiration_filter)
|
||||||
query_projects, query_old_project_assoc = (
|
query = query.join(models.Project)
|
||||||
self._build_filter_secrets_by_project_queries(
|
query = query.filter(models.Project.external_id == external_project_id)
|
||||||
query, external_project_id))
|
return query
|
||||||
|
|
||||||
if query_projects.count() > 0:
|
|
||||||
return query_projects
|
|
||||||
else:
|
|
||||||
return query_old_project_assoc
|
|
||||||
|
|
||||||
def _do_validate(self, values):
|
def _do_validate(self, values):
|
||||||
"""Sub-class hook: validate values."""
|
"""Sub-class hook: validate values."""
|
||||||
@ -695,18 +652,11 @@ class SecretRepo(BaseRepo):
|
|||||||
def _build_get_project_entities_query(self, project_id, session):
|
def _build_get_project_entities_query(self, project_id, session):
|
||||||
"""Builds query for retrieving Secrets associated with a given project
|
"""Builds query for retrieving Secrets associated with a given project
|
||||||
|
|
||||||
Discovery is done via a ProjectSecret association.
|
|
||||||
|
|
||||||
:param project_id: id of barbican project entity
|
:param project_id: id of barbican project entity
|
||||||
:param session: existing db session reference.
|
:param session: existing db session reference.
|
||||||
"""
|
"""
|
||||||
query = session.query(models.Secret).filter_by(deleted=False)
|
query = session.query(models.Secret).filter_by(deleted=False)
|
||||||
|
query = query.filter(models.Secret.project_id == project_id)
|
||||||
query_projects, query_old_project_assoc = (
|
|
||||||
self._build_filter_secrets_by_project_queries(
|
|
||||||
query, project_id))
|
|
||||||
|
|
||||||
query = query_projects.union(query_old_project_assoc)
|
|
||||||
|
|
||||||
return query
|
return query
|
||||||
|
|
||||||
@ -877,31 +827,6 @@ class KEKDatumRepo(BaseRepo):
|
|||||||
project_id=project_id).filter_by(deleted=False)
|
project_id=project_id).filter_by(deleted=False)
|
||||||
|
|
||||||
|
|
||||||
class ProjectSecretRepo(BaseRepo):
|
|
||||||
"""Repository for the ProjectSecret entity."""
|
|
||||||
|
|
||||||
def _do_entity_name(self):
|
|
||||||
"""Sub-class hook: return entity name, such as for debugging."""
|
|
||||||
return "ProjectSecret"
|
|
||||||
|
|
||||||
def _do_build_get_query(self, entity_id, external_project_id, session):
|
|
||||||
"""Sub-class hook: build a retrieve query."""
|
|
||||||
return session.query(models.ProjectSecret).filter_by(id=entity_id)
|
|
||||||
|
|
||||||
def _do_validate(self, values):
|
|
||||||
"""Sub-class hook: validate values."""
|
|
||||||
pass
|
|
||||||
|
|
||||||
def _build_get_project_entities_query(self, project_id, session):
|
|
||||||
"""Builds query for retrieving ProjectSecret related to given project.
|
|
||||||
|
|
||||||
:param project_id: id of barbican project entity
|
|
||||||
:param session: existing db session reference.
|
|
||||||
"""
|
|
||||||
return session.query(models.ProjectSecret).filter_by(
|
|
||||||
project_id=project_id).filter_by(deleted=False)
|
|
||||||
|
|
||||||
|
|
||||||
class OrderRepo(BaseRepo):
|
class OrderRepo(BaseRepo):
|
||||||
"""Repository for the Order entity."""
|
"""Repository for the Order entity."""
|
||||||
|
|
||||||
@ -1991,12 +1916,6 @@ def get_project_ca_repository():
|
|||||||
ProjectCertificateAuthorityRepo)
|
ProjectCertificateAuthorityRepo)
|
||||||
|
|
||||||
|
|
||||||
def get_project_secret_repository():
|
|
||||||
"""Returns a singleton ProjectSecret repository instance."""
|
|
||||||
global _PROJECT_SECRET_REPOSITORY
|
|
||||||
return _get_repository(_PROJECT_SECRET_REPOSITORY, ProjectSecretRepo)
|
|
||||||
|
|
||||||
|
|
||||||
def get_secret_acl_repository():
|
def get_secret_acl_repository():
|
||||||
"""Returns a singleton Secret ACL repository instance."""
|
"""Returns a singleton Secret ACL repository instance."""
|
||||||
global _SECRET_ACL_REPOSITORY
|
global _SECRET_ACL_REPOSITORY
|
||||||
|
@ -345,14 +345,6 @@ def _save_secret_in_repo(secret_model, project_model):
|
|||||||
if not secret_model.id:
|
if not secret_model.id:
|
||||||
secret_model.project_id = project_model.id
|
secret_model.project_id = project_model.id
|
||||||
secret_repo.create_from(secret_model)
|
secret_repo.create_from(secret_model)
|
||||||
new_assoc = models.ProjectSecret()
|
|
||||||
new_assoc.project_id = project_model.id
|
|
||||||
new_assoc.secret_id = secret_model.id
|
|
||||||
new_assoc.role = "admin"
|
|
||||||
new_assoc.status = models.States.ACTIVE
|
|
||||||
|
|
||||||
project_secret_repo = repos.get_project_secret_repository()
|
|
||||||
project_secret_repo.create_from(new_assoc)
|
|
||||||
else:
|
else:
|
||||||
secret_repo.save(secret_model)
|
secret_repo.save(secret_model)
|
||||||
|
|
||||||
|
@ -304,18 +304,11 @@ def _store_secret_and_datum(
|
|||||||
if not secret_model.id:
|
if not secret_model.id:
|
||||||
secret_model.project_id = context.project_model.id
|
secret_model.project_id = context.project_model.id
|
||||||
repositories.get_secret_repository().create_from(secret_model)
|
repositories.get_secret_repository().create_from(secret_model)
|
||||||
new_assoc = models.ProjectSecret()
|
|
||||||
new_assoc.project_id = context.project_model.id
|
|
||||||
new_assoc.secret_id = secret_model.id
|
|
||||||
new_assoc.role = "admin"
|
|
||||||
new_assoc.status = models.States.ACTIVE
|
|
||||||
repositories.get_project_secret_repository().create_from(new_assoc)
|
|
||||||
|
|
||||||
# setup and store encrypted datum
|
# setup and store encrypted datum
|
||||||
datum_model = models.EncryptedDatum(secret_model, kek_datum_model)
|
datum_model = models.EncryptedDatum(secret_model, kek_datum_model)
|
||||||
datum_model.content_type = context.content_type
|
datum_model.content_type = context.content_type
|
||||||
datum_model.cypher_text = (
|
datum_model.cypher_text = base64.b64encode(generated_dto.cypher_text)
|
||||||
base64.b64encode(generated_dto.cypher_text))
|
|
||||||
datum_model.kek_meta_extended = generated_dto.kek_meta_extended
|
datum_model.kek_meta_extended = generated_dto.kek_meta_extended
|
||||||
datum_model.secret_id = secret_model.id
|
datum_model.secret_id = secret_model.id
|
||||||
repositories.get_encrypted_datum_repository().create_from(
|
repositories.get_encrypted_datum_repository().create_from(
|
||||||
|
@ -236,11 +236,6 @@ class BaseSecretsResource(FunctionalTest):
|
|||||||
self.secret_repo.create_from.return_value = self.secret
|
self.secret_repo.create_from.return_value = self.secret
|
||||||
self.setup_secret_repository_mock(self.secret_repo)
|
self.setup_secret_repository_mock(self.secret_repo)
|
||||||
|
|
||||||
# Set up mocked project-secret repo
|
|
||||||
self.project_secret_repo = mock.MagicMock()
|
|
||||||
self.project_secret_repo.create_from.return_value = None
|
|
||||||
self.setup_project_secret_repository_mock(self.project_secret_repo)
|
|
||||||
|
|
||||||
# Set up mocked encrypted datum repo
|
# Set up mocked encrypted datum repo
|
||||||
self.datum_repo = mock.MagicMock()
|
self.datum_repo = mock.MagicMock()
|
||||||
self.datum_repo.create_from.return_value = None
|
self.datum_repo.create_from.return_value = None
|
||||||
@ -327,9 +322,8 @@ class WhenGettingPuttingOrDeletingSecretUsingSecretResource(FunctionalTest):
|
|||||||
content_type=self.datum.content_type)
|
content_type=self.datum.content_type)
|
||||||
|
|
||||||
self.secret.secret_acls = []
|
self.secret.secret_acls = []
|
||||||
self.secret.project_assocs = [mock.MagicMock()]
|
self.secret.project = mock.MagicMock()
|
||||||
secret_project = self.secret.project_assocs[0].projects
|
self.secret.project.external_id = self.external_project_id
|
||||||
secret_project.external_id = self.external_project_id
|
|
||||||
|
|
||||||
# Set up mocked project
|
# Set up mocked project
|
||||||
self.project = models.Project()
|
self.project = models.Project()
|
||||||
@ -350,9 +344,6 @@ class WhenGettingPuttingOrDeletingSecretUsingSecretResource(FunctionalTest):
|
|||||||
self.secret_repo.delete_entity_by_id = mock.Mock(return_value=None)
|
self.secret_repo.delete_entity_by_id = mock.Mock(return_value=None)
|
||||||
self.setup_secret_repository_mock(self.secret_repo)
|
self.setup_secret_repository_mock(self.secret_repo)
|
||||||
|
|
||||||
# Set up mocked project-secret repo
|
|
||||||
self.setup_project_secret_repository_mock()
|
|
||||||
|
|
||||||
# Set up mocked encrypted datum repo
|
# Set up mocked encrypted datum repo
|
||||||
self.datum_repo = mock.MagicMock()
|
self.datum_repo = mock.MagicMock()
|
||||||
self.datum_repo.create_from.return_value = None
|
self.datum_repo.create_from.return_value = None
|
||||||
|
@ -256,7 +256,6 @@ class WhenTestingSecretsResource(BaseTestCase):
|
|||||||
self.setup_encrypted_datum_repository_mock()
|
self.setup_encrypted_datum_repository_mock()
|
||||||
self.setup_kek_datum_repository_mock()
|
self.setup_kek_datum_repository_mock()
|
||||||
self.setup_project_repository_mock()
|
self.setup_project_repository_mock()
|
||||||
self.setup_project_secret_repository_mock()
|
|
||||||
self.setup_secret_meta_repository_mock()
|
self.setup_secret_meta_repository_mock()
|
||||||
self.setup_transport_key_repository_mock()
|
self.setup_transport_key_repository_mock()
|
||||||
|
|
||||||
@ -323,8 +322,7 @@ class WhenTestingSecretResource(BaseTestCase):
|
|||||||
self.acl_list = [acl_read]
|
self.acl_list = [acl_read]
|
||||||
secret = mock.MagicMock()
|
secret = mock.MagicMock()
|
||||||
secret.secret_acls.__iter__.return_value = self.acl_list
|
secret.secret_acls.__iter__.return_value = self.acl_list
|
||||||
secret.project_assocs[0].projects.external_id = (self.
|
secret.project.external_id = self.external_project_id
|
||||||
external_project_id)
|
|
||||||
secret.creator_id = self.creator_user_id
|
secret.creator_id = self.creator_user_id
|
||||||
|
|
||||||
self.resource = SecretResource(secret)
|
self.resource = SecretResource(secret)
|
||||||
|
@ -49,7 +49,6 @@ class WhenTestingSecretACLRepository(database_utils.RepositoryTestCase,
|
|||||||
# Setup the secret and needed base relationship
|
# Setup the secret and needed base relationship
|
||||||
secret_repo = repositories.get_secret_repository()
|
secret_repo = repositories.get_secret_repository()
|
||||||
session = secret_repo.get_session()
|
session = secret_repo.get_session()
|
||||||
secret = secret_repo.create_from(models.Secret(), session=session)
|
|
||||||
|
|
||||||
if project_id is None: # don't re-create project if it created earlier
|
if project_id is None: # don't re-create project if it created earlier
|
||||||
project = models.Project()
|
project = models.Project()
|
||||||
@ -57,10 +56,11 @@ class WhenTestingSecretACLRepository(database_utils.RepositoryTestCase,
|
|||||||
project.save(session=session)
|
project.save(session=session)
|
||||||
project_id = project.id
|
project_id = project.id
|
||||||
|
|
||||||
project_secret = models.ProjectSecret()
|
secret_model = models.Secret()
|
||||||
project_secret.secret_id = secret.id
|
secret_model.project_id = project_id
|
||||||
project_secret.project_id = project_id
|
secret = secret_repo.create_from(secret_model, session=session)
|
||||||
project_secret.save(session=session)
|
|
||||||
|
secret.save(session=session)
|
||||||
|
|
||||||
session.commit()
|
session.commit()
|
||||||
return secret
|
return secret
|
||||||
@ -226,8 +226,7 @@ class WhenTestingSecretACLRepository(database_utils.RepositoryTestCase,
|
|||||||
session)
|
session)
|
||||||
self.acl_repo.create_or_replace_from(secret1, acl1)
|
self.acl_repo.create_or_replace_from(secret1, acl1)
|
||||||
|
|
||||||
secret2 = self._create_base_secret(
|
secret2 = self._create_base_secret(secret1.project.id)
|
||||||
secret1.project_assocs[0].project_id)
|
|
||||||
acl21 = self.acl_repo.create_from(models.SecretACL(secret2.id, 'read',
|
acl21 = self.acl_repo.create_from(models.SecretACL(secret2.id, 'read',
|
||||||
None, ['u3', 'u4']),
|
None, ['u3', 'u4']),
|
||||||
session)
|
session)
|
||||||
|
@ -56,15 +56,13 @@ class WhenTestingSecretRepository(database_utils.RepositoryTestCase):
|
|||||||
def test_get_by_create_date(self):
|
def test_get_by_create_date(self):
|
||||||
session = self.repo.get_session()
|
session = self.repo.get_session()
|
||||||
|
|
||||||
secret = self.repo.create_from(models.Secret(), session=session)
|
|
||||||
project = models.Project()
|
project = models.Project()
|
||||||
project.external_id = "my keystone id"
|
project.external_id = "my keystone id"
|
||||||
project.save(session=session)
|
project.save(session=session)
|
||||||
|
|
||||||
project_secret = models.ProjectSecret()
|
secret_model = models.Secret()
|
||||||
project_secret.secret_id = secret.id
|
secret_model.project_id = project.id
|
||||||
project_secret.project_id = project.id
|
secret = self.repo.create_from(secret_model, session=session)
|
||||||
project_secret.save(session=session)
|
|
||||||
|
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
@ -81,15 +79,14 @@ class WhenTestingSecretRepository(database_utils.RepositoryTestCase):
|
|||||||
def test_get_secret_by_id(self):
|
def test_get_secret_by_id(self):
|
||||||
session = self.repo.get_session()
|
session = self.repo.get_session()
|
||||||
|
|
||||||
secret = self.repo.create_from(models.Secret(), session=session)
|
|
||||||
project = models.Project()
|
project = models.Project()
|
||||||
project.external_id = "my keystone id"
|
project.external_id = "my keystone id"
|
||||||
project.save(session=session)
|
project.save(session=session)
|
||||||
|
|
||||||
project_secret = models.ProjectSecret()
|
secret_model = models.Secret()
|
||||||
project_secret.secret_id = secret.id
|
secret_model.project_id = project.id
|
||||||
project_secret.project_id = project.id
|
secret = self.repo.create_from(secret_model, session=session)
|
||||||
project_secret.save(session=session)
|
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
db_secret = self.repo.get_secret_by_id(secret.id)
|
db_secret = self.repo.get_secret_by_id(secret.id)
|
||||||
@ -104,31 +101,24 @@ class WhenTestingSecretRepository(database_utils.RepositoryTestCase):
|
|||||||
suppress_exception=True))
|
suppress_exception=True))
|
||||||
|
|
||||||
@utils.parameterized_dataset(dataset_for_filter_tests)
|
@utils.parameterized_dataset(dataset_for_filter_tests)
|
||||||
def test_get_by_create_date_with_filter(
|
def test_get_by_create_date_with_filter(self, secret_1_dict, secret_2_dict,
|
||||||
self, secret_1_dict, secret_2_dict, query_dict):
|
query_dict):
|
||||||
session = self.repo.get_session()
|
session = self.repo.get_session()
|
||||||
|
|
||||||
secret1 = self.repo.create_from(
|
|
||||||
models.Secret(secret_1_dict),
|
|
||||||
session=session,
|
|
||||||
)
|
|
||||||
secret2 = self.repo.create_from(
|
|
||||||
models.Secret(secret_2_dict),
|
|
||||||
session=session,
|
|
||||||
)
|
|
||||||
project = models.Project()
|
project = models.Project()
|
||||||
project.external_id = "my keystone id"
|
project.external_id = "my keystone id"
|
||||||
project.save(session=session)
|
project.save(session=session)
|
||||||
|
|
||||||
project_secret1 = models.ProjectSecret()
|
secret_1_dict['project_id'] = project.id
|
||||||
project_secret1.secret_id = secret1.id
|
secret1 = self.repo.create_from(
|
||||||
project_secret1.project_id = project.id
|
models.Secret(secret_1_dict),
|
||||||
project_secret1.save(session=session)
|
session=session,
|
||||||
|
)
|
||||||
project_secret2 = models.ProjectSecret()
|
secret_2_dict['project_id'] = project.id
|
||||||
project_secret2.secret_id = secret2.id
|
secret2 = self.repo.create_from(
|
||||||
project_secret2.project_id = project.id
|
models.Secret(secret_2_dict),
|
||||||
project_secret2.save(session=session)
|
session=session,
|
||||||
|
)
|
||||||
|
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
@ -137,8 +127,9 @@ class WhenTestingSecretRepository(database_utils.RepositoryTestCase):
|
|||||||
session=session,
|
session=session,
|
||||||
**query_dict
|
**query_dict
|
||||||
)
|
)
|
||||||
|
resulting_secret_ids = [s.id for s in secrets]
|
||||||
self.assertEqual([s.id for s in secrets], [secret1.id])
|
self.assertIn(secret1.id, resulting_secret_ids)
|
||||||
|
self.assertNotIn(secret2.id, resulting_secret_ids)
|
||||||
self.assertEqual(offset, 0)
|
self.assertEqual(offset, 0)
|
||||||
self.assertEqual(limit, 10)
|
self.assertEqual(limit, 10)
|
||||||
self.assertEqual(total, 1)
|
self.assertEqual(total, 1)
|
||||||
|
@ -75,10 +75,6 @@ class WhenTestingPluginResource(testtools.TestCase,
|
|||||||
self.setup_container_secret_repository_mock(
|
self.setup_container_secret_repository_mock(
|
||||||
self.container_secret_repo)
|
self.container_secret_repo)
|
||||||
|
|
||||||
self.project_secret_repo = mock.MagicMock()
|
|
||||||
self.project_secret_repo.create_from.return_value = None
|
|
||||||
self.setup_project_secret_repository_mock(self.project_secret_repo)
|
|
||||||
|
|
||||||
self.secret_meta_repo = mock.MagicMock()
|
self.secret_meta_repo = mock.MagicMock()
|
||||||
self.secret_meta_repo.create_from.return_value = None
|
self.secret_meta_repo.create_from.return_value = None
|
||||||
self.setup_secret_meta_repository_mock(self.secret_meta_repo)
|
self.setup_secret_meta_repository_mock(self.secret_meta_repo)
|
||||||
|
@ -125,7 +125,6 @@ class TestSecretStoreBase(testtools.TestCase,
|
|||||||
|
|
||||||
def init_patchers(self):
|
def init_patchers(self):
|
||||||
self._config_get_secret_repository()
|
self._config_get_secret_repository()
|
||||||
self._config_get_project_secret_repository()
|
|
||||||
self._config_get_encrypted_datum_repository()
|
self._config_get_encrypted_datum_repository()
|
||||||
self._config_get_kek_datum_repository()
|
self._config_get_kek_datum_repository()
|
||||||
|
|
||||||
@ -140,12 +139,6 @@ class TestSecretStoreBase(testtools.TestCase,
|
|||||||
self.secret_repo.create_from.return_value = self.secret_model
|
self.secret_repo.create_from.return_value = self.secret_model
|
||||||
self.setup_secret_repository_mock(self.secret_repo)
|
self.setup_secret_repository_mock(self.secret_repo)
|
||||||
|
|
||||||
def _config_get_project_secret_repository(self):
|
|
||||||
"""Mock the get_project_secret_repository() factory function."""
|
|
||||||
self.project_secret_repo = mock.MagicMock()
|
|
||||||
self.project_secret_repo.create_from.return_value = None
|
|
||||||
self.setup_project_secret_repository_mock(self.project_secret_repo)
|
|
||||||
|
|
||||||
def _config_get_encrypted_datum_repository(self):
|
def _config_get_encrypted_datum_repository(self):
|
||||||
"""Mock the get_encrypted_datum_repository() factory function."""
|
"""Mock the get_encrypted_datum_repository() factory function."""
|
||||||
self.datum_repo = mock.MagicMock()
|
self.datum_repo = mock.MagicMock()
|
||||||
@ -676,7 +669,6 @@ class WhenTestingStoreCryptoStoreSecretAndDatum(TestSecretStoreBase):
|
|||||||
|
|
||||||
# Verify the repository interactions.
|
# Verify the repository interactions.
|
||||||
self._verify_secret_repository_interactions()
|
self._verify_secret_repository_interactions()
|
||||||
self._verify_project_secret_repository_interactions()
|
|
||||||
self._verify_encrypted_datum_repository_interactions()
|
self._verify_encrypted_datum_repository_interactions()
|
||||||
|
|
||||||
def test_with_existing_secret(self):
|
def test_with_existing_secret(self):
|
||||||
@ -692,8 +684,6 @@ class WhenTestingStoreCryptoStoreSecretAndDatum(TestSecretStoreBase):
|
|||||||
# Verify **not** these repository interactions.
|
# Verify **not** these repository interactions.
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
self.secret_repo.create_from.call_count, 0)
|
self.secret_repo.create_from.call_count, 0)
|
||||||
self.assertEqual(
|
|
||||||
self.project_secret_repo.create_from.call_count, 0)
|
|
||||||
|
|
||||||
def _verify_secret_repository_interactions(self):
|
def _verify_secret_repository_interactions(self):
|
||||||
"""Verify the secret repository interactions."""
|
"""Verify the secret repository interactions."""
|
||||||
@ -703,19 +693,6 @@ class WhenTestingStoreCryptoStoreSecretAndDatum(TestSecretStoreBase):
|
|||||||
test_secret_model = args[0]
|
test_secret_model = args[0]
|
||||||
self.assertEqual(self.secret_model, test_secret_model)
|
self.assertEqual(self.secret_model, test_secret_model)
|
||||||
|
|
||||||
def _verify_project_secret_repository_interactions(self):
|
|
||||||
"""Verify the project-secret repository interactions."""
|
|
||||||
self.assertEqual(
|
|
||||||
self.project_secret_repo.create_from.call_count, 1)
|
|
||||||
args, kwargs = self.project_secret_repo.create_from.call_args
|
|
||||||
test_project_secret_model = args[0]
|
|
||||||
self.assertIsInstance(test_project_secret_model, models.ProjectSecret)
|
|
||||||
self.assertEqual(
|
|
||||||
self.context.project_model.id,
|
|
||||||
test_project_secret_model.project_id)
|
|
||||||
self.assertEqual(
|
|
||||||
models.States.ACTIVE, test_project_secret_model.status)
|
|
||||||
|
|
||||||
def _verify_encrypted_datum_repository_interactions(self):
|
def _verify_encrypted_datum_repository_interactions(self):
|
||||||
"""Verify the encrypted datum repository interactions."""
|
"""Verify the encrypted datum repository interactions."""
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
|
@ -37,7 +37,6 @@ ca_repo = repositories.get_ca_repository()
|
|||||||
preferred_ca_repo = repositories.get_preferred_ca_repository()
|
preferred_ca_repo = repositories.get_preferred_ca_repository()
|
||||||
project_repo = repositories.get_project_repository()
|
project_repo = repositories.get_project_repository()
|
||||||
order_repo = repositories.get_order_repository()
|
order_repo = repositories.get_order_repository()
|
||||||
project_secret_repo = repositories.get_project_secret_repository()
|
|
||||||
|
|
||||||
|
|
||||||
class WhenPerformingPrivateOperations(utils.BaseTestCase,
|
class WhenPerformingPrivateOperations(utils.BaseTestCase,
|
||||||
@ -167,30 +166,23 @@ class BaseCertificateRequestsTestCase(utils.BaseTestCase):
|
|||||||
# data for stored key cases
|
# data for stored key cases
|
||||||
self.private_key = models.Secret()
|
self.private_key = models.Secret()
|
||||||
self.private_key.secret_type = 'PRIVATE'
|
self.private_key.secret_type = 'PRIVATE'
|
||||||
|
self.private_key.project_id = self.project.id
|
||||||
secret_repo.create_from(self.private_key)
|
secret_repo.create_from(self.private_key)
|
||||||
|
|
||||||
ps = models.ProjectSecret()
|
|
||||||
ps.project_id = self.project.id
|
|
||||||
ps.secret_id = self.private_key.id
|
|
||||||
project_secret_repo.save(ps)
|
|
||||||
|
|
||||||
self.public_key = models.Secret()
|
self.public_key = models.Secret()
|
||||||
self.public_key.secret_type = 'PUBLIC'
|
self.public_key.secret_type = 'PUBLIC'
|
||||||
|
self.public_key.project_id = self.project.id
|
||||||
secret_repo.create_from(self.public_key)
|
secret_repo.create_from(self.public_key)
|
||||||
|
|
||||||
self.passphrase = models.Secret()
|
self.passphrase = models.Secret()
|
||||||
self.passphrase.secret_type = 'PASSPHRASE'
|
self.passphrase.secret_type = 'PASSPHRASE'
|
||||||
|
self.passphrase.project_id = self.project.id
|
||||||
secret_repo.create_from(self.passphrase)
|
secret_repo.create_from(self.passphrase)
|
||||||
|
|
||||||
self.private_key_value = None
|
self.private_key_value = None
|
||||||
self.public_key_value = "public_key"
|
self.public_key_value = "public_key"
|
||||||
self.passphrase_value = None
|
self.passphrase_value = None
|
||||||
|
|
||||||
ps = models.ProjectSecret()
|
|
||||||
ps.project_id = self.project.id
|
|
||||||
ps.secret_id = self.passphrase.id
|
|
||||||
project_secret_repo.save(ps)
|
|
||||||
|
|
||||||
self.parsed_container_with_passphrase = {
|
self.parsed_container_with_passphrase = {
|
||||||
'name': 'container name',
|
'name': 'container name',
|
||||||
'type': 'rsa',
|
'type': 'rsa',
|
||||||
|
@ -72,7 +72,6 @@ class WhenUsingKeystoneEventConsumer(
|
|||||||
super(WhenUsingKeystoneEventConsumer, self).setUp()
|
super(WhenUsingKeystoneEventConsumer, self).setUp()
|
||||||
self.kek_repo = rep.get_kek_datum_repository()
|
self.kek_repo = rep.get_kek_datum_repository()
|
||||||
self.project_repo = rep.get_project_repository()
|
self.project_repo = rep.get_project_repository()
|
||||||
self.project_secret_repo = rep.get_project_secret_repository()
|
|
||||||
self.secret_meta_repo = rep.get_secret_meta_repository()
|
self.secret_meta_repo = rep.get_secret_meta_repository()
|
||||||
self.secret_repo = rep.get_secret_repository()
|
self.secret_repo = rep.get_secret_repository()
|
||||||
self.transport_key_repo = rep.get_transport_key_repository()
|
self.transport_key_repo = rep.get_transport_key_repository()
|
||||||
@ -89,10 +88,6 @@ class WhenUsingKeystoneEventConsumer(
|
|||||||
self.assertEqual(1, len(db_secrets))
|
self.assertEqual(1, len(db_secrets))
|
||||||
self.assertEqual(secret.id, db_secrets[0].id)
|
self.assertEqual(secret.id, db_secrets[0].id)
|
||||||
|
|
||||||
db_project_secret = (
|
|
||||||
self.project_secret_repo.get_project_entities(project2_id))
|
|
||||||
self.assertEqual(1, len(db_project_secret))
|
|
||||||
|
|
||||||
db_kek = self.kek_repo.get_project_entities(project2_id)
|
db_kek = self.kek_repo.get_project_entities(project2_id)
|
||||||
self.assertEqual(1, len(db_kek))
|
self.assertEqual(1, len(db_kek))
|
||||||
|
|
||||||
@ -245,11 +240,6 @@ class WhenUsingKeystoneEventConsumerProcessMethod(
|
|||||||
entity_id=secret_metadata_id)
|
entity_id=secret_metadata_id)
|
||||||
self.assertIsNotNone(db_secret_store_meta)
|
self.assertIsNotNone(db_secret_store_meta)
|
||||||
|
|
||||||
project_secret_repo = rep.get_project_secret_repository()
|
|
||||||
db_project_secret = project_secret_repo.get_project_entities(
|
|
||||||
project1_id)
|
|
||||||
self.assertEqual(1, len(db_project_secret))
|
|
||||||
|
|
||||||
kek_repo = rep.get_kek_datum_repository()
|
kek_repo = rep.get_kek_datum_repository()
|
||||||
db_kek = kek_repo.get_project_entities(project1_id)
|
db_kek = kek_repo.get_project_entities(project1_id)
|
||||||
self.assertEqual(1, len(db_kek))
|
self.assertEqual(1, len(db_kek))
|
||||||
@ -272,11 +262,6 @@ class WhenUsingKeystoneEventConsumerProcessMethod(
|
|||||||
external_project_id=self.project_id1)
|
external_project_id=self.project_id1)
|
||||||
self.assertIn(secret_id, str(ex))
|
self.assertIn(secret_id, str(ex))
|
||||||
|
|
||||||
# After project entities delete, make sure project_secret is not found
|
|
||||||
entities = project_secret_repo.get_project_entities(
|
|
||||||
project1_id)
|
|
||||||
self.assertEqual(0, len(entities))
|
|
||||||
|
|
||||||
# After project entities delete, make sure kek data is not found
|
# After project entities delete, make sure kek data is not found
|
||||||
entities = kek_repo.get_project_entities(project1_id)
|
entities = kek_repo.get_project_entities(project1_id)
|
||||||
self.assertEqual(0, len(entities))
|
self.assertEqual(0, len(entities))
|
||||||
@ -308,11 +293,6 @@ class WhenUsingKeystoneEventConsumerProcessMethod(
|
|||||||
self.assertEqual(1, len(db_secrets))
|
self.assertEqual(1, len(db_secrets))
|
||||||
self.assertEqual(secret.id, db_secrets[0].id)
|
self.assertEqual(secret.id, db_secrets[0].id)
|
||||||
|
|
||||||
project_secret_repo = rep.get_project_secret_repository()
|
|
||||||
db_project_secret = project_secret_repo.get_project_entities(
|
|
||||||
project1_id)
|
|
||||||
self.assertEqual(1, len(db_project_secret))
|
|
||||||
|
|
||||||
kek_repo = rep.get_kek_datum_repository()
|
kek_repo = rep.get_kek_datum_repository()
|
||||||
db_kek = kek_repo.get_project_entities(project1_id)
|
db_kek = kek_repo.get_project_entities(project1_id)
|
||||||
self.assertEqual(1, len(db_kek))
|
self.assertEqual(1, len(db_kek))
|
||||||
@ -346,10 +326,6 @@ class WhenUsingKeystoneEventConsumerProcessMethod(
|
|||||||
self.assertEqual(1, len(db_secrets))
|
self.assertEqual(1, len(db_secrets))
|
||||||
self.assertEqual(secret_id, db_secrets[0].id)
|
self.assertEqual(secret_id, db_secrets[0].id)
|
||||||
|
|
||||||
db_project_secret = project_secret_repo.get_project_entities(
|
|
||||||
project1_id)
|
|
||||||
self.assertEqual(1, len(db_project_secret))
|
|
||||||
|
|
||||||
db_kek = kek_repo.get_project_entities(project1_id)
|
db_kek = kek_repo.get_project_entities(project1_id)
|
||||||
self.assertEqual(1, len(db_kek))
|
self.assertEqual(1, len(db_kek))
|
||||||
|
|
||||||
|
@ -67,10 +67,6 @@ class BaseOrderTestCase(utils.BaseTestCase, utils.MockModelRepositoryMixin):
|
|||||||
self.secret_repo.create_from.return_value = None
|
self.secret_repo.create_from.return_value = None
|
||||||
self.setup_secret_repository_mock(self.secret_repo)
|
self.setup_secret_repository_mock(self.secret_repo)
|
||||||
|
|
||||||
self.project_secret_repo = mock.MagicMock()
|
|
||||||
self.project_secret_repo.create_from.return_value = None
|
|
||||||
self.setup_project_secret_repository_mock(self.project_secret_repo)
|
|
||||||
|
|
||||||
self.datum_repo = mock.MagicMock()
|
self.datum_repo = mock.MagicMock()
|
||||||
self.datum_repo.create_from.return_value = None
|
self.datum_repo.create_from.return_value = None
|
||||||
self.setup_encrypted_datum_repository_mock(self.datum_repo)
|
self.setup_encrypted_datum_repository_mock(self.datum_repo)
|
||||||
|
@ -213,19 +213,6 @@ class MockModelRepositoryMixin(object):
|
|||||||
mock_repo_obj=mock_project_repo,
|
mock_repo_obj=mock_project_repo,
|
||||||
patcher_obj=self.mock_project_repo_patcher)
|
patcher_obj=self.mock_project_repo_patcher)
|
||||||
|
|
||||||
def setup_project_secret_repository_mock(
|
|
||||||
self, mock_project_secret_repo=mock.MagicMock()):
|
|
||||||
"""Mocks the project-secret repository factory function
|
|
||||||
|
|
||||||
:param mock_project_secret_repo: The pre-configured mock project-secret
|
|
||||||
repo to be returned.
|
|
||||||
"""
|
|
||||||
self.mock_project_secret_repo_patcher = None
|
|
||||||
self._setup_repository_mock(
|
|
||||||
repo_factory='get_project_secret_repository',
|
|
||||||
mock_repo_obj=mock_project_secret_repo,
|
|
||||||
patcher_obj=self.mock_project_secret_repo_patcher)
|
|
||||||
|
|
||||||
def setup_secret_meta_repository_mock(
|
def setup_secret_meta_repository_mock(
|
||||||
self, mock_secret_meta_repo=mock.MagicMock()):
|
self, mock_secret_meta_repo=mock.MagicMock()):
|
||||||
"""Mocks the secret-meta repository factory function
|
"""Mocks the secret-meta repository factory function
|
||||||
|
Loading…
x
Reference in New Issue
Block a user