Get rid of resource_validate flag in Stack

Why pass a parameter to a method to influence what it does when you can set
some state on the object that the programmer always has to keep in their
head to figure out what any given call will do?

Change-Id: I020238de0a351dd2eaf51c6f970ae36ad0f931be
This commit is contained in:
Zane Bitter 2017-05-01 17:26:05 -04:00
parent 9513feca7d
commit 41ae901c3b
6 changed files with 15 additions and 33 deletions

View File

@ -220,8 +220,6 @@ class Resource(status.ResourceStatus):
self.context = stack.context self.context = stack.context
self.name = name self.name = name
self.t = definition self.t = definition
# Only translate in cases where resource_validate is True
# ex. for template-validate
self.reparse(client_resolve=False) self.reparse(client_resolve=False)
self.update_policy = self.t.update_policy(self.update_policy_schema, self.update_policy = self.t.update_policy(self.update_policy_schema,
self.context) self.context)

View File

@ -1231,11 +1231,11 @@ class EngineService(service.ServiceBase):
stack_name = 'dummy' stack_name = 'dummy'
stack = parser.Stack(cnxt, stack_name, tmpl, stack = parser.Stack(cnxt, stack_name, tmpl,
strict_validate=False, strict_validate=False,
resource_validate=False,
service_check_defer=service_check_defer) service_check_defer=service_check_defer)
try: try:
stack.validate(ignorable_errors=ignorable_errors, stack.validate(ignorable_errors=ignorable_errors,
validate_by_deps=False) validate_by_deps=False,
validate_res_tmpl_only=True)
except exception.StackValidationFailed as ex: except exception.StackValidationFailed as ex:
return {'Error': six.text_type(ex)} return {'Error': six.text_type(ex)}
@ -2428,8 +2428,7 @@ class EngineService(service.ServiceBase):
continue continue
stk = parser.Stack.load(cnxt, stack=s, stk = parser.Stack.load(cnxt, stack=s,
service_check_defer=True, service_check_defer=True)
resource_validate=False)
LOG.info('Engine %(engine)s went down when stack ' LOG.info('Engine %(engine)s went down when stack '
'%(stack_id)s was in action %(action)s', '%(stack_id)s was in action %(action)s',
{'engine': engine_id, 'action': stk.action, {'engine': engine_id, 'action': stk.action,

View File

@ -124,7 +124,7 @@ class Stack(collections.Mapping):
use_stored_context=False, username=None, use_stored_context=False, username=None,
nested_depth=0, strict_validate=True, convergence=False, nested_depth=0, strict_validate=True, convergence=False,
current_traversal=None, tags=None, prev_raw_template_id=None, current_traversal=None, tags=None, prev_raw_template_id=None,
current_deps=None, cache_data=None, resource_validate=True, current_deps=None, cache_data=None,
service_check_defer=False, deleted_time=None): service_check_defer=False, deleted_time=None):
"""Initialise the Stack. """Initialise the Stack.
@ -192,13 +192,6 @@ class Stack(collections.Mapping):
# for not-yet-created resources (which return None) # for not-yet-created resources (which return None)
self.strict_validate = strict_validate self.strict_validate = strict_validate
# resource_validate can be used to disable resource plugin subclass
# validate methods, which is useful when you want to validate
# template integrity but some parameters may not be provided
# at all, thus we can't yet reference property values such as is
# commonly done in plugin validate() methods
self.resource_validate = resource_validate
# service_check_defer can be used to defer the validation of service # service_check_defer can be used to defer the validation of service
# availability for a given resource, which helps to create the resource # availability for a given resource, which helps to create the resource
# dependency tree completely when respective service is not available, # dependency tree completely when respective service is not available,
@ -509,8 +502,7 @@ class Stack(collections.Mapping):
@classmethod @classmethod
def load(cls, context, stack_id=None, stack=None, show_deleted=True, def load(cls, context, stack_id=None, stack=None, show_deleted=True,
use_stored_context=False, force_reload=False, cache_data=None, use_stored_context=False, force_reload=False, cache_data=None,
service_check_defer=False, resource_validate=True, service_check_defer=False, load_template=True):
load_template=True):
"""Retrieve a Stack from the database.""" """Retrieve a Stack from the database."""
if stack is None: if stack is None:
stack = stack_object.Stack.get_by_id( stack = stack_object.Stack.get_by_id(
@ -528,7 +520,6 @@ class Stack(collections.Mapping):
use_stored_context=use_stored_context, use_stored_context=use_stored_context,
cache_data=cache_data, cache_data=cache_data,
service_check_defer=service_check_defer, service_check_defer=service_check_defer,
resource_validate=resource_validate,
load_template=load_template) load_template=load_template)
@classmethod @classmethod
@ -563,8 +554,7 @@ class Stack(collections.Mapping):
@classmethod @classmethod
def _from_db(cls, context, stack, def _from_db(cls, context, stack,
use_stored_context=False, cache_data=None, use_stored_context=False, cache_data=None,
service_check_defer=False, resource_validate=True, service_check_defer=False, load_template=True):
load_template=True):
if load_template: if load_template:
template = tmpl.Template.load( template = tmpl.Template.load(
context, stack.raw_template_id, stack.raw_template) context, stack.raw_template_id, stack.raw_template)
@ -589,8 +579,7 @@ class Stack(collections.Mapping):
current_deps=stack.current_deps, cache_data=cache_data, current_deps=stack.current_deps, cache_data=cache_data,
nested_depth=stack.nested_depth, nested_depth=stack.nested_depth,
deleted_time=stack.deleted_at, deleted_time=stack.deleted_at,
service_check_defer=service_check_defer, service_check_defer=service_check_defer)
resource_validate=resource_validate)
def get_kwargs_for_cloning(self, keep_status=False, only_db=False): def get_kwargs_for_cloning(self, keep_status=False, only_db=False):
"""Get common kwargs for calling Stack() for cloning. """Get common kwargs for calling Stack() for cloning.
@ -797,7 +786,8 @@ class Stack(collections.Mapping):
return handler and handler(resource_name) return handler and handler(resource_name)
@profiler.trace('Stack.validate', hide_args=False) @profiler.trace('Stack.validate', hide_args=False)
def validate(self, ignorable_errors=None, validate_by_deps=True): def validate(self, ignorable_errors=None, validate_by_deps=True,
validate_res_tmpl_only=False):
"""Validates the stack.""" """Validates the stack."""
# TODO(sdake) Should return line number of invalid reference # TODO(sdake) Should return line number of invalid reference
@ -852,7 +842,7 @@ class Stack(collections.Mapping):
if res.name not in unique_defn_names: if res.name not in unique_defn_names:
continue continue
try: try:
if self.resource_validate: if not validate_res_tmpl_only:
if res.external_id is not None: if res.external_id is not None:
res.validate_external() res.validate_external()
continue continue

