Esempio n. 1
0
 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())
Esempio n. 2
0
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()
Esempio n. 3
0
 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())
Esempio n. 4
0
 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())
Esempio n. 5
0
 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())
Esempio n. 6
0
 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())
Esempio n. 7
0
 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())
Esempio n. 8
0
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()
Esempio n. 9
0
 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')"
         "])",
     )