Merge "Handle errors when updating unknown params of plan"

This commit is contained in:
Jenkins 2014-11-10 12:12:52 +00:00 committed by Gerrit Code Review
commit 4d787d4d59
3 changed files with 65 additions and 1 deletions

View File

@ -201,3 +201,8 @@ class PlanExists(DuplicateEntry):
class PlanAlreadyHasRole(DuplicateEntry): class PlanAlreadyHasRole(DuplicateEntry):
message = _("Plan %(plan_uuid)s already has role %(role_uuid)s.") message = _("Plan %(plan_uuid)s already has role %(role_uuid)s.")
class PlanParametersNotExist(Invalid):
message = _("There are no parameters named %(param_names)s"
" in plan %(plan_uuid)s.")

View File

@ -12,6 +12,7 @@
import logging import logging
from tuskar.common import exception
from tuskar.manager import models from tuskar.manager import models
from tuskar.manager import name_utils from tuskar.manager import name_utils
from tuskar.storage.exceptions import UnknownName from tuskar.storage.exceptions import UnknownName
@ -291,9 +292,24 @@ class PlansManager(object):
db_plan.environment_file.contents db_plan.environment_file.contents
) )
non_existent_params = []
for param_value in params: for param_value in params:
p = environment.find_parameter_by_name(param_value.name) p = environment.find_parameter_by_name(param_value.name)
p.value = param_value.value if p:
p.value = param_value.value
else:
non_existent_params.append(param_value.name)
if non_existent_params:
param_names = ', '.join(non_existent_params)
LOG.error(
'There are no parameters named %(param_names)s'
' in plan %(plan_uuid)s.' %
{'param_names': param_names, 'plan_uuid': plan_uuid})
raise exception.PlanParametersNotExist(
plan_uuid=plan_uuid,
param_names=param_names
)
# Save the updated environment. # Save the updated environment.
env_contents = composer.compose_environment(environment) env_contents = composer.compose_environment(environment)

View File

@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from tuskar.common import exception
from tuskar.manager.models import DeploymentPlan from tuskar.manager.models import DeploymentPlan
from tuskar.manager.models import ParameterValue from tuskar.manager.models import ParameterValue
from tuskar.manager.models import PlanParameter from tuskar.manager.models import PlanParameter
@ -319,6 +320,48 @@ class PlansManagerTestCase(TestCase):
self.assertEqual(found_params[2].value, 'm1.small') self.assertEqual(found_params[2].value, 'm1.small')
self.assertEqual(found_params[3].value, 'test-key') self.assertEqual(found_params[3].value, 'test-key')
def test_set_non_existent_parameters(self):
# Setup
test_role = self._add_test_role()
test_plan = self.plans_manager.create_plan('p1', 'd1')
self.plans_manager.add_role_to_plan(test_plan.uuid, test_role.uuid)
# Test
ns = name_utils.generate_role_namespace(test_role.name,
test_role.version)
not_present_in_role_1_name = ns_utils.apply_template_namespace(
ns, 'not_present_in_role_1')
not_present_in_role_2_name = ns_utils.apply_template_namespace(
ns, 'not_present_in_role_2')
update_us = [
ParameterValue(ns_utils.apply_template_namespace(ns, 'key_name'),
'test-key'),
ParameterValue(ns_utils.apply_template_namespace(ns, 'image_id'),
'test-image'),
ParameterValue(not_present_in_role_1_name,
'not-present-in-role-1-value'),
ParameterValue(not_present_in_role_2_name,
'not-present-in-role-2-value'),
]
# Verify
exc = self.assertRaises(exception.PlanParametersNotExist,
self.plans_manager.set_parameter_values,
test_plan.uuid,
update_us)
self.assertIn(not_present_in_role_1_name, str(exc))
self.assertIn(not_present_in_role_2_name, str(exc))
# Pull it from the database to make sure it was modified
found = self.plans_manager.retrieve_plan(test_plan.uuid)
found_params = sorted(found.parameters, key=lambda x: x.name)
self.assertEqual(4, len(found_params)) # 3 + 1 for scaling
self.assertEqual(found_params[0].value, '1')
self.assertEqual(found_params[1].value,
'3e6270da-fbf7-4aef-bc78-6d0cfc3ad11b')
self.assertEqual(found_params[2].value, 'm1.small')
self.assertEqual(found_params[3].value, '')
def test_package_templates(self): def test_package_templates(self):
# Setup # Setup
test_role = self._add_test_role() test_role = self._add_test_role()