Source code for fnss.netconfig.nodeconfig

"""Functions to deploy and configure protocol stacks and applications
on network nodes
"""

__all__ = [
    'add_stack',
    'get_stack',
    'remove_stack',
    'clear_stacks',
    'add_application',
    'get_application_names',
    'get_application_properties',
    'remove_application',
    'clear_applications',
           ]


[docs]def add_stack(topology, node, name, properties=None, **kwargs): """Set stack on a node. If the node already has a stack, it is overwritten Parameters ---------- topology : Topology The topology node : any hashable type The ID of the node name : str The name of the stack properties : dict, optional The properties of the stack **attr : keyworded attributes Further properties of the application """ if properties is None: properties = {} elif not isinstance(properties, dict): raise TypeError('The properties parameter must be a dictionary') properties.update(kwargs) topology.node[node]['stack'] = name, properties
[docs]def get_stack(topology, node, data=True): """Return the stack of a node, if any Parameters ---------- topology : Topology The topology node : any hashable type The ID of the node data : bool, optional If true, returns a tuple of the stack name and its attributes, otherwise just the stack name Returns ------- stack : tuple (name, properties) or name only If data = True, a tuple of two values, where the first value is the name of the stack and the second value is the dictionary of its properties. If data = False returns only the stack name If no stack is deployed, return None """ if 'stack' not in topology.node[node]: return None name, props = topology.node[node]['stack'] return (name, props) if data else name
[docs]def remove_stack(topology, node): """Remove stack from a node Parameters ---------- topology : Topology The topology node : any hashable type The ID of the node """ topology.node[node].pop('stack', None)
[docs]def clear_stacks(topology): """Remove all stacks from all nodes of the topology Parameters ---------- topology : Topology """ for v in topology.nodes(): topology.node[v].pop('stack', None)
[docs]def add_application(topology, node, name, properties=None, **attr): """Add an application to a node Parameters ---------- topology : Topology The topology node : any hashable type The ID of the node name : str The name of the application attr_dict : dict, optional Attributes of the application **attr : keyworded attributes Attributes of the application """ if properties is None: properties = {} elif not isinstance(properties, dict): raise TypeError('The attr_dict parameter must be a dictionary') properties.update(attr) if 'application' not in topology.node[node]: topology.node[node]['application'] = {} topology.node[node]['application'][name] = properties
[docs]def get_application_names(topology, node): """Return a list of names of applications deployed on a node Parameters ---------- topology : Topology The topology node : any hashable type The ID of the node Returns ------- application_names : list A list of application names """ return [] if 'application' not in topology.node[node] \ else list(topology.node[node]['application'].keys())
[docs]def get_application_properties(topology, node, name): """Return a dictionary containing all the properties of an application deployed on a node Parameters ---------- topology : Topology The topology node : any hashable type The ID of the node name : str The name of the application Returns ------- applications : dict A dictionary containing the properties of the application """ if 'application' not in topology.node[node]: raise ValueError('There is no such application deployed on the node') return topology.node[node]['application'][name]
[docs]def remove_application(topology, node, name=None): """Remove an application from a node Parameters ---------- topology : Topology The topology object node : any hashable type The ID of the node from which the application is to be removed name : optional The name of the application to remove. If not given, all the applications of the node are removed """ if 'application' in topology.node[node]: if name is None: del topology.node[node]['application'] elif name in topology.node[node]['application']: del topology.node[node]['application'][name]
[docs]def clear_applications(topology): """Remove all applications from all nodes of the topology Parameters ---------- topology : Topology The topology """ for v in topology.nodes(): topology.node[v].pop('application', None)