def test_rule_not_valid(self): validator = nvpair_multi.ValidateNvsetAppendNew( self.id_provider, {}, {}, "bad rule", rule_allows_rsc_expr=True, rule_allows_op_expr=True, rule_allows_node_attr_expr=True, ) assert_report_item_list_equal( validator.validate(force_options=True), [ fixture.error( reports.codes.RULE_EXPRESSION_PARSE_ERROR, rule_string="bad rule", reason='Expected "eq"', rule_line="bad rule", line_number=1, column_number=5, position=4, ), ], ) self.assertIsNone(validator.get_parsed_rule())
def _defaults_create( env: LibraryEnvironment, cib_section_name: str, validator_options: Mapping[str, Any], nvpairs: Mapping[str, str], nvset_options: Mapping[str, str], nvset_rule: Optional[str] = None, force_flags: Optional[Container] = None, ) -> None: if force_flags is None: force_flags = set() force = (reports.codes.FORCE in force_flags) or (reports.codes.FORCE_OPTIONS in force_flags) required_cib_version = None nice_to_have_cib_version = None if nvset_rule: # Parse the rule to see if we need to upgrade CIB schema. All errors # would be properly reported by a validator called bellow, so we can # safely ignore them here. try: rule_tree = parse_rule(nvset_rule) if has_rsc_or_op_expression(rule_tree): required_cib_version = Version(3, 4, 0) if has_node_attr_expr_with_type_integer(rule_tree): nice_to_have_cib_version = Version(3, 5, 0) except RuleParseError: pass cib = env.get_cib( minimal_version=required_cib_version, nice_to_have_version=nice_to_have_cib_version, ) id_provider = IdProvider(cib) validator = nvpair_multi.ValidateNvsetAppendNew( id_provider, nvpairs, nvset_options, nvset_rule=nvset_rule, **validator_options, ) if env.report_processor.report_list( validator.validate(force_options=force)).has_errors: raise LibraryError() nvpair_multi.nvset_append_new( sections.get(cib, cib_section_name), id_provider, get_pacemaker_version_by_which_cib_was_validated(cib), nvpair_multi.NVSET_META, nvpairs, nvset_options, nvset_rule=validator.get_parsed_rule(), ) env.report_processor.report( ReportItem.warning(reports.messages.DefaultsCanBeOverriden())) env.push_cib()
def test_success_minimal(self): validator = nvpair_multi.ValidateNvsetAppendNew( self.id_provider, {}, {} ) assert_report_item_list_equal( validator.validate(force_options=True), [] ) self.assertIsNone(validator.get_parsed_rule())
def test_score_not_valid(self): validator = nvpair_multi.ValidateNvsetAppendNew( self.id_provider, {}, {"score": "a"}) assert_report_item_list_equal( validator.validate(force_options=True), [fixture.error(reports.codes.INVALID_SCORE, score="a")], ) self.assertIsNone(validator.get_parsed_rule())
def test_id_not_available(self): validator = nvpair_multi.ValidateNvsetAppendNew( self.id_provider, {}, {"id": "a"}) assert_report_item_list_equal( validator.validate(force_options=True), [fixture.error(reports.codes.ID_ALREADY_EXISTS, id="a")], ) self.assertIsNone(validator.get_parsed_rule())
def test_id_not_valid(self): validator = nvpair_multi.ValidateNvsetAppendNew( self.id_provider, {}, {"id": "123"}) assert_report_item_list_equal( validator.validate(force_options=True), [fixture.report_invalid_id("123", "1")], ) self.assertIsNone(validator.get_parsed_rule())
def test_options_names_forced(self): validator = nvpair_multi.ValidateNvsetAppendNew( self.id_provider, {}, {"not_valid": "a"}) assert_report_item_list_equal( validator.validate(force_options=True), [ fixture.warn( reports.codes.INVALID_OPTIONS, option_names=["not_valid"], allowed=["id", "score"], option_type=None, allowed_patterns=[], ), ], ) self.assertIsNone(validator.get_parsed_rule())
def _defaults_create( env: LibraryEnvironment, cib_section_name: str, validator_options: Mapping[str, Any], nvpairs: Mapping[str, str], nvset_options: Mapping[str, str], nvset_rule: Optional[str] = None, force_flags: Optional[Container] = None, ) -> None: if force_flags is None: force_flags = set() force = (reports.codes.FORCE in force_flags) or (reports.codes.FORCE_OPTIONS in force_flags) required_cib_version = None if nvset_rule: required_cib_version = Version(3, 4, 0) cib = env.get_cib(required_cib_version) id_provider = IdProvider(cib) validator = nvpair_multi.ValidateNvsetAppendNew( id_provider, nvpairs, nvset_options, nvset_rule=nvset_rule, **validator_options, ) if env.report_processor.report_list( validator.validate(force_options=force)).has_errors: raise LibraryError() nvpair_multi.nvset_append_new( sections.get(cib, cib_section_name), id_provider, nvpair_multi.NVSET_META, nvpairs, nvset_options, nvset_rule=validator.get_parsed_rule(), ) env.report_processor.report( ReportItem.warning(reports.messages.DefaultsCanBeOverriden())) env.push_cib()
def test_success_full(self): validator = nvpair_multi.ValidateNvsetAppendNew( self.id_provider, {"name": "value"}, {"id": "some-id", "score": "10"}, nvset_rule="resource ::stateful", rule_allows_rsc_expr=True, rule_allows_op_expr=True, ) assert_report_item_list_equal( validator.validate(), [], ) self.assertEqual( repr(validator.get_parsed_rule()), "BoolExpr(operator='AND', children=[" "RscExpr(standard=None, provider=None, type='stateful')" "])", )