def _validate_post(self, value, name, result): network = result["network"] family = network["family"] result["network"] = network["address"] result["family"] = family gateway = result["gateway"] if gateway is not None: if family != gateway["family"]: raise ValidationError( name, "conflicting address family between network and gateway '%s'" % (gateway["address"]), ) result["gateway"] = gateway["address"] prefix = result["prefix"] if prefix is None: prefix = Util.addr_family_default_prefix(family) result["prefix"] = prefix elif not Util.addr_family_valid_prefix(family, prefix): raise ValidationError(name, "invalid prefix %s in '%s'" % (prefix, value)) return result
def _validate_post(self, value, name, result): family = result["family"] prefix = result["prefix"] if prefix is None: prefix = Util.addr_family_default_prefix(family) result["prefix"] = prefix elif not Util.addr_family_valid_prefix(family, prefix): raise ValidationError(name, "invalid prefix %s in '%s'" % (prefix, value)) return result
def _validate_impl(self, value, name): v = ArgValidatorStr._validate_impl(self, value, name) try: addr = Util.mac_aton(v, self.force_len) except MyError: raise ValidationError( name, "value '%s' is not a valid MAC address" % (value)) if not addr: raise ValidationError( name, "value '%s' is not a valid MAC address" % (value)) return Util.mac_ntoa(addr)
def _validate_impl(self, value, name): v = ArgValidatorStr._validate_impl(self, value, name) try: addr, family = Util.parse_ip(v, self.family) except Exception: raise ValidationError( name, "value '%s' is not a valid IP%s address" % (value, Util.addr_family_to_v(self.family)), ) if self.plain_address: return addr return {"family": family, "address": addr}
def _validate_impl(self, value, name): try: if isinstance(value, bool): return value if isinstance(value, Util.STRING_TYPE) or isinstance(value, int): return Util.boolean(value) except Exception: pass raise ValidationError(name, "must be an boolean but is '%s'" % (value))
def _validate_impl(self, value, name): if isinstance(value, Util.STRING_TYPE): v = str(value) if not v: raise ValidationError(name, "cannot be empty") try: return Util.parse_address(v, self.family) except Exception: raise ValidationError( name, "value '%s' is not a valid IP%s address with prefix length" % (value, Util.addr_family_to_v(self.family)), ) v = ArgValidatorDict._validate_impl(self, value, name) return { "address": v["address"]["address"], "family": v["address"]["family"], "prefix": v["prefix"], }
def connection_find_master(name, connections, n_connections=None): c = ArgUtil.connection_find_by_name(name, connections, n_connections) if not c: raise MyError("invalid master/parent '%s'" % (name)) if c["interface_name"] is None: raise MyError( "invalid master/parent '%s' which needs an 'interface_name'" % (name)) if not Util.ifname_valid(c["interface_name"]): raise MyError( "invalid master/parent '%s' with invalid 'interface_name' ('%s')" % (name, c["interface_name"])) return c["interface_name"]
def get_nm_ethtool_ring(name): """ Translate ethtool ring option into NetworkManager attribute name :param name: Name of the ring :type name: str :returns: Name of the setting to be used by `NM.SettingEthtool.set_ring()` :rtype: str """ name = ETHTOOL_RING_PREFIX + name.upper() ring = getattr(Util.NM(), name, None) return ring
def get_nm_ethtool_feature(name): """ Translate ethtool feature into Network Manager name :param name: Name of the feature :type name: str :returns: Name of the feature to be used by `NM.SettingEthtool.set_feature()` :rtype: str """ name = ETHTOOL_FEATURE_PREFIX + name.upper() feature = getattr(Util.NM(), name, None) return feature
def get_nm_ethtool_coalesce(name): """ Translate ethtool coalesce into Network Manager name :param name: Name of the coalesce :type name: str :returns: Name of the setting to be used by `NM.SettingEthtool.set_coalesce()` :rtype: str """ name = ETHTOOL_COALESCE_PREFIX + name.upper() coalesce = getattr(Util.NM(), name, None) return coalesce
def _validate_post(self, value, name, result): result = self._validate_post_state(value, name, result) result = self._validate_post_fields(value, name, result) if "type" in result: if "master" in result: if "slave_type" not in result: result["slave_type"] = None if result["master"] == result["name"]: raise ValidationError( name + ".master", '"master" cannot refer to itself' ) else: if "slave_type" in result: raise ValidationError( name + ".slave_type", "'slave_type' requires a 'master' property", ) if "ip" in result: if "master" in result: raise ValidationError( name + ".ip", 'a slave cannot have an "ip" property' ) else: if "master" not in result: result["ip"] = self.nested["ip"].get_default_value() if "zone" in result: if "master" in result: raise ValidationError( name + ".zone", '"zone" cannot be configured for slave types' ) else: result["zone"] = None if "mac" in result: if result["type"] not in ["ethernet", "infiniband"]: raise ValidationError( name + ".mac", "a 'mac' address is only allowed for type 'ethernet' " "or 'infiniband'", ) maclen = len(Util.mac_aton(result["mac"])) if result["type"] == "ethernet" and maclen != 6: raise ValidationError( name + ".mac", "a 'mac' address for type ethernet requires 6 octets " "but is '%s'" % result["mac"], ) if result["type"] == "infiniband" and maclen != 20: raise ValidationError( name + ".mac", "a 'mac' address for type ethernet requires 20 octets " "but is '%s'" % result["mac"], ) if result["type"] == "infiniband": if "infiniband" not in result: result["infiniband"] = self.nested[ "infiniband" ].get_default_infiniband() if "infiniband_transport_mode" in result: result["infiniband"]["transport_mode"] = result[ "infiniband_transport_mode" ] del result["infiniband_transport_mode"] if "infiniband_p_key" in result: result["infiniband"]["p_key"] = result["infiniband_p_key"] del result["infiniband_p_key"] else: if "infiniband_transport_mode" in result: raise ValidationError( name + ".infiniband_transport_mode", "cannot mix deprecated 'infiniband_transport_mode' " "property with 'infiniband' settings", ) if "infiniband_p_key" in result: raise ValidationError( name + ".infiniband_p_key", "cannot mix deprecated 'infiniband_p_key' property " "with 'infiniband' settings", ) if result["infiniband"]["transport_mode"] is None: result["infiniband"]["transport_mode"] = "datagram" if result["infiniband"]["p_key"] != -1: if "mac" not in result and "parent" not in result: raise ValidationError( name + ".infiniband.p_key", "a infiniband device with 'infiniband.p_key' " "property also needs 'mac' or 'parent' property", ) else: if "infiniband" in result: raise ValidationError( name + ".infiniband", "'infiniband' settings are only allowed for type 'infiniband'", ) if "infiniband_transport_mode" in result: raise ValidationError( name + ".infiniband_transport_mode", "a 'infiniband_transport_mode' property is only " "allowed for type 'infiniband'", ) if "infiniband_p_key" in result: raise ValidationError( name + ".infiniband_p_key", "a 'infiniband_p_key' property is only allowed for " "type 'infiniband'", ) if "interface_name" in result: # Ignore empty interface_name if result["interface_name"] == "": del result["interface_name"] elif not Util.ifname_valid(result["interface_name"]): raise ValidationError( name + ".interface_name", "invalid 'interface_name' '%s'" % (result["interface_name"]), ) else: if not result.get("mac"): if not Util.ifname_valid(result["name"]): raise ValidationError( name + ".interface_name", "'interface_name' as 'name' '%s' is not valid" % (result["name"]), ) result["interface_name"] = result["name"] if "interface_name" not in result and result["type"] in [ "bond", "bridge", "macvlan", "team", "vlan", ]: raise ValidationError( name + ".interface_name", "type '%s' requires 'interface_name'" % (result["type"]), ) if result["type"] == "vlan": if "vlan" not in result: if "vlan_id" not in result: raise ValidationError( name + ".vlan", 'missing "vlan" settings for "type" "vlan"' ) result["vlan"] = self.nested["vlan"].get_default_vlan() result["vlan"]["id"] = result["vlan_id"] del result["vlan_id"] else: if "vlan_id" in result: raise ValidationError( name + ".vlan_id", "don't use the deprecated 'vlan_id' together with the " "'vlan' settings'", ) if "parent" not in result: raise ValidationError( name + ".parent", 'missing "parent" for "type" "vlan"' ) else: if "vlan" in result: raise ValidationError( name + ".vlan", '"vlan" is only allowed for "type" "vlan"' ) if "vlan_id" in result: raise ValidationError( name + ".vlan_id", '"vlan_id" is only allowed for "type" "vlan"' ) if "parent" in result: if result["type"] not in ["vlan", "macvlan", "infiniband"]: raise ValidationError( name + ".parent", "'parent' is only allowed for type 'vlan', 'macvlan' or " "'infiniband'", ) if result["parent"] == result["name"]: raise ValidationError( name + ".parent", '"parent" cannot refer to itself' ) if result["type"] == "bond": if "bond" not in result: result["bond"] = self.nested["bond"].get_default_bond() else: if "bond" in result: raise ValidationError( name + ".bond", "'bond' settings are not allowed for 'type' '%s'" % (result["type"]), ) if result["type"] in ["ethernet", "vlan", "bridge", "bond", "team"]: if "ethernet" not in result: result["ethernet"] = self.nested["ethernet"].get_default_ethernet() else: if "ethernet" in result: raise ValidationError( name + ".ethernet", "'ethernet' settings are not allowed for 'type' '%s'" % (result["type"]), ) if result["type"] == "macvlan": if "macvlan" not in result: result["macvlan"] = self.nested["macvlan"].get_default_macvlan() else: if "macvlan" in result: raise ValidationError( name + ".macvlan", "'macvlan' settings are not allowed for 'type' '%s'" % (result["type"]), ) for k in self.VALID_FIELDS: if k in result: continue v = self.nested[k] vv = v.get_default_value() if vv is not ArgValidator.MISSING: result[k] = vv return result