Blame tests/integration/static_ip_address_test.py

Packit Service 5e62f7
#
Packit Service 5e62f7
# Copyright (c) 2018-2019 Red Hat, Inc.
Packit Service 5e62f7
#
Packit Service 5e62f7
# This file is part of nmstate
Packit Service 5e62f7
#
Packit Service 5e62f7
# This program is free software: you can redistribute it and/or modify
Packit Service 5e62f7
# it under the terms of the GNU Lesser General Public License as published by
Packit Service 5e62f7
# the Free Software Foundation, either version 2.1 of the License, or
Packit Service 5e62f7
# (at your option) any later version.
Packit Service 5e62f7
#
Packit Service 5e62f7
# This program is distributed in the hope that it will be useful,
Packit Service 5e62f7
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 5e62f7
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 5e62f7
# GNU Lesser General Public License for more details.
Packit Service 5e62f7
#
Packit Service 5e62f7
# You should have received a copy of the GNU Lesser General Public License
Packit Service 5e62f7
# along with this program. If not, see <https://www.gnu.org/licenses/>.
Packit Service 5e62f7
#
Packit Service 5e62f7
Packit Service 5e62f7
import pytest
Packit Service 5e62f7
Packit Service 5e62f7
import libnmstate
Packit Service 5e62f7
from libnmstate.iplib import is_ipv6_link_local_addr
Packit Service 5e62f7
from libnmstate.schema import Interface
Packit Service 5e62f7
from libnmstate.schema import InterfaceIPv4
Packit Service 5e62f7
from libnmstate.schema import InterfaceIPv6
Packit Service 5e62f7
from libnmstate.schema import InterfaceState
Packit Service 5e62f7
from libnmstate.schema import InterfaceType
Packit Service 5e62f7
Packit Service 5e62f7
from .testlib import assertlib
Packit Service 5e62f7
from .testlib import cmdlib
Packit Service 5e62f7
from .testlib import statelib
Packit Service 5e62f7
from .testlib.dummy import nm_unmanaged_dummy
Packit Service 5e62f7
from .testlib.iproutelib import ip_monitor_assert_stable_link_up
Packit Service 5e62f7
Packit Service 5e62f7
# TEST-NET addresses: https://tools.ietf.org/html/rfc5737#section-3
Packit Service 5e62f7
IPV4_ADDRESS1 = "192.0.2.251"
Packit Service 5e62f7
IPV4_ADDRESS2 = "192.0.2.252"
Packit Service 5e62f7
IPV4_ADDRESS3 = "198.51.100.249"
Packit Service 5e62f7
IPV4_ADDRESS4 = "198.51.100.250"
Packit Service 5e62f7
# IPv6 Address Prefix Reserved for Documentation:
Packit Service 5e62f7
# https://tools.ietf.org/html/rfc3849
Packit Service 5e62f7
IPV6_ADDRESS1 = "2001:db8:1::1"
Packit Service 5e62f7
IPV6_ADDRESS2 = "2001:db8:2::1"
Packit Service 5e62f7
IPV6_LINK_LOCAL_ADDRESS1 = "fe80::1"
Packit Service 5e62f7
IPV6_LINK_LOCAL_ADDRESS2 = "fe80::2"
Packit Service 5e62f7
Packit Service 5e62f7
DUMMY1 = "dummy1"
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
@pytest.fixture
Packit Service 5e62f7
def setup_eth1_ipv4(eth1_up):
Packit Service 5e62f7
    desired_state = {
Packit Service 5e62f7
        Interface.KEY: [
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth1",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.STATE: InterfaceState.UP,
Packit Service 5e62f7
                Interface.IPV4: {
Packit Service 5e62f7
                    InterfaceIPv4.ENABLED: True,
Packit Service 5e62f7
                    InterfaceIPv4.ADDRESS: [
Packit Service 5e62f7
                        {
Packit Service 5e62f7
                            InterfaceIPv4.ADDRESS_IP: IPV4_ADDRESS1,
Packit Service 5e62f7
                            InterfaceIPv4.ADDRESS_PREFIX_LENGTH: 24,
Packit Service 5e62f7
                        }
Packit Service 5e62f7
                    ],
Packit Service 5e62f7
                },
Packit Service 5e62f7
            }
Packit Service 5e62f7
        ]
