aboutsummaryrefslogtreecommitdiff
path: root/jfed_support.py
diff options
context:
space:
mode:
authorSander Vrijders <sander.vrijders@intec.ugent.be>2017-01-24 15:01:17 +0100
committerSander Vrijders <sander.vrijders@intec.ugent.be>2017-01-24 15:01:17 +0100
commit97e601fdc5c03de7c643c855228b83419394f728 (patch)
tree0f4cca29dd5bd4236122be280c53c6a34ced12fe /jfed_support.py
parentaa144af88a71fe61c09c21469f78e22881f83354 (diff)
downloadrumba-97e601fdc5c03de7c643c855228b83419394f728.tar.gz
rumba-97e601fdc5c03de7c643c855228b83419394f728.zip
rhumba: Add jFed support
This adds jFed support. You need to direct the python script to the jFed CLI jar when creating a jFedTestbed, as well as directing it to your certificate. The passphrase for this certificate will be asked upon starting.
Diffstat (limited to 'jfed_support.py')
-rw-r--r--jfed_support.py128
1 files changed, 128 insertions, 0 deletions
diff --git a/jfed_support.py b/jfed_support.py
new file mode 100644
index 0000000..aa933d8
--- /dev/null
+++ b/jfed_support.py
@@ -0,0 +1,128 @@
+#
+# jFed support for Rhumba
+#
+# Sander Vrijders <sander.vrijders@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 subprocess
+import xml.dom.minidom as xml
+
+def create_rspec(testbed, nodes, links):
+ testbed.rspec = testbed.exp_name + ".rspec"
+
+ impl = xml.getDOMImplementation()
+ doc = impl.createDocument(None, "rspec", None)
+
+ top_el = doc.documentElement
+ top_el.setAttribute("xmlns", "http://www.geni.net/resources/rspec/3")
+ top_el.setAttribute("type", "request")
+ top_el.setAttribute("xmlns:emulab", "http://www.protogeni.net/resources/" +
+ "rspec/ext/emulab/1")
+ top_el.setAttribute("xmlns:jfedBonfire", "http://jfed.iminds.be/rspec/" +
+ "ext/jfed-bonfire/1")
+ top_el.setAttribute("xmlns:delay", "http://www.protogeni.net/resources/" +
+ "rspec/ext/delay/1")
+ top_el.setAttribute("xmlns:jfed-command", "http://jfed.iminds.be/" +
+ "rspec/ext/jfed-command/1")
+ top_el.setAttribute("xmlns:client", "http://www.protogeni.net/resources/" +
+ "rspec/ext/client/1")
+ top_el.setAttribute("xmlns:jfed-ssh-keys", "http://jfed.iminds.be/rspec" +
+ "/ext/jfed-ssh-keys/1")
+ top_el.setAttribute("xmlns:jfed", "http://jfed.iminds.be/rspec/ext/jfed/1")
+ top_el.setAttribute("xmlns:sharedvlan", "http://www.protogeni.net/" +
+ "resources/rspec/ext/shared-vlan/1")
+ top_el.setAttribute("xmlns:xsi", "http://www.w3.org/2001/" +
+ "XMLSchema-instance")
+ top_el.setAttribute("xsi:schemaLocation", "http://www.geni.net/" +
+ "resources/rspec/3 http://www.geni.net/" +
+ "resources/rspec/3/request.xsd")
+
+ for node in nodes:
+ el = doc.createElement("node")
+ top_el.appendChild(el)
+ el.setAttribute("client_id", node.name)
+ el.setAttribute("exclusive", "true")
+ el.setAttribute("component_manager_id", testbed.authority)
+
+ el2 = doc.createElement("sliver_type")
+ el.appendChild(el2)
+ el2.setAttribute("name", "raw-pc")
+
+ node.ifs = 0
+ for link in links:
+ if link.node_a == node or link.node_b == node:
+ el3 = doc.createElement("interface")
+ if link.node_a == node:
+ link_id = link.int_a.id = node.name + ":if" + str(node.ifs)
+ if link.node_b == node:
+ link_id = link.int_b.id = node.name + ":if" + str(node.ifs)
+
+ el3.setAttribute("client_id", link_id)
+ node.ifs += 1
+ el.appendChild(el3)
+
+ for link in links:
+ el = doc.createElement("link")
+ top_el.appendChild(el)
+ el.setAttribute("client_id", link.name)
+
+ el2 = doc.createElement("component_manager_id")
+ el2.setAttribute("name", testbed.authority)
+ el.appendChild(el2)
+
+ el3 = doc.createElement("interface_ref")
+ el3.setAttribute("client_id", link.int_a.id)
+ el.appendChild(el3)
+
+ el4 = doc.createElement("interface_ref")
+ el4.setAttribute("client_id", link.int_b.id)
+ el.appendChild(el4)
+
+ file = open(testbed.rspec, "w")
+ file.write(doc.toprettyxml())
+ file.close()
+
+def create_experiment(testbed, nodes, links):
+ create_rspec(testbed, nodes, links)
+ testbed.manifest = testbed.exp_name + ".rrspec"
+
+ subprocess.call(["java", "-jar", testbed.jfed_jar, "create", "-S", \
+ testbed.proj_name, "--rspec", \
+ testbed.rspec, "-s", \
+ testbed.exp_name, "-p", testbed.cert_file, "-k", \
+ "usercert,userkeys,shareduserallkeys", "--create-slice",\
+ "--manifest", testbed.manifest,
+ "-P", testbed.password, \
+ "-e", testbed.exp_hours])
+
+ rspec = xml.parse(testbed.manifest)
+ xml_nodes = rspec.getElementsByTagName("node")
+
+ for xml_node in xml_nodes:
+ n_name = xml_node.getAttribute("client_id")
+ intfs = xml_node.getElementsByTagName("interface")
+ for link in links:
+ if link.node_a.name == n_name:
+ interface = link.int_a
+ if link.node_b.name == n_name:
+ interface = link.int_b
+ for intf in intfs:
+ comp_id = intf.getAttribute("component_id")
+ comp_arr = comp_id.split(":")
+ interface.name = comp_arr[-1]
+ xml_ip = intf.getElementsByTagName("ip")
+ interface.ip = xml_ip[0].getAttribute("address")