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 (">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
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):