diff --git a/docs/cloudlab.md b/docs/cloudlab.md new file mode 100644 index 0000000000..1c516e4057 --- /dev/null +++ b/docs/cloudlab.md @@ -0,0 +1,127 @@ +# CloudLab getting started guide + +## 1 Prerequisites + +First, submit an account request to CloudLab (https://www.cloudlab.us/). Things to note: + +- If you're an internal member, select "Join Existing Project" and type: `Sieve-Acto`. Otherwise, you'll have to join other existing projects or create a new one, which is not detailed here. +- The username and key you provide will be used for SSH login + +Wait for the admin to approve your account. Once you are able to login, familiarize yourself with the web-based dashboard, and [the concept of *profiles* and *experiments*](https://docs.cloudlab.us/basic-concepts.html). + +Although you should be able to log in to any machine instantiated by your project collaborators (i.e. a Linux user will be automatically created for you on every machine with `authorized_keys` set up), for us (`Sieve-Acto`), the current practice is to let everyone run code **on their own experiments**. + +Next you'll prepare the dependencies either manually ([section 2](#2-manually-set-up-the-dependencies)) or automatically ([section 3](#3-automatically-set-up-the-dependencies), recommended). + +## 2 Manually set up the dependencies + +
Click to show details + +### 2.1 Create CloudLab experiments + +Launch an experiment via the web dashboard: + +1. Click "Experiments" -- "Start Experiment". The default selected profile should be `small-lan`. "Next". +2. Enter/Choose parameters: + - "Select OS image": `UBUNTU 20.04` + - "Optional physical node type": `c6420` + - Leave other parameters as default. (Especially those regarding temporary filesystem -- this will be handled after provisioning using Ansible.) +3. "Next". Give your experiment a name. "Next". "Finish". + +Wait for the provisioning to finish. The web dashboard will show you the server address, in the form of `..cloudlab.us`. E.g. `clnode123.clemson.cloudlab.us`. + +### 2.2 Install the dependencies with Ansible + +You are going to manage CloudLab machines with Ansible from a controller node. This "controller" can be your local machine, or one of the CloudLab machines themselves. + +**On your controller node**: + +Install Ansible: + +```shell +sudo apt update +sudo apt -y install software-properties-common +sudo add-apt-repository --yes --update ppa:ansible/ansible +sudo apt -y install ansible +ansible-galaxy collection install ansible.posix +ansible-galaxy collection install community.general +``` + +Clone the Ansible scripts: + +```shell +git clone https://github.com/xlab-uiuc/acto-cloudlab.git /tmp/acto-cloudlab +``` + +Set up `ansible_hosts` file (**remember to replace the placeholders with your real domain and user name**): + +```shell +domain="clnodeXXX.clemson.cloudlab.us" +user="alice" + +cd /tmp/acto-cloudlab/scripts/ansible/ +echo "$domain ansible_connection=ssh ansible_user=$user ansible_port=22" > ansible_hosts +``` + +> If the controller is a CloudLab machine too, this step can be automated: +> +> ```shell +> sudo apt -y install xmlstarlet +> +> component_name=$( geni-get portalmanifest | xmlstarlet sel -N x="http://www.geni.net/resources/rspec/3" -t -v "//x:node/@component_id" ) +> cluster_domain=$( echo $component_name | cut -d '+' -f 2 ) +> node_subdomain=$( echo $component_name | cut -d '+' -f 4 ) +> domain="${node_subdomain}.${cluster_domain}" +> user=$( geni-get user_urn | rev | cut -d '+' -f -1 | rev ) +> +> cd /tmp/acto-cloudlab/scripts/ansible/ +> echo "$domain ansible_connection=ssh ansible_user=$user ansible_port=22" > ansible_hosts +> ``` +> +> Or even simpler, use `127.0.0.1` directly: +> +> ```shell +> cd /tmp/acto-cloudlab/scripts/ansible/ +> echo 127.0.0.1 > ansible_hosts +> ``` + +(Only if the controller is a CloudLab machine too) work around the key authentication: + +```shell +ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "" && cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys +``` + +Finally, run the Ansible scripts to install dependencies: + +```shell +ansible-playbook -i ansible_hosts configure.yaml +``` + +
+ +(Only if the controller is a CloudLab machine too) log out before jumping to section 4 and logging in again. + +Go to [section 4](#4-run-acto). + +## 3 Automatically set up the dependencies + +Everything needed to install the dependencies (see section 2) is included in [a CloudLab profile](https://github.com/xlab-uiuc/acto-cloudlab), by which the same environment can be set up without manually entering any command. + +Launch an experiment via the web dashboard: + +1. Open this link: https://www.cloudlab.us/p/Sieve-Acto/acto-cloudlab?refspec=refs/heads/main. The default selected profile should be `acto-cloudlab`. "Next". +2. "Next". Give your experiment a name. "Next". "Finish". + +Wait for provisioning and startup both to finish (i.e. under the "List View" tab, "Status" is `ready` and "Startup" is `Finished`). The web dashboard will show you the server address, in the form of `..cloudlab.us`. E.g. `clnode123.clemson.cloudlab.us`. + +## 4 Run Acto + +Log in to the CloudLab machine, and run: + + + +```shell +cd ~/workdir/acto +make +python3 reproduce_bugs.py --bug-id rdoptwo-287 +``` diff --git a/scripts/ansible/README.md b/scripts/ansible/README.md index 78a9d218d8..649de815e6 100644 --- a/scripts/ansible/README.md +++ b/scripts/ansible/README.md @@ -1,23 +1,28 @@ -# Ansible playbook to automatically configure environment for Acto to run a baremetal machine +# Ansible playbook to automatically configure environment for Acto to run on a baremetal machine + To run the script, you first need an `ansible_hosts` file. Each line in the file should contain a worker in your cluster. See https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html for details. An example: + ```ini c220g5-110417.wisc.cloudlab.us ansible_connection=ssh ansible_user=tylergu ansible_port=22 c220g5-110418.wisc.cloudlab.us ansible_connection=ssh ansible_user=tylergu ansible_port=22 ``` -If you haven't installed `ansible playbook` on your control node, run +If you haven't installed `ansible-playbook` on your control node, run + ```sh pip3 install ansible ansible-galaxy collection install ansible.posix ansible-galaxy collection install community.general -``` - -Then just run ``` -bash configure.sh + +Then just run + +```sh +ansible-playbook -i ansible_hosts configure.yaml ``` + and the proper environment will be setup on the workers. diff --git a/scripts/ansible/configure.sh b/scripts/ansible/configure.sh deleted file mode 100644 index 64fff0438d..0000000000 --- a/scripts/ansible/configure.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -ansible-playbook tmpfs.yaml -i ansible_hosts -ansible-playbook go.yaml -i ansible_hosts -ansible-playbook docker.yaml -i ansible_hosts -ansible-playbook python.yaml -i ansible_hosts -ansible-playbook kind.yaml -i ansible_hosts -ansible-playbook kubectl.yaml -i ansible_hosts -ansible-playbook helm.yaml -i ansible_hosts -ansible-playbook sysctl.yaml -i ansible_hosts -ansible-playbook k3d.yaml -i ansible_hosts -ansible-playbook k9s.yaml -i ansible_hosts -ansible-playbook htop.yaml -i ansible_hosts -ansible-playbook acto.yaml -i ansible_hosts