# Copyright (C) 2014 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
from nepi.execution.attribute import Attribute, Flags, Types
from nepi.execution.trace import Trace, TraceAttr
from nepi.execution.resource import ResourceManager, clsinit_copy, \
- ResourceState, ResourceFactory, reschedule_delay
+ ResourceState, ResourceFactory
from nepi.resources.linux.application import LinuxApplication
from nepi.util.timefuncs import tnow, tdiffsec
from nepi.resources.ns3.ns3simulation import NS3Simulation
import time
import threading
-## TODO: Clean up DCE part. All that is DCE specific should go
-## in the linux ns3dceapplication.py
-
@clsinit_copy
class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
- _rtype = "LinuxNS3Simulation"
+ _rtype = "linux::ns3::Simulation"
@classmethod
def _register_attributes(cls):
ns3_version = Attribute("ns3Version",
"Version of ns-3 to install from nsam repo",
- #default = "ns-3.19",
default = "ns-3.20",
#default = "ns-3-dev",
flags = Flags.Design)
pybindgen_version = Attribute("pybindgenVersion",
"Version of pybindgen to install from bazar repo",
- #default = "864",
default = "868",
#default = "876",
flags = Flags.Design)
dce_version = Attribute("dceVersion",
"Version of dce to install from nsam repo (tag branch for repo)",
- default = "dce-1.3",
- #default = "dce-dev",
+ #default = "dce-1.3",
+ default = "dce-dev",
flags = Flags.Design)
populate_routing_tables = Attribute("populateRoutingTables",
type = Types.Bool,
flags = Flags.Design)
- stoptime = Attribute("stopTime",
+ stoptime = Attribute("StopTime",
"Time at which the simulation will stop",
flags = Flags.Design)
self._client = None
self._home = "ns3-simu-%s" % self.guid
self._socket_name = "ns3-%s.sock" % os.urandom(4).encode('hex')
- self._dce_manager_helper_uuid = None
- self._dce_application_helper_uuid = None
self._enable_dce = None
+ self._dce_helper = None
@property
def socket_name(self):
self.debug("---- RESCHEDULING DEPLOY ---- node state %s " % self.node.state )
# ccnd needs to wait until node is deployed and running
- self.ec.schedule(reschedule_delay, self.deploy)
+ self.ec.schedule(self.reschedule_delay, self.deploy)
else:
if not self.get("command"):
self.set("command", self._start_command)
if self.get("populateRoutingTables") == True:
self.invoke(IPV4_GLOBAL_ROUTING_HELPER_UUID, "PopulateRoutingTables")
+ time = self.get("StopTime")
+ if time:
+ self._client.stop(time=time)
+
self._client.start()
self.set_started()
else:
msg = " Failed to execute command '%s'" % command
self.error(msg, out, err)
- raise RuntimeError, msg
+ raise RuntimeError(msg)
def do_stop(self):
""" Stops simulation execution
"""
if self.state == ResourceState.STARTED:
- time = None
- if self.get("stopTime"):
- time = self.get("stopTime")
-
- self._client.stop(time=time)
+ if not self.get("StopTime"):
+ self._client.stop()
self.set_stopped()
def do_release(self):
super(LinuxApplication, self).do_release()
+ @property
+ def state(self):
+ super(LinuxApplication, self).state
+
+ if self._state == ResourceState.STARTED:
+ try:
+ is_finished = self.invoke(SIMULATOR_UUID, "isFinished")
+
+ if is_finished:
+ self.set_stopped()
+ except:
+ msg = "Simulator failed. Can not retrieve state"
+ out = ""
+
+ import traceback
+ err = traceback.format_exc()
+ self.error(msg, out, err)
+ self.do_fail()
+
+ return self._state
+
@property
def enable_dce(self):
if self._enable_dce is None:
rm = self.ec.get_resource(guid)
if isinstance(rm, rclass):
self._enable_dce = True
+
+ from nepi.resources.ns3.ns3dcehelper import NS3DceHelper
+ self._dce_helper = NS3DceHelper(self)
break
return self._enable_dce
+ @property
+ def dce_helper(self):
+ return self._dce_helper
+
@property
def _start_command(self):
command = []
"""
command = " [ -e %s ] && echo 'DONE' " % self.remote_socket
- for i in xrange(200):
+ for i in range(200):
(out, err), proc = self.node.execute(command, retry = 1,
with_lock = True)