Packit Service 5e62f7
    }
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
    yield desired_state
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
@pytest.fixture
Packit Service 5e62f7
def setup_eth1_ipv6(eth1_up):
Packit Service 5e62f7
    desired_state = {
Packit Service 5e62f7
        Interface.KEY: [
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth1",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.STATE: InterfaceState.UP,
Packit Service 5e62f7
                Interface.IPV6: {
Packit Service 5e62f7
                    InterfaceIPv6.ENABLED: True,
Packit Service 5e62f7
                    InterfaceIPv6.ADDRESS: [
Packit Service 5e62f7
                        {
Packit Service 5e62f7
                            InterfaceIPv6.ADDRESS_IP: IPV6_ADDRESS1,
Packit Service 5e62f7
                            InterfaceIPv6.ADDRESS_PREFIX_LENGTH: 64,
Packit Service 5e62f7
                        }
Packit Service 5e62f7
                    ],
Packit Service 5e62f7
                },
Packit Service 5e62f7
            }
Packit Service 5e62f7
        ]
Packit Service 5e62f7
    }
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    return desired_state
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
@pytest.fixture
Packit Service 5e62f7
def setup_eth1_ipv6_disable(eth1_up):
Packit Service 5e62f7
    desired_state = {
Packit Service 5e62f7
        Interface.KEY: [
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth1",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.STATE: InterfaceState.UP,
Packit Service 5e62f7
                Interface.IPV6: {InterfaceIPv6.ENABLED: False},
Packit Service 5e62f7
            }
Packit Service 5e62f7
        ]
Packit Service 5e62f7
    }
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    return desired_state
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
def test_add_static_ipv4_with_full_state(eth1_up):
Packit Service 5e62f7
    desired_state = statelib.show_only(("eth1",))
Packit Service 5e62f7
    eth1_desired_state = desired_state[Interface.KEY][0]
Packit Service 5e62f7
Packit Service 5e62f7
    eth1_desired_state[Interface.STATE] = InterfaceState.UP
Packit Service 5e62f7
    eth1_desired_state[Interface.IPV4][InterfaceIPv4.ENABLED] = True
Packit Service 5e62f7
    eth1_desired_state[Interface.IPV4][InterfaceIPv4.ADDRESS] = [
Packit Service 5e62f7
        {
Packit Service 5e62f7
            InterfaceIPv4.ADDRESS_IP: IPV4_ADDRESS3,
Packit Service 5e62f7
            InterfaceIPv4.ADDRESS_PREFIX_LENGTH: 24,
Packit Service 5e62f7
        }
Packit Service 5e62f7
    ]
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    assertlib.assert_state(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
@pytest.mark.tier1
Packit Service 5e62f7
def test_add_static_ipv4_with_min_state(eth2_up):
Packit Service 5e62f7
    desired_state = {
Packit Service 5e62f7
        Interface.KEY: [
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth2",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.STATE: InterfaceState.UP,
Packit Service 5e62f7
                Interface.IPV4: {
Packit Service 5e62f7
                    InterfaceIPv4.ENABLED: True,
Packit Service 5e62f7
                    InterfaceIPv4.ADDRESS: [
Packit Service 5e62f7
                        {
Packit Service 5e62f7
                            InterfaceIPv4.ADDRESS_IP: IPV4_ADDRESS4,
Packit Service 5e62f7
                            InterfaceIPv4.ADDRESS_PREFIX_LENGTH: 24,
Packit Service 5e62f7
                        }
Packit Service 5e62f7
                    ],
Packit Service 5e62f7
                },
Packit Service 5e62f7
            }
Packit Service 5e62f7
        ]
Packit Service 5e62f7
    }
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    assertlib.assert_state(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
@pytest.mark.tier1
Packit Service 5e62f7
def test_remove_static_ipv4(setup_eth1_ipv4):
Packit Service 5e62f7
    desired_state = {
Packit Service 5e62f7
        Interface.KEY: [
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth1",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.IPV4: {InterfaceIPv4.ENABLED: False},
Packit Service 5e62f7
            }
Packit Service 5e62f7
        ]
Packit Service 5e62f7
    }
Packit Service 5e62f7
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    assertlib.assert_state(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
@pytest.mark.tier1
Packit Service 5e62f7
def test_edit_static_ipv4_address_and_prefix(setup_eth1_ipv4):
Packit Service 5e62f7
    desired_state = {
Packit Service 5e62f7
        Interface.KEY: [
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth1",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.STATE: InterfaceState.UP,
Packit Service 5e62f7
                Interface.IPV4: {
Packit Service 5e62f7
                    InterfaceIPv4.ENABLED: True,
Packit Service 5e62f7
                    InterfaceIPv4.ADDRESS: [
Packit Service 5e62f7
                        {
Packit Service 5e62f7
                            InterfaceIPv4.ADDRESS_IP: IPV4_ADDRESS2,
Packit Service 5e62f7
                            InterfaceIPv4.ADDRESS_PREFIX_LENGTH: 30,
Packit Service 5e62f7
                        }
Packit Service 5e62f7
                    ],
Packit Service 5e62f7
                },
Packit Service 5e62f7
            }
Packit Service 5e62f7
        ]
Packit Service 5e62f7
    }
