From: Lucia Guevgeozian Odizzio Date: Fri, 4 Apr 2014 13:48:29 +0000 (+0200) Subject: Renaming old ping exp to filters X-Git-Tag: nepi-3.1.0~91 X-Git-Url: http://git.onelab.eu/?p=nepi.git;a=commitdiff_plain;h=6933e58c5af68fc242fe71878337bd3566aed1c1 Renaming old ping exp to filters --- diff --git a/examples/planetlab/ping_filters_experiment.py b/examples/planetlab/ping_filters_experiment.py new file mode 100755 index 00000000..79d4738c --- /dev/null +++ b/examples/planetlab/ping_filters_experiment.py @@ -0,0 +1,161 @@ +#!/usr/bin/env python +# +# NEPI, a framework to manage network experiments +# Copyright (C) 2013 INRIA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# Author: Lucia Guevgeozian + +from nepi.execution.ec import ExperimentController +from nepi.execution.resource import ResourceAction, ResourceState + +import os + +def create_node(ec, username, pl_user, pl_password, hostname=None, country=None, + operatingSystem=None, minBandwidth=None, minCpu=None): + + node = ec.register_resource("PlanetlabNode") + + if username: + ec.set(node, "username", username) + if pl_user: + ec.set(node, "pluser", pl_user) + if pl_password: + ec.set(node, "plpassword", pl_password) + + if hostname: + ec.set(node, "hostname", hostname) + if country: + ec.set(node, "country", country) + if operatingSystem: + ec.set(node, "operatingSystem", operatingSystem) + if minBandwidth: + ec.set(node, "minBandwidth", minBandwidth) + if minCpu: + ec.set(node, "minCpu", minCpu) + + ec.set(node, "cleanHome", True) + ec.set(node, "cleanProcesses", True) + + return node + +def add_app(ec, command, node, sudo=None, video=None, depends=None, forward_x11=None, \ + env=None): + app = ec.register_resource("LinuxApplication") + if sudo is not None: + ec.set(app, "sudo", sudo) + if video is not None: + ec.set(app, "sources", video) + if depends is not None: + ec.set(app, "depends", depends) + if forward_x11 is not None: + ec.set(app, "forwardX11", forward_x11) + if env is not None: + ec.set(app, "env", env) + ec.set(app, "command", command) + + ec.register_connection(app, node) + + return app + +exp_id = "ping_filters_exp" + +# Create the entity Experiment Controller: +ec = ExperimentController(exp_id) + +# Register the nodes resources: + +# The username in this case is the slice name, the one to use for login in +# via ssh into PlanetLab nodes. Replace with your own slice name. +username = "inria_sfatest" + +# The pluser and plpassword are the ones used to login in the PlanetLab web +# site. Replace with your own user and password account information. +pl_user = "lucia.guevgeozian_odizzio@inria.fr" +pl_password = os.environ.get("PL_PASS") + +# Choose the PlanetLab nodes for the experiment, in this example 5 nodes are +# used, and they are picked according to different criterias. + +# First node will be the one defined by its hostname. +hostname = "planetlab2.utt.fr" +node1 = create_node(ec, username, pl_user, pl_password, hostname=hostname) + +# Second node will be any node in France. +country = "France" +node2 = create_node(ec, username, pl_user, pl_password, country=country) + +# Third node will be a node in France that has Fedora 14 installed. +operatingSystem = "f14" +node3 = create_node(ec, username, pl_user, pl_password, country=country, + operatingSystem=operatingSystem) + +# Forth node will have at least 50% of CPU available +minCpu=50 +node4 = create_node(ec, username, pl_user, pl_password, minCpu=minCpu) + +# Fifth node can be any node, constrains are not important. +node5 = create_node(ec, username, pl_user, pl_password) + +# Register the applications to run in the nodes, in this case just ping to the +# first node: +apps_per_node = dict() +apps = [] +for node in [node2, node3, node4, node5]: + command = "ping -c5 %s > ping%s.txt" % (hostname, node) + app = add_app(ec, command, node) + apps_per_node[node] = app + apps.append(app) + +# Register conditions + +# The nodes that are completely identified by their hostnames have to be provisioned +# before the rest of the nodes. This assures that no other resource will use the +# identified node even if the constraints matchs. +# In this example node2, node3, node4 and node5, are deployed after node1 is +# provisioned. node1 must be the node planetlab2.utt.fr, meanwhile node2, node3, +# node4 and node5 just need to fulfill certain constraints. +# Applications are always deployed after nodes, so no need to register conditions +# for the apps in this example. + +ec.register_condition(node2, ResourceAction.DEPLOY, node1, ResourceState.PROVISIONED) +ec.register_condition(node3, ResourceAction.DEPLOY, node1, ResourceState.PROVISIONED) +ec.register_condition(node4, ResourceAction.DEPLOY, node1, ResourceState.PROVISIONED) +ec.register_condition(node5, ResourceAction.DEPLOY, node1, ResourceState.PROVISIONED) + +# Deploy the experiment: +ec.deploy() + +# Wait until the applications are finish to retrive the traces: +ec.wait_finished(apps) + +traces = dict() +for node, app in apps_per_node.iteritems(): + ping_string = "ping%s.txt" % node + trace = ec.trace(app, ping_string) + traces[node]= trace + +# Choose a directory to store the traces locally, change to a convenient path for you: +directory = "examples/planetlab/" +for node, trace in traces.iteritems(): + trace_file = directory + "ping%s.txt" % node + f = open(trace_file, "w") + f.write(trace) + f.close() + +# Do the experiment controller shutdown: +ec.shutdown() + +# END