# Network probes

## Run a network probe

A successful network probe neither creates real network objects like interfaces or addresses, nor database records. The only important thing it does – it raises no exception.

On the contrary, an unsuccessful network probe raises a NetlinkError exception, cancelling the whole transaction.

A network probe is always run from the corresponding netlink target: a local system, a remote system, a network namespace, a container.

An example scenario:

> - target alpha, set up eth0 10.0.0.2/24

> - target beta, set up eth0 10.0.0.4/24

> - ping 10.0.0.4 (beta) from target alpha

> - ping 10.0.0.2 (alpha) from target beta

The code below sets up the addresses and checks ICMP responses. If any step fails, the whole transaction will be rolled back automatically:

    with NDB(log='debug') as ndb:
        ndb.sources.add(kind='remote', hostname='alpha', username='root')
        ndb.sources.add(kind='remote', hostname='beta', username='root')

        with ndb.begin() as trx:
            trx.push(
                (ndb
                    .interfaces[{'target': 'alpha', 'ifname': 'eth0'}]
                    .set(state='up')
                    .add_ip(address='10.0.0.2', prefixlen=24)
                ),
                (ndb
                    .interfaces[{'target': 'beta', 'ifname': 'eth0'}]
                    .set(state='up')
                    .add_ip(address='10.0.0.4', prefixlen=24)
                ),
                (ndb
                    .probes
                    .create(target='alpha', kind='ping', dst='10.0.0.4')
                ),
                (ndb
                    .probes
                    .create(target='beta', kind='ping', dst='10.0.0.2')
                ),
            )