Workflow
************************

1. Define the network graph, creating instances of model.Node and
   model.Layer classes. Experiments can import rumba.model to obtain all
   Rumba classes needed to run an experiment.

2. Create an instance of a specific model.Testbed class (Docker,
   Local, Emulab or jFed).

3. Create an instance of the selected prototype.Experiment class
   (Ouroboros), passing the testbed instance and a list
   of Node instances.

  * At the end of the base Experiment constructor, the
    generate function is called to generate information about
    per-node IPCPs, registrations and enrollment, ready to be
    used by the prototype plugins.

4. Call methods on the prototype.Experiment instance:

  * swap_in() swaps the experiment in on the testbed, and fills in
    the missing information in the model.

  * install_prototype() installs the chosen prototype on the testbed
    (if necessary). Currently an Ubuntu image is assumed.

  * bootstrap_prototype() calls a prototype-specific setup function,
    to create the required IPCPs, perform registrations,
    enrollments, etc.

  * swap_out() swaps the experiment out of the testbed.

5. Optionally run a Storyboard to emulate real network traffic.


Accessing nodes after swap-in
-----------------------------

To access a node once the experiment is swapped in, use the following
command (in the same terminal where ssh-agent was run in case of jFed): ::

    $ rumba-access $NODE_NAME

Where $NODE_NAME is the name of the node to access.
