def get_one_interface(): ifs = nas_os_if_utils.nas_os_if_list() while not ifs: ifs = nas_os_if_utils.nas_os_if_list() time.sleep(1) obj = cps_object.CPSObject(obj=ifs[-1]) return obj.get_attr_data('dell-base-if-cmn/if/interfaces/interface/if-index')
def init_all_ports_of_type( iftype, xnode_port, lookup_map, lookup_sched_prof, lookup_buf_prof = {}): # keep track of configured port in case more interfaces are created # while we are initializing default NAS-QOS done_ifs = [] check_new_intf = True while (check_new_intf): check_new_intf = False if (iftype == 'base-if:cpu'): ifs = nas_os_if_utils.nas_os_cpu_if() else: ifs = nas_os_if_utils.nas_os_if_list() for intf in ifs: if intf in done_ifs: continue # add to configured port list done_ifs.append(intf) check_new_intf = True obj = cps_object.CPSObject(obj=intf) try: _iftype = obj.get_attr_data('if/interfaces/interface/type') except ValueError: continue if _iftype != iftype: continue ifname = obj.get_attr_data('if/interfaces/interface/name') ifidx = obj.get_attr_data('dell-base-if-cmn/if/interfaces/interface/if-index') max_speed = 0 if (iftype != 'base-if:cpu'): max_speed = get_max_speed(obj) init_port(ifidx, ifname, iftype, max_speed, xnode_port, lookup_map, lookup_sched_prof, lookup_buf_prof)
def init_all_ports_of_type( iftype, xnode_port, lookup_map, lookup_sched_prof): # keep track of configured port in case more interfaces are created # while we are initializing default NAS-QOS done_ifs = [] check_new_intf = True while (check_new_intf): check_new_intf = False if iftype == 'base-if:cpu': ifs = nas_os_if_utils.nas_os_cpu_if() else: ifs = nas_os_if_utils.nas_os_if_list() for intf in ifs: if intf in done_ifs: continue # add to configured port list done_ifs.append(intf) check_new_intf = True obj = cps_object.CPSObject(obj=intf) try: _iftype = obj.get_attr_data('if/interfaces/interface/type') except ValueError: continue if _iftype != iftype: continue ifname = obj.get_attr_data('if/interfaces/interface/name') ifidx = obj.get_attr_data('dell-base-if-cmn/if/interfaces/interface/if-index') init_port(ifidx, ifname, xnode_port, lookup_map, lookup_sched_prof)
def if_media_type_set(pas_media_obj): try: media_id = pas_media_obj.get_attr_data('port') media_type = pas_media_obj.get_attr_data('type') except: nas_if.log_info( "media Id or media type is not present in the media event") return # fetch FP info from media ID l = nas_if.nas_os_fp_list(d={'media-id': media_id}) if len(l) == 0: nas_if.log_err("No such port found... for media " + str(media_id)) return #fetching 2 front panel port object from 1 phy media id for QSFP28-DD ports port_list = [] for fp_obj in l: obj = cps_object.CPSObject(obj=fp_obj) if _fp_port_key == obj.get_key(): port_list = port_list + nas_if.physical_ports_for_front_panel_port( obj) if len(port_list) == 0: nas_if.log_err("There are no physical ports for front panel port ") nas_if.log_err(l[0]) return # create interface set RPC obj for each phy port in the list and send it for p in port_list: npu = p.get_attr_data('npu-id') port = p.get_attr_data('port-id') hwport_list = p.get_attr_data('hardware-port-list') nas_if.log_info("send if rpc for media id set for phy port " + str(port)) ifobj = cps_object.CPSObject( module='dell-base-if-cmn/set-interface', data={ 'dell-base-if-cmn/set-interface/input/operation': 3, 'base-if-phy/if/interfaces/interface/npu-id': npu, 'base-if-phy/if/interfaces/interface/port-id': port, 'base-if-phy/if/interfaces/interface/phy-media': media_type, 'if/interfaces/interface/type': "ianaift:ethernetCsmacd" }) ch = {'operation': 'rpc', 'change': ifobj.get()} cps.transaction([ch]) if_name = str( ch['change']['data']['if/interfaces/interface/name'])[:-1] if_details = nas_if.nas_os_if_list( d={'if/interfaces/interface/name': if_name}) enable = ba.from_ba( if_details[0]['data']['if/interfaces/interface/enabled'], "uint64_t") for hwport in hwport_list: fp_details = fp.find_port_by_hwport(npu, hwport) _lane = fp_details.lane media_transceiver_set(1, fp_details.media_id, _lane, enable) nas_if.log_info("setting media id: " + str(media_id) + " media type: " + str(media_type))
def if_media_type_set(pas_media_obj): try: media_id = pas_media_obj.get_attr_data('port') media_type = pas_media_obj.get_attr_data('type') except: nas_if.log_err( "media Id or media type is not present in the media event") return # fetch FP info from media ID l = nas_if.nas_os_fp_list(d={'media-id': media_id}) if len(l) == 0: nas_if.log_err("No such port found... for media " + str(media_id)) return # fetch PHY port list for the FP port port_list = nas_if.physical_ports_for_front_panel_port( cps_object.CPSObject(obj=l[0])) if len(port_list) == 0: nas_if.log_err("There are no physical ports for front panel port ") nas_if.log_err(l[0]) return # create interface set RPC obj for each phy port in the list and send it for p in port_list: npu = p.get_attr_data('npu-id') port = p.get_attr_data('port-id') fanout = p.get_attr_data('fanout-mode') hwport = p.get_attr_data('hardware-port-id') nas_if.log_info("send if rpc for media id set for phy port " + str(port)) ifobj = cps_object.CPSObject( module='dell-base-if-cmn/set-interface', data={ 'dell-base-if-cmn/set-interface/input/operation': 3, 'base-if-phy/if/interfaces/interface/npu-id': npu, 'base-if-phy/if/interfaces/interface/port-id': port, 'base-if-phy/if/interfaces/interface/phy-media': media_type, 'if/interfaces/interface/type': "ianaift:ethernetCsmacd" }) ch = {'operation': 'rpc', 'change': ifobj.get()} cps.transaction([ch]) if_name = ba.ba_to_str( ch['change']['data']['if/interfaces/interface/name'], len(_if_name)) if_details = nas_if.nas_os_if_list( d={'if/interfaces/interface/name': if_name}) enable = ba.from_ba( if_details[0]['data']['if/interfaces/interface/enabled'], "uint64_t") fp_details = fp.find_port_by_hwport(npu, hwport) if fanout == 2: # then it is in 4x10G fanout mode BASE_PORT_BREAKOUT_MODE_BREAKOUT_4X1 _lane = fp_details.lane else: # non-fanout mode 1x40g mode _lane = None # enable/disable all channels. Do not pass Lane # media_transceiver_set(1, fp_details.media_id, _lane, enable) nas_if.log_info("setting media id: " + str(media_id) + " media type: " + str(media_type))
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 get_if_name(index=0): global ifs if not ifs: ifs = nas_os_if_utils.nas_os_if_list() while not ifs: ifs = nas_os_if_utils.nas_os_if_list() time.sleep(1) if not ifs: raise RuntimeError("No interfaces found") if index < len(ifs): if_wr_obj = cps_utils.CPSObject(obj=ifs[index]) else: if_wr_obj = cps_utils.CPSObject(obj=ifs[0]) return if_wr_obj.get_attr_data('if/interfaces/interface/name')
def get_first_phy_port(): ret_data_list = nas_os_if_utils.nas_os_if_list() if not ret_data_list: return None name_list = [] for ret_data in ret_data_list: cps_obj = cps_utils.CPSObject(obj=ret_data) port_name = cps_obj.get_attr_data('if/interfaces/interface/name') name_list.append(port_name) name_list.sort() return name_list[0]
def init_interfaces(ifnames): xnode_root = ET.parse(get_cfg()).getroot() lookup_sched_prof = {} lookup_buf_prof = {} lookup_map = {} # build the profile list read_current_buf_prof(lookup_buf_prof) if lookup_sched_prof == {}: return read_current_sched_prof(lookup_sched_prof) if lookup_sched_prof == {}: return for map_type in map_types: read_current_map(lookup_map, map_type) if lookup_map == {}: return if (dbg_on): print lookup_buf_prof print lookup_sched_prof print lookup_map if (lookup_sched_prof == {} or lookup_buf_prof == {} or lookup_map == {}): return try: for xnode_obj in xnode_root: if xnode_obj.tag == 'FRONT-PANEL-PORTS': for ifname in ifnames: ifidx = nas_os_if_utils.name_to_ifindex(ifname) speed = 0 intf = nas_os_if_utils.nas_os_if_list({'if-index': ifidx}) if intf: obj = cps_object.CPSObject(obj=intf[0]) speed = get_max_speed(obj) init_port(ifidx, ifname, 'ianaift:ethernetCsmacd', speed, xnode_obj, lookup_map, lookup_sched_prof, lookup_buf_prof) except RuntimeError as r: syslog.syslog("Runtime Error: " + str(r)) sys.exit(1) if err_detected: sys.exit(1)
def _process_logical_if_event(obj): if_index = _get_obj_attr_value( obj, 'dell-base-if-cmn/if/interfaces/interface/if-index') speed = _get_obj_attr_value(obj, 'dell-if/if/interfaces/interface/speed') # check if if_index is present if if_index == None or speed is None: nas_if.log_err('Interface index not present in the interface event') return # 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') return if len(if_obj_list) != 0: set_interface_media_speed(if_obj_list[0], speed)
def get_one_interface(): while True: ifs = nas_os_if_utils.nas_os_if_list() if not ifs: time.sleep(1) continue for intf in ifs: obj = cps_object.CPSObject(obj=intf) ifidx = obj.get_attr_data( 'dell-base-if-cmn/if/interfaces/interface/if-index') p = nas_qos.IngPortCPSObj(ifindex=ifidx) r = [] if cps.get([p.data()], r) == True: return ifidx time.sleep(1)
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 init_fp_ports(xnode_fp, lookup_map, lookup_sched_prof, lookup_buf_prof): # Be backward compatible if 'port' not in map(lambda x: x.tag, xnode_fp.getchildren()): init_all_ports_of_type('ianaift:ethernetCsmacd', xnode_fp, lookup_map, lookup_sched_prof, lookup_buf_prof) return ifs = nas_os_if_utils.nas_os_if_list() ifnames = map( lambda x: cps_object.CPSObject(obj=x).get_attr_data( 'if/interfaces/interface/name'), ifs) d = {} for pr in enumerate(ifnames): d[pr[1]] = pr[0] ifnames.sort() for xnode_port in xnode_fp: if xnode_port.tag != 'port': continue if 'port' in xnode_port.attrib: # Single port ifname = xnode_port.attrib['port'] if ifname not in ifnames: continue init_fp_port(cps_object.CPSObject(obj=ifs[d[ifname]]), lookup_map, lookup_sched_prof, lookup_buf_prof) continue if 'from' in xnode_port.attrib and 'to' in xnode_port.attrib: # Range of ports _from = xnode_port.attrib['from'] _to = xnode_port.attrib['to'] if _from not in ifnames or _to not in ifnames: continue i = ifnames.index(_from) j = ifnames.index(_to) while i <= j: init_fp_port(cps_object.CPSObject(obj=ifs[d[ifnames[i]]]), lookup_map, lookup_sched_prof, lookup_buf_prof) i = i + 1
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
"/usr/bin/opx-config-fanout",interface,"true"]) except Exception as ex: nas_if.log_err(str(ex)) def parse_config_file(): """parse the xml file which has the config for fanout interfaces """ if not os.path.isfile(fanout_config_file): nas_if.log_err(str(fanout_config_file)+" does not exist") try: config_xml_handle = minidom.parse(fanout_config_file) except Exception: nas_if.log_err(str(fanout_config_file)+" Is not a valid xml file") try: intf_list = config_xml_handle.getElementsByTagName("interface") parse_intf_config(intf_list) except Exception as ex: nas_if.log_err(str(ex)) if __name__ == '__main__': # Wait till interface service is ready while nas_if.nas_os_if_list() == None: sleep(1) parse_config_file()
def create_if_map(lst): if_n = {} for i in lst: obj = cps_object.CPSObject(obj=i) name = obj.get_attr_data(_g_if_name) if_n[name] = obj return if_n if __name__ == '__main__': if len(sys.argv) < 2: print "Missing parameters.. please provide interface name eg.. e00-1" sys.exit(1) l = nas_if.nas_os_if_list() if_names = create_if_map(l) if not sys.argv[1] in if_names: print "Interface is invalid... " + sys.argv[1] sys.exit(1) obj = if_names[sys.argv[1]] # disable the port first before delteting the interface obj.add_attr('enabled', False) ch = {'operation': 'set', 'change': obj.get()} if cps.transaction([ch]) != True: print "Failed to shutdown interface, exiting..." sys.exit(0)
def set_intf_request(pas_media_obj): try: media_id = pas_media_obj.get_attr_data('port') display_str = pas_media_obj.get_attr_data( 'base-pas/media/display-string') except: nas_if.log_info("Media String is not present in the media event") return # fetch FP info from media ID o = cps_object.CPSObject( module='base-if-phy/front-panel-port', data={'base-if-phy/front-panel-port/media-id': media_id}) l = [] fp_utils.gen_fp_port_list(o, l) if len(l) == 0: nas_if.log_err("No such port found... for media " + str(media_id)) return #fetching 2 front panel port object from 1 phy media id for QSFP28-DD ports port_list = [] for fp_obj in l: obj = cps_object.CPSObject(obj=fp_obj) if nas_comm.yang.get_value('fp_key', 'keys_id') == obj.get_key(): port_list = port_list + nas_if.physical_ports_for_front_panel_port( obj) if len(port_list) == 0: nas_if.log_err("There are no physical ports for front panel port ") nas_if.log_err(str(l[0])) return # create interface set RPC obj for each phy port in the list and send it for p in port_list: npu = p.get_attr_data('npu-id') port = p.get_attr_data('port-id') process_media_event(npu, port, pas_media_obj) hwport_list = p.get_attr_data('hardware-port-list') nas_if.log_info("send if obj for media id set for phy port " + str(port)) ifobj = cps_object.CPSObject( module='dell-base-if-cmn/if/interfaces/interface', data={ 'base-if-phy/if/interfaces/interface/npu-id': npu, 'base-if-phy/if/interfaces/interface/port-id': port, 'if/interfaces/interface/type': "ianaift:ethernetCsmacd" }) if if_lib.set_media_setting(None, ifobj) == False: return ch = {'operation': 'set', 'change': ifobj.get()} cps.transaction([ch]) if_name = if_config.if_config_get_by_npu_port(npu, port) if_details = nas_if.nas_os_if_list( d={'if/interfaces/interface/name': if_name}) enable = ba.from_ba( if_details[0]['data']['if/interfaces/interface/enabled'], "uint64_t") for hwport in hwport_list: fp_details = fp.find_port_by_hwport(npu, hwport) if fp_details.port_group_id is None: _lane = fp_details.lane else: pg_list = fp.get_port_group_list() pg_obj = pg_list[fp_details.port_group_id] if ((pg_obj.get_profile_type()) == "ethernet_ddqsfp28"): _lane = pg_obj.get_lane(hwport) else: _lane = fp_details.lane media.media_transceiver_set(1, fp_details.media_id, _lane, enable)
"/usr/bin/sonic-config-fanout",interface,"true"]) except Exception as ex: syslog.syslog(str(ex)) def parse_config_file(): """parse the xml file which has the config for fanout interfaces """ if not os.path.isfile(fanout_config_file): print "%s does not exist" % (fanout_config_file) try: config_xml_handle = minidom.parse(fanout_config_file) except Exception: print "%s Is not a valid xml file" % (fanout_config_file) try: intf_list = config_xml_handle.getElementsByTagName("interface") parse_intf_config(intf_list) except Exception as ex: syslog.syslog(str(ex)) if __name__ == '__main__': # Wait till interface service is ready while nas_if.nas_os_if_list() == None: sleep(1) parse_config_file()
if_n = {} for i in lst: obj = cps_object.CPSObject(obj=i) name = obj.get_attr_data(_g_if_name) if_n[name] = obj return if_n if __name__ == '__main__': if len(sys.argv) < 2: print "Missing parameters.. please provide interface name eg.. e00-1" sys.exit(1) l = nas_if.nas_os_if_list() if_names = create_if_map(l) if not sys.argv[1] in if_names: print "Interface is invalid... " + sys.argv[1] sys.exit(1) obj = if_names[sys.argv[1]] # disable the port first before delteting the interface obj.add_attr('enabled', False) ch = {'operation': 'set', 'change': obj.get()} if cps.transaction([ch]) != True: print "Failed to shutdown interface, exiting..." sys.exit(0)
def iface_config_clear(): ifs = nas_os_if_utils.nas_os_if_list() + nas_os_if_utils.nas_os_cpu_if() # For each interface, ... for iface in ifs: ifidx = cps_object.CPSObject(obj=iface).get_attr_data( 'dell-base-if-cmn/if/interfaces/interface/if-index') # Set all ingress maps to none cps_set( 'base-qos/port-ingress', 'target', { 'base-qos/port-ingress/port-id': ifidx, 'base-qos/port-ingress/dot1p-to-color-map': 0, 'base-qos/port-ingress/dscp-to-tc-map': 0, 'base-qos/port-ingress/priority-group-to-pfc-priority-map': 0, 'base-qos/port-ingress/tc-to-queue-map': 0, 'base-qos/port-ingress/dot1p-to-tc-color-map': 0, 'base-qos/port-ingress/dot1p-to-tc-map': 0, 'base-qos/port-ingress/tc-to-priority-group-map': 0, 'base-qos/port-ingress/dscp-to-tc-color-map': 0, 'base-qos/port-ingress/dscp-to-color-map': 0 }) # Set all egress maps and scheduler profile to none cps_set( 'base-qos/port-egress', 'target', { 'base-qos/port-egress/port-id': ifidx, 'base-qos/port-egress/pfc-priority-to-queue-map': 0, 'base-qos/port-egress/tc-to-dot1p-map': 0, 'base-qos/port-egress/tc-color-to-dscp-map': 0, 'base-qos/port-egress/tc-color-to-dot1p-map': 0, 'base-qos/port-egress/tc-to-queue-map': 0, 'base-qos/port-egress/tc-to-dscp-map': 0, 'base-qos/port-egress/scheduler-profile-id': 0 }) # For each priority group, ... resp = [] cps_get('base-qos/priority-group', 'target', {'base-qos/priority-group/port-id': ifidx}, resp) for r in resp: # Set buffer profile to none cps_set( 'base-qos/priority-group', 'target', { 'base-qos/priority-group/port-id': ifidx, 'base-qos/priority-group/local-id': cps_object.CPSObject(obj=r).get_attr_data( 'base-qos/priority-group/local-id'), 'base-qos/priority-group/buffer-profile-id': 0 }) # For each queue, ... resp = [] cps_get('base-qos/queue', 'target', {'base-qos/queue/port-id': ifidx}, resp) for r in resp: # Set scheduler and buffer profile to none robj = cps_object.CPSObject(obj=r) cps_set( 'base-qos/queue', 'target', { 'base-qos/queue/port-id': ifidx, 'base-qos/queue/queue-number': robj.get_attr_data('base-qos/queue/queue-number'), 'base-qos/queue/type': robj.get_attr_data('base-qos/queue/type'), 'base-qos/queue/scheduler-profile-id': 0, 'base-qos/queue/buffer-profile-id': 0 }) # For each scheduler group, ... resp = [] cps_get('base-qos/scheduler-group', 'target', {'base-qos/scheduler-group/port-id': ifidx}, resp) for r in resp: # Set scheduler profile to none robj = cps_object.CPSObject(obj=r) cps_set( 'base-qos/scheduler-group', 'target', { 'base-qos/scheduler-group/id': robj.get_attr_data('base-qos/scheduler-group/id'), 'base-qos/scheduler-group/scheduler-profile-id': 0 })