Packit Service 5e62f7
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    assertlib.assert_state(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
def test_add_ifaces_with_same_static_ipv4_address_in_one_transaction(
Packit Service 5e62f7
    eth1_up, eth2_up
Packit Service 5e62f7
):
Packit Service 5e62f7
    desired_state = {
Packit Service 5e62f7
        Interface.KEY: [
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth1",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.STATE: InterfaceState.UP,
Packit Service 5e62f7
                Interface.IPV4: {
Packit Service 5e62f7
                    InterfaceIPv4.ENABLED: True,
Packit Service 5e62f7
                    InterfaceIPv4.ADDRESS: [
Packit Service 5e62f7
                        {
Packit Service 5e62f7
                            InterfaceIPv4.ADDRESS_IP: IPV4_ADDRESS1,
Packit Service 5e62f7
                            InterfaceIPv4.ADDRESS_PREFIX_LENGTH: 24,
Packit Service 5e62f7
                        }
Packit Service 5e62f7
                    ],
Packit Service 5e62f7
                },
Packit Service 5e62f7
            },
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth2",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.STATE: InterfaceState.UP,
Packit Service 5e62f7
                Interface.IPV4: {
Packit Service 5e62f7
                    InterfaceIPv4.ENABLED: True,
Packit Service 5e62f7
                    InterfaceIPv4.ADDRESS: [
Packit Service 5e62f7
                        {
Packit Service 5e62f7
                            InterfaceIPv4.ADDRESS_IP: IPV4_ADDRESS1,
Packit Service 5e62f7
                            InterfaceIPv4.ADDRESS_PREFIX_LENGTH: 24,
Packit Service 5e62f7
                        }
Packit Service 5e62f7
                    ],
Packit Service 5e62f7
                },
Packit Service 5e62f7
            },
Packit Service 5e62f7
        ]
Packit Service 5e62f7
    }
