Code clean-up due to type order enhancement
Removed code related old Order. Cleaned redundant fields from Order model. Also cleaned the API, no more support for old style orders. - Fixed broken functional test - Fixed alembic version conflict due to CR 122498 Closes-Bug: 1335171 Change-Id: I33fe7a75568e0108c623e8f6f786fb9e9b888d36
This commit is contained in:
1 parent
bef3b9e21f
commit
76191025d6
14 files changed
+92
-642
No files matched your search
@@ -160,7 +160,6 @@ class OrdersController(object):
|
||||
self.tenant_repo = tenant_repo or repo.TenantRepo()
|
||||
self.order_repo = order_repo or repo.OrderRepo()
|
||||
self.queue = queue_resource or async_client.TaskClient()
|
||||
self.validator = validators.NewOrderValidator()
|
||||
self.type_order_validator = validators.TypeOrderValidator()
|
||||
|
||||
@pecan.expose()
|
||||
@@ -208,61 +207,19 @@ class OrdersController(object):
|
||||
|
||||
tenant = res.get_or_create_tenant(keystone_id, self.tenant_repo)
|
||||
|
||||
# Note(atiwari): trying to preserve backward compatibility
|
||||
# This will be removed as part of bug1335171
|
||||
raw_body = pecan.request.body
|
||||
order_type = None
|
||||
if raw_body:
|
||||
order_type = json.loads(raw_body).get('type')
|
||||
|
||||
if order_type:
|
||||
body = api.load_body(pecan.request,
|
||||
validator=self.type_order_validator)
|
||||
LOG.debug('Processing order type %s', order_type)
|
||||
new_order = models.Order()
|
||||
new_order.meta = body.get('meta')
|
||||
new_order.type = order_type
|
||||
|
||||
# TODO(john-wood-w) These are required attributes currently, but
|
||||
# will eventually be removed once we drop the legacy orders
|
||||
# request.
|
||||
new_order.secret_name = 'N/A'
|
||||
new_order.secret_algorithm = 'N/A'
|
||||
new_order.secret_bit_length = 0
|
||||
new_order.secret_mode = 'N/A'
|
||||
new_order.secret_payload_content_type = 'N/A'
|
||||
else:
|
||||
body = api.load_body(pecan.request, validator=self.validator)
|
||||
LOG.debug('Start on_post...%s', body)
|
||||
|
||||
if 'secret' not in body:
|
||||
_secret_not_in_order()
|
||||
secret_info = body['secret']
|
||||
name = secret_info.get('name')
|
||||
LOG.debug('Secret to create is %s', name)
|
||||
|
||||
new_order = models.Order()
|
||||
new_order.secret_name = secret_info.get('name')
|
||||
new_order.secret_algorithm = secret_info.get('algorithm')
|
||||
new_order.secret_bit_length = secret_info.get('bit_length', 0)
|
||||
new_order.secret_mode = secret_info.get('mode')
|
||||
new_order.secret_payload_content_type = secret_info.get(
|
||||
'payload_content_type')
|
||||
|
||||
new_order.secret_expiration = secret_info.get('expiration')
|
||||
body = api.load_body(pecan.request,
|
||||
validator=self.type_order_validator)
|
||||
order_type = body.get('type')
|
||||
LOG.debug('Processing order type %s', order_type)
|
||||
new_order = models.Order()
|
||||
new_order.meta = body.get('meta')
|
||||
new_order.type = order_type
|
||||
|
||||
new_order.tenant_id = tenant.id
|
||||
self.order_repo.create_from(new_order)
|
||||
|
||||
# Send to workers to process.
|
||||
# TODO(atiwari) - bug 1335171
|
||||
if order_type:
|
||||
self.queue.process_type_order(order_id=new_order.id,
|
||||
keystone_id=keystone_id)
|
||||
else:
|
||||
self.queue.process_order(order_id=new_order.id,
|
||||
keystone_id=keystone_id)
|
||||
|
||||
self.queue.process_type_order(order_id=new_order.id,
|
||||
keystone_id=keystone_id)
|
||||
pecan.response.status = 202
|
||||
pecan.response.headers['Location'] = '/{0}/orders/{1}'.format(
|
||||
keystone_id, new_order.id
|
||||
|
||||
@@ -387,51 +387,6 @@ class TypeOrderValidator(ValidatorBase):
|
||||
.format(order_type))
|
||||
|
||||
|
||||
# TODO(atiwari) - Remove this Validator for bug 1335171
|
||||
class NewOrderValidator(ValidatorBase):
|
||||
"""Validate a new order."""
|
||||
|
||||
def __init__(self):
|
||||
self.name = 'Order'
|
||||
self.schema = {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
},
|
||||
}
|
||||
self.secret_validator = NewSecretValidator()
|
||||
|
||||
def validate(self, json_data, parent_schema=None):
|
||||
schema_name = self._full_name(parent_schema)
|
||||
|
||||
self._assert_schema_is_valid(json_data, schema_name)
|
||||
|
||||
secret = json_data.get('secret')
|
||||
self._assert_validity(secret is not None,
|
||||
schema_name,
|
||||
u._("'secret' attributes are required"),
|
||||
"secret")
|
||||
|
||||
# If secret group is provided, validate it now.
|
||||
self.secret_validator.validate(secret, parent_schema=self.name)
|
||||
self._assert_validity('payload' not in secret,
|
||||
schema_name,
|
||||
u._("'payload' not allowed for secret "
|
||||
"generation"),
|
||||
"secret")
|
||||
|
||||
# Validation secret generation related fields.
|
||||
# TODO(jfwood): Invoke the crypto plugin for this purpose
|
||||
|
||||
if secret.get('payload_content_type') != 'application/octet-stream':
|
||||
raise exception.UnsupportedField(field='payload_content_type',
|
||||
schema=schema_name,
|
||||
reason=u._("Only 'application/oc "
|
||||
"tet-stream' "
|
||||
"supported"))
|
||||
|
||||
return json_data
|
||||
|
||||
|
||||
class ContainerConsumerValidator(ValidatorBase):
|
||||
"""Validate a Consumer."""
|
||||
|
||||
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
"""removing redundant fields from order
|
||||
|
||||
Revision ID: 254495565185
|
||||
Revises: 2843d6469f25
|
||||
Create Date: 2014-09-16 12:09:23.716390
|
||||
|
||||
"""
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '254495565185'
|
||||
down_revision = '2843d6469f25'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy.dialects import mysql
|
||||
|
||||
def upgrade():
|
||||
### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_column('orders', 'secret_mode')
|
||||
op.drop_column('orders', 'secret_algorithm')
|
||||
op.drop_column('orders', 'secret_bit_length')
|
||||
op.drop_column('orders', 'secret_expiration')
|
||||
op.drop_column('orders', 'secret_payload_content_type')
|
||||
op.drop_column('orders', 'secret_name')
|
||||
### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade():
|
||||
### commands auto generated by Alembic - please adjust! ###
|
||||
op.add_column('orders', sa.Column('secret_name', mysql.VARCHAR(length=255), nullable=True))
|
||||
op.add_column('orders', sa.Column('secret_payload_content_type', mysql.VARCHAR(length=255), nullable=False))
|
||||
op.add_column('orders', sa.Column('secret_expiration', mysql.DATETIME(), nullable=True))
|
||||
op.add_column('orders', sa.Column('secret_bit_length', mysql.INTEGER(display_width=11), autoincrement=False, nullable=True))
|
||||
op.add_column('orders', sa.Column('secret_algorithm', mysql.VARCHAR(length=255), nullable=True))
|
||||
op.add_column('orders', sa.Column('secret_mode', mysql.VARCHAR(length=255), nullable=True))
|
||||
### end Alembic commands ###
|
||||
@@ -457,12 +457,6 @@ class Order(BASE, ModelBase):
|
||||
error_status_code = sa.Column(sa.String(16))
|
||||
error_reason = sa.Column(sa.String(255))
|
||||
|
||||
secret_name = sa.Column(sa.String(255))
|
||||
secret_algorithm = sa.Column(sa.String(255))
|
||||
secret_bit_length = sa.Column(sa.Integer)
|
||||
secret_mode = sa.Column(sa.String(255))
|
||||
secret_payload_content_type = sa.Column(sa.String(255), nullable=False)
|
||||
secret_expiration = sa.Column(sa.DateTime, default=None)
|
||||
meta = sa.Column(JsonBlob(), nullable=True)
|
||||
|
||||
secret_id = sa.Column(sa.String(36), sa.ForeignKey('secrets.id'),
|
||||
@@ -496,28 +490,11 @@ class Order(BASE, ModelBase):
|
||||
|
||||
def _do_extra_dict_fields(self):
|
||||
"""Sub-class hook method: return dict of fields."""
|
||||
if not self.meta:
|
||||
if self.secret_expiration:
|
||||
expiration = self.secret_expiration.isoformat()
|
||||
else:
|
||||
expiration = self.secret_expiration
|
||||
ret = {
|
||||
'secret': {
|
||||
'name': self.secret_name or self.secret_id,
|
||||
'algorithm': self.secret_algorithm,
|
||||
'bit_length': self.secret_bit_length,
|
||||
'mode': self.secret_mode,
|
||||
'expiration': expiration,
|
||||
'payload_content_type': self.secret_payload_content_type
|
||||
},
|
||||
'order_id': self.id
|
||||
}
|
||||
else:
|
||||
ret = {
|
||||
'type': self.type,
|
||||
'meta': self.meta,
|
||||
'order_id': self.id
|
||||
}
|
||||
ret = {
|
||||
'type': self.type,
|
||||
'meta': self.meta,
|
||||
'order_id': self.id
|
||||
}
|
||||
if self.secret_id:
|
||||
ret['secret_id'] = self.secret_id
|
||||
if self.container_id:
|
||||
|
||||
@@ -37,12 +37,6 @@ class TaskClient(object):
|
||||
# standalone single-node mode for Barbican.
|
||||
self._client = queue.get_client() or _DirectTaskInvokerClient()
|
||||
|
||||
def process_order(self, order_id, keystone_id):
|
||||
"""Process Order."""
|
||||
|
||||
self._cast('process_order', order_id=order_id,
|
||||
keystone_id=keystone_id)
|
||||
|
||||
def process_type_order(self, order_id, keystone_id):
|
||||
"""Process TypeOrder."""
|
||||
|
||||
|
||||
@@ -40,15 +40,6 @@ class Tasks(object):
|
||||
server utilizing Oslo messaging's RPC server. This RPC server can invoke
|
||||
methods on itself, which include the methods in this class.
|
||||
"""
|
||||
def process_order(self, context, order_id, keystone_id):
|
||||
"""Process Order."""
|
||||
LOG.debug('Order id is %s', order_id)
|
||||
task = resources.BeginOrder()
|
||||
try:
|
||||
task.process(order_id, keystone_id)
|
||||
except Exception:
|
||||
LOG.exception(">>>>> Task exception seen, details reported "
|
||||
"on the Orders entity.")
|
||||
|
||||
def process_type_order(self, context, order_id, keystone_id):
|
||||
"""Process TypeOrder."""
|
||||
|
||||
@@ -142,72 +142,6 @@ class BaseTask(object):
|
||||
"""
|
||||
|
||||
|
||||
class BeginOrder(BaseTask):
|
||||
"""Handles beginning processing an Order."""
|
||||
|
||||
def get_name(self):
|
||||
return u._('Create Secret')
|
||||
|
||||
def __init__(self, tenant_repo=None, order_repo=None,
|
||||
secret_repo=None, tenant_secret_repo=None,
|
||||
datum_repo=None, kek_repo=None, secret_meta_repo=None):
|
||||
LOG.debug('Creating BeginOrder task processor')
|
||||
self.repos = rep.Repositories(tenant_repo=tenant_repo,
|
||||
tenant_secret_repo=tenant_secret_repo,
|
||||
secret_repo=secret_repo,
|
||||
datum_repo=datum_repo,
|
||||
kek_repo=kek_repo,
|
||||
secret_meta_repo=secret_meta_repo,
|
||||
order_repo=order_repo)
|
||||
|
||||
def retrieve_entity(self, order_id, keystone_id):
|
||||
return self.repos.order_repo.get(entity_id=order_id,
|
||||
keystone_id=keystone_id)
|
||||
|
||||
def handle_processing(self, order, *args, **kwargs):
|
||||
self.handle_order(order)
|
||||
|
||||
def handle_error(self, order, status, message, exception,
|
||||
*args, **kwargs):
|
||||
order.status = models.States.ERROR
|
||||
order.error_status_code = status
|
||||
order.error_reason = message
|
||||
self.repos.order_repo.save(order)
|
||||
|
||||
def handle_success(self, order, *args, **kwargs):
|
||||
order.status = models.States.ACTIVE
|
||||
self.repos.order_repo.save(order)
|
||||
|
||||
def handle_order(self, order):
|
||||
"""Handle secret creation.
|
||||
|
||||
Either creates a secret item here, or else begins the extended
|
||||
process of creating a secret (such as for SSL certificate
|
||||
generation.
|
||||
|
||||
:param order: Order to process on behalf of.
|
||||
:return SUCCESS_STATUS, PENDING_STATUS
|
||||
"""
|
||||
order_info = order.to_dict_fields()
|
||||
secret_info = order_info['secret']
|
||||
|
||||
# Retrieve the tenant.
|
||||
tenant = self.repos.tenant_repo.get(order.tenant_id)
|
||||
|
||||
# Create Secret
|
||||
new_secret = plugin.generate_secret(
|
||||
secret_info,
|
||||
secret_info.get('payload_content_type',
|
||||
'application/octet-stream'),
|
||||
tenant,
|
||||
self.repos
|
||||
)
|
||||
|
||||
order.secret_id = new_secret.id
|
||||
|
||||
LOG.debug("...done creating order's secret.")
|
||||
|
||||
|
||||
class BeginTypeOrder(BaseTask):
|
||||
"""Handles beginning processing of a TypeOrder."""
|
||||
|
||||
|
||||
@@ -73,21 +73,6 @@ def create_secret(id_ref="id", name="name",
|
||||
return secret
|
||||
|
||||
|
||||
def create_order(id_ref="id",
|
||||
name="name",
|
||||
algorithm=None,
|
||||
bit_length=None,
|
||||
mode=None):
|
||||
"""Generate an Order entity instance."""
|
||||
order = models.Order()
|
||||
order.id = id_ref
|
||||
order.secret_name = name
|
||||
order.secret_algorithm = algorithm
|
||||
order.secret_bit_length = bit_length
|
||||
order.secret_mode = mode
|
||||
return order
|
||||
|
||||
|
||||
def create_order_with_meta(id_ref="id", order_type="certificate", meta={},
|
||||
status='PENDING'):
|
||||
"""Generate an Order entity instance with Metadata."""
|
||||
@@ -1483,15 +1468,16 @@ class WhenCreatingOrdersUsingOrdersResource(FunctionalTest):
|
||||
self.queue_resource = mock.MagicMock()
|
||||
self.queue_resource.process_order.return_value = None
|
||||
|
||||
self.key_order_req = {
|
||||
'secret': {
|
||||
'name': self.secret_name,
|
||||
'payload_content_type': self.secret_payload_content_type,
|
||||
'algorithm': self.secret_algorithm,
|
||||
'bit_length': self.secret_bit_length,
|
||||
'mode': self.secret_mode
|
||||
}
|
||||
}
|
||||
self.type = 'key'
|
||||
self.meta = {"name": "secretname",
|
||||
"algorithm": "AES",
|
||||
"bit_length": 256,
|
||||
"mode": "cbc",
|
||||
'payload_content_type':
|
||||
'application/octet-stream'}
|
||||
|
||||
self.key_order_req = {'type': self.type,
|
||||
'meta': self.meta}
|
||||
|
||||
def test_should_add_new_order(self):
|
||||
resp = self.app.post_json(
|
||||
@@ -1500,7 +1486,7 @@ class WhenCreatingOrdersUsingOrdersResource(FunctionalTest):
|
||||
)
|
||||
self.assertEqual(resp.status_int, 202)
|
||||
|
||||
self.queue_resource.process_order.assert_called_once_with(
|
||||
self.queue_resource.process_type_order.assert_called_once_with(
|
||||
order_id=None, keystone_id=self.tenant_keystone_id)
|
||||
|
||||
args, kwargs = self.order_repo.create_from.call_args
|
||||
@@ -1512,7 +1498,8 @@ class WhenCreatingOrdersUsingOrdersResource(FunctionalTest):
|
||||
|
||||
# Using unsupported algorithm field for this test
|
||||
self.unsupported_req = {
|
||||
'secret': {
|
||||
'type': 'key',
|
||||
'meta': {
|
||||
'name': self.secret_name,
|
||||
'payload_content_type': self.secret_payload_content_type,
|
||||
'algorithm': "not supported",
|
||||
@@ -1587,12 +1574,14 @@ class WhenGettingOrdersListUsingOrdersResource(FunctionalTest):
|
||||
self.offset = 2
|
||||
self.limit = 2
|
||||
|
||||
order_params = {'name': self.name,
|
||||
'algorithm': self.secret_algorithm,
|
||||
'bit_length': self.secret_bit_length,
|
||||
'mode': self.secret_mode}
|
||||
order_meta = {'name': self.name,
|
||||
'algorithm': self.secret_algorithm,
|
||||
'bit_length': self.secret_bit_length,
|
||||
'mode': self.secret_mode}
|
||||
|
||||
self.orders = [create_order(id_ref='id' + str(id), **order_params) for
|
||||
self.orders = [create_order_with_meta(id_ref='id' + str(id),
|
||||
order_type='key',
|
||||
meta=order_meta) for
|
||||
id in xrange(self.num_orders)]
|
||||
self.total = len(self.orders)
|
||||
self.order_repo = mock.MagicMock()
|
||||
@@ -1689,7 +1678,9 @@ class WhenGettingOrDeletingOrderUsingOrderResource(FunctionalTest):
|
||||
self.tenant_keystone_id = 'keystoneid1234'
|
||||
self.requestor = 'requestor1234'
|
||||
|
||||
self.order = create_order(id_ref="id1", name="name")
|
||||
self.order = create_order_with_meta(id_ref="id1",
|
||||
order_type='key',
|
||||
meta='{"name":"just_test"}')
|
||||
|
||||
self.order_repo = mock.MagicMock()
|
||||
self.order_repo.get.return_value = self.order
|
||||
|
||||
@@ -310,229 +310,6 @@ class WhenTestingSecretValidator(utils.BaseTestCase):
|
||||
self.validator.validate(self.secret_req)
|
||||
|
||||
|
||||
class WhenTestingOrderValidator(utils.BaseTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(WhenTestingOrderValidator, self).setUp()
|
||||
|
||||
self.name = 'name'
|
||||
self.secret_algorithm = 'aes'
|
||||
self.secret_bit_length = 128
|
||||
self.secret_mode = 'cbc'
|
||||
self.secret_payload_content_type = 'application/octet-stream'
|
||||
|
||||
self.secret_req = {'name': self.name,
|
||||
'algorithm': self.secret_algorithm,
|
||||
'bit_length': self.secret_bit_length,
|
||||
'mode': self.secret_mode,
|
||||
'payload_content_type':
|
||||
self.secret_payload_content_type}
|
||||
self.key_order_req = {'secret': self.secret_req}
|
||||
|
||||
self.validator = validators.NewOrderValidator()
|
||||
|
||||
def test_should_validate_all_fields(self):
|
||||
self.validator.validate(self.key_order_req)
|
||||
|
||||
def test_should_validate_no_name(self):
|
||||
del self.secret_req['name']
|
||||
result = self.validator.validate(self.key_order_req)
|
||||
|
||||
self.assertTrue('secret' in result)
|
||||
|
||||
def test_should_validate_empty_name(self):
|
||||
self.secret_req['name'] = ' '
|
||||
result = self.validator.validate(self.key_order_req)
|
||||
|
||||
self.assertTrue('secret' in result)
|
||||
|
||||
def test_should_validate_future_expiration(self):
|
||||
self.secret_req['expiration'] = '2114-02-28T19:14:44.180394'
|
||||
result = self.validator.validate(self.key_order_req)
|
||||
|
||||
self.assertTrue('secret' in result)
|
||||
result = result['secret']
|
||||
self.assertTrue('expiration' in result)
|
||||
self.assertTrue(isinstance(result['expiration'], datetime.datetime))
|
||||
|
||||
def test_should_validate_empty_expiration(self):
|
||||
self.secret_req['expiration'] = ' '
|
||||
result = self.validator.validate(self.key_order_req)
|
||||
|
||||
self.assertTrue('secret' in result)
|
||||
result = result['secret']
|
||||
self.assertTrue('expiration' in result)
|
||||
self.assertTrue(not result['expiration'])
|
||||
|
||||
def test_should_allow_bad_mode(self):
|
||||
# TODO(john-wood-w) Allow until plugin validation is added.
|
||||
self.secret_req['mode'] = 'badmode'
|
||||
|
||||
result = self.validator.validate(self.key_order_req)
|
||||
|
||||
self.assertTrue('secret' in result)
|
||||
|
||||
def test_should_allow_non_multiple_eight_bit_length(self):
|
||||
# TODO(john-wood-w) Allow until plugin validation is added.
|
||||
self.secret_req['bit_length'] = 129
|
||||
|
||||
result = self.validator.validate(self.key_order_req)
|
||||
|
||||
self.assertTrue('secret' in result)
|
||||
|
||||
def test_should_allow_empty_mode(self):
|
||||
# TODO(john-wood-w) Allow until plugin validation is added.
|
||||
del self.secret_req['mode']
|
||||
|
||||
result = self.validator.validate(self.key_order_req)
|
||||
|
||||
self.assertTrue('secret' in result)
|
||||
|
||||
def test_should_allow_empty_algorithm(self):
|
||||
# TODO(john-wood-w) Allow until plugin validation is added.
|
||||
del self.secret_req['algorithm']
|
||||
|
||||
result = self.validator.validate(self.key_order_req)
|
||||
|
||||
self.assertTrue('secret' in result)
|
||||
|
||||
def test_should_raise_numeric_name(self):
|
||||
self.secret_req['name'] = 123
|
||||
|
||||
exception = self.assertRaises(
|
||||
excep.InvalidObject,
|
||||
self.validator.validate,
|
||||
self.key_order_req,
|
||||
)
|
||||
|
||||
self.assertEqual('name', exception.invalid_property)
|
||||
|
||||
def test_should_raise_negative_bit_length(self):
|
||||
self.secret_req['bit_length'] = -23
|
||||
|
||||
exception = self.assertRaises(
|
||||
excep.InvalidObject,
|
||||
self.validator.validate,
|
||||
self.key_order_req,
|
||||
)
|
||||
|
||||
self.assertEqual('bit_length', exception.invalid_property)
|
||||
|
||||
def test_should_raise_non_integer_bit_length(self):
|
||||
self.secret_req['bit_length'] = "23"
|
||||
|
||||
exception = self.assertRaises(
|
||||
excep.InvalidObject,
|
||||
self.validator.validate,
|
||||
self.key_order_req,
|
||||
)
|
||||
|
||||
self.assertEqual('bit_length', exception.invalid_property)
|
||||
|
||||
def test_should_raise_secret_not_order_schema_provided(self):
|
||||
exception = self.assertRaises(
|
||||
excep.InvalidObject,
|
||||
self.validator.validate,
|
||||
self.secret_req,
|
||||
)
|
||||
|
||||
self.assertEqual('secret', exception.invalid_property)
|
||||
|
||||
def test_should_raise_payload_provided(self):
|
||||
self.secret_req['payload'] = ' '
|
||||
|
||||
exception = self.assertRaises(
|
||||
excep.InvalidObject,
|
||||
self.validator.validate,
|
||||
self.key_order_req,
|
||||
)
|
||||
|
||||
self.assertTrue('payload' in exception.invalid_property)
|
||||
|
||||
def test_should_raise_already_expired(self):
|
||||
self.secret_req['expiration'] = '2004-02-28T19:14:44.180394'
|
||||
|
||||
exception = self.assertRaises(
|
||||
excep.InvalidObject,
|
||||
self.validator.validate,
|
||||
self.key_order_req,
|
||||
)
|
||||
|
||||
self.assertEqual('expiration', exception.invalid_property)
|
||||
|
||||
def test_should_raise_expiration_nonsense(self):
|
||||
self.secret_req['expiration'] = 'nonsense'
|
||||
|
||||
exception = self.assertRaises(
|
||||
excep.InvalidObject,
|
||||
self.validator.validate,
|
||||
self.key_order_req,
|
||||
)
|
||||
|
||||
self.assertEqual('expiration', exception.invalid_property)
|
||||
|
||||
def test_should_raise_all_nulls(self):
|
||||
self.secret_req = {'name': None,
|
||||
'algorithm': None,
|
||||
'bit_length': None,
|
||||
'mode': None}
|
||||
self.key_order_req = {'secret': self.secret_req}
|
||||
|
||||
self.assertRaises(
|
||||
excep.InvalidObject,
|
||||
self.validator.validate,
|
||||
self.key_order_req,
|
||||
)
|
||||
|
||||
def test_should_raise_all_empties(self):
|
||||
self.secret_req = {'name': '',
|
||||
'algorithm': '',
|
||||
'bit_length': '',
|
||||
'mode': ''}
|
||||
self.key_order_req = {'secret': self.secret_req}
|
||||
|
||||
self.assertRaises(
|
||||
excep.InvalidObject,
|
||||
self.validator.validate,
|
||||
self.key_order_req,
|
||||
)
|
||||
|
||||
def test_should_raise_no_payload_content_type(self):
|
||||
del self.secret_req['payload_content_type']
|
||||
|
||||
self.assertRaises(
|
||||
excep.UnsupportedField,
|
||||
self.validator.validate,
|
||||
self.key_order_req,
|
||||
)
|
||||
|
||||
def test_should_raise_unsupported_payload_content_type(self):
|
||||
self.secret_req['payload_content_type'] = 'text/plain'
|
||||
|
||||
self.assertRaises(
|
||||
excep.UnsupportedField,
|
||||
self.validator.validate,
|
||||
self.key_order_req,
|
||||
)
|
||||
|
||||
def test_should_raise_invalid_json_data_type(self):
|
||||
self.assertRaises(
|
||||
excep.InvalidObject,
|
||||
self.validator.validate,
|
||||
[],
|
||||
)
|
||||
|
||||
def test_should_raise_payload_in_secret(self):
|
||||
self.key_order_req['secret']['payload'] = "YWJjZGVmZw=="
|
||||
self.key_order_req['secret']['payload_content_encoding'] = 'base64'
|
||||
|
||||
self.assertRaises(
|
||||
excep.InvalidObject,
|
||||
self.validator.validate,
|
||||
self.key_order_req
|
||||
)
|
||||
|
||||
|
||||
class WhenTestingContainerValidator(utils.BaseTestCase):
|
||||
|
||||
def setUp(self):
|
||||
|
||||
@@ -32,11 +32,11 @@ class WhenUsingAsyncTaskClient(utils.BaseTestCase):
|
||||
|
||||
self.client = client.TaskClient()
|
||||
|
||||
def test_should_process_order(self):
|
||||
self.client.process_order(order_id=self.order_id,
|
||||
keystone_id=self.keystone_id)
|
||||
def test_should_process_type_order(self):
|
||||
self.client.process_type_order(order_id=self.order_id,
|
||||
keystone_id=self.keystone_id)
|
||||
queue.get_client.assert_called_with()
|
||||
self.mock_client.cast.assert_called_with({}, 'process_order',
|
||||
self.mock_client.cast.assert_called_with({}, 'process_type_order',
|
||||
order_id=self.order_id,
|
||||
keystone_id=self.keystone_id)
|
||||
|
||||
|
||||
@@ -19,20 +19,20 @@ from barbican.queue import server
|
||||
from barbican.tests import utils
|
||||
|
||||
|
||||
class WhenUsingBeginOrderTask(utils.BaseTestCase):
|
||||
"""Test using the Tasks class for 'order' task."""
|
||||
class WhenUsingBeginTypeOrderTask(utils.BaseTestCase):
|
||||
"""Test using the Tasks class for 'type order' task."""
|
||||
|
||||
def setUp(self):
|
||||
super(WhenUsingBeginOrderTask, self).setUp()
|
||||
super(WhenUsingBeginTypeOrderTask, self).setUp()
|
||||
|
||||
self.tasks = server.Tasks()
|
||||
|
||||
@mock.patch('barbican.tasks.resources.BeginOrder')
|
||||
@mock.patch('barbican.tasks.resources.BeginTypeOrder')
|
||||
def test_should_process_order(self, mock_begin_order):
|
||||
mock_begin_order.return_value.process.return_value = None
|
||||
self.tasks.process_order(context=None,
|
||||
order_id=self.order_id,
|
||||
keystone_id=self.keystone_id)
|
||||
self.tasks.process_type_order(context=None,
|
||||
order_id=self.order_id,
|
||||
keystone_id=self.keystone_id)
|
||||
mock_begin_order.return_value.process.assert_called_with(
|
||||
self.order_id, self.keystone_id)
|
||||
|
||||
@@ -48,25 +48,10 @@ class WhenUsingBeginOrderTask(utils.BaseTestCase):
|
||||
self.order_id, self.keystone_id, updated_meta
|
||||
)
|
||||
|
||||
@mock.patch('barbican.tasks.resources.BeginOrder')
|
||||
def test_process_order_catch_exception(self, mock_begin_order):
|
||||
"""Test process_order() handles all exceptions."""
|
||||
mock_begin_order.return_value.process.side_effect = Exception()
|
||||
self.tasks.process_order(None, self.order_id, self.keystone_id)
|
||||
|
||||
|
||||
class WhenUsingBeginTypeOrderTask(utils.BaseTestCase):
|
||||
"""Test using the Tasks class for 'type order' task."""
|
||||
|
||||
def setUp(self):
|
||||
super(WhenUsingBeginTypeOrderTask, self).setUp()
|
||||
|
||||
self.tasks = server.Tasks()
|
||||
|
||||
@mock.patch('barbican.tasks.resources.BeginTypeOrder')
|
||||
def test_process_type_order_catch_exception(self, mock_begin_type_order):
|
||||
"""Test process_type_order() method handles all exceptions."""
|
||||
mock_begin_type_order.return_value.process.side_effect = Exception()
|
||||
def test_process_order_catch_exception(self, mock_begin_order):
|
||||
"""Test process_type_order() handles all exceptions."""
|
||||
mock_begin_order.return_value.process.side_effect = Exception()
|
||||
self.tasks.process_type_order(None, self.order_id, self.keystone_id)
|
||||
|
||||
|
||||
|
||||
@@ -22,155 +22,6 @@ from barbican.tasks import resources
|
||||
from barbican.tests import utils
|
||||
|
||||
|
||||
class WhenBeginningOrder(utils.BaseTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(WhenBeginningOrder, self).setUp()
|
||||
|
||||
self.requestor = 'requestor1234'
|
||||
self.order = models.Order()
|
||||
self.order.id = "id1"
|
||||
self.order.requestor = self.requestor
|
||||
|
||||
self.secret_name = "name"
|
||||
self.secret_algorithm = "AES"
|
||||
self.secret_bit_length = 256
|
||||
self.secret_mode = "CBC"
|
||||
self.secret_expiration = timeutils.utcnow()
|
||||
self.secret_payload_content_type = 'application/octet-stream'
|
||||
|
||||
self.keystone_id = 'keystone1234'
|
||||
self.tenant_id = 'tenantid1234'
|
||||
self.tenant = models.Tenant()
|
||||
self.tenant.id = self.tenant_id
|
||||
self.tenant.keystone_id = self.keystone_id
|
||||
self.tenant_repo = mock.MagicMock()
|
||||
self.tenant_repo.get.return_value = self.tenant
|
||||
|
||||
self.order.status = models.States.PENDING
|
||||
self.order.tenant_id = self.tenant_id
|
||||
self.order.secret_name = self.secret_name
|
||||
self.order.secret_algorithm = self.secret_algorithm
|
||||
self.order.secret_bit_length = self.secret_bit_length
|
||||
self.order.secret_mode = self.secret_mode
|
||||
self.order.secret_expiration = self.secret_expiration
|
||||
self.order.secret_payload_content_type = (
|
||||
self.secret_payload_content_type)
|
||||
|
||||
self.order_repo = mock.MagicMock()
|
||||
self.order_repo.get.return_value = self.order
|
||||
|
||||
self.secret = models.Secret()
|
||||
|
||||
self.secret_repo = mock.MagicMock()
|
||||
self.secret_repo.create_from.return_value = None
|
||||
|
||||
self.tenant_secret_repo = mock.MagicMock()
|
||||
self.tenant_secret_repo.create_from.return_value = None
|
||||
|
||||
self.datum_repo = mock.MagicMock()
|
||||
self.datum_repo.create_from.return_value = None
|
||||
|
||||
self.kek_repo = mock.MagicMock()
|
||||
|
||||
self.secret_meta_repo = mock.MagicMock()
|
||||
|
||||
self.resource = resources.BeginOrder(self.tenant_repo, self.order_repo,
|
||||
self.secret_repo,
|
||||
self.tenant_secret_repo,
|
||||
self.datum_repo, self.kek_repo,
|
||||
self.secret_meta_repo
|
||||
)
|
||||
|
||||
@mock.patch('barbican.plugin.resources.generate_secret')
|
||||
def test_should_process_order(self, mock_generate_secret):
|
||||
mock_generate_secret.return_value = self.secret
|
||||
|
||||
self.resource.process(self.order.id, self.keystone_id)
|
||||
|
||||
self.order_repo.get.assert_called_once_with(
|
||||
entity_id=self.order.id, keystone_id=self.keystone_id)
|
||||
self.assertEqual(self.order.status, models.States.ACTIVE)
|
||||
|
||||
secret_info = self.order.to_dict_fields()['secret']
|
||||
mock_generate_secret.assert_called_once_with(
|
||||
secret_info,
|
||||
secret_info.get('payload_content_type',
|
||||
'application/octet-stream'),
|
||||
self.tenant,
|
||||
mock.ANY
|
||||
)
|
||||
|
||||
def test_should_raise_during_retrieval(self):
|
||||
# Force an error during the order retrieval phase.
|
||||
self.order_repo.get = mock.MagicMock(return_value=None,
|
||||
side_effect=ValueError())
|
||||
|
||||
self.assertRaises(
|
||||
ValueError,
|
||||
self.resource.process,
|
||||
self.order.id,
|
||||
self.keystone_id,
|
||||
)
|
||||
|
||||
# Order state doesn't change because can't retrieve it to change it.
|
||||
self.assertEqual(models.States.PENDING, self.order.status)
|
||||
|
||||
def test_should_raise_during_processing(self):
|
||||
# Force an error during the processing handler phase.
|
||||
self.tenant_repo.get = mock.MagicMock(return_value=None,
|
||||
side_effect=ValueError())
|
||||
|
||||
self.assertRaises(
|
||||
ValueError,
|
||||
self.resource.process,
|
||||
self.order.id,
|
||||
self.keystone_id,
|
||||
)
|
||||
|
||||
self.assertEqual(models.States.ERROR, self.order.status)
|
||||
self.assertEqual(500, self.order.error_status_code)
|
||||
self.assertEqual(u._('Create Secret failure seen - please contact '
|
||||
'site administrator.'), self.order.error_reason)
|
||||
|
||||
@mock.patch('barbican.plugin.resources.generate_secret')
|
||||
def test_should_raise_during_success_report_fail(self,
|
||||
mock_generate_secret):
|
||||
mock_generate_secret.return_value = self.secret
|
||||
|
||||
# Force an error during the processing handler phase.
|
||||
self.order_repo.save = mock.MagicMock(return_value=None,
|
||||
side_effect=ValueError())
|
||||
|
||||
self.assertRaises(
|
||||
ValueError,
|
||||
self.resource.process,
|
||||
self.order.id,
|
||||
self.keystone_id,
|
||||
)
|
||||
|
||||
def test_should_raise_during_error_report_fail(self):
|
||||
# Force an error during the error-report handling after
|
||||
# error in processing handler phase.
|
||||
|
||||
# Force an error during the processing handler phase.
|
||||
self.tenant_repo.get = mock.MagicMock(return_value=None,
|
||||
side_effect=TypeError())
|
||||
|
||||
# Force exception in the error-reporting phase.
|
||||
self.order_repo.save = mock.MagicMock(return_value=None,
|
||||
side_effect=ValueError())
|
||||
|
||||
# Should see the original exception (TypeError) instead of the
|
||||
# secondary one (ValueError).
|
||||
self.assertRaises(
|
||||
TypeError,
|
||||
self.resource.process,
|
||||
self.order.id,
|
||||
self.keystone_id,
|
||||
)
|
||||
|
||||
|
||||
class WhenBeginningKeyTypeOrder(utils.BaseTestCase):
|
||||
|
||||
def setUp(self):
|
||||
|
||||
@@ -20,13 +20,14 @@ from functionaltests.api.v1.models.secret_models import SecretModel
|
||||
class OrderModel(BaseModel):
|
||||
|
||||
def __init__(self, status=None, secret_ref=None, updated=None,
|
||||
created=None, secret=None, order_ref=None):
|
||||
created=None, type=None, meta=None, order_ref=None):
|
||||
super(OrderModel, self).__init__()
|
||||
self.status = status
|
||||
self.secret_ref = secret_ref
|
||||
self.updated = updated
|
||||
self.created = created
|
||||
self.secret = secret
|
||||
self.type = type
|
||||
self.meta = meta
|
||||
self.order_ref = order_ref
|
||||
|
||||
@classmethod
|
||||
|
||||
@@ -17,7 +17,8 @@ from functionaltests.api.v1.models import order_models
|
||||
|
||||
|
||||
create_order_data = {
|
||||
"secret": {
|
||||
'type': 'key',
|
||||
"meta": {
|
||||
"name": "secretname",
|
||||
"algorithm": "AES",
|
||||
"bit_length": 256,
|
||||
|
||||
Reference in new issue
Block a user