Beispiel #1
0
def _apply_ifaces_state(
    desired_state, verify_change, commit, rollback_timeout
):
    current_state = state.State(netinfo.show())

    desired_state.sanitize_ethernet(current_state)
    desired_state.sanitize_dynamic_ip()
    desired_state.merge_routes(current_state)
    desired_state.merge_dns(current_state)
    metadata.generate_ifaces_metadata(desired_state, current_state)

    validator.validate_interfaces_state(desired_state, current_state)
    validator.validate_routes(desired_state, current_state)

    new_interfaces = _list_new_interfaces(desired_state, current_state)

    try:
        with nm.checkpoint.CheckPoint(
            autodestroy=commit, timeout=rollback_timeout
        ) as checkpoint:
            with _setup_providers():
                _add_interfaces(new_interfaces, desired_state)
                state2edit = _create_editable_desired_state(
                    desired_state, current_state, new_interfaces
                )
                _edit_interfaces(state2edit)
            if verify_change:
                _verify_change(desired_state)
        if not commit:
            return checkpoint
    except nm.checkpoint.NMCheckPointPermissionError:
        raise NmstatePermissionError('Error creating a check point')
    except nm.checkpoint.NMCheckPointCreationError:
        raise NmstateConflictError('Error creating a check point')
Beispiel #2
0
 def test_invalid_route_due_to_missing_ipv6(self):
     iface1 = _create_interface_state("eth2", ipv6=False)
     route1 = self._create_route1()
     desired_state = state.State(
         {
             schema.Interface.KEY: [iface1],
             schema.Route.KEY: {schema.Route.CONFIG: [route1]},
         }
     )
     with pytest.raises(validator.NmstateRouteWithNoIPInterfaceError):
         validator.validate_routes(desired_state, state.State({}))
Beispiel #3
0
    def test_invalid_route_due_to_missing_iface(self):
        route0 = self._create_route0()
        desired_state = state.State(
            {
                schema.Interface.KEY: [],
                schema.Route.KEY: {schema.Route.CONFIG: [route0]},
            }
        )

        with pytest.raises(validator.NmstateRouteWithNoInterfaceError):
            validator.validate_routes(desired_state, state.State({}))
Beispiel #4
0
    def test_valid_route_based_on_desired_state(self):
        iface0 = _create_interface_state("eth1", ipv4=True)
        route0 = self._create_route0()
        desired_state = state.State(
            {
                schema.Interface.KEY: [iface0],
                schema.Route.KEY: {schema.Route.CONFIG: [route0]},
            }
        )

        validator.validate_routes(desired_state, state.State({}))
Beispiel #5
0
 def test_invalid_route_due_to_non_up_iface(self):
     iface0 = _create_interface_state(
         "eth1", state=schema.InterfaceState.DOWN, ipv4=True
     )
     route0 = self._create_route0()
     desired_state = state.State(
         {
             schema.Interface.KEY: [iface0],
             schema.Route.KEY: {schema.Route.CONFIG: [route0]},
         }
     )
     with pytest.raises(validator.NmstateRouteWithNoUpInterfaceError):
         validator.validate_routes(desired_state, state.State({}))
Beispiel #6
0
def _apply_ifaces_state(desired_state, verify_change, commit,
                        rollback_timeout):
    original_desired_state = copy.deepcopy(desired_state)
    current_state = state.State(netinfo.show())

    desired_state.sanitize_ethernet(current_state)
    desired_state.sanitize_dynamic_ip()
    desired_state.merge_routes(current_state)
    desired_state.merge_dns(current_state)
    desired_state.merge_route_rules(current_state)
    desired_state.remove_unknown_interfaces()
    desired_state.complement_master_interfaces_removal(current_state)
    metadata.generate_ifaces_metadata(desired_state, current_state)

    validator.validate_interfaces_state(original_desired_state, current_state)
    validator.validate_routes(desired_state, current_state)

    try:
        with nm.checkpoint.CheckPoint(autodestroy=commit,
                                      timeout=rollback_timeout) as checkpoint:
            with _setup_providers():
                state2edit = state.State(desired_state.state)
                state2edit.merge_interfaces(current_state)
                nm.applier.apply_changes(
                    list(state2edit.interfaces.values()),
                    original_desired_state,
                )
            verified = False
            if verify_change:
                for _ in range(VERIFY_RETRY_TIMEOUT):
                    try:
                        _verify_change(desired_state)
                        verified = True
                        break
                    except NmstateVerificationError:
                        time.sleep(VERIFY_RETRY_INTERNAL)
                if not verified:
                    _verify_change(desired_state)

        if not commit:
            return checkpoint
    except nm.checkpoint.NMCheckPointPermissionError:
        raise NmstatePermissionError("Error creating a check point")
    except nm.checkpoint.NMCheckPointCreationError:
        raise NmstateConflictError("Error creating a check point")
    except NmstateError:
        # Assume rollback occurred.
        # Checkpoint rollback is async, there is a need to wait for it to
        # finish before proceeding with other actions.
        time.sleep(5)
        raise
