initial toy code for future core api changes/improvements
This commit is contained in:
		
							parent
							
								
									7e03202ba4
								
							
						
					
					
						commit
						9fe57c6089
					
				
					 6 changed files with 372 additions and 0 deletions
				
			
		
							
								
								
									
										0
									
								
								daemon/core/future/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								daemon/core/future/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
								
								
									
										152
									
								
								daemon/core/future/coreemu.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								daemon/core/future/coreemu.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,152 @@ | ||||||
|  | # import itertools | ||||||
|  | 
 | ||||||
|  | from core import services | ||||||
|  | from core.emane.nodes import EmaneNode | ||||||
|  | from core.misc.ipaddress import Ipv4Prefix | ||||||
|  | from core.netns.nodes import CoreNode | ||||||
|  | from core.session import Session | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class IdGen(object): | ||||||
|  |     def __init__(self): | ||||||
|  |         self.id = 0 | ||||||
|  | 
 | ||||||
|  |     def next(self): | ||||||
|  |         self.id += 1 | ||||||
|  |         return self.id | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class FutureIpv4Prefix(Ipv4Prefix): | ||||||
|  |     def get_address(self, node_id): | ||||||
|  |         address = self.addr(node_id) | ||||||
|  |         return "%s/%s" % (address, self.prefixlen) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class FutureSession(Session): | ||||||
|  |     def __init__(self, session_id, config=None, persistent=True, mkdir=True): | ||||||
|  |         super(FutureSession, self).__init__(session_id, config, persistent, mkdir) | ||||||
|  | 
 | ||||||
|  |         # set master | ||||||
|  |         self.master = True | ||||||
|  | 
 | ||||||
|  |         # object management | ||||||
|  |         self.object_id_gen = IdGen() | ||||||
|  | 
 | ||||||