Packit Service 5e62f7
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    assertlib.assert_state(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
@pytest.mark.tier1
Packit Service 5e62f7
def test_add_iface_with_same_static_ipv4_address_to_existing(
Packit Service 5e62f7
    setup_eth1_ipv4, eth2_up
Packit Service 5e62f7
):
Packit Service 5e62f7
    desired_state = {
Packit Service 5e62f7
        Interface.KEY: [
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth2",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.STATE: InterfaceState.UP,
Packit Service 5e62f7
                Interface.IPV4: {
Packit Service 5e62f7
                    InterfaceIPv4.ENABLED: True,
Packit Service 5e62f7
                    InterfaceIPv4.ADDRESS: [
Packit Service 5e62f7
                        {
Packit Service 5e62f7
                            InterfaceIPv4.ADDRESS_IP: IPV4_ADDRESS1,
Packit Service 5e62f7
                            InterfaceIPv4.ADDRESS_PREFIX_LENGTH: 24,
Packit Service 5e62f7
                        }
Packit Service 5e62f7
                    ],
Packit Service 5e62f7
                },
Packit Service 5e62f7
            }
Packit Service 5e62f7
        ]
Packit Service 5e62f7
    }
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    assertlib.assert_state(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
@pytest.mark.tier1
Packit Service 5e62f7
def test_add_static_ipv6_with_full_state(eth1_up):
Packit Service 5e62f7
    desired_state = statelib.show_only(("eth1",))
Packit Service 5e62f7
    eth1_desired_state = desired_state[Interface.KEY][0]
Packit Service 5e62f7
    eth1_desired_state[Interface.STATE] = InterfaceState.UP
Packit Service 5e62f7
    eth1_desired_state[Interface.IPV6][InterfaceIPv6.ENABLED] = True
Packit Service 5e62f7
    eth1_desired_state[Interface.IPV6][InterfaceIPv6.ADDRESS] = [
Packit Service 5e62f7
        {
Packit Service 5e62f7
            InterfaceIPv6.ADDRESS_IP: IPV6_ADDRESS2,
Packit Service 5e62f7
            InterfaceIPv6.ADDRESS_PREFIX_LENGTH: 64,
Packit Service 5e62f7
        },
Packit Service 5e62f7
        # This sequence is intentionally made for IP address sorting.
Packit Service 5e62f7
        {
Packit Service 5e62f7
            InterfaceIPv6.ADDRESS_IP: IPV6_ADDRESS1,
Packit Service 5e62f7
            InterfaceIPv6.ADDRESS_PREFIX_LENGTH: 64,
Packit Service 5e62f7
        },
Packit Service 5e62f7
    ]
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
    assertlib.assert_state(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
def test_add_static_ipv6_with_link_local(eth1_up):
Packit Service 5e62f7
    desired_state = statelib.show_only(("eth1",))
Packit Service 5e62f7
    eth1_desired_state = desired_state[Interface.KEY][0]
Packit Service 5e62f7
    eth1_desired_state[Interface.STATE] = InterfaceState.UP
Packit Service 5e62f7
    eth1_desired_state[Interface.IPV6][InterfaceIPv6.ENABLED] = True
Packit Service 5e62f7
    eth1_desired_state[Interface.IPV6][InterfaceIPv6.ADDRESS] = [
Packit Service 5e62f7
        {
Packit Service 5e62f7
            InterfaceIPv6.ADDRESS_IP: IPV6_LINK_LOCAL_ADDRESS1,
Packit Service 5e62f7
            InterfaceIPv6.ADDRESS_PREFIX_LENGTH: 64,
Packit Service 5e62f7
        },
Packit Service 5e62f7
        {
Packit Service 5e62f7
            InterfaceIPv6.ADDRESS_IP: IPV6_ADDRESS1,
Packit Service 5e62f7
            InterfaceIPv6.ADDRESS_PREFIX_LENGTH: 64,
Packit Service 5e62f7
        },
Packit Service 5e62f7
    ]
Packit Service 5e62f7
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    # Make sure only the link local address got ignored.
Packit Service 5e62f7
    cur_state = statelib.show_only(("eth1",))
Packit Service 5e62f7
    eth1_cur_state = cur_state[Interface.KEY][0]
Packit Service 5e62f7
    assert (
Packit Service 5e62f7
        eth1_desired_state[Interface.IPV6][InterfaceIPv6.ADDRESS][0]
Packit Service 5e62f7
        not in eth1_cur_state[Interface.IPV6][InterfaceIPv6.ADDRESS]
Packit Service 5e62f7
    )
Packit Service 5e62f7
    assert (
Packit Service 5e62f7
        eth1_desired_state[Interface.IPV6][InterfaceIPv6.ADDRESS][1]
Packit Service 5e62f7
        in eth1_cur_state[Interface.IPV6][InterfaceIPv6.ADDRESS]
Packit Service 5e62f7
    )
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
def test_add_static_ipv6_with_link_local_only(eth1_up):
Packit Service 5e62f7
    desired_state = statelib.show_only(("eth1",))
Packit Service 5e62f7
    eth1_desired_state = desired_state[Interface.KEY][0]
Packit Service 5e62f7
    eth1_desired_state[Interface.STATE] = InterfaceState.UP
Packit Service 5e62f7
    eth1_desired_state[Interface.IPV6][InterfaceIPv6.ENABLED] = True
Packit Service 5e62f7
    eth1_desired_state[Interface.IPV6][InterfaceIPv6.ADDRESS] = [
Packit Service 5e62f7
        {
Packit Service 5e62f7
            InterfaceIPv6.ADDRESS_IP: IPV6_LINK_LOCAL_ADDRESS1,
Packit Service 5e62f7
            InterfaceIPv6.ADDRESS_PREFIX_LENGTH: 64,
Packit Service 5e62f7
        },
Packit Service 5e62f7
        {
Packit Service 5e62f7
            InterfaceIPv6.ADDRESS_IP: IPV6_LINK_LOCAL_ADDRESS2,
Packit Service 5e62f7
            InterfaceIPv6.ADDRESS_PREFIX_LENGTH: 64,
Packit Service 5e62f7
        },
Packit Service 5e62f7
    ]
Packit Service 5e62f7
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    # Make sure the link local address got ignored.
Packit Service 5e62f7
    cur_state = statelib.show_only(("eth1",))
Packit Service 5e62f7
    eth1_cur_state = cur_state[Interface.KEY][0]
Packit Service 5e62f7
    assert (
Packit Service 5e62f7
        eth1_desired_state[Interface.IPV6][InterfaceIPv6.ADDRESS][0]
Packit Service 5e62f7
        not in eth1_cur_state[Interface.IPV6][InterfaceIPv6.ADDRESS]
Packit Service 5e62f7
    )
Packit Service 5e62f7
    assert (
Packit Service 5e62f7
        eth1_desired_state[Interface.IPV6][InterfaceIPv6.ADDRESS][1]
Packit Service 5e62f7
        not in eth1_cur_state[Interface.IPV6][InterfaceIPv6.ADDRESS]
Packit Service 5e62f7
    )
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
@pytest.mark.tier1
Packit Service 5e62f7
def test_add_static_ipv6_with_no_address(eth1_up):
Packit Service 5e62f7
    desired_state = statelib.show_only(("eth1",))
Packit Service 5e62f7
    eth1_desired_state = desired_state[Interface.KEY][0]
Packit Service 5e62f7
    eth1_desired_state[Interface.STATE] = InterfaceState.UP
Packit Service 5e62f7
    eth1_desired_state[Interface.IPV6][InterfaceIPv6.ENABLED] = True
Packit Service 5e62f7
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    cur_state = statelib.show_only(("eth1",))
Packit Service 5e62f7
    eth1_cur_state = cur_state[Interface.KEY][0]
Packit Service 5e62f7
    # Should have at least 1 link-local address.
Packit Service 5e62f7
    assert len(eth1_cur_state[Interface.IPV6][InterfaceIPv6.ADDRESS]) >= 1
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
def test_add_static_ipv6_with_min_state(eth2_up):
Packit Service 5e62f7
    desired_state = {
Packit Service 5e62f7
        Interface.KEY: [
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth2",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.STATE: InterfaceState.UP,
Packit Service 5e62f7
                Interface.IPV6: {
Packit Service 5e62f7
                    InterfaceIPv6.ENABLED: True,
Packit Service 5e62f7
                    InterfaceIPv6.ADDRESS: [
Packit Service 5e62f7
                        {
Packit Service 5e62f7
                            InterfaceIPv6.ADDRESS_IP: IPV6_ADDRESS1,
Packit Service 5e62f7
                            InterfaceIPv6.ADDRESS_PREFIX_LENGTH: 64,
Packit Service 5e62f7
                        }
Packit Service 5e62f7
                    ],
Packit Service 5e62f7
                },
Packit Service 5e62f7
            }
Packit Service 5e62f7
        ]
Packit Service 5e62f7
    }
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    assertlib.assert_state(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
@pytest.mark.tier1
Packit Service 5e62f7
def test_disable_static_ipv6(setup_eth1_ipv6):
Packit Service 5e62f7
    desired_state = {
Packit Service 5e62f7
        Interface.KEY: [
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth1",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.IPV6: {InterfaceIPv6.ENABLED: False},
Packit Service 5e62f7
            }
Packit Service 5e62f7
        ]
Packit Service 5e62f7
    }
Packit Service 5e62f7
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    assertlib.assert_state(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
@pytest.mark.tier1
Packit Service 5e62f7
def test_disable_static_ipv6_and_rollback(setup_eth1_ipv6):
Packit Service 5e62f7
    desired_state = {
Packit Service 5e62f7
        Interface.KEY: [
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth1",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.IPV6: {InterfaceIPv6.ENABLED: False},
Packit Service 5e62f7
                "foo": "bad_value",
Packit Service 5e62f7
            }
Packit Service 5e62f7
        ]
Packit Service 5e62f7
    }
Packit Service 5e62f7
Packit Service 5e62f7
    with pytest.raises(libnmstate.error.NmstateVerificationError):
Packit Service 5e62f7
        libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    assertlib.assert_state(setup_eth1_ipv6)
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
@pytest.mark.tier1
Packit Service 5e62f7
def test_enable_ipv6_and_rollback_to_disable_ipv6(setup_eth1_ipv6_disable):
Packit Service 5e62f7
    desired_state = {
Packit Service 5e62f7
        Interface.KEY: [
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth1",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.IPV6: {
Packit Service 5e62f7
                    InterfaceIPv6.ENABLED: True,
Packit Service 5e62f7
                    InterfaceIPv6.ADDRESS: [
Packit Service 5e62f7
                        {
Packit Service 5e62f7
                            InterfaceIPv6.ADDRESS_IP: IPV6_ADDRESS1,
Packit Service 5e62f7
                            InterfaceIPv6.ADDRESS_PREFIX_LENGTH: 64,
Packit Service 5e62f7
                        }
Packit Service 5e62f7
                    ],
Packit Service 5e62f7
                },
Packit Service 5e62f7
                "foo": "bad_value",
Packit Service 5e62f7
            }
Packit Service 5e62f7
        ]
