Exemplo n.º 1
0
    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
Exemplo n.º 2
0
 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
Exemplo n.º 3
0
 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)
Exemplo n.º 4
0
 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}
Exemplo n.º 5
0
 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))
Exemplo n.º 6
0
 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"],
     }
Exemplo n.º 7
0
 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"]
Exemplo n.º 8
0
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
Exemplo n.º 9
0
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
Exemplo n.º 10
0
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
Exemplo n.º 11
0
    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