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_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