X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Flinux%2Fccn%2Ffibentry.py;h=8712708145bc1e7fef45a330748d712a7c6908db;hb=6285ca51026efb69642eea9dfc7c480e722d84a9;hp=1f39a98697999e33f2d8a0658b991c2613ab1515;hpb=f072f25afac82e5a878fbc5566108a4206d3f5c7;p=nepi.git diff --git a/src/nepi/resources/linux/ccn/fibentry.py b/src/nepi/resources/linux/ccn/fibentry.py index 1f39a986..87127081 100644 --- a/src/nepi/resources/linux/ccn/fibentry.py +++ b/src/nepi/resources/linux/ccn/fibentry.py @@ -3,9 +3,8 @@ # 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. +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation; # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -20,12 +19,14 @@ from nepi.execution.attribute import Attribute, Flags, Types from nepi.execution.trace import Trace, TraceAttr from nepi.execution.resource import clsinit_copy, ResourceState, \ - ResourceAction, reschedule_delay + ResourceAction from nepi.resources.linux.application import LinuxApplication from nepi.resources.linux.ccn.ccnd import LinuxCCND from nepi.util.timefuncs import tnow import os +import socket +import time # TODO: Add rest of options for ccndc!!! @@ -33,14 +34,14 @@ import os @clsinit_copy class LinuxFIBEntry(LinuxApplication): - _rtype = "LinuxFIBEntry" + _rtype = "linux::FIBEntry" @classmethod def _register_attributes(cls): uri = Attribute("uri", "URI prefix to match and route for this FIB entry", default = "ccnx:/", - flags = Flags.ExecReadOnly) + flags = Flags.Design) protocol = Attribute("protocol", "Transport protocol used in network connection to peer " @@ -48,21 +49,26 @@ class LinuxFIBEntry(LinuxApplication): type = Types.Enumerate, default = "udp", allowed = ["udp", "tcp"], - flags = Flags.ExecReadOnly) + flags = Flags.Design) host = Attribute("host", - "Peer host used in network connection for this FIB entry. ", - flags = Flags.ExecReadOnly) + "Peer hostname used in network connection for this FIB entry. ", + flags = Flags.Design) port = Attribute("port", "Peer port address used in network connection to peer " "for this FIB entry.", - flags = Flags.ExecReadOnly) + flags = Flags.Design) + + ip = Attribute("ip", + "Peer host public IP used in network connection for this FIB entry. ", + flags = Flags.Design) cls._register_attribute(uri) cls._register_attribute(protocol) cls._register_attribute(host) cls._register_attribute(port) + cls._register_attribute(ip) @classmethod def _register_traces(cls): @@ -78,14 +84,37 @@ class LinuxFIBEntry(LinuxApplication): super(LinuxFIBEntry, self).__init__(ec, guid) self._home = "fib-%s" % self.guid self._ping = None - self._mtr = None self._traceroute = None + self._ccnd = None @property def ccnd(self): - ccnd = self.get_connected(LinuxCCND.rtype()) - if ccnd: return ccnd[0] - return None + if not self._ccnd: + ccnd = self.get_connected(LinuxCCND.get_rtype()) + if ccnd: + self._ccnd = ccnd[0] + + return self._ccnd + + @property + def ping(self): + if not self._ping: + from nepi.resources.linux.ping import LinuxPing + ping = self.get_connected(LinuxPing.get_rtype()) + if ping: + self._ping = ping[0] + + return self._ping + + @property + def traceroute(self): + if not self._traceroute: + from nepi.resources.linux.traceroute import LinuxTraceroute + traceroute = self.get_connected(LinuxTraceroute.get_rtype()) + if traceroute: + self._traceroute = traceroute[0] + + return self._traceroute @property def node(self): @@ -94,41 +123,43 @@ class LinuxFIBEntry(LinuxApplication): def trace(self, name, attr = TraceAttr.ALL, block = 512, offset = 0): if name == "ping": - return self.ec.trace(self._ping, "stdout", attr, block, offset) - if name == "mtr": - return self.ec.trace(self._mtr, "stdout", attr, block, offset) + if not self.ping: + return None + return self.ec.trace(self.ping.guid, "stdout", attr, block, offset) + if name == "traceroute": - return self.ec.trace(self._traceroute, "stdout", attr, block, offset) + if not self.traceroute: + return None + return self.ec.trace(self.traceroute.guid, "stdout", attr, block, offset) return super(LinuxFIBEntry, self).trace(name, attr, block, offset) - - def deploy(self): + + def do_deploy(self): # Wait until associated ccnd is provisioned if not self.ccnd or self.ccnd.state < ResourceState.READY: # ccnr needs to wait until ccnd is deployed and running - self.ec.schedule(reschedule_delay, self.deploy) + self.ec.schedule(self.reschedule_delay, self.deploy) else: - try: - if not self.get("command"): - self.set("command", self._start_command) + if not self.get("ip"): + host = self.get("host") + ip = socket.gethostbyname(host) + self.set("ip", ip) - if not self.get("env"): - self.set("env", self._environment) + if not self.get("command"): + self.set("command", self._start_command) - command = self.get("command") + if not self.get("env"): + self.set("env", self._environment) - self.info("Deploying command '%s' " % command) + command = self.get("command") + + self.info("Deploying command '%s' " % command) - self.discover() - self.provision() - self.configure() - except: - self.fail() - raise - - self.debug("----- READY ---- ") - self._ready_time = tnow() - self._state = ResourceState.READY + self.do_discover() + self.do_provision() + self.configure() + + self.set_ready() def upload_start_command(self): command = self.get("command") @@ -142,59 +173,52 @@ class LinuxFIBEntry(LinuxApplication): env = env and self.replace_paths(env) command = self.replace_paths(command) - (out, err), proc = self.execute_command(command, env) + # ccndc seems to return exitcode OK even if a (dns) error + # occurred, so we need to account for this case here. + (out, err), proc = self.execute_command(command, + env, blocking = True) if proc.poll(): - self._state = ResourceState.FAILED msg = "Failed to execute command" self.error(msg, out, err) - raise RuntimeError, msg - + raise RuntimeError(msg) + def configure(self): - if self.trace_enabled("ping"): + if self.trace_enabled("ping") and not self.ping: self.info("Configuring PING trace") - self._ping = self.ec.register_resource("LinuxPing") - self.ec.set(self._ping, "printTimestamp", True) - self.ec.set(self._ping, "target", self.get("host")) - self.ec.register_connection(self._ping, self.node.guid) + ping = self.ec.register_resource("linux::Ping") + self.ec.set(ping, "printTimestamp", True) + self.ec.set(ping, "target", self.get("host")) + self.ec.set(ping, "earlyStart", True) + self.ec.register_connection(ping, self.node.guid) + self.ec.register_connection(ping, self.guid) # schedule ping deploy - self.ec.deploy(guids=[self._ping], group = self.deployment_group) - - if self.trace_enabled("mtr"): - self.info("Configuring MTR trace") - self._mtr = self.ec.register_resource("LinuxMtr") - self.ec.set(self._mtr, "noDns", True) - self.ec.set(self._mtr, "printTimestamp", True) - self.ec.set(self._mtr, "continuous", True) - self.ec.set(self._mtr, "target", self.get("host")) - self.ec.register_connection(self._mtr, self.node.guid) - # schedule mtr deploy - self.ec.deploy(guids=[self._mtr], group = self.deployment_group) + self.ec.deploy(guids=[ping], group = self.deployment_group) - if self.trace_enabled("traceroute"): + if self.trace_enabled("traceroute") and not self.traceroute: self.info("Configuring TRACEROUTE trace") - self._traceroute = self.ec.register_resource("LinuxTraceroute") - self.ec.set(self._traceroute, "printTimestamp", True) - self.ec.set(self._traceroute, "continuous", True) - self.ec.set(self._traceroute, "target", self.get("host")) - self.ec.register_connection(self._traceroute, self.node.guid) + traceroute = self.ec.register_resource("linux::Traceroute") + self.ec.set(traceroute, "printTimestamp", True) + self.ec.set(traceroute, "continuous", True) + self.ec.set(traceroute, "target", self.get("host")) + self.ec.set(traceroute, "earlyStart", True) + self.ec.register_connection(traceroute, self.node.guid) + self.ec.register_connection(traceroute, self.guid) # schedule mtr deploy - self.ec.deploy(guids=[self._traceroute], group = self.deployment_group) + self.ec.deploy(guids=[traceroute], group = self.deployment_group) - def start(self): - if self._state in [ResourceState.READY, ResourceState.STARTED]: + def do_start(self): + if self.state == ResourceState.READY: command = self.get("command") self.info("Starting command '%s'" % command) - self._start_time = tnow() - self._state = ResourceState.STARTED + self.set_started() else: msg = " Failed to execute command '%s'" % command self.error(msg, out, err) - self._state = ResourceState.FAILED - raise RuntimeError, msg + raise RuntimeError(msg) - def stop(self): + def do_stop(self): command = self.get('command') env = self.get('env') @@ -202,30 +226,28 @@ class LinuxFIBEntry(LinuxApplication): self.info("Stopping command '%s'" % command) command = self._stop_command - (out, err), proc = self.execute_command(command, env) + (out, err), proc = self.execute_command(command, env, + blocking = True) - if proc.poll(): - pass + self.set_stopped() - self._stop_time = tnow() - self._state = ResourceState.STOPPED - - @property - def state(self): - return self._state + if err: + msg = " Failed to execute command '%s'" % command + self.error(msg, out, err) + raise RuntimeError(msg) @property def _start_command(self): uri = self.get("uri") or "" protocol = self.get("protocol") or "" - host = self.get("host") or "" + ip = self.get("ip") or "" port = self.get("port") or "" # add ccnx:/example.com/ udp 224.0.0.204 52428 return "ccndc add %(uri)s %(protocol)s %(host)s %(port)s" % ({ "uri" : uri, "protocol": protocol, - "host": host, + "host": ip, "port": port }) @@ -233,14 +255,14 @@ class LinuxFIBEntry(LinuxApplication): def _stop_command(self): uri = self.get("uri") or "" protocol = self.get("protocol") or "" - host = self.get("host") or "" + ip = self.get("ip") or "" port = self.get("port") or "" # add ccnx:/example.com/ udp 224.0.0.204 52428 return "ccndc del %(uri)s %(protocol)s %(host)s %(port)s" % ({ "uri" : uri, "protocol": protocol, - "host": host, + "host": ip, "port": port })