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:
Arvind Tiwari committed 2014-10-01 09:15:22 -06:00
1 parent bef3b9e21f
commit 76191025d6
14 files changed
+92 -642

No files matched your search

+9 -52
View File
@@ -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
-45
View File
@@ -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."""
@@ -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 ###
+5 -28
View File
@@ -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:
-6
View File
@@ -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."""
-9
View File
@@ -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."""
-66
View File
@@ -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."""
+23 -32
View File
@@ -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
-223
View File
@@ -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):
+4 -4
View File
@@ -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)
+10 -25
View File
@@ -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)
-149
View File
@@ -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
+2 -1
View File
@@ -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,