Cluster edition prototype: remote nodes and links.
We add a new experimental feature to allow Mininet to run across a cluster of machines. This is currently implemented via a set mix-in classes that provide remote nodes that are implemented via a connection to a remote shell, and remote links which are tunnels across servers. In this preliminary implementation, both control and data connections are made via ssh, but this could change in the future. A MininetCluster class is provided which allows existing code to be used with minimal modification - all that is required is to provide a list of servers to use. A customizable placement algorithm may also be specified. An experimental CLI subclass is also provided to make it easier to examine node placement; status and links commands can also check whether nodes and tunnels are still running. Although this is an experimental feature, it does include a --cluster option to make it convenient to start up a Mininet simulation over a cluster, and a script to assist with setting up the prerequisite authentication via ssh key pairs. The cluster feature is preliminary and missing some obvious important features, such as parallel startup and multiple tunnel types, which we hope to add in the future.
This commit is contained in:
Executable
+182
@@ -0,0 +1,182 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Mininet ssh authentication script for cluster edition
|
||||
# This script will create a single key pair, which is then
|
||||
# propagated throughout the entire cluster.
|
||||
# There are two options for setup; temporary setup
|
||||
# persistent setup. If no options are specified, and the script
|
||||
# is only given ip addresses or host names, it will default to
|
||||
# the temporary setup. An ssh directory is then created in
|
||||
# /tmp/mn/ssh on each node, and mounted with the keys over the
|
||||
# user's ssh directory. This setup can easily be torn down by running
|
||||
# clustersetup with the -c option.
|
||||
# If the -p option is used, the setup will be persistent. In this
|
||||
# case, the key pair will be be distributed directly to each node's
|
||||
# ssh directory, but will be called cluster_key. An option to
|
||||
# specify this key for use will be added to the config file in each
|
||||
# user's ssh directory.
|
||||
|
||||
|
||||
set -e
|
||||
num_options=0
|
||||
persistent=false
|
||||
showHelp=false
|
||||
clean=false
|
||||
declare -a hosts=()
|
||||
user=$(whoami)
|
||||
SSHDIR=/tmp/mn/ssh
|
||||
USERDIR=/home/$user/.ssh
|
||||
usage=$'./clustersetup.sh [ -p|h|c ] [ host1 ] [ host2 ] ...\n
|
||||
Authenticate yourself and other cluster nodes to each other
|
||||
via ssh for mininet cluster edition. By default, we use a
|
||||
temporary ssh setup. An ssh directory is mounted over
|
||||
/home/user/.ssh on each machine in the cluster.
|
||||
|
||||
-h: display this help
|
||||
-p: create a persistent ssh setup. This will add
|
||||
new ssh keys and known_hosts to each nodes
|
||||
/home/user/.ssh directory
|
||||
-c: method to clean up a temporary ssh setup.
|
||||
Any hosts taken as arguments will be cleaned
|
||||
'
|
||||
|
||||
persistentSetup() {
|
||||
echo "***creating key pair"
|
||||
ssh-keygen -t rsa -C "Cluster_Edition_Key" -f $USERDIR/cluster_key -N '' &> /dev/null
|
||||
cat $USERDIR/cluster_key.pub >> $USERDIR/authorized_keys
|
||||
echo "***configuring ssh"
|
||||
echo "IdentityFile $USERDIR/cluster_key" >> $USERDIR/config
|
||||
echo "IdentityFile $USERDIR/id_rsa" >> $USERDIR/config
|
||||
|
||||
for host in $hosts; do
|
||||
echo "***copying public key to $host"
|
||||
ssh-copy-id -i $USERDIR/cluster_key.pub $user@$host &> /dev/null
|
||||
echo "***copying key pair to remote host"
|
||||
scp $USERDIR/cluster_key $user@$host:$USERDIR
|
||||
scp $USERDIR/cluster_key.pub $user@$host:$USERDIR
|
||||
echo "***configuring remote host"
|
||||
ssh -o ForwardAgent=yes $user@$host "
|
||||
echo 'IdentityFile $USERDIR/cluster_key' >> $USERDIR/config
|
||||
echo 'IdentityFile $USERDIR/id_rsa' >> $USERDIR/config"
|
||||
done
|
||||
|
||||
for host in $hosts; do
|
||||
echo "***copying known_hosts to $host"
|
||||
scp $USERDIR/known_hosts $user@$host:$USERDIR/cluster_known_hosts
|
||||
ssh $user@$host "
|
||||
cat $USERDIR/cluster_known_hosts >> $USERDIR/known_hosts
|
||||
rm $USERDIR/cluster_known_hosts"
|
||||
done
|
||||
}
|
||||
|
||||
tempSetup() {
|
||||
|
||||
echo "***creating temporary ssh directory"
|
||||
mkdir -p $SSHDIR
|
||||
echo "***creating key pair"
|
||||
ssh-keygen -t rsa -C "Cluster_Edition_Key" -f /tmp/mn/ssh/id_rsa -N '' &> /dev/null
|
||||
|
||||
echo "***mounting temporary ssh directory"
|
||||
sudo mount --bind $SSHDIR /home/$user/.ssh
|
||||
cp $SSHDIR/id_rsa.pub $SSHDIR/authorized_keys
|
||||
|
||||
for host in $hosts; do
|
||||
echo "***copying public key to $host"
|
||||
ssh-copy-id $user@$host &> /dev/null
|
||||
echo "***mounting remote temporary ssh directory for $host"
|
||||
ssh -o ForwardAgent=yes $user@$host "
|
||||
mkdir -p /tmp/mn/ssh
|
||||
cp /home/$user/.ssh/authorized_keys $SSHDIR/authorized_keys
|
||||
sudo mount --bind $SSHDIR /home/$user/.ssh"
|
||||
echo "***copying key pair to $host"
|
||||
scp $SSHDIR/{id_rsa,id_rsa.pub} $user@$host:$SSHDIR
|
||||
done
|
||||
|
||||
for host in $hosts; do
|
||||
echo "***copying known_hosts to $host"
|
||||
scp $SSHDIR/known_hosts $user@$host:$SSHDIR
|
||||
done
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
|
||||
for host in $hosts; do
|
||||
echo "***cleaning up $host"
|
||||
ssh $user@$host "sudo umount /home/$user/.ssh
|
||||
sudo rm -rf $SSHDIR"
|
||||
done
|
||||
|
||||
echo "**unmounting local directories"
|
||||
sudo umount /home/$user/.ssh
|
||||
echo "***removing temporary ssh directory"
|
||||
sudo rm -rf $SSHDIR
|
||||
echo "done!"
|
||||
|
||||
}
|
||||
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "ERROR: No Arguments"
|
||||
echo "$usage"
|
||||
exit
|
||||
else
|
||||
while getopts 'hpc' OPTION
|
||||
do
|
||||
((num_options+=1))
|
||||
case $OPTION in
|
||||
h) showHelp=true;;
|
||||
p) persistent=true;;
|
||||
c) clean=true;;
|
||||
?) showHelp=true;;
|
||||
esac
|
||||
done
|
||||
shift $(($OPTIND - 1))
|
||||
fi
|
||||
|
||||
if [ "$num_options" -gt 1 ]; then
|
||||
echo "ERROR: Too Many Options"
|
||||
echo "$usage"
|
||||
exit
|
||||
fi
|
||||
|
||||
if $showHelp; then
|
||||
echo "$usage"
|
||||
exit
|
||||
fi
|
||||
|
||||
for i in "$@"; do
|
||||
output=$(getent ahostsv4 "$i")
|
||||
if [ -z "$output" ]; then
|
||||
echo '***WARNING: could not find hostname "$i"'
|
||||
echo ""
|
||||
else
|
||||
hosts+="$i "
|
||||
fi
|
||||
done
|
||||
|
||||
if $clean; then
|
||||
cleanup
|
||||
exit
|
||||
fi
|
||||
|
||||
echo "***authenticating to:"
|
||||
for host in $hosts; do
|
||||
echo "$host"
|
||||
done
|
||||
|
||||
echo
|
||||
|
||||
if $persistent; then
|
||||
echo '***Setting up persistent SSH configuration between all nodes'
|
||||
persistentSetup
|
||||
echo $'\n*** Sucessfully set up ssh throughout the cluster!'
|
||||
|
||||
else
|
||||
echo '*** Setting up temporary SSH configuration between all nodes'
|
||||
tempSetup
|
||||
echo $'\n***Finished temporary setup. When you are done with your cluster'
|
||||
echo $' session, tear down the SSH connections with'
|
||||
echo $' ./clustersetup.sh -c '$hosts''
|
||||
fi
|
||||
|
||||
echo
|
||||
Reference in New Issue
Block a user