Basic File Transfer Example

Here we present a basic example that simulates the network traffic of an HTTP server with 3 clients, each running on different virtual hosts. If you do not have Python or cURL installed, you can download them through your distribution's package manager.

Configuring the Simulation

Each client uses cURL to make an HTTP request to a basic Python HTTP server.

Shadow requires a configuration file that specifies information about the network graph and the processes to run within the simulation. This example uses a built-in network graph for simplicity.

shadow.yaml:

general: # stop after 10 simulated seconds stop_time: 10s # old versions of cURL use a busy loop, so to avoid spinning in this busy # loop indefinitely, we add a system call latency to advance the simulated # time when running non-blocking system calls model_unblocked_syscall_latency: true network: graph: # use a built-in network graph containing # a single vertex with a bandwidth of 1 Gbit type: 1_gbit_switch hosts: # a host with the hostname 'server' server: network_node_id: 0 processes: - path: python3 args: -m http.server 80 start_time: 3s # tell shadow to expect this process to still be running at the end of the # simulation expected_final_state: running # three hosts with hostnames 'client1', 'client2', and 'client3' using a yaml # anchor to avoid duplicating the options for each host client1: &client_host network_node_id: 0 processes: - path: curl args: -s server start_time: 5s client2: *client_host client3: *client_host

Running the Simulation

Shadow stores simulation data to the shadow.data/ directory by default. We first remove this directory if it already exists, and then run Shadow.

# delete any existing simulation data rm -rf shadow.data/ shadow shadow.yaml > shadow.log

This small Shadow simulation should complete almost immediately.

Viewing the Simulation Output

Shadow will write simulation output to the data directory shadow.data/. Each host has its own directory under shadow.data/hosts/. For example:

$ ls -l shadow.data/hosts/ drwxrwxr-x 2 user user 4096 Jun 2 16:54 client1 drwxrwxr-x 2 user user 4096 Jun 2 16:54 client2 drwxrwxr-x 2 user user 4096 Jun 2 16:54 client3 drwxrwxr-x 2 user user 4096 Jun 2 16:54 server

Each host directory contains the output for each process running on that host. For example:

$ ls -l shadow.data/hosts/client1/ -rw-rw-r-- 1 user user 0 Jun 2 16:54 curl.1000.shimlog -rw-r--r-- 1 user user 0 Jun 2 16:54 curl.1000.stderr -rw-r--r-- 1 user user 542 Jun 2 16:54 curl.1000.stdout $ cat shadow.data/hosts/client1/curl.1000.stdout <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Directory listing for /</title> </head> <body> <h1>Directory listing for /</h1> ...