|  |         # set default services | ||||||
|  |         self.services.defaultservices = { | ||||||
|  |             "mdr": ("zebra", "OSPFv3MDR", "IPForward"), | ||||||
|  |             "PC": ("DefaultRoute",), | ||||||
|  |             "prouter": ("zebra", "OSPFv2", "OSPFv3", "IPForward"), | ||||||
|  |             "router": ("zebra", "OSPFv2", "OSPFv3", "IPForward"), | ||||||
|  |             "host": ("DefaultRoute", "SSH"), | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     def create_node(self, cls, name=None, model=None): | ||||||
|  |         object_id = self.object_id_gen.next() | ||||||
|  | 
 | ||||||
|  |         if not name: | ||||||
|  |             name = "%s%s" % (cls.__name__, object_id) | ||||||
|  | 
 | ||||||
|  |         node = self.add_object(cls=cls, name=name, objid=object_id) | ||||||
|  |         node.type = model | ||||||
|  |         if node.type: | ||||||
|  |             self.services.addservicestonode(node, node.type, services_str=None) | ||||||
|  | 
 | ||||||
|  |         return node | ||||||
|  | 
 | ||||||
|  |     def create_emane_node(self, name=None): | ||||||
|  |         return self.create_node(cls=CoreNode, name=name, model="mdr") | ||||||
|  | 
 | ||||||
|  |     def create_emane_network(self, model, geo_reference, geo_scale=None, name=None): | ||||||
|  |         """ | ||||||
|  |         Convenience method for creating an emane network. | ||||||
|  | 
 | ||||||
|  |         :param model: emane model to use for emane network | ||||||
|  |         :param geo_reference: geo reference point to use for emane node locations | ||||||
|  |         :param geo_scale: geo scale to use for emane node locations, defaults to 1.0 | ||||||
|  |         :param name: name for emane network, defaults to node class name | ||||||
|  |         :return: create emane network | ||||||
|  |         """ | ||||||
|  |         # required to be set for emane to function properly | ||||||
|  |         self.location.setrefgeo(*geo_reference) | ||||||
|  |         if geo_scale: | ||||||
|  |             self.location.refscale = geo_scale | ||||||
|  | 
 | ||||||
|  |         # create and return network | ||||||
|  |         emane_network = self.create_node(cls=EmaneNode, name=name) | ||||||
|  |         self.set_emane_model(emane_network, model) | ||||||
|  |         return emane_network | ||||||
|  | 
 | ||||||
|  |     def set_emane_model(self, emane_node, model): | ||||||
|  |         """ | ||||||
|  |         Set emane model for a given emane node. | ||||||
|  | 
 | ||||||
|  |         :param emane_node: emane node to set model for | ||||||
|  |         :param model: emane model to set | ||||||
|  |         :return: nothing | ||||||
|  |         """ | ||||||
|  |         values = list(model.getdefaultvalues()) | ||||||
|  |         self.emane.setconfig(emane_node.objid, model.name, values) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class CoreEmu(object): | ||||||
|  |     """ | ||||||
|  |     Provides logic for creating and configuring CORE sessions and the nodes within them. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, config=None): | ||||||
|  |         # configuration | ||||||
|  |         self.config = config | ||||||
|  | 
 | ||||||
|  |         # session management | ||||||
|  |         self.session_id_gen = IdGen() | ||||||
|  |         self.sessions = {} | ||||||
|  | 
 | ||||||
|  |         # load default services | ||||||
|  |         services.load() | ||||||
|  | 
 | ||||||
|  |     def create_session(self): | ||||||
|  |         """ | ||||||
|  |         Create a new CORE session. | ||||||
|  | 
 | ||||||
|  |         :return: created session | ||||||
|  |         :rtype: FutureSession | ||||||
|  |         """ | ||||||
|  |         session_id = self.session_id_gen.next() | ||||||
|  |         return FutureSession(session_id, config=self.config) | ||||||
|  | 
 | ||||||
|  |     def set_wireless_model(self, node, model): | ||||||
|  |         """ | ||||||
|  |         Convenience method for setting a wireless model. | ||||||
|  | 
 | ||||||
|  |         :param node: node to set wireless model for | ||||||
|  |         :param core.mobility.WirelessModel model: wireless model to set node to | ||||||
|  |         :return: nothing | ||||||
|  |         """ | ||||||
|  |         values = list(model.getdefaultvalues()) | ||||||
|  |         node.setmodel(model, values) | ||||||
|  | 
 | ||||||
|  |     def wireless_link_all(self, network, nodes): | ||||||
|  |         """ | ||||||
|  |         Link all nodes to the provided wireless network. | ||||||
|  | 
 | ||||||
|  |         :param network: wireless network to link nodes to | ||||||
|  |         :param nodes: nodes to link to wireless network | ||||||
|  |         :return: nothing | ||||||
|  |         """ | ||||||
|  |         for node in nodes: | ||||||
|  |             for common_network, interface_one, interface_two in node.commonnets(network): | ||||||
|  |                 common_network.link(interface_one, interface_two) | ||||||
|  | 
 | ||||||
|  |     def add_interface(self, network, node, prefix): | ||||||
|  |         """ | ||||||
|  |         Convenience method for adding an interface with a prefix based on node id. | ||||||
|  | 
 | ||||||
|  |         :param network: network to add interface with | ||||||
|  |         :param node: node to add interface to | ||||||
|  |         :param prefix: prefix to get address from for interface | ||||||
|  |         :return: created interface | ||||||
|  |         """ | ||||||
|  |         address = prefix.get_address(node.objid) | ||||||
|  |         interface_index = node.newnetif(network, [address]) | ||||||
|  |         return node.netif(interface_index) | ||||||
							
								
								
									
										54
									
								
								daemon/examples/future/emane80211.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								daemon/examples/future/emane80211.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,54 @@ | ||||||
|  | #!/usr/bin/python -i | ||||||
|  | # | ||||||
|  | # Example CORE Python script that attaches N nodes to an EMANE 802.11abg network. | ||||||
|  | 
 | ||||||
|  | import datetime | ||||||
|  | 
 | ||||||
|  | import parser | ||||||
|  | from core.emane.ieee80211abg import EmaneIeee80211abgModel | ||||||
|  | from core.future.coreemu import FutureIpv4Prefix, CoreEmu | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def example(options): | ||||||
|  |     # ip generator for example | ||||||
|  |     prefix = FutureIpv4Prefix("10.83.0.0/16") | ||||||
|  | 
 | ||||||
|  |     # create emulator instance for creating sessions and utility methods | ||||||
|  |     coreemu = CoreEmu() | ||||||
|  |     session = coreemu.create_session() | ||||||
|  | 
 | ||||||
|  |     # create emane network node | ||||||
|  |     emane_network = session.create_emane_network( | ||||||
|  |         model=EmaneIeee80211abgModel, | ||||||
|  |         geo_reference=(47.57917, -122.13232, 2.00000) | ||||||
|  |     ) | ||||||
|  |     emane_network.setposition(x=80, y=50) | ||||||
|  | 
 | ||||||
|  |     # create nodes | ||||||
|  |     for i in xrange(options.nodes): | ||||||
|  |         node = session.create_emane_node() | ||||||
|  |         coreemu.add_interface(emane_network, node, prefix) | ||||||
|  |         node.setposition(x=150 * (i + 1), y=150) | ||||||
|  | 
 | ||||||
|  |     # instantiate session | ||||||
|  |     session.instantiate() | ||||||
|  | 
 | ||||||
|  |     # start a shell on the first node | ||||||
|  |     node = session.get_object(2) | ||||||
|  |     node.client.term("bash") | ||||||
|  | 
 | ||||||
|  |     # shutdown session | ||||||
|  |     raw_input("press enter to exit...") | ||||||
|  |     session.shutdown() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     options = parser.parse_options("emane80211") | ||||||
|  |     start = datetime.datetime.now() | ||||||
|  |     print "running emane 80211 example: nodes(%s) time(%s)" % (options.nodes, options.time) | ||||||
|  |     example(options) | ||||||
|  |     print "elapsed time: %s" % (datetime.datetime.now() - start) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if __name__ == "__main__" or __name__ == "__builtin__": | ||||||
|  |     main() | ||||||
							
								
								
									
										41
									
								
								daemon/examples/future/parser.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								daemon/examples/future/parser.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,41 @@ | ||||||
|  | import argparse | ||||||
|  | 
 | ||||||
|  | DEFAULT_NODES = 2 | ||||||
|  | DEFAULT_TIME = 10 | ||||||
|  | DEFAULT_STEP = 1 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def parse_options(name): | ||||||
|  |     parser = argparse.ArgumentParser(description="Run %s example" % name) | ||||||
|  |     parser.add_argument("-n", "--nodes", type=int, default=DEFAULT_NODES, | ||||||
|  |                         help="number of nodes to create in this example") | ||||||
|  |     parser.add_argument("-t", "--time", type=int, default=DEFAULT_TIME, | ||||||
|  |                         help="example iperf run time in seconds") | ||||||
|  | 
 | ||||||
|  |     options = parser.parse_args() | ||||||
|  | 
 | ||||||
|  |     # usagestr = "usage: %prog [-h] [options] [args]" | ||||||
|  |     # parser = optparse.OptionParser(usage=usagestr) | ||||||
|  |     # | ||||||
|  |     # parser.add_option("-n", "--nodes", dest="nodes", type=int, default=DEFAULT_NODES, | ||||||
|  |     #                   help="number of nodes to create in this example") | ||||||
|  |     # | ||||||
|  |     # parser.add_option("-t", "--time", dest="time", type=int, default=DEFAULT_TIME, | ||||||
|  |     #                   help="example iperf run time in seconds") | ||||||
|  | 
 | ||||||
|  |     # def usage(msg=None, err=0): | ||||||
|  |     #     print | ||||||
|  |     #     if msg: | ||||||
|  |     #         print "%s\n" % msg | ||||||
|  |     #     parser.print_help() | ||||||
|  |     #     sys.exit(err) | ||||||
|  | 
 | ||||||
|  |     # parse command line options | ||||||
|  |     # options, args = parser.parse_args() | ||||||
|  | 
 | ||||||
|  |     if options.nodes < 2: | ||||||
|  |         parser.error("invalid min number of nodes: %s" % options.nodes) | ||||||
|  |     if options.time < 1: | ||||||
|  |         parser.error("invalid test time: %s" % options.time) | ||||||
|  | 
 | ||||||
|  |     return options | ||||||
							
								
								
									
										59
									
								
								daemon/examples/future/switch.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								daemon/examples/future/switch.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,59 @@ | ||||||
|  | #!/usr/bin/python | ||||||
|  | # | ||||||
|  | # run iperf to measure the effective throughput between two nodes when | ||||||
|  | # n nodes are connected to a virtual wlan; run test for testsec | ||||||
|  | # and repeat for minnodes <= n <= maxnodes with a step size of | ||||||
|  | # nodestep | ||||||
|  | 
 | ||||||
|  | import datetime | ||||||
|  | 
 | ||||||
|  | import parser | ||||||
|  | from core.future.coreemu import FutureIpv4Prefix, CoreEmu | ||||||
|  | from core.netns.nodes import CoreNode, SwitchNode | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def example(options): | ||||||
|  |     # ip generator for example | ||||||
|  |     prefix = FutureIpv4Prefix("10.83.0.0/16") | ||||||
|  | 
 | ||||||
|  |     # create emulator instance for creating sessions and utility methods | ||||||
|  |     coreemu = CoreEmu() | ||||||
|  |     session = coreemu.create_session() | ||||||
|  | 
 | ||||||
|  |     # create switch network node | ||||||
|  |     switch_network = session.create_node(cls=SwitchNode) | ||||||
|  | 
 | ||||||
|  |     # create nodes | ||||||
|  |     for _ in xrange(options.nodes): | ||||||
|  |         node = session.create_node(cls=CoreNode) | ||||||
|  |         coreemu.add_interface(switch_network, node, prefix) | ||||||
|  | 
 | ||||||
|  |     # instantiate session | ||||||
|  |     session.instantiate() | ||||||
|  | 
 | ||||||
|  |     # get nodes to run example | ||||||
|  |     first_node = session.get_object(2) | ||||||
|  |     last_node = session.get_object(options.nodes + 1) | ||||||
|  | 
 | ||||||
|  |     print "starting iperf server on node: %s" % first_node.name | ||||||
|  |     first_node.cmd(["iperf", "-s", "-D"]) | ||||||
|  |     address = str(prefix.addr(first_node.objid)) | ||||||
|  |     print "node %s connecting to %s" % (last_node.name, address) | ||||||
|  |     last_node.client.icmd(["iperf", "-t", str(options.time), "-c", address]) | ||||||
|  |     first_node.cmd(["killall", "-9", "iperf"]) | ||||||
|  | 
 | ||||||
|  |     # shutdown session | ||||||
|  |     session.shutdown() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     options = parser.parse_options("switch") | ||||||
|  | 
 | ||||||
|  |     start = datetime.datetime.now() | ||||||
|  |     print "running switch example: nodes(%s) time(%s)" % (options.nodes, options.time) | ||||||
|  |     example(options) | ||||||
|  |     print "elapsed time: %s" % (datetime.datetime.now() - start) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     main() | ||||||
							
								
								
									
										66
									
								
								daemon/examples/future/wlan.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								daemon/examples/future/wlan.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,66 @@ | ||||||
|  | #!/usr/bin/python | ||||||
|  | # | ||||||
|  | # run iperf to measure the effective throughput between two nodes when | ||||||
|  | # n nodes are connected to a virtual wlan; run test for testsec | ||||||
|  | # and repeat for minnodes <= n <= maxnodes with a step size of | ||||||
|  | # nodestep | ||||||
|  | 
 | ||||||
|  | import datetime | ||||||
|  | 
 | ||||||
|  | import parser | ||||||
|  | from core.future.coreemu import FutureIpv4Prefix, CoreEmu | ||||||
|  | from core.mobility import BasicRangeModel | ||||||
|  | from core.netns.nodes import WlanNode, CoreNode | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def example(options): | ||||||
|  |     # ip generator for example | ||||||
|  |     prefix = FutureIpv4Prefix("10.83.0.0/16") | ||||||
|  | 
 | ||||||
|  |     # create emulator instance for creating sessions and utility methods | ||||||
|  |     coreemu = CoreEmu() | ||||||
|  |     session = coreemu.create_session() | ||||||
|  | 
 | ||||||
|  |     # create wlan network node | ||||||
|  |     wlan_network = session.create_node(cls=WlanNode) | ||||||
|  |     coreemu.set_wireless_model(wlan_network, BasicRangeModel) | ||||||
|  | 
 | ||||||
|  |     # create nodes | ||||||
|  |     wireless_nodes = [] | ||||||
|  |     for _ in xrange(options.nodes): | ||||||
|  |         node = session.create_node(cls=CoreNode) | ||||||
|  |         coreemu.add_interface(wlan_network, node, prefix) | ||||||
|  |         wireless_nodes.append(node) | ||||||
|  | 
 | ||||||
|  |     # link all created nodes with the wireless network | ||||||
|  |     coreemu.wireless_link_all(wlan_network, wireless_nodes) | ||||||
|  | 
 | ||||||
|  |     # instantiate session | ||||||
|  |     session.instantiate() | ||||||
|  | 
 | ||||||
|  |     # get nodes for example run | ||||||
|  |     first_node = session.get_object(2) | ||||||
|  |     last_node = session.get_object(options.nodes + 1) | ||||||
|  | 
 | ||||||
|  |     print "starting iperf server on node: %s" % first_node.name | ||||||
|  |     first_node.cmd(["iperf", "-s", "-D"]) | ||||||
|  |     address = str(prefix.addr(first_node.objid)) | ||||||
|  |     print "node %s connecting to %s" % (last_node.name, address) | ||||||
|  |     last_node.client.icmd(["iperf", "-t", str(options.time), "-c", address]) | ||||||
|  |     first_node.cmd(["killall", "-9", "iperf"]) | ||||||
|  | 
 | ||||||
|  |     # shutdown session | ||||||
|  |     session.shutdown() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     options = parser.parse_options("wlan") | ||||||
|  | 
 | ||||||
|  |     start = datetime.datetime.now() | ||||||
|  |     print "running wlan example: nodes(%s) time(%s)" % (options.nodes, options.time) | ||||||
|  |     example(options) | ||||||
|  |     print "elapsed time: %s" % (datetime.datetime.now() - start) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     main() | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue