def _validate_port_map_list(options_list, id_provider, force_options): allowed_options = [ "id", "port", "internal-port", "range", ] validators = [ validate.value_id("id", "port-map id", id_provider), validate.depends_on_option("internal-port", "port", "port-map", "port-map"), validate.is_required_some_of(["port", "range"], "port-map"), validate.mutually_exclusive(["port", "range"], "port-map"), validate.value_port_number("port"), validate.value_port_number("internal-port"), validate.value_port_range( "range", code_to_allow_extra_values=report_codes.FORCE_OPTIONS, allow_extra_values=force_options), ] report_list = [] for options in options_list: report_list.extend( validate.run_collection_of_option_validators(options, validators) + validate.names_in(allowed_options, options.keys(), "port-map", report_codes.FORCE_OPTIONS, force_options)) return report_list
def test_success_when_dependency_present(self): assert_report_item_list_equal( validate.depends_on_option("name", "prerequisite", "type")({ "name": "value", "prerequisite": "value", }), [])
def test_success_when_dependency_present(self): assert_report_item_list_equal( validate.depends_on_option("name", "prerequisite", "type")({ "name": "value", "prerequisite": "value", }), [] )
def test_report_when_dependency_missing(self): assert_report_item_list_equal( validate.depends_on_option("name", "prerequisite", "type1", "type2")({ "name": "value", }), [ (severities.ERROR, report_codes.PREREQUISITE_OPTION_IS_MISSING, { "option_name": "name", "option_type": "type1", "prerequisite_name": "prerequisite", "prerequisite_type": "type2", }, None), ])
def test_report_when_dependency_missing(self): assert_report_item_list_equal( validate.depends_on_option( "name", "prerequisite", "type1", "type2" )({ "name": "value", }), [ ( severities.ERROR, report_codes.PREREQUISITE_OPTION_IS_MISSING, { "option_name": "name", "option_type": "type1", "prerequisite_name": "prerequisite", "prerequisite_type": "type2", }, None ), ] )
def create_link_list_knet(link_list, max_link_number): """ Validate creating knet link (interface) list options iterable link_list -- list of link options integer max_link_number -- highest allowed linknumber """ if not link_list: # It is not mandatory to set link options. If an empty link list is # provided, everything is fine and we have nothing to validate. It is # also possible to set link options for only some of the links. return [] max_link_number = max(0, min(constants.LINKS_KNET_MAX - 1, max_link_number)) max_link_count = max_link_number + 1 allowed_options = [ "ip_version", # It tells knet which IP to prefer. "linknumber", "link_priority", "mcastport", "ping_interval", "ping_precision", "ping_timeout", "pong_count", "transport", ] validators = [ validate.value_in("ip_version", ("ipv4", "ipv6")), validate.value_integer_in_range("linknumber", 0, max_link_number), validate.value_integer_in_range("link_priority", 0, 255), validate.value_port_number("mcastport"), validate.value_nonnegative_integer("ping_interval"), validate.value_nonnegative_integer("ping_precision"), validate.value_nonnegative_integer("ping_timeout"), validate.depends_on_option( "ping_interval", "ping_timeout", option_type="link", prerequisite_type="link" ), validate.depends_on_option( "ping_timeout", "ping_interval", option_type="link", prerequisite_type="link" ), validate.value_nonnegative_integer("pong_count"), validate.value_in("transport", ("sctp", "udp")), ] report_items = [] used_link_number = defaultdict(int) for options in link_list: if "linknumber" in options: used_link_number[options["linknumber"]] += 1 report_items += ( validate.run_collection_of_option_validators(options, validators) + validate.names_in(allowed_options, options.keys(), "link") ) non_unique_linknumbers = [ number for number, count in used_link_number.items() if count > 1 ] if non_unique_linknumbers: report_items.append( reports.corosync_link_number_duplication(non_unique_linknumbers) ) link_count = len(link_list) if link_count > max_link_count: report_items.append( reports.corosync_too_many_links(link_count, max_link_count, "knet") ) return report_items
def create_link_list_knet(link_list, max_allowed_link_count): """ Validate creating knet link (interface) list options iterable link_list -- list of link options integer max_allowed_link_count -- how many links is defined by addresses """ if not link_list: # It is not mandatory to set link options. If an empty link list is # provided, everything is fine and we have nothing to validate. It is # also possible to set link options for only some of the links. return [] allowed_options = [ "linknumber", "link_priority", "mcastport", "ping_interval", "ping_precision", "ping_timeout", "pong_count", "transport", ] validators = [ validate.value_integer_in_range("link_priority", 0, 255), validate.value_port_number("mcastport"), validate.value_nonnegative_integer("ping_interval"), validate.value_nonnegative_integer("ping_precision"), validate.value_nonnegative_integer("ping_timeout"), validate.depends_on_option("ping_interval", "ping_timeout", option_type="link", prerequisite_type="link"), validate.depends_on_option("ping_timeout", "ping_interval", option_type="link", prerequisite_type="link"), validate.value_nonnegative_integer("pong_count"), validate.value_in("transport", ("sctp", "udp")), ] report_items = [] used_link_number = defaultdict(int) for options in link_list: if "linknumber" in options: used_link_number[options["linknumber"]] += 1 if validate.is_integer(options["linknumber"], 0, constants.LINKS_KNET_MAX - 1): if int(options["linknumber"]) >= max_allowed_link_count: # first link is link0, hence >= report_items.append( reports.corosync_link_does_not_exist_cannot_update( options["linknumber"], link_count=max_allowed_link_count)) else: report_items.append( reports.invalid_option_value( "linknumber", options["linknumber"], f"0..{constants.LINKS_KNET_MAX - 1}")) report_items += ( validate.run_collection_of_option_validators(options, validators) + validate.names_in(allowed_options, options.keys(), "link")) non_unique_linknumbers = [ number for number, count in used_link_number.items() if count > 1 ] if non_unique_linknumbers: report_items.append( reports.corosync_link_number_duplication(non_unique_linknumbers)) report_items.extend( _check_link_options_count(len(link_list), max_allowed_link_count)) return report_items