Packit Service 5e62f7
    }
Packit Service 5e62f7
Packit Service 5e62f7
    with pytest.raises(libnmstate.error.NmstateVerificationError):
Packit Service 5e62f7
        libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    assertlib.assert_state(setup_eth1_ipv6_disable)
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
@pytest.mark.tier1
Packit Service 5e62f7
def test_edit_static_ipv6_address_and_prefix(setup_eth1_ipv6):
Packit Service 5e62f7
    eth1_setup = setup_eth1_ipv6[Interface.KEY][0]
Packit Service 5e62f7
    desired_state = {
Packit Service 5e62f7
        Interface.KEY: [
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth1",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.STATE: InterfaceState.UP,
Packit Service 5e62f7
                Interface.IPV6: {
Packit Service 5e62f7
                    InterfaceIPv6.ENABLED: True,
Packit Service 5e62f7
                    InterfaceIPv6.ADDRESS: [
Packit Service 5e62f7
                        {
Packit Service 5e62f7
                            InterfaceIPv6.ADDRESS_IP: IPV6_ADDRESS2,
Packit Service 5e62f7
                            InterfaceIPv6.ADDRESS_PREFIX_LENGTH: 64,
Packit Service 5e62f7
                        }
Packit Service 5e62f7
                    ],
Packit Service 5e62f7
                },
Packit Service 5e62f7
            }
Packit Service 5e62f7
        ]