Beispiel #7
0
def _apply_ifaces_state(
    desired_state, verify_change, commit, rollback_timeout
):
    current_state = state.State(netinfo.show())

    desired_state.sanitize_ethernet(current_state)
    desired_state.sanitize_dynamic_ip()
    desired_state.merge_routes(current_state)
    desired_state.merge_dns(current_state)
    metadata.generate_ifaces_metadata(desired_state, current_state)

    validator.validate_interfaces_state(desired_state, current_state)
    validator.validate_routes(desired_state, current_state)

    new_interfaces = _list_new_interfaces(desired_state, current_state)

    try:
        with nm.checkpoint.CheckPoint(
            autodestroy=commit, timeout=rollback_timeout
        ) as checkpoint:
            with _setup_providers():
                ifaces2add, ifaces_add_configs = _add_interfaces(
                    new_interfaces, desired_state
                )
                state2edit = _create_editable_desired_state(
                    desired_state, current_state, new_interfaces
                )
                ifaces2edit, ifaces_edit_configs = _edit_interfaces(state2edit)
                nm.applier.set_ifaces_admin_state(
                    ifaces2add + ifaces2edit,
                    con_profiles=ifaces_add_configs + ifaces_edit_configs,
                )
            _disable_ipv6(desired_state)
            if verify_change:
                _verify_change(desired_state)
        if not commit:
            return checkpoint
    except nm.checkpoint.NMCheckPointPermissionError:
        raise NmstatePermissionError('Error creating a check point')
    except nm.checkpoint.NMCheckPointCreationError:
        raise NmstateConflictError('Error creating a check point')
    except NmstateError:
        # Assume rollback occured, revert IPv6 stack state.
        # Checkpoint rollback is async, there is a need to wait for it to
        # finish before proceeding with other actions.
        # TODO: https://nmstate.atlassian.net/browse/NMSTATE-103
        time.sleep(5)
        _disable_ipv6(current_state)
        raise
Beispiel #8
0
    def test_invalid_route_based_on_desired_state_but_not_current(self):
        iface0_ipv4_disabled = _create_interface_state("eth1", ipv4=False)
        route0 = self._create_route0()
        desired_state = state.State(
            {
                schema.Interface.KEY: [iface0_ipv4_disabled],
                schema.Route.KEY: {schema.Route.CONFIG: [route0]},
            }
        )
        iface0_ipv4_enabled = _create_interface_state("eth1", ipv4=True)
        current_state = state.State(
            {
                schema.Interface.KEY: [iface0_ipv4_enabled],
                schema.Route.KEY: {schema.Route.CONFIG: []},
            }
        )

        with pytest.raises(validator.NmstateRouteWithNoIPInterfaceError):
            validator.validate_routes(desired_state, current_state)
Beispiel #9
0
    def test_valid_route_based_on_desired_state_but_not_current(self):
        iface0 = _create_interface_state('eth1', ipv4=True)
        route0 = self._create_route0()
        desired_state = state.State({
            schema.Interface.KEY: [iface0],
            schema.Route.KEY: {
                schema.Route.CONFIG: [route0]
            },
        })
        iface0_down = _create_interface_state('eth1',
                                              state=schema.InterfaceState.DOWN)
        current_state = state.State({
            schema.Interface.KEY: [iface0_down],
            schema.Route.KEY: {
                schema.Route.CONFIG: []
            },
        })

        validator.validate_routes(desired_state, current_state)
Beispiel #10
0
 def test_empty_states(self):
     validator.validate_routes(state.State({}), state.State({}))