def monitor_fp_event(): handle = cps.event_connect() cps.event_register(handle, _fp_port_key) while True: o = cps.event_wait(handle) obj = cps_object.CPSObject(obj = o) _update_fp(obj)
def monitor_events(self): self.log("Started CPS events listener...") interfaces_key = cps.key_from_name( 'observed', 'dell-base-if-cmn/if/interfaces-state/interface') handle = cps.event_connect() cps.event_register(handle, interfaces_key) while True: o = cps.event_wait(handle) obj = cps_object.CPSObject(obj=o) # Monitor interfaces if interfaces_key == obj.get_key(): list = [] cps.get([ cps.key_from_name( 'observed', 'dell-base-if-cmn/if/interfaces-state/interface') ], list) # Ignore the first entry for entry in list[1:]: # Construct a new object for each entry get_obj = cps_object.CPSObject(obj=entry) if (obj.get_attr_data("if/interfaces-state/interface/name") == get_obj.get_attr_data( "if/interfaces-state/interface/name")): oper_status = get_obj.get_attr_data( "if/interfaces-state/interface/oper-status") # ... new_list = [] cps.get([ cps.key_from_name( 'target', 'dell-base-if-cmn/if/interfaces/interface') ], new_list) # Ignore the first entry for aux_entry in new_list[1:]: # Construct a new object for each entry get_aux_obj = cps_object.CPSObject(obj=aux_entry) if (get_aux_obj.get_attr_data( "if/interfaces/interface/name") == obj.get_attr_data( "if/interfaces-state/interface/name")): if_name = get_aux_obj.get_attr_data( "if/interfaces/interface/name") #enabled = get_aux_obj.get_attr_data("if/interfaces/interface/enabled") Utils.cliLogger(if_name, 1) Utils.cliLogger(0, 1) interface = Interface(if_name, "", 0, "", "", oper_status, "", "", "") Utils.timeLogger( "EventHandler| CPS event Operstatus changed: " ) q.put((dh.change_interface, (interface, ), {}))
def monitor_interface_event(): handle = cps.event_connect() cps.event_register(handle, nas_comm.yang.get_value('physical_key', 'keys_id')) cps.event_register( handle, nas_comm.yang.get_value('logical_if_state_key', 'keys_id')) cps.event_register( handle, nas_comm.yang.get_value('obs_logical_if_key', 'keys_id')) _led_control = media.led_control_get() while True: o = cps.event_wait(handle) obj = cps_object.CPSObject(obj=o) if nas_comm.yang.get_value('fp_key', 'keys_id') == obj.get_key(): _update_fp(obj) if nas_comm.yang.get_value('physical_key', 'keys_id') == obj.get_key(): continue if nas_comm.yang.get_value('obs_logical_if_key', 'keys_id') == obj.get_key(): _process_logical_if_event(obj) elif nas_comm.yang.get_value('logical_if_state_key', 'keys_id') == obj.get_key(): if_index = _get_obj_attr_value( obj, 'if/interfaces-state/interface/if-index') # check if if_index is present if if_index is None: nas_if.log_err( 'Interface index not present in the interface state event') continue # Get Interface attributes if_obj_list = nas_if.nas_os_if_list(d={'if-index': if_index}) if if_obj_list is None: nas_if.log_err( 'Failed to get Interface attributes by ifindex from NAS interface' ) continue admin_state = _get_obj_attr_value( obj, 'if/interfaces-state/interface/admin-status') if admin_state != None: # This is admin state change event try: set_media_transceiver(if_obj_list[0]) except: nas_if.log_err( "Unable to set media transceiver for if_index {}". format(str(if_index))) if _led_control == True: oper_state = _get_obj_attr_value( obj, 'if/interfaces-state/interface/oper-status') if oper_state != None: try: set_interface_media_speed(if_obj_list[0]) except: nas_if.log_err("Error in setting LED") continue
def handle_leaked_rt_event(): _leaked_rt_evt_handle = cps.event_connect() cps.event_register(_leaked_rt_evt_handle, _leaked_rt_key) while True: leaked_rt_evt = cps.event_wait(_leaked_rt_evt_handle) obj = cps_object.CPSObject(obj=leaked_rt_evt) if obj is None: continue if not 'operation' in leaked_rt_evt.keys(): continue op = None if leaked_rt_evt['operation'] == 'create': op = 'add' if leaked_rt_evt['operation'] == 'delete': op = 'del' src_vrf_name = None af = None prefix = None prefix_len = 0 dst_vrf_name = None try: dst_vrf_name = obj.get_attr_data( 'os-re/os-leak-route-config/vrf-name') af = obj.get_attr_data('os-re/os-leak-route-config/af') prefix = obj.get_attr_data( 'os-re/os-leak-route-config/route-prefix') prefix = binascii.unhexlify(prefix) prefix = get_ip_str(af, prefix) prefix_len = obj.get_attr_data( 'os-re/os-leak-route-config/prefix-len') src_vrf_name = obj.get_attr_data( 'os-re/os-leak-route-config/src-vrf-name') except ValueError as e: log_err( 'Error - Mandatatory object attributes are not present for route leak configuration!' ) continue global _vrf_mutex _vrf_mutex.acquire() ret_val, nexthop_ip, nexthop_ip6 = _veth_ip_get( dst_vrf_name, src_vrf_name, True) _vrf_mutex.release() if ret_val is False: log_err('veth info. not found while handling src-vrf:%s af:%s prefix:%s/%s dst-vrd:%s'\ % (src_vrf_name, str(af), prefix, str(prefix_len), dst_vrf_name)) continue if af == socket.AF_INET6: nexthop_ip = nexthop_ip6 if dn_base_vrf_tool.process_leaked_rt_config(op, af, dst_vrf_name, prefix,\ prefix_len, nexthop_ip) != True: log_err('VRF route leaking configuration failed op:%s src-vrf:%s af:%s prefix:%s/%s dst-vrd:%s'\ % (op, src_vrf_name, str(af), prefix, str(prefix_len), dst_vrf_name)) continue
def monitor_media_event(): handle = cps.event_connect() nas_if.log_info(" registering for media") cps.event_register(handle, cps.key_from_name('observed', 'base-pas/media')) while True: media = cps.event_wait(handle) obj = cps_object.CPSObject(obj=media) set_media_info(obj)
def handle_addr_event(): _intf_addr_evt_handle = cps.event_connect() cps.event_register(_intf_addr_evt_handle, _linux_intf_addr_key) global _addr_mutex global _dad_timer _addr_mutex = Lock() while True: intf_evt = cps.event_wait(_intf_addr_evt_handle) obj = cps_object.CPSObject(obj=intf_evt) if obj is None: continue if not 'operation' in intf_evt.keys(): continue op = intf_evt['operation'] vrf_name = None intf_name = None intf_addr = None intf_prefix_len = 0 dad_failed = 0 try: dad_failed = obj.get_attr_data('base-ip/ipv6/dad-failed') # if DAD is not failed for the IPv6 address, ignore this event. if dad_failed == 0: continue vrf_name = obj.get_attr_data('base-ip/ipv6/vrf-name') intf_name = obj.get_attr_data('base-ip/ipv6/name') intf_addr = obj.get_attr_data('base-ip/ipv6/address/ip') intf_addr = binascii.unhexlify(intf_addr) intf_addr = socket.inet_ntop(socket.AF_INET6, intf_addr) intf_prefix_len = obj.get_attr_data( 'base-ip/ipv6/address/prefix-length') except ValueError as e: continue key = '*' + str(vrf_name) + '*' + str(intf_name) + '*' + str( intf_addr) + '/' + str(intf_prefix_len) + '*' _addr_mutex.acquire() val = _intf_addr_dad_failed_list.get(key, None) if op == 'create' or op == 'set': if val is None: _intf_addr_dad_failed_list[key] = 1 if len(_intf_addr_dad_failed_list) == 1: _dad_timer = Timer(_dad_failure_handle_intvl, handle_dad_failure_timer) _dad_timer.start() elif op == 'delete': if val is not None: _intf_addr_dad_failed_list.pop(key, None) _addr_mutex.release()
def handle_ip_address_event(): _ip_addr_evt_handle = cps.event_connect() cps.event_register(_ip_addr_evt_handle, _linux_ip_addr_key) cps.event_register(_ip_addr_evt_handle, _linux_ipv6_addr_key) global _vrf_ipsvcs_mutex while True: ip_evt = cps.event_wait(_ip_addr_evt_handle) obj = cps_object.CPSObject(obj=ip_evt) if obj is None: continue if not 'operation' in ip_evt.keys(): continue if _linux_ip_addr_key == obj.get_key(): af = 'ipv4' else: af = 'ipv6' op = ip_evt['operation'] if op == 'create' or op == 'set': isAdd = 1 else: isAdd = 0 if af == 'ipv6': try: vrf_name = obj.get_attr_data('base-ip/ipv6/vrf-name') except ValueError as e: vrf_name = 'default' if vrf_name != 'default': _vrf_ipsvcs_mutex.acquire() ipv6_rule_programming( obj, isAdd) # this api needs to be protected by lock _vrf_ipsvcs_mutex.release() else: log_info('Default vrf ip address event. Ignore this') else: try: vrf_name = obj.get_attr_data('base-ip/ipv4/vrf-name') except ValueError as e: vrf_name = 'default' if vrf_name != 'default': _vrf_ipsvcs_mutex.acquire() ipv4_rule_programming( obj, isAdd) # this api needs to be protected by lock _vrf_ipsvcs_mutex.release() else: log_info('Default vrf ip address event. Ignore this')
def _trace_events(_obj): handle = cps.event_connect() cps.event_register_object(handle, _obj.get()) while True: ev = cps.event_wait(handle) print "@", str(datetime.datetime.now()), "- Event for", _get_key( ev['key']) if 'operation' in ev: print "Operation : ", ev['operation'] cps_utils.print_obj(ev) print "----------------------------------------------"
def monitor_phy_media(): media.init_nas_media_info() handle = cps.event_connect() cps.event_register(handle, _media_key) while True: o = cps.event_wait(handle) obj = cps_object.CPSObject(obj=o) print "media event received" try: # configure NPU for the media-type change event media.set_media_info(obj) except: # the event could be unrelated to media-type continue
def monitor_media_events(): handle = cps.event_connect() cps.event_register(handle, nas_comm.yang.get_value('media_key', 'keys_id')) while True: o = cps.event_wait(handle) obj = cps_object.CPSObject(obj=o) nas_if.log_info("Media event received") global mutex mutex.acquire() try: set_intf_request(obj) except: logging.exception('logical interface media event failed') mutex.release()
def monitor_phy_media(): media.init_nas_media_info() handle = cps.event_connect() cps.event_register(handle, _media_key) while True: o = cps.event_wait(handle) obj = cps_object.CPSObject(obj=o) nas_if.log_info("media event received") try: # configure NPU for the media-type change event media.if_media_type_set(obj) except: # the event could be unrelated to media-type continue
def handle_interface_event_for_lla_cfg(): _intf_evt_handle = cps.event_connect() cps.event_register(_intf_evt_handle, _linux_intf_key) while True: intf_evt = cps.event_wait(_intf_evt_handle) obj = cps_object.CPSObject(obj=intf_evt) if obj is None: continue if not 'operation' in intf_evt.keys(): continue if ((intf_evt['operation'] != 'create') and (intf_evt['operation'] != 'set')): continue vrf_name = None intf_name = None intf_mac = None intf_admin_status = 0 try: vrf_name = obj.get_attr_data( 'ni/if/interfaces/interface/bind-ni-name') intf_name = obj.get_attr_data('if/interfaces/interface/name') intf_mac = obj.get_attr_data( 'dell-if/if/interfaces/interface/phys-address') intf_admin_status = obj.get_attr_data( 'if/interfaces/interface/enabled') # if admin status is not enabled, ignore the interface event if intf_admin_status != 1: continue except ValueError as e: continue mac_list = intf_mac.split(':') # Create the LLA lla_addr = 'fe80::'+hex(int(mac_list[0],16)^2)[2:]+mac_list[1]+':'+mac_list[2]+\ 'ff:fe'+mac_list[3]+':'+mac_list[4]+mac_list[5] lla_addr_with_prefix_len = lla_addr + '/64' # Configuring the LLA on the L2 intf will lead to error, pass the exception try: add_ip_addr(lla_addr_with_prefix_len, intf_name, "ipv6", vrf_name, False) except: pass
def monitor_interface_event(): handle = cps.event_connect() cps.event_register(handle, _physical_key) cps.event_register(handle, _logical_if_state_key) _led_control = media.led_control_get() while True: o = cps.event_wait(handle) obj = cps_object.CPSObject(obj=o) if _physical_key == obj.get_key(): if o['operation'] != 'create': continue nas_if.log_info("physical port creation event") set_media_type_on_port_create(obj) elif _logical_if_state_key == obj.get_key(): if_index = _get_obj_attr_value( obj, 'if/interfaces-state/interface/if-index') # check if if_index is present if if_index == None: nas_if.log_err( 'Interface index not present in the interface state event') continue # Get Interface attributes admin_state = _get_obj_attr_value( obj, 'if/interfaces-state/interface/admin-status') if admin_state != None: # This is admin state change event try: if_obj_list = nas_if.nas_os_if_list( d={'if-index': if_index}) set_media_transceiver(if_obj_list[0]) except: nas_if.log_err("Unable to set media transceiver for ", str(if_index)) if _led_control == True: oper_state = _get_obj_attr_value( obj, 'if/interfaces-state/interface/oper-status') if oper_state != None: try: set_interface_led(if_obj_list[0]) except: nas_if.log_err("Error in setting LED") continue
def run(path, method, notify): '''Run the event loop''' handle = cps.event_connect() (yin_form, data) = cps_parse.yin_path(path) if yin_form is None: return cps_obj = cps_utils.CPSObject(yin_form, data=data, qual="observed") cps.event_register_object(handle, cps_obj.get()) import traceback while True: result = cps.event_wait(handle) try: event_path = cps_parse.prep_path(yin_form, result) if result['data'].get( "cps/object-group/return-code") is not None: del result['data']["cps/object-group/return-code"] parsed = cps_parse.convert_result(event_path, result) notify(method, parsed) except KeyError: pass except AttributeError: pass
def monitor_interface_event(): handle = cps.event_connect() cps.event_register(handle, _physical_key) cps.event_register(handle, _logical_if_state_key) _led_control = media.led_control_get() while True: o = cps.event_wait(handle) obj = cps_object.CPSObject(obj=o) if _physical_key == obj.get_key(): if o['operation'] != 'create': continue print "physical port creation event" set_media_type_on_port_create(obj) elif _logical_if_state_key == obj.get_key(): if_index = _get_obj_attr_value(obj, 'if/interfaces-state/interface/if-index') # check if if_index is present if if_index == None: print 'Interface index not present in the interface state event' continue # Get Interface attributes admin_state = _get_obj_attr_value(obj, 'if/interfaces-state/interface/admin-status') if admin_state != None: # This is admin state change event try: if_obj_list = nas_if.nas_os_if_list(d={'if-index':if_index}) set_media_transceiver(if_obj_list[0]) except: print "Unable to set media transceiver for ", str(if_index) if _led_control == True: oper_state = _get_obj_attr_value(obj, 'if/interfaces-state/interface/oper-status') if oper_state != None: try: set_interface_led(if_obj_list[0]) except: print "Error in setting LED" continue
# # THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR # CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT # LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS # FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT. # # See the Apache Version 2.0 License for specific language governing # permissions and limitations under the License. import cps import cps_object import cps_utils _ipv4_key = cps.key_from_name('target', 'base-ip/ipv4') _ipv6_key = cps.key_from_name('target', 'base-ip/ipv6') if __name__ == '__main__': # monitor ip change event handle = cps.event_connect() cps.event_register(handle, _ipv4_key) cps.event_register(handle, _ipv6_key) while True: o = cps.event_wait(handle) print o obj = cps_object.CPSObject(obj=o) cps_utils.print_obj(obj) if _ipv4_key == obj.get_key(): print "IPv4 change event received" elif _ipv6_key == obj.get_key(): print "IPv6 change event received"
def _ev_wait_node_grp(handle): while True: event_data = {} event_data = cps.event_wait(handle) if 'operation' in event_data: process_node_grp_events(event_data)
# CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT # LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS # FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT. # # See the Apache Version 2.0 License for specific language governing # permissions and limitations under the License. # import cps import cps_object import cps_utils _ipv4_key = cps.key_from_name('target', 'base-ip/ipv4') _ipv6_key = cps.key_from_name('target', 'base-ip/ipv6') if __name__ == '__main__': # monitor ip change event handle = cps.event_connect() cps.event_register(handle, _ipv4_key) cps.event_register(handle, _ipv6_key) while True: o = cps.event_wait(handle) print o obj = cps_object.CPSObject(obj=o) cps_utils.print_obj(obj) if _ipv4_key == obj.get_key(): print "IPv4 change event received" elif _ipv6_key == obj.get_key(): print "IPv6 change event received"
def monitor_VLAN_interface_event(): _vlan_handle = cps.event_connect() cps.event_register(_vlan_handle, _intf_vlan_key) mcast_utils.log_info('monitor_VLAN_interface_event started') while True: vlan_event = cps.event_wait(_vlan_handle) obj = cps_object.CPSObject(obj=vlan_event) if obj is None: mcast_utils.log_err( 'VLAN_MONITOR: Object not present in the event') continue if obj.get_key() != _intf_vlan_key: mcast_utils.log_debug( 'VLAN_MONITOR: Wrong VLAN interface event, ignore') continue try: vlan_name = obj.get_attr_data('if/interfaces/interface/name') # check if if_name is present if vlan_name is None: mcast_utils.log_err( 'VLAN_MONITOR: VLAN name not present in the event') continue if 'operation' in vlan_event: mcast_utils.log_info('VLAN_MONITOR: Received %s %s event' % (vlan_name, vlan_event['operation'])) if (vlan_event['operation'] == 'create'): ret = mcast_utils._update_file_system( mcast_utils._get_path_per_vlan_configs( vlan_name, "multicast_snooping"), 0) if ret is True: mcast_utils.log_info( 'VLAN_MONITOR: Disabled snooping on %s in kernel' % (vlan_name)) else: mcast_utils.log_err( 'VLAN_MONITOR: Failed to disable snooping on %s in kernel' % (vlan_name)) elif (vlan_event['operation'] == 'delete'): #On VLAN deletion, not sure application sends the snoop disable, even if it sends it comes #with VLAN id, so for getting ifname NAS interface may not have VLAN and will fail to get name. #and per VLAN rule in kernel may not get deleted. So here on VLAN deletion the per VLAN IGMP/MLD #rules are deleted. # if (snoop_remove_vlan_rules(True, vlan_name)) is False: mcast_utils.log_debug( 'VLAN_MONITOR: Failed to remove IGMP ebtables rule in kernel for %s' % (vlan_name)) if (snoop_remove_vlan_rules(False, vlan_name)) is False: mcast_utils.log_debug( 'VLAN_MONITOR: Failed to remove MLD ebtables rule in kernel for %s' % (vlan_name)) else: mcast_utils.log_info( 'VLAN_MONITOR: Received event without operation' % (vlan_name)) except Exception as e: mcast_utils.log_err('VLAN_MONITOR: Exception: %s' % e)
#!/usr/bin/python import sys import cps import cps_object import cps_utils import nas_os_utils print "NHT CPS registration..." handle = cps.event_connect() cps.event_register(handle, cps.key_from_name('observed', 'base-route/nh-track')) while True: nht_event = cps_object.CPSObject(obj=cps.event_wait(handle)) dest_addr = nht_event.get_attr_data('dest-addr') nh_count = 0 nh_count = nht_event.get_attr_data('nh-count') print "Received NHT Event for: ", dest_addr, nh_count
def process_events(): while True: obj = cps.event_wait(cps_ev_hdl) event_handler(obj)