If a role is already in a plan return a 409

Change-Id: Ib2eb78c554bc15e73d57a6fe83a69eb5afcf7456
This commit is contained in:
Dougal Matthews 2014-08-21 12:25:50 +01:00
parent 3e1fdad58a
commit 44bcead218
3 changed files with 30 additions and 1 deletions

View File

@ -16,6 +16,7 @@ from pecan import rest
from wsmeext import pecan as wsme_pecan from wsmeext import pecan as wsme_pecan
from tuskar.api.controllers.v2 import models from tuskar.api.controllers.v2 import models
from tuskar.common import exception
from tuskar.manager.plan import PlansManager from tuskar.manager.plan import PlansManager
from tuskar.manager.role import RoleManager from tuskar.manager.role import RoleManager
@ -56,10 +57,20 @@ class RolesController(rest.RestController):
:return: modified plan :return: modified plan
:rtype: tuskar.api.controllers.v2.models.Plan :rtype: tuskar.api.controllers.v2.models.Plan
:raises: tuskar.common.exception.PlanAlreadyHasRole if the role has
already been added to the plan.
""" """
LOG.debug('Adding role: %s' % role.uuid) LOG.debug('Adding role: %s' % role.uuid)
manager = PlansManager() manager = PlansManager()
updated_plan = manager.add_role_to_plan(plan_uuid, role.uuid) try:
updated_plan = manager.add_role_to_plan(plan_uuid, role.uuid)
except ValueError:
LOG.debug('The role has already been added to the plan.')
raise exception.PlanAlreadyHasRole(
plan_uuid=plan_uuid,
role_uuid=role.uuid
)
transfer_plan = models.Plan.from_tuskar_model(updated_plan) transfer_plan = models.Plan.from_tuskar_model(updated_plan)
return transfer_plan return transfer_plan

View File

@ -197,3 +197,7 @@ class PlanNotFound(NotFound):
class PlanExists(DuplicateEntry): class PlanExists(DuplicateEntry):
message = _("Plan with name %(name)s already exists.") message = _("Plan with name %(name)s already exists.")
class PlanAlreadyHasRole(DuplicateEntry):
message = _("Plan %(plan_uuid)s already has role %(role_uuid)s.")

View File

@ -74,6 +74,20 @@ class RolesTests(base.TestCase):
self.assertEqual(result['uuid'], 'a') self.assertEqual(result['uuid'], 'a')
self.assertEqual(result['name'], 'n') self.assertEqual(result['name'], 'n')
@mock.patch('tuskar.manager.plan.PlansManager.add_role_to_plan')
def test_post_duplicate(self, mock_add):
# Setup
mock_add.side_effect = ValueError()
# Test
role_data = {'uuid': 'qwerty12345'}
response = self.app.post_json(URL_PLAN_ROLES, params=role_data,
status=409)
# Verify
mock_add.assert_called_once_with('plan_uuid', 'qwerty12345')
self.assertEqual(response.status_int, 409)
@mock.patch('tuskar.manager.plan.PlansManager.remove_role_from_plan') @mock.patch('tuskar.manager.plan.PlansManager.remove_role_from_plan')
def test_delete(self, mock_remove): def test_delete(self, mock_remove):
# Setup # Setup