Packit Service 5e62f7
    }
Packit Service 5e62f7
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
    eth1_desired_state = desired_state[Interface.KEY][0]
Packit Service 5e62f7
    current_state = statelib.show_only(("eth1",))
Packit Service 5e62f7
Packit Service 5e62f7
    eth1_current_state = current_state[Interface.KEY][0]
Packit Service 5e62f7
Packit Service 5e62f7
    assert (
Packit Service 5e62f7
        eth1_desired_state[Interface.IPV6][InterfaceIPv6.ADDRESS][0]
Packit Service 5e62f7
        in eth1_current_state[Interface.IPV6][InterfaceIPv6.ADDRESS]
Packit Service 5e62f7
    )
Packit Service 5e62f7
Packit Service 5e62f7
    assert (
Packit Service 5e62f7
        eth1_setup[Interface.IPV6][InterfaceIPv6.ADDRESS][0]
Packit Service 5e62f7
        not in eth1_current_state[Interface.IPV6][InterfaceIPv6.ADDRESS]
Packit Service 5e62f7
    )
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
def test_add_ifaces_with_same_static_ipv6_address_in_one_transaction(
Packit Service 5e62f7
    eth1_up, eth2_up
Packit Service 5e62f7
):
Packit Service 5e62f7
    desired_state = {
Packit Service 5e62f7
        Interface.KEY: [
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth1",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.STATE: InterfaceState.UP,
Packit Service 5e62f7
                Interface.IPV6: {
Packit Service 5e62f7
                    InterfaceIPv6.ENABLED: True,
Packit Service 5e62f7
                    InterfaceIPv6.ADDRESS: [
Packit Service 5e62f7
                        {
Packit Service 5e62f7
                            InterfaceIPv6.ADDRESS_IP: IPV6_ADDRESS1,
Packit Service 5e62f7
                            InterfaceIPv6.ADDRESS_PREFIX_LENGTH: 64,
Packit Service 5e62f7
                        }
Packit Service 5e62f7
                    ],
Packit Service 5e62f7
                },
Packit Service 5e62f7
            },
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth2",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.STATE: InterfaceState.UP,
Packit Service 5e62f7
                Interface.IPV6: {
Packit Service 5e62f7
                    InterfaceIPv6.ENABLED: True,
Packit Service 5e62f7
                    InterfaceIPv6.ADDRESS: [
Packit Service 5e62f7
                        {
Packit Service 5e62f7
                            InterfaceIPv6.ADDRESS_IP: IPV6_ADDRESS1,
Packit Service 5e62f7
                            InterfaceIPv6.ADDRESS_PREFIX_LENGTH: 64,
Packit Service 5e62f7
                        }
Packit Service 5e62f7
                    ],
Packit Service 5e62f7
                },
Packit Service 5e62f7
            },
Packit Service 5e62f7
        ]
Packit Service 5e62f7
    }
