aboutsummaryrefslogtreecommitdiff
path: root/rhumba_emulab.py
diff options
context:
space:
mode:
authorSander Vrijders <sander.vrijders@intec.ugent.be>2017-02-09 14:56:32 +0100
committerSander Vrijders <sander.vrijders@intec.ugent.be>2017-02-09 14:56:32 +0100
commit53a11eac43187ff12d82605cf8379803697db7b7 (patch)
tree9e83d743b7178b10d901e42df2b3de421320230c /rhumba_emulab.py
parent22b3218c951ebfc0bd2b2bdb89adb59b8a3e5ee7 (diff)
downloadrumba-53a11eac43187ff12d82605cf8379803697db7b7.tar.gz
rumba-53a11eac43187ff12d82605cf8379803697db7b7.zip
rhumba: Create Python package
This transforms the repository into a real Python package.
Diffstat (limited to 'rhumba_emulab.py')
-rw-r--r--rhumba_emulab.py246
1 files changed, 0 insertions, 246 deletions
diff --git a/rhumba_emulab.py b/rhumba_emulab.py
deleted file mode 100644
index db1c299..0000000
--- a/rhumba_emulab.py
+++ /dev/null
@@ -1,246 +0,0 @@
-#
-# Emulab support for Rhumba
-#
-# Sander Vrijders <sander.vrijders@intec.ugent.be>
-# Wouter Tavernier <wouter.tavernier@intec.ugent.be>
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-# MA 02110-1301 USA
-
-import os
-import time
-import re
-from ast import literal_eval
-from ssh_support import *
-import rhumba
-
-import warnings
-warnings.filterwarnings("ignore")
-
-
-
-# Represents an emulab testbed info
-#
-# @url [string] URL of the testbed
-# @image [string] specific image to use
-#
-class EmulabTestbed(rhumba.Testbed):
- def __init__(self, exp_name, username, password = "",
- proj_name = "ARCFIRE", url = "wall1.ilabt.iminds.be",
- image = "UBUNTU14-64-STD"):
- rhumba.Testbed.__init__(self, exp_name, username, password, proj_name)
- self.url = url
- self.image = image
-
- def ops_server(self):
- '''
- Return server name of the ops-server (is testbed specific)
-
- @param self: testbed info
-
- @return: server name of the ops-server
- '''
- return 'ops.' + self.url
-
- def full_name(self, node_name):
- '''
- Return server name of a node
-
- @param node_name: name of the node
- @param self: testbed info
-
- @return: server name of the node
- '''
- return node_name + '.' + self.exp_name + '.' + \
- self.proj_name + '.' + self.url
-
- def get_experiment_list(self, project_name = None):
- '''
- Get list of made emulab experiments accessible with your credentials
-
- @param self: testbed info
- @param project_name: optional filter on project
-
- @return: list of created experiments (strings)
- '''
- cmd = '/usr/testbed/bin/sslxmlrpc_client.py -m experiment getlist'
- out = execute_command(self, self.ops_server(), cmd)
-
- try:
- if project_name != None:
- return literal_eval(out)[project_name][project_name]
- else:
- return literal_eval(out)
- except:
- return { project_name: { project_name: [] }}
-
- def swap_exp_in(self):
- '''
- Swaps experiment in
-
- @param self: testbed info
- '''
- cmd = '/usr/testbed/bin/sslxmlrpc_client.py swapexp proj=' + \
- self.proj_name + \
- ' exp=' + \
- self.exp_name + \
- ' direction=in'
-
- output = execute_command(self, self.ops_server(), cmd)
-
- return output
-
- def _create_experiment(self, nodes, links):
- '''
- Creates an emulab experiment
-
- @param self: testbed info
- @param nodes: holds the nodes in the experiment
- @param links: holds the links in the experiment
- '''
- proj_name = self.proj_name
- exp_name = self.exp_name
-
- exp_list = self.get_experiment_list()
-
- try:
- if exp_name in exp_list[proj_name][proj_name]:
- print("Experiment already exists.")
- return
- except:
- print("First experiment to be created for that project.")
-
- ns = self.generate_ns_script(nodes, links)
- dest_file_name = '/users/'+ self.username + \
- '/temp_ns_file.%s.ns' % os.getpid()
- copy_file_to_testbed(self, self.ops_server(), ns, dest_file_name)
-
- cmd = '/usr/testbed/bin/sslxmlrpc_client.py startexp ' + \
- 'batch=false wait=true proj="' + proj_name + \
- '" exp="' + exp_name + '" noswapin=true ' + \
- 'nsfilepath="' + dest_file_name + '"'
-
- execute_command(self, self.ops_server(), cmd, time_out = None)
- execute_command(self, self.ops_server(),'rm ' + dest_file_name)
- print("New experiment succesfully created.")
-
- def generate_ns_script(self, nodes, p2plinks):
- '''
- Generate ns script based on network graph.
- Enables to customize default node image.
-
- @param nodes: holds the nodes in the experiment
- @param links: holds the links in the experiment
- @param self: testbed info
-
- @return: ns2 script for Emulab experiment
- '''
-
- ns2_script = "# ns script generated by Rhumba\n"
- ns2_script += "set ns [new Simulator]\n"
- ns2_script += "source tb_compat.tcl\n"
-
- for node in nodes:
- ns2_script += "set " + node.name + " [$ns node]\n"
- ns2_script += "tb-set-node-os $" + node.name + " " + \
- self.image + "\n"
-
- for link in p2plinks:
- ns2_script += "set " + link.name + \
- " [$ns duplex-link $" + \
- link.node_a.name + " $" + \
- link.node_b.name + " 1000Mb 0ms DropTail]\n"
-
- ns2_script += "$ns run\n"
-
- return ns2_script
-
- def wait_until_nodes_up(self):
- '''
- Checks if nodes are up
-
- @param self: testbed info
- '''
- print("Waiting until all nodes are up")
-
- cmd = '/usr/testbed/bin/script_wrapper.py expinfo -e' + \
- self.proj_name + \
- ',' + \
- self.exp_name + \
- ' -a | grep State | cut -f2,2 -d " "'
-
- res = execute_command(self, self.ops_server(), cmd)
- active = False
- if res == "active":
- active = True
- while active != True:
- res = execute_command(self, self.ops_server(), cmd)
- if res == "active":
- active = True
- print("Still waiting")
- time.sleep(5)
-
- def complete_experiment_graph(self, nodes, p2plinks):
- '''
- Gets the interface (ethx) to link mapping
-
- @param self: testbed info
- @param nodes: holds the nodes in the experiment
- @param links: holds the links in the experiment
- '''
-
- node_full_name = full_name(self, nodes[0].name)
- cmd = 'cat /var/emulab/boot/topomap'
- topomap = execute_command(self, node_full_name, cmd)
- # Almost as ugly as yo momma
- index = topomap.rfind("# lans")
- topo_array = topomap[:index].split('\\n')[1:-1]
- # Array contains things like 'r2b1,link7:10.1.6.3 link6:10.1.5.3'
- for item in topo_array:
- item_array = re.split(',? ?', item)
- node_name = item_array[0]
- for item2 in item_array[1:]:
- item2 = item2.split(':')
- link_name = item2[0]
- link_ip = item2[1]
- for link in p2plinks:
- if link.name == link_name:
- if link.node_a.name == node_name:
- link.int_a.ip = link_ip
- elif link.node_b.name == node_name:
- link.int_b.ip = link_ip
-
- for node in nodes:
- cmd = 'cat /var/emulab/boot/ifmap'
- node_full_name = full_name(self, node.name)
- output = execute_command(self, node_full_name, cmd)
- output = re.split('\\\\n', output)
- for item in output:
- item = item.split()
- for link in p2plinks:
- if link.node_a.name == node.name and \
- link.int_a.ip == item[1]:
- link.int_a.name = item[0]
- elif link.node_b.name == node.name and \
- link.int_b.ip == item[1]:
- link.int_b.name = item[0]
- node.full_name = self.full_name(node.name)
-
- def create_experiment(self, nodes, links):
- self._create_experiment(nodes, links)
- self.swap_exp_in()
- self.wait_until_nodes_up()
- es.complete_experiment_graph(nodes, links)
-