force_store_value for follower

This commit is contained in:
Emmanuel Garette 2019-11-20 08:29:45 +01:00
parent 1bcad4d7ed
commit 709c0bf228
1 changed files with 57 additions and 25 deletions

View File

@ -76,8 +76,7 @@ class Values(object):
option_bag, option_bag,
check_error=True) check_error=True)
# store value in cache # store value in cache
properties = option_bag.config_bag.properties validator = 'validator' in setting_properties and 'demoting_error_warning' not in setting_properties
validator = 'validator' in properties and 'demoting_error_warning' not in properties
if not is_cached or validator: if not is_cached or validator:
cache.setcache(option_bag.path, cache.setcache(option_bag.path,
option_bag.index, option_bag.index,
@ -102,7 +101,7 @@ class Values(object):
if 'force_metaconfig_on_freeze' in option_bag.properties: if 'force_metaconfig_on_freeze' in option_bag.properties:
settings = option_bag.config_bag.context.cfgimpl_get_settings() settings = option_bag.config_bag.context.cfgimpl_get_settings()
if 'force_metaconfig_on_freeze' in option_bag.option.impl_getproperties() and \ if 'force_metaconfig_on_freeze' in option_bag.option.impl_getproperties() and \
not settings._p_.getproperties(option_bag.path, frozenset()): not settings._p_.getproperties(option_bag.path, None, frozenset()):
# if force_metaconfig_on_freeze is only in option (not in config) # if force_metaconfig_on_freeze is only in option (not in config)
return option_bag.config_bag.context.impl_type == 'config' return option_bag.config_bag.context.impl_type == 'config'
else: else:
@ -150,12 +149,13 @@ class Values(object):
value = self.calc_value(option_bag, value) value = self.calc_value(option_bag, value)
return value return value
def calc_value(self, option_bag, value): def calc_value(self, option_bag, value, reset_cache=True):
if isinstance(value, Calculation): if isinstance(value, Calculation):
value = value.execute(option_bag) value = value.execute(option_bag, leadership_must_have_index=True)
elif isinstance(value, (list, tuple)): elif isinstance(value, (list, tuple)):
value = list(self._do_value_list(value, option_bag)) value = list(self._do_value_list(value, option_bag))
self.calculate_reset_cache(option_bag, value) if reset_cache:
self.calculate_reset_cache(option_bag, value)
return value return value
def getdefaultvalue(self, def getdefaultvalue(self,
@ -267,13 +267,7 @@ class Values(object):
"convenience method to know if an option is empty" "convenience method to know if an option is empty"
empty = opt._empty empty = opt._empty
if index in [None, undefined] and opt.impl_is_multi(): if index in [None, undefined] and opt.impl_is_multi():
if force_allow_empty_list: isempty = value is None or (not force_allow_empty_list and value == []) or \
allow_empty_list = True
else:
allow_empty_list = opt.impl_allow_empty_list()
if allow_empty_list is undefined:
allow_empty_list = opt.impl_is_follower()
isempty = value is None or (not allow_empty_list and value == []) or \
None in value or empty in value None in value or empty in value
else: else:
isempty = value is None or value == empty or (opt.impl_is_submulti() and value == []) isempty = value is None or value == empty or (opt.impl_is_submulti() and value == [])
@ -294,7 +288,25 @@ class Values(object):
self._setvalue(option_bag, self._setvalue(option_bag,
value, value,
owner, owner,
commit=_commit) commit=False)
setting_properties = option_bag.config_bag.properties
validator = 'validator' in setting_properties and 'demoting_error_warning' not in setting_properties
if validator:
cache = option_bag.config_bag.context._impl_values_cache
cache.setcache(option_bag.path,
option_bag.index,
value,
option_bag.properties,
setting_properties,
validator)
if 'force_store_value' in setting_properties and option_bag.option.impl_is_leader():
option_bag.option.impl_get_leadership().follower_force_store_value(self,
value,
option_bag,
owners.forced,
_commit=_commit)
if _commit:
self._p_.commit()
def setvalue_validation(self, def setvalue_validation(self,
value, value,
@ -303,10 +315,11 @@ class Values(object):
# First validate properties with this value # First validate properties with this value
opt = option_bag.option opt = option_bag.option
settings.validate_frozen(option_bag) settings.validate_frozen(option_bag)
settings.validate_mandatory(value, val = self.calc_value(option_bag, value, False)
settings.validate_mandatory(val,
option_bag) option_bag)
# Value must be valid for option # Value must be valid for option
opt.impl_validate(value, opt.impl_validate(val,
option_bag, option_bag,
check_error=True) check_error=True)
if 'warnings' in option_bag.config_bag.properties: if 'warnings' in option_bag.config_bag.properties:
@ -449,6 +462,7 @@ class Values(object):
context = option_bag.config_bag.context context = option_bag.config_bag.context
hasvalue = self._p_.hasvalue(option_bag.path) hasvalue = self._p_.hasvalue(option_bag.path)
setting_properties = option_bag.config_bag.properties
if hasvalue and 'validator' in option_bag.config_bag.properties: if hasvalue and 'validator' in option_bag.config_bag.properties:
fake_context = context._gen_fake_values() fake_context = context._gen_fake_values()
@ -469,7 +483,7 @@ class Values(object):
option_bag, option_bag,
_commit=_commit) _commit=_commit)
if hasvalue: if hasvalue:
if 'force_store_value' in option_bag.properties: if 'force_store_value' in option_bag.config_bag.properties and 'force_store_value' in option_bag.properties:
value = self.getdefaultvalue(option_bag) value = self.getdefaultvalue(option_bag)
self._setvalue(option_bag, self._setvalue(option_bag,
@ -477,9 +491,19 @@ class Values(object):
owners.forced, owners.forced,
commit=_commit) commit=_commit)
else: else:
# for leader only
value = None
self._p_.resetvalue(option_bag.path, self._p_.resetvalue(option_bag.path,
_commit) _commit)
context.cfgimpl_reset_cache(option_bag) context.cfgimpl_reset_cache(option_bag)
if 'force_store_value' in setting_properties and option_bag.option.impl_is_leader():
if value is None:
value = self.getdefaultvalue(option_bag)
option_bag.option.impl_get_leadership().follower_force_store_value(self,
value,
option_bag,
owners.forced,
_commit=_commit)
def reset_follower(self, def reset_follower(self,
option_bag, option_bag,
@ -487,7 +511,8 @@ class Values(object):
if self._p_.hasvalue(option_bag.path, index=option_bag.index): if self._p_.hasvalue(option_bag.path, index=option_bag.index):
context = option_bag.config_bag.context context = option_bag.config_bag.context
if 'validator' in option_bag.config_bag.properties: setting_properties = option_bag.config_bag.properties
if 'validator' in setting_properties:
fake_context = context._gen_fake_values() fake_context = context._gen_fake_values()
fake_value = fake_context.cfgimpl_get_values() fake_value = fake_context.cfgimpl_get_values()
config_bag = option_bag.config_bag.copy() config_bag = option_bag.config_bag.copy()
@ -499,9 +524,17 @@ class Values(object):
value = fake_value.getdefaultvalue(soption_bag) value = fake_value.getdefaultvalue(soption_bag)
fake_value.setvalue_validation(value, fake_value.setvalue_validation(value,
soption_bag) soption_bag)
self._p_.resetvalue_index(option_bag.path, if 'force_store_value' in setting_properties and 'force_store_value' in option_bag.properties:
option_bag.index, value = self.getdefaultvalue(option_bag)
_commit)
self._setvalue(option_bag,
value,
owners.forced,
commit=_commit)
else:
self._p_.resetvalue_index(option_bag.path,
option_bag.index,
_commit)
context.cfgimpl_reset_cache(option_bag) context.cfgimpl_reset_cache(option_bag)
def reset_leadership(self, def reset_leadership(self,
@ -558,8 +591,7 @@ class Values(object):
subconfig, subconfig,
od_config_bag): od_config_bag):
settings = context.cfgimpl_get_settings() settings = context.cfgimpl_get_settings()
for option in description.get_children(config_bag, for option in description.get_children(config_bag):
context):
name = option.impl_getname() name = option.impl_getname()
path = '.'.join(currpath + [name]) path = '.'.join(currpath + [name])
@ -599,11 +631,11 @@ class Values(object):
path, path,
index, index,
config_bag) config_bag)
if 'mandatory' in option_bag.properties: if 'mandatory' in option_bag.properties or 'empty' in option_bag.properties:
subconfig.getattr(name, subconfig.getattr(name,
option_bag) option_bag)
except PropertiesOptionError as err: except PropertiesOptionError as err:
if err.proptype == ['mandatory']: if err.proptype in (['mandatory'], ['empty']):
yield path yield path
except ConfigError: except ConfigError:
pass pass