Skip to content

Releases

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 11 Nov 22:07
5bfec08

Release 0.3 "Shapes". A scenario is no longer one link between two nodes: it is a network of nodes, routers and routes, written out or built from the shortcuts chain, star, dumbbell and multipath, over IPv4 and IPv6, with an MTU, the don't-fragment bit and queues with their disciplines and statistics. Traffic gets the TCP of the machine (bulk transfers and request/response), the echo of a UDP stream and the replay of a trace from a CSV file or a capture, and your own program can still run in a node. A link can follow a model over time, a trace or a table of samples, and a link profile library (LTE, 5G, satellite) gives starting values with published sources. Scenario files take parameters, templates and includes, and carry their expect checks, so the file is the whole test. In Python a link can be changed while a run goes, with asyncio, data frames and a fuller builder, and every run reports the precision of the timers of the machine. The README says what 0.3 does and does not do, and docs/ACCEPTANCE.md how each criterion of the release is proven, among them the fairness of two flows over a bottleneck, two paths, Reno against the formula of Mathis, and everything written for 0.2 still working.

Breaking. The format of the scenario file and of the result is version 0, which a minor release may change (docs/VERSIONING.md): the files of 0.2 still read and run, results made by 0.2 are read by the reports, replay and the Python package, and the result has new fields. No command, option or name in Python was removed. What breaks is the Rust API of netscenario-model and netscenario-core (#94, #96, #99, #100, #101, #102, #104, #108, #113, #114, #115):

  • Types of the scenario are non_exhaustive: Scenario, Link, Jitter, Event and Topology, and Problem of the errors; so is Provisioned of the core and the enum Basis of the recovery. A new field or variant is no longer a break from now on.
  • Impairments has the field queue, and JitterDistribution has the variants Pareto, ParetoNormal and Table. Jitter and series::Input are no longer Copy.
  • netscenario_core::check takes two parameters and not three, and sha256_hex moved from netscenario-core to netscenario-model.

Features

  • Breaking: Read networks of several nodes, links and routes in the scenario format (#94)
  • Add the shortcuts chain, star, dumbbell and multipath and the commands expand and show (#95)
  • Breaking: Build networks of several nodes, routers and routes in the Kernel backend (#96)
  • Account for packets link by link along a path and test the fidelity of paths (#97)
  • Add the MTU of a link and account for the fragments of a packet (#98)
  • Breaking: Add IPv6 and dont-fragment, and the MTU in the values of a shortcut (#99)
  • Breaking: Add queues with disciplines and their statistics (#100)
  • Breaking: Add the pareto, paretonormal and table distributions of the jitter (#101)
  • Breaking: Add the trace-replay workload with CSV files and captures (#102)
  • Breaking: Add the TCP agents, the stream records, the UDP echo and a limit on the segments of a link (#104)
  • Add the workloads tcp-bulk and request-response to the format (#105)
  • Run the TCP workloads and report them in the result (#106)
  • Add the echo of a UDP stream and report its round trip (#107)
  • Breaking: Recover TCP workloads on their goodput and name their metrics (#108)
  • Breaking: Add models over time for links and repeating events of the timeline (#113)
  • Breaking: Add trace-driven links, a rate that follows its steps, and allow-limited (#114)
  • Breaking: Add parameters, templates and includes for scenario files (#115)
  • Add expect checks to the scenario file (#122)
  • Add the link profile library and the profiles and capabilities commands (#123)
  • Change a link from test code while a run goes, add asyncio, data frames and a fuller builder (#124)
  • Report the precision of the timers in every run and with doctor --timers (#125)

Fixes

  • Name the node address as the source in the routes of a node (#109)
  • Run TCP workloads with many connections and add the acceptance experiments of TCP (#111)
  • Raise the listener queue of the TCP agent and widen the delay of the seed test (#112)
  • Refuse unread link traces, order faults deterministically and guard zero packet size (#121)

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 03 Nov 17:00
0e89b18

Release 0.2 "Time and noise". This is the state of 0.2.0-rc.1; the release only removes the notes that say it is a candidate.

A link can change while a run goes (a rate that drops, an outage, a link that goes down and up), and the same seed still gives the same lost packets. There are more impairments: burst loss (Gilbert-Elliott and four states), reordering, duplication and corruption, and a stream can be sent without the UDP checksum so that a damaged packet arrives and is counted. There is more traffic: Poisson, on/off and bursty streams. A node can run your own program, started in order, waited for, supervised, with its output and its metrics in the result, and a link can be captured as pcap files. A result has more statistics (the extent of reordering, the interarrival jitter, the runs of lost packets), a series by time bin in two views (what was sent and what arrived) and the time to recover after each event. Several runs with seeds derived from one seed give confidence intervals (a seeded bootstrap with its measured coverage, docs/STATISTICS.md), a run can be replayed from its directory, and reports are made as Markdown, JUnit and one HTML file (docs/REPORTS.md). All of it works from the command line, from Python and as pytest tests. The release files carry an attestation of their provenance, and the parsers of input that is not trusted are fuzzed every week. The README says what 0.2 does and does not do yet, and docs/ACCEPTANCE.md how each criterion of the release is proven.

Breaking. The format of the scenario file and of the result is version 0, which a minor release may change (docs/VERSIONING.md): the files of 0.1 still read and run, and the result has new fields. What breaks is the Rust API of netscenario-model and netscenario-core (#50, #52, #53, #55, #61, #76, #79, #80):

  • The result types are non_exhaustive (#50), so that a new field is no longer a break from now on.
  • Loss is an enum and not a struct (#52); Scenario has the fields timeline (#53) and measure (#80); Workload is an enum of the kinds and non_exhaustive (#55, #76); UdpCbr has udp_checksum (#61); Command has on_exit (#79).
  • Feature and Workload have new variants; Backend has new methods with defaults (#79, #80).
  • RunOptions lost bin, recovery and export_packets, which MeasureOverrides replaces (#80); series::Input takes a Schedule (#76).

In Python the arguments bin, recovery_*, capture and packets of run now replace a key of the section measure of the scenario (#80), and the properties that the pytest plugin writes to a JUnit file are text, so 0.0 is 0 (#85). A scenario with repetitions as a key is refused, because it is an option of a run (--repetitions, repetitions=). The command line exits with 1 for a replay that did not reproduce (#83). The wire format of the agent is version 2 (#61), so the programs of a run have to be of one release, which they are when they come from one installation.

Features

  • Breaking: Mark the result types non-exhaustive (#50)
  • Suggest the name that was meant for misspelled keys, values and units (#51)
  • Breaking: Read burst loss, reordering, duplication and corruption in the scenario format (#52)
  • Breaking: Read the timeline in the scenario format (#53)
  • Breaking: Read workloads of kind command in the scenario format (#55)
  • Apply the burst loss models, the reordering and the duplication in the Kernel backend (#59)
  • Apply the corruption in the Kernel backend and account for every packet of a direction (#60)
  • Breaking: Send a stream without the UDP checksum and count the packets that arrive damaged (#61)
  • Name the packets that arrive damaged by sequence number with a tap in the receiving agent (#62)
  • Report the extent of reordering, the interarrival jitter and the runs of lost packets (#63)
  • Build the queues of a direction for every state of the timeline and write a state into them as a whole (#64)
  • Do the steps of the timeline by the clock and record each one in the result (#65)
  • Do a step of the timeline at a barrier of the workload, so that the same seed gives the same lost packets (#66)
  • Change a link through one tc that lives for the run and let the backend add notes to the result (#68)
  • Take links down and up and make an outage a window at the delivery as steps of the timeline, and leave refused packets out of the statistics (#69)
  • Say that two workloads in a direction whose queue draws random numbers are not a repeatable experiment, and derive the bound of the corruption run test (#70)
  • Stop the workloads and keep the result when the command line is interrupted with Ctrl-C (#71)
  • Add a series by time bin for each workload and the time to recover after an event (#75)
  • Breaking: Add the traffic kinds udp-poisson, udp-onoff and udp-bursty with a seeded schedule that the agent walks (#76)
  • Breaking: Run programs of your own in the nodes, with readiness, supervision, logs and metrics (#79)
  • Breaking: Add the section measure and the capture of the interfaces of a link as pcap files (#80)
  • Add repetitions with derived seeds and bootstrap intervals (#81)
  • Add repetitions to the Python package and the pytest plugin (#82)
  • Add replay of a run from its result directory (#83)
  • Add reports as Markdown, JUnit and HTML from result directories (#84)
  • Add reports and replay to Python, and the report data of a run to the plugin (#85)

Fixes

  • Wait for the queues of the links to empty before the receivers stop, so that packets in a queue do not count as lost (#72)
  • Refuse what the kernel refuses before the network is built, by declaring the features from the probe of the machine and not from the version of tc alone (#73)

v0.2.0-rc.1

v0.2.0-rc.1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 03 Nov 16:02
40810bb

The first release candidate of 0.2 "Time and noise". It exists to try the packages and the release itself, with the provenance of the release files, before 0.2.0; between the candidate and the release only the notes that say it is a candidate go away.

A link can change while a run goes (a rate that drops, an outage, a link that goes down and up), and the same seed still gives the same lost packets. There are more impairments: burst loss (Gilbert-Elliott and four states), reordering, duplication and corruption, and a stream can be sent without the UDP checksum so that a damaged packet arrives and is counted. There is more traffic: Poisson, on/off and bursty streams. A node can run your own program, started in order, waited for, supervised, with its output and its metrics in the result, and a link can be captured as pcap files. A result has more statistics (the extent of reordering, the interarrival jitter, the runs of lost packets), a series by time bin in two views (what was sent and what arrived) and the time to recover after each event. Several runs with seeds derived from one seed give confidence intervals (a seeded bootstrap with its measured coverage, docs/STATISTICS.md), a run can be replayed from its directory, and reports are made as Markdown, JUnit and one HTML file (docs/REPORTS.md). All of it works from the command line, from Python and as pytest tests. The release files carry an attestation of their provenance, and the parsers of input that is not trusted are fuzzed every week. The README says what 0.2 does and does not do yet, and docs/ACCEPTANCE.md how each criterion of the release is proven.

Breaking. The format of the scenario file and of the result is version 0, which a minor release may change (docs/VERSIONING.md): the files of 0.1 still read and run, and the result has new fields. What breaks is the Rust API of netscenario-model and netscenario-core (#50, #52, #53, #55, #61, #76, #79, #80):

  • The result types are non_exhaustive (#50), so that a new field is no longer a break from now on.
  • Loss is an enum and not a struct (#52); Scenario has the fields timeline (#53) and measure (#80); Workload is an enum of the kinds and non_exhaustive (#55, #76); UdpCbr has udp_checksum (#61); Command has on_exit (#79).
  • Feature and Workload have new variants; Backend has new methods with defaults (#79, #80).
  • RunOptions lost bin, recovery and export_packets, which MeasureOverrides replaces (#80); series::Input takes a Schedule (#76).

In Python the arguments bin, recovery_*, capture and packets of run now replace a key of the section measure of the scenario (#80), and the properties that the pytest plugin writes to a JUnit file are text, so 0.0 is 0 (#85). A scenario with repetitions as a key is refused, because it is an option of a run (--repetitions, repetitions=). The command line exits with 1 for a replay that did not reproduce (#83). The wire format of the agent is version 2 (#61), so the programs of a run have to be of one release, which they are when they come from one installation.

Features

  • Breaking: Mark the result types non-exhaustive (#50)
  • Suggest the name that was meant for misspelled keys, values and units (#51)
  • Breaking: Read burst loss, reordering, duplication and corruption in the scenario format (#52)
  • Breaking: Read the timeline in the scenario format (#53)
  • Breaking: Read workloads of kind command in the scenario format (#55)
  • Apply the burst loss models, the reordering and the duplication in the Kernel backend (#59)
  • Apply the corruption in the Kernel backend and account for every packet of a direction (#60)
  • Breaking: Send a stream without the UDP checksum and count the packets that arrive damaged (#61)
  • Name the packets that arrive damaged by sequence number with a tap in the receiving agent (#62)
  • Report the extent of reordering, the interarrival jitter and the runs of lost packets (#63)
  • Build the queues of a direction for every state of the timeline and write a state into them as a whole (#64)
  • Do the steps of the timeline by the clock and record each one in the result (#65)
  • Do a step of the timeline at a barrier of the workload, so that the same seed gives the same lost packets (#66)
  • Change a link through one tc that lives for the run and let the backend add notes to the result (#68)
  • Take links down and up and make an outage a window at the delivery as steps of the timeline, and leave refused packets out of the statistics (#69)
  • Say that two workloads in a direction whose queue draws random numbers are not a repeatable experiment, and derive the bound of the corruption run test (#70)
  • Stop the workloads and keep the result when the command line is interrupted with Ctrl-C (#71)
  • Add a series by time bin for each workload and the time to recover after an event (#75)
  • Breaking: Add the traffic kinds udp-poisson, udp-onoff and udp-bursty with a seeded schedule that the agent walks (#76)
  • Breaking: Run programs of your own in the nodes, with readiness, supervision, logs and metrics (#79)
  • Breaking: Add the section measure and the capture of the interfaces of a link as pcap files (#80)
  • Add repetitions with derived seeds and bootstrap intervals (#81)
  • Add repetitions to the Python package and the pytest plugin (#82)
  • Add replay of a run from its result directory (#83)
  • Add reports as Markdown, JUnit and HTML from result directories (#84)
  • Add reports and replay to Python, and the report data of a run to the plugin (#85)

Fixes

  • Wait for the queues of the links to empty before the receivers stop, so that packets in a queue do not count as lost (#72)
  • Refuse what the kernel refuses before the network is built, by declaring the features from the probe of the machine and not from the version of tc alone (#73)

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 13:04
d9bd40d

The first release. You describe a point-to-point link in a file or in code (delay, jitter, loss, a rate, different values in each direction), run it in network namespaces with the Kernel backend, send constant-rate UDP streams through it, and get loss, one-way delay percentiles and throughput back, per packet if you ask for it, together with the seed and the versions that made the result. From the command line (netscenario run, validate, schema, doctor, clean), from Python, and as pytest tests with the plugin pytest-netscenario. Wheels for Linux on x86_64 and aarch64; the crates netscenario-cli and netscenario-agent for the command line. The README says what 0.1 does and does not do yet, and docs/ACCEPTANCE.md how each criterion of the release is proven.

This is the state of 0.1.0-rc.2; the release only removes the notes "not published yet" from the documentation and adds the badges. The format of the scenario file and of the result is version 0: a minor release may change them, and the changelog says how (docs/VERSIONING.md).

Features

  • Add the Rust workspace, the lints, the tooling and a first command line (#11)
  • Add the Python packages, the bindings crate and the Python tooling (#12)
  • Add the scenario model with strict units, validation and the JSON Schema (#16)
  • Add the backend interface, the capability check and the Kernel declaration (#17)
  • Provision real namespaces in the Kernel backend with a supervisor, limits and crash tests (#18)
  • Record the seed of a run, show lines in capability errors and test root mode and seeded loss on the CI (#19)
  • Add the doctor and clean commands, and wait for the last words of a supervisor that died (#20)
  • Add the agent that sends and receives the packets of a workload and records each one (#21)
  • Read the output of programs in the nodes, write to them, and limit their memory (#22)
  • Run a scenario in the nodes and write a result with statistics, provenance and the seed (#23)
  • Add the commands run, validate and schema, and make the program its own supervisor (#24)
  • Let a run be observed and cancelled, and show its progress on a terminal (#28)
  • Add the Python bindings and the typed Python package (#29)
  • Add the pytest plugin with a runner, a marker, a guard for the environment and a report (#30)
  • Build the wheels with the programs inside and test them in a clean environment (#31)
  • Add the release workflow, one version for everything, the changelog and the versioning policy (#33)
  • Count the packets in the queue of each direction with loss and compare them with the packets of the workloads (#37)

Fixes

  • Build a direction with a jitter and a rate from two qdiscs, in the order of its stages (#26)
  • Take the rights of the process for a run when it has them and they work (#36)

v0.1.0-rc.2

v0.1.0-rc.2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Oct 12:37
78a6394

The second release candidate. Nothing changes in how a run works. It tests the changed release process (one environment for each registry, one upload to PyPI) and brings the descriptions of the packages and the READMEs that PyPI shows in line with what release 0.1 does: the example is self-contained now, and a program of your own in the network, which comes with release 0.2, is no longer promised.

v0.1.0-rc.1

v0.1.0-rc.1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Oct 11:42
a6eb235

The first release candidate of 0.1: the Kernel backend, the command line, the Python package and the pytest plugin, as described in the README (what 0.1 does, and what it does not do yet). It exists to try the packages and the release itself before 0.1.0.

Features

  • Add the Rust workspace, the lints, the tooling and a first command line (#11)
  • Add the Python packages, the bindings crate and the Python tooling (#12)
  • Add the scenario model with strict units, validation and the JSON Schema (#16)
  • Add the backend interface, the capability check and the Kernel declaration (#17)
  • Provision real namespaces in the Kernel backend with a supervisor, limits and crash tests (#18)
  • Record the seed of a run, show lines in capability errors and test root mode and seeded loss on the CI (#19)
  • Add the doctor and clean commands, and wait for the last words of a supervisor that died (#20)
  • Add the agent that sends and receives the packets of a workload and records each one (#21)
  • Read the output of programs in the nodes, write to them, and limit their memory (#22)
  • Run a scenario in the nodes and write a result with statistics, provenance and the seed (#23)
  • Add the commands run, validate and schema, and make the program its own supervisor (#24)
  • Let a run be observed and cancelled, and show its progress on a terminal (#28)
  • Add the Python bindings and the typed Python package (#29)
  • Add the pytest plugin with a runner, a marker, a guard for the environment and a report (#30)
  • Build the wheels with the programs inside and test them in a clean environment (#31)
  • Add the release workflow, one version for everything, the changelog and the versioning policy (#33)
  • Count the packets in the queue of each direction with loss and compare them with the packets of the workloads (#37)

Fixes

  • Build a direction with a jitter and a rate from two qdiscs, in the order of its stages (#26)
  • Take the rights of the process for a run when it has them and they work (#36)