Blame libnmstate/validator.py

Packit b9ca78
#
Packit b9ca78
# Copyright (c) 2018-2020 Red Hat, Inc.
Packit b9ca78
#
Packit b9ca78
# This file is part of nmstate
Packit b9ca78
#
Packit b9ca78
# This program is free software: you can redistribute it and/or modify
Packit b9ca78
# it under the terms of the GNU Lesser General Public License as published by
Packit b9ca78
# the Free Software Foundation, either version 2.1 of the License, or
Packit b9ca78
# (at your option) any later version.
Packit b9ca78
#
Packit b9ca78
# This program is distributed in the hope that it will be useful,
Packit b9ca78
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit b9ca78
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit b9ca78
# GNU Lesser General Public License for more details.
Packit b9ca78
#
Packit b9ca78
# You should have received a copy of the GNU Lesser General Public License
Packit b9ca78
# along with this program. If not, see <https://www.gnu.org/licenses/>.
Packit b9ca78
#
Packit b9ca78
Packit b9ca78
import copy
Packit b9ca78
import logging
Packit b9ca78
Packit b9ca78
import jsonschema as js
Packit b9ca78
Packit b9ca78
from libnmstate.ifaces.ovs import is_ovs_running
Packit b9ca78
from libnmstate.schema import Interface
Packit b9ca78
from libnmstate.schema import InterfaceType
Packit b9ca78
from libnmstate.error import NmstateDependencyError
Packit b9ca78
Packit b9ca78
from . import schema
Packit b9ca78
from .plugin import NmstatePlugin
Packit b9ca78
Packit b9ca78
MAX_SUPPORTED_INTERFACES = 1000
Packit b9ca78
Packit b9ca78
Packit b9ca78
def schema_validate(data, validation_schema=schema.ifaces_schema):
Packit b9ca78
    data = copy.deepcopy(data)
Packit b9ca78
    _validate_max_supported_intface_count(data)
Packit b9ca78
    for ifstate in data.get(schema.Interface.KEY, ()):
Packit b9ca78
        if not ifstate.get(schema.Interface.TYPE):
Packit b9ca78
            ifstate[schema.Interface.TYPE] = schema.InterfaceType.UNKNOWN
Packit b9ca78
    js.validate(data, validation_schema)
Packit b9ca78
Packit b9ca78
Packit b9ca78
def validate_capabilities(state, capabilities):
Packit b9ca78
    validate_interface_capabilities(state.get(Interface.KEY, []), capabilities)
Packit b9ca78
Packit b9ca78
Packit b9ca78
def validate_interface_capabilities(ifaces_state, capabilities):
Packit b9ca78
    ifaces_types = {iface_state.get("type") for iface_state in ifaces_state}
Packit b9ca78
    has_ovs_capability = NmstatePlugin.OVS_CAPABILITY in capabilities
Packit b9ca78
    has_team_capability = NmstatePlugin.TEAM_CAPABILITY in capabilities
Packit b9ca78
    ovs_is_running = is_ovs_running()
Packit b9ca78
    for iface_type in ifaces_types:
Packit b9ca78
        is_ovs_type = iface_type in (
Packit b9ca78
            InterfaceType.OVS_BRIDGE,
Packit b9ca78
            InterfaceType.OVS_INTERFACE,
Packit b9ca78
            InterfaceType.OVS_PORT,
Packit b9ca78
        )
Packit b9ca78
        if is_ovs_type and not has_ovs_capability:
Packit b9ca78
            if not ovs_is_running:
Packit b9ca78
                raise NmstateDependencyError(
Packit b9ca78
                    "openvswitch service is not started."
Packit b9ca78
                )
Packit b9ca78
            else:
Packit b9ca78
                raise NmstateDependencyError(
Packit b9ca78
                    "Open vSwitch NetworkManager support not installed "
Packit b9ca78
                    "and started"
Packit b9ca78
                )
Packit b9ca78
        elif iface_type == InterfaceType.TEAM and not has_team_capability:
Packit b9ca78
            raise NmstateDependencyError(
Packit b9ca78
                "NetworkManager-team plugin not installed and started"
Packit b9ca78
            )
Packit b9ca78
Packit b9ca78
Packit b9ca78
def _validate_max_supported_intface_count(data):
Packit b9ca78
    """
Packit b9ca78
    Raises warning if the interfaces count in the single desired state
Packit b9ca78
    exceeds the limit specified in MAX_SUPPORTED_INTERFACES
Packit b9ca78
    """
Packit b9ca78
    num_of_interfaces = len(
Packit b9ca78
        [intface for intface in data.get(schema.Interface.KEY, ())]
Packit b9ca78
    )
Packit b9ca78
    if num_of_interfaces > MAX_SUPPORTED_INTERFACES:
Packit b9ca78
        logging.warning(
Packit b9ca78
            "Interfaces count exceeds the limit %s in desired state",
Packit b9ca78
            MAX_SUPPORTED_INTERFACES,
Packit b9ca78
        )