def _validate_container_docker_options_update( docker_el, options, force_options ): validators = [ # image is a mandatory attribute and cannot be removed validate.value_not_empty("image", "image name"), validate.value_empty_or_valid( "masters", validate.value_nonnegative_integer("masters") ), validate.value_empty_or_valid( "replicas", validate.value_positive_integer("replicas") ), validate.value_empty_or_valid( "replicas-per-host", validate.value_positive_integer("replicas-per-host") ), ] return ( validate.run_collection_of_option_validators(options, validators) + validate.names_in( # allow to remove options even if they are not allowed _docker_options | _options_to_remove(options), options.keys(), "container", report_codes.FORCE_OPTIONS, force_options ) )
def __get_heuristics_options_validators( self, allow_empty_values=False, force_options=False ): validators = { "mode": validate.value_in( "mode", ("off", "on", "sync"), code_to_allow_extra_values=report_codes.FORCE_OPTIONS, allow_extra_values=force_options ), "interval": validate.value_positive_integer( "interval", code_to_allow_extra_values=report_codes.FORCE_OPTIONS, allow_extra_values=force_options ), "sync_timeout": validate.value_positive_integer( "sync_timeout", code_to_allow_extra_values=report_codes.FORCE_OPTIONS, allow_extra_values=force_options ), "timeout": validate.value_positive_integer( "timeout", code_to_allow_extra_values=report_codes.FORCE_OPTIONS, allow_extra_values=force_options ), } if not allow_empty_values: # make sure to return a list even in python3 so we can call append # on it return list(validators.values()) return [ validate.value_empty_or_valid(option_name, validator) for option_name, validator in validators.items() ]
def _validate_container(container_type, container_options, force_options=False): if not container_type in GENERIC_CONTAINER_TYPES: return [ reports.invalid_option_value( "container type", container_type, GENERIC_CONTAINER_TYPES, ) ] validators = [ validate.is_required("image", "container"), validate.value_not_empty("image", "image name"), validate.value_nonnegative_integer("masters"), validate.value_nonnegative_integer("promoted-max"), validate.mutually_exclusive(["masters", "promoted-max"], "container"), validate.value_positive_integer("replicas"), validate.value_positive_integer("replicas-per-host"), ] deprecation_reports = [] if "masters" in container_options: deprecation_reports.append( reports.deprecated_option("masters", ["promoted-max"], "container", severity=ReportItemSeverity.WARNING)) return (validate.run_collection_of_option_validators( container_options, validators) + deprecation_reports + validate.names_in(GENERIC_CONTAINER_OPTIONS, container_options.keys(), "container", report_codes.FORCE_OPTIONS, force_options))
def _validate_generic_container_options_update(docker_el, options, force_options): validators = [ # image is a mandatory attribute and cannot be removed validate.value_not_empty("image", "image name"), validate.value_empty_or_valid( "masters", validate.value_nonnegative_integer("masters")), validate.value_empty_or_valid( "promoted-max", validate.value_nonnegative_integer("promoted-max")), validate.value_empty_or_valid( "replicas", validate.value_positive_integer("replicas")), validate.value_empty_or_valid( "replicas-per-host", validate.value_positive_integer("replicas-per-host")), ] # CIB does not allow both to be set. Deleting both is not a problem, # though. Deleting one while setting another also works and is further # checked bellow. if not (options.get("masters", "") == "" or options.get("promoted-max", "") == ""): validators.append( validate.mutually_exclusive(["masters", "promoted-max"], "container")) deprecation_reports = [] if options.get("masters"): # If the user wants to delete the masters option, do not report it is # deprecated. They may be removing it because they just found out it is # deprecated. deprecation_reports.append( reports.deprecated_option("masters", ["promoted-max"], "container", severity=ReportItemSeverity.WARNING)) # Do not allow to set masters if promoted-max is set unless promoted-max is # going to be removed now. Do the same check also the other way around. CIB # only allows one of them to be set. if (options.get("masters") and docker_el.get("promoted-max") and options.get("promoted-max") != ""): deprecation_reports.append( reports.prerequisite_option_must_not_be_set( "masters", "promoted-max", "container", "container")) if (options.get("promoted-max") and docker_el.get("masters") and options.get("masters") != ""): deprecation_reports.append( reports.prerequisite_option_must_not_be_set( "promoted-max", "masters", "container", "container")) return (validate.run_collection_of_option_validators(options, validators) + deprecation_reports + validate.names_in( # allow to remove options even if they are not allowed _generic_container_options | _options_to_remove(options), options.keys(), "container", report_codes.FORCE_OPTIONS, force_options))
def _validate_container_docker_options_new(options, force_options): validators = [ validate.is_required("image", "container"), validate.value_not_empty("image", "image name"), validate.value_nonnegative_integer("masters"), validate.value_positive_integer("replicas"), validate.value_positive_integer("replicas-per-host"), ] return (validate.run_collection_of_option_validators(options, validators) + validate.names_in(_docker_options, options.keys(), "container", report_codes.FORCE_OPTIONS, force_options))
def _get_quorum_options_validators(allow_empty_values=False): allowed_bool = ("0", "1") validators = { "auto_tie_breaker": validate.value_in( "auto_tie_breaker", allowed_bool ), "last_man_standing": validate.value_in( "last_man_standing", allowed_bool ), "last_man_standing_window": validate.value_positive_integer( "last_man_standing_window" ), "wait_for_all": validate.value_in( "wait_for_all", allowed_bool ), } if not allow_empty_values: # make sure to return a list even in python3 so we can call append # on it return list(validators.values()) return [ validate.value_empty_or_valid(option_name, validator) for option_name, validator in validators.items() ]
def create_transport_udp(generic_options, compression_options, crypto_options): """ Validate creating udp/udpu transport options dict generic_options -- generic transport options dict compression_options -- compression options dict crypto_options -- crypto options """ # No need to support force: # * values are either an enum or numbers with no range set - nothing to # force # * names are strictly set as we cannot risk the user overwrites some # setting they should not to # * changes to names and values in corosync are very rare allowed_options = [ "ip_version", "netmtu", ] validators = [ validate.value_in("ip_version", constants.IP_VERSION_VALUES), validate.value_positive_integer("netmtu"), ] report_items = (validate.run_collection_of_option_validators( generic_options, validators) + validate.names_in( allowed_options, generic_options.keys(), "udp/udpu transport")) if compression_options: report_items.append( reports.corosync_transport_unsupported_options( "compression", "udp/udpu", ("knet", ))) if crypto_options: report_items.append( reports.corosync_transport_unsupported_options( "crypto", "udp/udpu", ("knet", ))) return report_items
def _get_qdevice_generic_options_validators(allow_empty_values=False, force_options=False): allow_extra_values = validate.allow_extra_values( report_codes.FORCE_OPTIONS, force_options) validators = { "sync_timeout": validate.value_positive_integer("sync_timeout", **allow_extra_values), "timeout": validate.value_positive_integer("timeout", **allow_extra_values), } if not allow_empty_values: # make sure to return a list even in python3 so we can call append # on it return list(validators.values()) return [ validate.value_empty_or_valid(option_name, validator) for option_name, validator in validators.items() ]
def test_report_invalid_value(self): assert_report_item_list_equal( validate.value_positive_integer("key")({ "key": "0" }), [ (severities.ERROR, report_codes.INVALID_OPTION_VALUE, { "option_name": "key", "option_value": "0", "allowed_values": "a positive integer", }, None), ])
def _validate_generic_container_options_new(options, force_options): validators = [ validate.is_required("image", "container"), validate.value_not_empty("image", "image name"), validate.value_nonnegative_integer("masters"), validate.value_nonnegative_integer("promoted-max"), validate.mutually_exclusive(["masters", "promoted-max"], "container"), validate.value_positive_integer("replicas"), validate.value_positive_integer("replicas-per-host"), ] deprecation_reports = [] if "masters" in options: deprecation_reports.append( reports.deprecated_option("masters", ["promoted-max"], "container", severity=ReportItemSeverity.WARNING)) return (validate.run_collection_of_option_validators(options, validators) + deprecation_reports + validate.names_in( _generic_container_options, options.keys(), "container", report_codes.FORCE_OPTIONS, force_options))
def test_report_invalid_value(self): assert_report_item_list_equal( validate.value_positive_integer("key")({"key": "0"}), [ ( severities.ERROR, report_codes.INVALID_OPTION_VALUE, { "option_name": "key", "option_value": "0", "allowed_values": "a positive integer", }, None ), ] )
def test_empty_report_on_valid_option(self): assert_report_item_list_equal( validate.value_positive_integer("key")({ "key": "10" }), [])
def test_empty_report_on_valid_option(self): assert_report_item_list_equal( validate.value_positive_integer("key")({"key": "10"}), [] )