#
# NEPI, a framework to manage network experiments
# 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 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
# 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: Alina Quereilhac
from nepi.execution.attribute import Attribute, Flags, Types
from nepi.execution.resource import clsinit_copy, ResourceState
from nepi.resources.ns3.ns3dceapplication import NS3BaseDceApplication
import os
import threading
@clsinit_copy
class NS3BaseCCNDceApplication(NS3BaseDceApplication):
_rtype = "abstract::ns3::CCNDceApplication"
# Lock used to synchronize usage of CcnClientHelper
ccn_client_lock = threading.Lock()
_ccn_client_helper_uuid = None
@property
def ccn_client_helper_uuid(self):
if not self._ccn_client_helper_uuid:
self._ccn_client_helper_uuid = self.simulation.create("CcnClientHelper")
return self._ccn_client_helper_uuid
def _instantiate_object(self):
pass
def _connect_object(self):
node = self.node
if node.uuid not in self.connected:
self._connected.add(node.uuid)
# Preventing concurrent access to the DceApplicationHelper
# from different DceApplication RMs
with self.ccn_client_lock:
self.simulation.invoke(
self.ccn_client_helper_uuid,
"ResetArguments")
self.simulation.invoke(
self.ccn_client_helper_uuid,
"ResetEnvironment")
self.simulation.invoke(
self.ccn_client_helper_uuid,
"SetBinary", self.get("binary"))
self.simulation.invoke(
self.ccn_client_helper_uuid,
"SetStackSize", self.get("stackSize"))
arguments = self.get("arguments")
if arguments:
for arg in map(str.strip, arguments.split(";")):
self.simulation.invoke(
self.ccn_client_helper_uuid,
"AddArgument", arg)
environment = self.get("environment")
if environment:
for env in map(str.strip, environment.split(";")):
key, val = env.split("=")
self.simulation.invoke(
self.ccn_client_helper_uuid,
"AddEnvironment", key, val)
if self.has_attribute("files"):
files = self.get("files")
if files:
for file in map(str.strip, files.split(";")):
remotepath, dcepath = file.split("=")
localpath = os.path.join(self.simulation.app_home,
os.path.basename(remotepath))
self.simulation.invoke(
self.ccn_client_helper_uuid,
"AddFile", localpath, dcepath)
if self.has_attribute("stdinFile"):
stdinfile = self.get("stdinFile")
if stdinfile:
# stdinfile might be an empty text that should be set as
# stdin
self.simulation.invoke(
self.ccn_client_helper_uuid,
"SetStdinFile", stdinfile)
apps_uuid = self.simulation.invoke(
self.ccn_client_helper_uuid,
"InstallInNode", self.node.uuid)
"""
container_uuid = self.simulation.create("NodeContainer")
self.simulation.invoke(container_uuid, "Add", self.node.uuid)
apps_uuid = self.simulation.invoke(
self.ccn_client_helper_uuid,
"Install", container_uuid)
"""
self._uuid = self.simulation.invoke(apps_uuid, "Get", 0)
if self.has_changed("StartTime"):
self.simulation.ns3_set(self.uuid, "StartTime", self.get("StartTime"))
if self.has_changed("StopTime"):
self.simulation.ns3_set(self.uuid, "StopTime", self.get("StopTime"))