def of_demo_29(): f = "cfg.yml" d = {} if(load_dict_from_file(f, d) is False): print("Config file '%s' read error: " % f) exit() try: ctrlIpAddr = d['ctrlIpAddr'] ctrlPortNum = d['ctrlPortNum'] ctrlUname = d['ctrlUname'] ctrlPswd = d['ctrlPswd'] rundelay = d['rundelay'] except: print ("Failed to get Controller device attributes") exit(0) description = ( "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n" " This demo illustrates how to use Controller's notification \n" " subscription service for tracing dynamic changes in the\n" " network topology data tree maintained by the Controller.\n" "\n" " It is implied that core network services (Forwarding Rules\n" " Manager, Topology Manager, Switch Manager, Host Tracker)\n" " are functioning on the Controller\n" "\n" " This script creates an event listener on the Controller and\n" " establishes permanent connection to the events notification\n" " stream. Once a data change event in the topology tree (such\n" " as add/remove switch, host or link) is detected it will be\n" " reported to the screen.\n" "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n" ) print "\n".strip() print description print "\n".strip() time.sleep(rundelay) print ("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<") print ("<<< Demo 29 Start") print ("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<") ctrl = Controller(ctrlIpAddr, ctrlPortNum, ctrlUname, ctrlPswd) # Identifier of the network topology to be traced # (name used by Controller for default topology instance) topo_id = 'flow:1' print "\n".strip() print ("<<< 'Controller': %s, Topology Identifier: '%s'" % (ctrlIpAddr, topo_id)) time.sleep(rundelay) # Data store for the changes # Can be one of: # - CONFIGURATION: Logical data store representing configuration # state of the system and it's components. # - OPERATIONAL: Logical data store representing operational # state of the system and it's components datastore = "OPERATIONAL" # Scope of the data changes # Can be one of: # - BASE: Represents only a direct change of the node, such as # replacement, addition or deletion of the node. # - ONE: Represent a change (addition, replacement, deletion) # of the node or one of its direct children. # This scope is a superset of BASE. # - SUBTREE: Represents a change of the node or any of its child # nodes, direct and nested. # This scope is superset of ONE and BASE. scope = "SUBTREE" # Path to the network topology node in the YANG data tree path = ctrl.get_network_topology_yang_schema_path(topo_id) # Create listener on the Controller (if it does already exist Controller # just returns the stream name to subscribe to) result = ctrl.create_data_change_event_subscription(datastore, scope, path) status = result.get_status() if not status.eq(STATUS.OK): print ("\n") print ("!!!Demo terminated, reason: %s" % status.detailed()) exit(1) stream_name = result.get_data() # Subscribe to the stream result = ctrl.subscribe_to_stream(stream_name) status = result.get_status() if not status.eq(STATUS.OK): print ("\n") print ("!!!Demo terminated, reason: %s" % status.detailed()) exit(1) print "\n".strip() print " Successfully subscribed for data change notifications" print " Stream location:" stream_location = result.get_data() print " %s" % stream_location print "\n".strip() print " Listening ... (CTRL-C to exit)" print "\n".strip() # Connect to the notification stream on the Controller # and start listening for the data change notifications # (report only events that we are really interested in) websock = create_connection(stream_location) try: while True: event = websock.recv() tcn = NetworkTopologyChangeNotification(event) timestamp = tcn.get_time() l = tcn.switches_added() if l and len(l): for i in l: print " [%s] added switch: %s" % (timestamp, i) l = tcn.switches_removed() if l and len(l): for i in l: print " [%s] removed switch: %s" % (timestamp, i) l = tcn.hosts_added() if l and len(l): for i in l: print " [%s] added host: %s" % (timestamp, i) l = tcn.hosts_removed() if l and len(l): for i in l: print " [%s] removed host: %s" % (timestamp, i) l = tcn.links_added() if l and len(l): for i in l: print " [%s] added link: %s" % (timestamp, i) l = tcn.links_removed() if l and len(l): for i in l: print " [%s] removed link: %s" % (timestamp, i) except(KeyboardInterrupt): print "Interrupted from keyboard, exit\n" websock.close() print ("\n") print (">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>") print (">>> Demo End") print (">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
def of_demo_30(): f = "cfg.yml" d = {} if load_dict_from_file(f, d) is False: print ("Config file '%s' read error: " % f) exit() try: ctrlIpAddr = d["ctrlIpAddr"] ctrlPortNum = d["ctrlPortNum"] ctrlUname = d["ctrlUname"] ctrlPswd = d["ctrlPswd"] rundelay = d["rundelay"] except: print ("Failed to get Controller device attributes") exit(0) description = ( "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n" " This demo illustrates how to use Controller's notification\n" " subscription service for tracing dynamic changes in the\n" " the Controller's inventory data store.\n" "\n" " It is implied that core network services (OpenFlow, NETCONF)\n" " are functioning on the Controller.\n" "\n" " This script creates an event listener on the Controller and\n" " establishes permanent connection to the events notification\n" " stream. Once a data change event in the inventory data store\n" " (such as add/remove node or flow entry) is detected\n" " it will be reported to the screen.\n" "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n" ) print "\n".strip() print description print "\n".strip() time.sleep(rundelay) print ("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<") print ("<<< Demo 30 Start") print ("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<") ctrl = Controller(ctrlIpAddr, ctrlPortNum, ctrlUname, ctrlPswd) print "\n".strip() print ("<<< 'Controller': %s" % (ctrlIpAddr)) time.sleep(rundelay) # Data store for the changes # Can be one of: # - CONFIGURATION: Logical data store representing configuration # state of the system and it's components. # - OPERATIONAL: Logical data store representing operational # state of the system and it's components datastore = "OPERATIONAL" # Scope of the data changes # Can be one of: # - BASE: Represents only a direct change of the node, such as # replacement, addition or deletion of the node. # - ONE: Represent a change (addition, replacement, deletion) # of the node or one of its direct children. # This scope is a superset of BASE. # - SUBTREE: Represents a change of the node or any of its child # nodes, direct and nested. # This scope is superset of ONE and BASE. scope = "SUBTREE" # Path to the inventory data store in the YANG data tree path = ctrl.get_inventory_nodes_yang_schema_path() # Create listener on the Controller (if it does already exist Controller # just returns the stream name to subscribe to) result = ctrl.create_data_change_event_subscription(datastore, scope, path) status = result.get_status() if not status.eq(STATUS.OK): print ("\n") print ("!!!Demo terminated, reason: %s" % status.detailed()) exit(1) stream_name = result.get_data() # Subscribe to the stream result = ctrl.subscribe_to_stream(stream_name) status = result.get_status() if not status.eq(STATUS.OK): print ("\n") print ("!!!Demo terminated, reason: %s" % status.detailed()) exit(1) print "\n".strip() print " Successfully subscribed for data change notifications" print " Stream location:" stream_location = result.get_data() print " %s" % stream_location print "\n".strip() print " Listening ... (CTRL-C to exit)" print "\n".strip() # Connect to the notification stream on the Controller # and start listening for the data change notifications # (report only events that we are really interested in) websock = create_connection(stream_location) try: while True: notification = websock.recv() icn = InventoryChangeNotification(notification) timestamp = icn.get_time() l = icn.nodes_added() if l and len(l): for i in l: print " [%s] added node: %s" % (timestamp, i) l = icn.nodes_removed() if l and len(l): for i in l: print " [%s] removed node: %s" % (timestamp, i) l = icn.flows_added() if l and len(l): for i in l: print " [%s] added flow entry: %s" % (timestamp, i.to_string()) l = icn.flows_removed() if l and len(l): for i in l: print " [%s] removed flow entry: %s" % (timestamp, i.to_string()) except (KeyboardInterrupt): print "Interrupted from keyboard, exit\n" websock.close() print ("\n") print (">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>") print (">>> Demo End") print (">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")