diff options
Diffstat (limited to 'vicn/resource/vpp/vpp.py')
-rw-r--r-- | vicn/resource/vpp/vpp.py | 96 |
1 files changed, 57 insertions, 39 deletions
diff --git a/vicn/resource/vpp/vpp.py b/vicn/resource/vpp/vpp.py index 9edcfea3..8250f99a 100644 --- a/vicn/resource/vpp/vpp.py +++ b/vicn/resource/vpp/vpp.py @@ -23,6 +23,7 @@ from vicn.core.attribute import Attribute, Multiplicity from vicn.core.exception import ResourceNotFound from vicn.core.resource import Resource from vicn.core.task import BashTask, task, inline_task +from vicn.core.task import inherit_parent, EmptyTask from vicn.resource.lxd.lxc_container import LxcContainer from vicn.resource.node import Node from vicn.resource.linux.application import LinuxApplication @@ -33,6 +34,7 @@ from vicn.resource.vpp.scripts import TPL_VPP_DPDK_DAEMON_SCRIPT from vicn.resource.vpp.vpp_commands import CMD_VPP_DISABLE, CMD_VPP_STOP from vicn.resource.vpp.vpp_commands import CMD_VPP_START from vicn.resource.vpp.vpp_commands import CMD_VPP_ENABLE_PLUGIN +from vicn.resource.vpp.vpp_commands import CMD_REMOVE_DPDK_PLUGIN from vicn.resource.vpp.vpp_host import VPPHost #------------------------------------------------------------------------------ @@ -50,7 +52,7 @@ class VPP(LinuxApplication): start and stop commands """ - __package_names__ = ['vpp', 'vpp-dbg', 'vpp-dpdk-dev'] + __package_names__ = ['vpp', 'vpp-dpdk-dev'] plugins = Attribute(String, multiplicity = Multiplicity.OneToMany) @@ -72,12 +74,15 @@ class VPP(LinuxApplication): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.vppctl_lock = asyncio.Lock() + self.vppctl_lock = asyncio.Lock() + + # needed by "lxc config device add" + self.memif_lock = asyncio.Lock() - self.dpdk_setup_file = None if isinstance(self.node, LxcContainer): if not 'vpp' in self.node.profiles: self.node.profiles.append('vpp') + self.dpdk_setup_file = None #-------------------------------------------------------------------------- # Resource lifecycle @@ -86,16 +91,14 @@ class VPP(LinuxApplication): def __after__(self): return ['BaseNetDevice'] + @inherit_parent + @task def __get__(self): + raise ResourceNotFound return BashTask(self.node, CMD_GET) + @inherit_parent def __subresources__(self): - self.dpdk_setup_file = TextFile(node = self.node, - filename = FN_VPP_DPDK_SCRIPT, - overwrite = True) - return self.dpdk_setup_file - - def __create__(self): socket_mem = dict() numa_mgr = self.node.node_with_kernel.numa_mgr @@ -117,25 +120,6 @@ class VPP(LinuxApplication): self.numa_node, self.core = \ numa_mgr.get_numa_core(numa_node = self.numa_node) - dpdk_list = list() - - # On numa architecture socket-mem requires to set the amount of memory - # to be reserved on each numa node - socket_mem_str = 'socket-mem ' - for numa in range (0,numa_mgr.get_number_of_numa()): - if numa in socket_mem: - socket_mem_str = socket_mem_str + str(socket_mem[numa]) - else: - socket_mem_str = socket_mem_str + '0' - - if numa < numa_mgr.get_number_of_numa()-1: - socket_mem_str = socket_mem_str + ',' - - dpdk_list.append(socket_mem_str) - - for interface in self.node.interfaces: - if isinstance(interface, DpdkDevice): - dpdk_list.append('dev ' + interface.pci_address) # Add the core on which running vpp and the dpdk parameters setup = TPL_VPP_DPDK_DAEMON_SCRIPT + 'cpu {' @@ -146,19 +130,42 @@ class VPP(LinuxApplication): self.numa_node, cpu_worker =numa_mgr.get_numa_core(self.numa_node) setup = setup + '''\n corelist-workers ''' + str(cpu_worker) - setup = setup + '''\n}\n\n dpdk { ''' - - for dpdk_dev in dpdk_list: - setup = setup + ''' \n ''' + dpdk_dev - - setup = setup + '\n}' + dpdk_list = list() + for interface in self.node.interfaces: + if isinstance(interface, DpdkDevice): + dpdk_list.append('dev ' + interface.pci_address) + setup = setup + '''\n}\n\n''' + if dpdk_list: + setup = setup + 'dpdk {' + # add socket_mem + # On numa architecture socket-mem requires to set the amount of memory + # to be reserved on each numa node + socket_mem_str = 'socket-mem ' + for numa in range (0,numa_mgr.get_number_of_numa()): + if numa in socket_mem: + socket_mem_str = socket_mem_str + str(socket_mem[numa]) + else: + socket_mem_str = socket_mem_str + '0' + + if numa < numa_mgr.get_number_of_numa()-1: + socket_mem_str = socket_mem_str + ',' + + dpdk_list.append(socket_mem_str) + + for dpdk_dev in dpdk_list: + setup = setup + ''' \n ''' + dpdk_dev + setup = setup + '''\n}''' + + dpdk_setup_file = TextFile(node = self.node, + filename = FN_VPP_DPDK_SCRIPT, + content = setup, + overwrite = True) - if any([isinstance(interface,DpdkDevice) for interface in self.node.interfaces]): - self.dpdk_setup_file.content = setup - else: - self.dpdk_setup_file.content = TPL_VPP_DPDK_DAEMON_SCRIPT + return dpdk_setup_file + @inherit_parent + def __create__(self): lock = self.node.node_with_kernel.vpp_host.vppstart_lock vpp_disable = BashTask(self.node, CMD_VPP_DISABLE, lock = lock) @@ -166,8 +173,19 @@ class VPP(LinuxApplication): enable_ip_forward = BashTask(self.node, CMD_DISABLE_IP_FORWARD) start_vpp = BashTask(self.node, CMD_VPP_START, lock = lock) - return ((vpp_disable > vpp_stop) | enable_ip_forward) > start_vpp + found = False + for iface in self.interfaces: + if isinstance(iface.parent, DpdkDevice): + found = True + break + + remove_dpdk_plugin = EmptyTask() + if (not found): + remove_dpdk_plugin = BashTask(self.node, CMD_REMOVE_DPDK_PLUGIN, lock = lock) + + return (((vpp_disable > vpp_stop) | enable_ip_forward) > (remove_dpdk_plugin > start_vpp)) + @inherit_parent def __delete__(self): return BashTask(self.node, CMD_VPP_STOP) |