The Basics: The neo-containers system uses cloud-container technology to abstract and generalize container creation and initialization. There is a per-experiment control node that centralizes configuration details. At the DETER level, the experiments have the control node and a number of "pnodes" which serve as hosts for the virtualized containers. The control node configures the pnodes as well as the containerized nodes as well as itself. The bootstrap script is run on the control node and: 1) installs configuration software on itself, 2) updates its own configuration, 3) updates the configuration of the other physical nodes (which includes virtual networking and starting virtual machines), 4) give configuration information to virtual nodes and allows them to configuration themselves. Execution Flow: The execution flow of is as follows. The initialization uses the existing containers system as a bootstrap. 1. Create a containerized experiment with an NS file and the {{{/share/containers/containerize.py}}} script. 2. Modify the generated NS file. a. Change the OS type of the pnodes to {{{PNODE-BASE}}}. e.g. make the line in the NS file: {{{ tb-set-node-os ${pnode(0000)} PNODE-BASE }}} b. Add a new control node. Traditionally it's been called "config", but there is no restriction on the name. Add this to the NS file: {{{ set config [$ns node] tb-set-node-os ${config} Ubuntu1404-64-STD tb-set-hardware ${config} MicroCloud tb-set-node-failure-action ${config} "nonfatal" }}} 3. Swap in the experiment. 4. Run the bootstrap script. The bootstrap script: 1. Uses the NFS mounted dir /share/chef/chef-packages to install Chef server and Chef client on the {{{config}}} node. a. The {{{config}}} node is both a Chef server (talks to all machines in the experiment) and a Chef client/workstation (holds the Chef git repo which contains all configuration scripts). 2. Configures Chef Server on the {{{config}}} node. a. Simply runs the chef self-configure scripts. 3. Configures Chef client/workstation on the {{{config}}} node. a. creates a chef-deter identity (keys and names) for the Chef Server. b. installs {{{git}}} on the {{{config}}} node. c. git clones the canonical Chef repository from the NFS mounted dir {{{/share/chef/chef-repo}}}. Thie repo contains all configuration scripts and data for the system. d. upload all Chef recipes, data bags, and roles (configuration scripts, data, and roles) to the Chef server on {{{config}}} (localhost). 4. Create an experiment-specific "data bag" and upload it to the Chef Server. The data contains experiment name, project, group, name and address of the {{{config}}} machine, and the name and address of the RESTful configuration server. 5. Register the {{{config}}} node (localhost) as a Chef client to the server, download and execute all local configuration recipes. Details of these are in the next section. {{{config}}} recipes.