Packit Service 5e62f7
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    assertlib.assert_state(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
def test_add_iface_with_same_static_ipv6_address_to_existing(
Packit Service 5e62f7
    setup_eth1_ipv6, eth2_up
Packit Service 5e62f7
):
Packit Service 5e62f7
    desired_state = {
Packit Service 5e62f7
        Interface.KEY: [
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: "eth2",
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.STATE: InterfaceState.UP,
Packit Service 5e62f7
                Interface.IPV6: {
Packit Service 5e62f7
                    InterfaceIPv6.ENABLED: True,
Packit Service 5e62f7
                    InterfaceIPv6.ADDRESS: [
Packit Service 5e62f7
                        {
Packit Service 5e62f7
                            InterfaceIPv6.ADDRESS_IP: IPV6_ADDRESS1,
Packit Service 5e62f7
                            InterfaceIPv6.ADDRESS_PREFIX_LENGTH: 64,
Packit Service 5e62f7
                        }
Packit Service 5e62f7
                    ],
Packit Service 5e62f7
                },
Packit Service 5e62f7
            }
Packit Service 5e62f7
        ]
Packit Service 5e62f7
    }
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
    assertlib.assert_state(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
def test_add_iface_with_static_ipv6_expanded_format(eth1_up):
Packit Service 5e62f7
    ipv6_addr_lead_zeroes = "2001:0db8:85a3:0000:0000:8a2e:0370:7331"
Packit Service 5e62f7
    desired_state = {
Packit Service 5e62f7
        Interface.KEY: [
Packit Service 5e62f7
            {
Packit Service 5e62f7
                Interface.NAME: eth1_up[Interface.KEY][0][Interface.NAME],
Packit Service 5e62f7
                Interface.TYPE: InterfaceType.ETHERNET,
Packit Service 5e62f7
                Interface.STATE: InterfaceState.UP,
Packit Service 5e62f7
                Interface.IPV6: {
Packit Service 5e62f7
                    InterfaceIPv6.ENABLED: True,
Packit Service 5e62f7
                    InterfaceIPv6.ADDRESS: [
Packit Service 5e62f7
                        {
Packit Service 5e62f7
                            InterfaceIPv6.ADDRESS_IP: ipv6_addr_lead_zeroes,
Packit Service 5e62f7
                            InterfaceIPv6.ADDRESS_PREFIX_LENGTH: 64,
Packit Service 5e62f7
                        }
Packit Service 5e62f7
                    ],
Packit Service 5e62f7
                },
Packit Service 5e62f7
            }
Packit Service 5e62f7
        ]
Packit Service 5e62f7
    }
Packit Service 5e62f7
    libnmstate.apply(desired_state)
Packit Service 5e62f7
    assertlib.assert_state(desired_state)
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
@pytest.mark.tier1
Packit Service 5e62f7
@ip_monitor_assert_stable_link_up("eth1")
Packit Service 5e62f7
def test_modify_ipv4_with_reapply(setup_eth1_ipv4):
Packit Service 5e62f7
    ipv4_addr = IPV4_ADDRESS2
Packit Service 5e62f7
    ipv4_state = setup_eth1_ipv4[Interface.KEY][0][Interface.IPV4]
Packit Service 5e62f7
    ipv4_state[InterfaceIPv4.ADDRESS][0][InterfaceIPv4.ADDRESS_IP] = ipv4_addr
Packit Service 5e62f7
    libnmstate.apply(setup_eth1_ipv4)
Packit Service 5e62f7
Packit Service 5e62f7
    assertlib.assert_state(setup_eth1_ipv4)
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
@pytest.mark.tier1
Packit Service 5e62f7
@ip_monitor_assert_stable_link_up("eth1")
Packit Service 5e62f7
def test_modify_ipv6_with_reapply(setup_eth1_ipv6):
Packit Service 5e62f7
    ipv6_addr = IPV6_ADDRESS2
Packit Service 5e62f7
    ipv6_state = setup_eth1_ipv6[Interface.KEY][0][Interface.IPV6]
Packit Service 5e62f7
    ipv6_state[InterfaceIPv6.ADDRESS][0][InterfaceIPv6.ADDRESS_IP] = ipv6_addr
Packit Service 5e62f7
    libnmstate.apply(setup_eth1_ipv6)
Packit Service 5e62f7
Packit Service 5e62f7
    assertlib.assert_state(setup_eth1_ipv6)
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
@pytest.mark.tier1
Packit Service 5e62f7
def test_get_ip_address_from_unmanaged_dummy():
Packit Service 5e62f7
    with nm_unmanaged_dummy(DUMMY1):
Packit Service 5e62f7
        cmdlib.exec_cmd(
Packit Service 5e62f7
            f"ip addr add {IPV4_ADDRESS1}/24 dev {DUMMY1}".split(), check=True
Packit Service 5e62f7
        )
Packit Service 5e62f7
        cmdlib.exec_cmd(
Packit Service 5e62f7
            f"ip -6 addr add {IPV6_ADDRESS2}/64 dev {DUMMY1}".split(),
Packit Service 5e62f7
            check=True,
Packit Service 5e62f7
        )
Packit Service 5e62f7
        iface_state = statelib.show_only((DUMMY1,))[Interface.KEY][0]
Packit Service 5e62f7
        # Remove IPv6 link local address
Packit Service 5e62f7
        iface_state[Interface.IPV6][InterfaceIPv6.ADDRESS] = [
Packit Service 5e62f7
            addr
Packit Service 5e62f7
            for addr in iface_state[Interface.IPV6][InterfaceIPv6.ADDRESS]
Packit Service 5e62f7
            if not is_ipv6_link_local_addr(
Packit Service 5e62f7
                addr[InterfaceIPv6.ADDRESS_IP],
Packit Service 5e62f7
                addr[InterfaceIPv6.ADDRESS_PREFIX_LENGTH],
Packit Service 5e62f7
            )
Packit Service 5e62f7
        ]
Packit Service 5e62f7
Packit Service 5e62f7
        assert iface_state[Interface.IPV4] == {
Packit Service 5e62f7
            InterfaceIPv4.ENABLED: True,
Packit Service 5e62f7
            InterfaceIPv4.ADDRESS: [
Packit Service 5e62f7
                {
Packit Service 5e62f7
                    InterfaceIPv4.ADDRESS_IP: IPV4_ADDRESS1,
Packit Service 5e62f7
                    InterfaceIPv4.ADDRESS_PREFIX_LENGTH: 24,
Packit Service 5e62f7
                }
Packit Service 5e62f7
            ],
Packit Service 5e62f7
        }
Packit Service 5e62f7
Packit Service 5e62f7
        assert iface_state[Interface.IPV6] == {
Packit Service 5e62f7
            InterfaceIPv6.ENABLED: True,
Packit Service 5e62f7
            InterfaceIPv6.ADDRESS: [
Packit Service 5e62f7
                {
Packit Service 5e62f7
                    InterfaceIPv6.ADDRESS_IP: IPV6_ADDRESS2,
Packit Service 5e62f7
                    InterfaceIPv6.ADDRESS_PREFIX_LENGTH: 64,
Packit Service 5e62f7
                }
Packit Service 5e62f7
            ],
Packit Service 5e62f7
        }
Packit Service 5e62f7
Packit Service 5e62f7
Packit Service 5e62f7
def test_ignore_invalid_ip_on_absent_interface(eth1_up):
Packit Service 5e62f7
    libnmstate.apply(
Packit Service 5e62f7
        {
Packit Service 5e62f7
            Interface.KEY: [
Packit Service 5e62f7
                {
Packit Service 5e62f7
                    Interface.NAME: "eth1",
Packit Service 5e62f7
                    Interface.STATE: InterfaceState.ABSENT,
Packit Service 5e62f7
                    Interface.IPV4: {
Packit Service 5e62f7
                        InterfaceIPv4.ENABLED: True,
Packit Service 5e62f7
                        InterfaceIPv4.ADDRESS: [
Packit Service 5e62f7
                            {
Packit Service 5e62f7
                                InterfaceIPv4.ADDRESS_IP: "a.a.a.a",
Packit Service 5e62f7
                                InterfaceIPv4.ADDRESS_PREFIX_LENGTH: 24,
Packit Service 5e62f7
                            }
Packit Service 5e62f7
                        ],
Packit Service 5e62f7
                    },
Packit Service 5e62f7
                    Interface.IPV6: {
Packit Service 5e62f7
                        InterfaceIPv6.ENABLED: True,
Packit Service 5e62f7
                        InterfaceIPv6.ADDRESS: [
Packit Service 5e62f7
                            {
Packit Service 5e62f7
                                InterfaceIPv6.ADDRESS_IP: "::g",
Packit Service 5e62f7
                                InterfaceIPv6.ADDRESS_PREFIX_LENGTH: 64,
Packit Service 5e62f7
                            }
Packit Service 5e62f7
                        ],
Packit Service 5e62f7
                    },
Packit Service 5e62f7
                }
Packit Service 5e62f7
            ]
Packit Service 5e62f7
        }
Packit Service 5e62f7
    )