diff options
author | Jordan Augé <jordan.auge+fdio@email.com> | 2017-02-24 14:58:01 +0100 |
---|---|---|
committer | Jordan Augé <jordan.auge+fdio@cisco.com> | 2017-02-24 18:36:29 +0000 |
commit | 85a341d645b57b7cd88a26ed2ea0a314704240ea (patch) | |
tree | bdda2b35003aae20103a796f86daced160b8a730 /vicn/resource/icn/nfd.py | |
parent | 9b30fc10fb1cbebe651e5a107e8ca5b24de54675 (diff) |
Initial commit: vICN
Change-Id: I7ce66c4e84a6a1921c63442f858b49e083adc7a7
Signed-off-by: Jordan Augé <jordan.auge+fdio@cisco.com>
Diffstat (limited to 'vicn/resource/icn/nfd.py')
-rw-r--r-- | vicn/resource/icn/nfd.py | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/vicn/resource/icn/nfd.py b/vicn/resource/icn/nfd.py new file mode 100644 index 00000000..c65fdeb8 --- /dev/null +++ b/vicn/resource/icn/nfd.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Copyright (c) 2017 Cisco and/or its affiliates. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import logging +import re + +from vicn.core.exception import ResourceNotFound +from vicn.core.task import inline_task, BashTask +from vicn.core.task import ParseRegexTask +from vicn.resource.icn.forwarder import Forwarder +from vicn.resource.icn.icn_application import ICN_SUITE_NDN + +log = logging.getLogger(__name__) + +NFD_CONF_FILE = "/etc/ndn/nfd.conf" + +CMD_SET_STRATEGY_CACHE = '\n'.join([ + 'sed -i "s/^.*cs_max_packets .*$/ cs_max_packets {nfd.cache_size}/" ' \ + '{conf_file}', + 'sed -i "0,/\/ / s/\/localhost\/nfd\/strategy\/.*/' \ + '\/localhost\/nfd\/strategy\/{nfd.fw_strategy}/" {conf_file}', + 'service nfd restart']) +CMD_RESET_CACHE = ''' +sed -i "s/^.*cs_max_packets .*$/ cs_max_packets 65536/" {conf_file} +service nfd restart +''' + +CMD_ADD_ROUTE = 'nfdc register {route.prefix} {route.face.nfd_uri}' +# or: nfdc register {route.prefix} {route.face.id} + +CMD_REMOVE_ROUTE = 'nfdc unregister {route.prefix} {route.face.nfd_uri}' +# or: nfdc unregister {route.prefix} {route.face.id} + +CMD_ADD_FACE = 'nfdc create {face.nfdc_flags} {face.nfd_uri}' + +CMD_REMOVE_FACE = 'nfdc destroy {face.id}' +# or: nfdc destroy {face.nfd_uri} + +# FIXME redundant with Forwarder.FaceType +layer_2_protocols = ["udp", "udp4", "tcp", "tcp4", "ether"] + +NFD_DEFAULT_PORT = 6363 + +# Regular expressions used for parsing nfdc results +STR_ADD_FACE = ('Face creation succeeded: ControlParameters\(FaceId: ' + '(?P<id>.*?), Uri: (?P<face_uri>.*?), \)') +RX_ADD_FACE = re.compile(STR_ADD_FACE) + +class NFD(Forwarder): + """ + Resource: NFD + """ + + __capabilities__ = set(['ICN_SUITE_NDN']) + __service_name__ = 'nfd' + __package_names__ = ['nfd'] + + #-------------------------------------------------------------------------- + # Resource lifecycle + #-------------------------------------------------------------------------- + + @inline_task + def __get__(self): + # NFD is assumed not to exist + raise ResourceNotFound + + def __create__(self): + # Modify the configuration file before running the forwarder service + conf = BashTask(self.node, CMD_SET_STRATEGY_CACHE, {'nfd': self}) + forwarder = Forwarder.__create__(self) + return conf.then(forwarder) + + def __delete__(self): + raise NotImplementedError + + #-------------------------------------------------------------------------- + # Attributes + #-------------------------------------------------------------------------- + + @inline_task + def _get_routes(self): + return {'routes': list()} + + @inline_task + def _add_routes(self, route): + return BashTask(self.node, CMD_ADD_ROUTE, {'route': route}) + + @inline_task + def _remove_routes(self, route): + return BashTask(self.node, CMD_REMOVE_ROUTE, {'route': route}) + + @inline_task + def _get_faces(self): + return {'faces': list()} + + @inline_task + def _add_faces(self, face): + add_face = BashTask(self.node, CMD_ADD_FACE, {'face': face}) + set_face_id = ParseRegexTask(RX_ADD_FACE) + return add_face.compose(set_face_id) + + @inline_task + def _remove_faces(self, face): + return BashTask(self.node, CMD_REMOVE_FACE, {'face': face}) + + #-------------------------------------------------------------------------- + # Methods + #-------------------------------------------------------------------------- + + def __method_reset_cache__(self, conf_file): + return BashTask(self.node, CMD_RESET_CACHE, {'conf_file': conf_file}) + + #-------------------------------------------------------------------------- + # Internal methods + #-------------------------------------------------------------------------- + + def _get_default_port(self): + return NFD_DEFAULT_PORT + + def _def_protocol_suite(self): + return ICN_SUITE_NDN |