View File

@ -1338,8 +1338,7 @@ class StackServiceTest(common.HeatTestCase):
]) ])
mock_stack_load.assert_called_once_with(self.ctx, mock_stack_load.assert_called_once_with(self.ctx,
stack=db_stack, stack=db_stack,
service_check_defer=True, service_check_defer=True)
resource_validate=False)
self.assertTrue(lock2.release.called) self.assertTrue(lock2.release.called)
reason = ('Engine went down during stack %s' % fake_stack.action) reason = ('Engine went down during stack %s' % fake_stack.action)
mock_thread.start_with_acquired_lock.assert_called_once_with( mock_thread.start_with_acquired_lock.assert_called_once_with(

View File

@ -193,9 +193,7 @@ class ResourceTest(common.HeatTestCase):
self.assertEqual(0, mock_load.call_count) self.assertEqual(0, mock_load.call_count)
# set stack._resources = None to reload the resources # set stack._resources = None to reload the resources
# and set resource_validate = False
stack._resources = None stack._resources = None
stack.resource_validate = False
mock_db_get.return_value = mock.Mock() mock_db_get.return_value = mock.Mock()
self.assertEqual(1, len(stack.resources)) self.assertEqual(1, len(stack.resources))
self.assertEqual(2, mock_translate.call_count) self.assertEqual(2, mock_translate.call_count)

View File

@ -445,8 +445,7 @@ class StackTest(common.HeatTestCase):
current_deps=None, cache_data=None, current_deps=None, cache_data=None,
nested_depth=0, nested_depth=0,
deleted_time=None, deleted_time=None,
service_check_defer=False, service_check_defer=False)
resource_validate=True)
self.m.ReplayAll() self.m.ReplayAll()
stack.Stack.load(self.ctx, stack_id=self.stack.id) stack.Stack.load(self.ctx, stack_id=self.stack.id)
@ -2029,8 +2028,7 @@ class StackTest(common.HeatTestCase):
self.assertIn("The Parameter (aparam) was not provided", self.assertIn("The Parameter (aparam) was not provided",
six.text_type(ex)) six.text_type(ex))
self.stack.resource_validate = False self.assertIsNone(self.stack.validate(validate_res_tmpl_only=True))
self.assertIsNone(self.stack.validate())
def test_nodisable_validate_tmpl_err(self): def test_nodisable_validate_tmpl_err(self):
tmpl = template_format.parse(""" tmpl = template_format.parse("""
@ -2058,9 +2056,9 @@ class StackTest(common.HeatTestCase):
"The specified reference \"noexist\" (in AResource) is incorrect", "The specified reference \"noexist\" (in AResource) is incorrect",
six.text_type(ex)) six.text_type(ex))
self.stack.resource_validate = False
ex = self.assertRaises(exception.InvalidTemplateReference, ex = self.assertRaises(exception.InvalidTemplateReference,
self.stack.validate) self.stack.validate,
validate_res_tmpl_only=True)
self.assertIn( self.assertIn(
"The specified reference \"noexist\" (in AResource) is incorrect", "The specified reference \"noexist\" (in AResource) is incorrect",
six.text_type(ex)) six.text_type(ex))