def process_media_event(npu, port, pas_media_obj): try: media_id = pas_media_obj.get_attr_data('base-pas/media/port') display_str = pas_media_obj.get_attr_data( 'base-pas/media/display-string') except: nas_if.log_info( "Media event without enough attributes to determine default media settings" ) return if_name = if_config.if_config_get_by_npu_port(npu, port) if if_name is None: nas_if.log_err("Interface Name: None") return False config = if_config.if_config_get(if_name) port = fp.find_front_panel_port(config.fp_port) pas_media_obj.add_attr('dell-if/if/interfaces/interface/speed', config.get_speed()) pas_media_obj.add_attr('base-if-phy/physical/speed', fp.get_max_port_speed(port)) config.set_media_obj(pas_media_obj) return True
def identification_led_set(name, state): config = if_config.if_config_get(name) port = config.get_fp_port() led_name = "Port " + str(port) + " Beacon" fp_beacon_led_obj = cps_object.CPSObject(module='base-pas/led', qual='target', data={ 'slot': 1, 'entity-type': 3, 'name': led_name, 'on': state }) ch = {'operation': 'set', 'change': fp_beacon_led_obj.get()} return cps.transaction([ch])
def _if_update_config(op, obj): if_name = None npu_id = None port_id = None negotiation = None speed = None duplex = None media_type = None breakout_mode = None try: if_name = obj.get_attr_data(ifname_attr_name) except: # check for media_type change event obj nas_if.log_info('process media event, op %s' % op) return(if_handle_set_media_type(op, obj)) nas_if.log_info('update config for %s: op %s' % (if_name, op)) npu_port_found = True try: npu_id = obj.get_attr_data(npu_attr_name) port_id = obj.get_attr_data(port_attr_name) except: npu_port_found = False if op == 'create': # if config is cached only for physical interface if_type = if_config.get_intf_type(obj) if if_type != 'front-panel': return True ietf_intf_type = nas_if.get_cps_attr(obj,nas_comm.get_value(nas_comm.attr_name,'intf_type')) config = if_config.IF_CONFIG(if_name, ietf_intf_type) if if_config.if_config_add(if_name, config) == False: nas_if.log_err(' interface config already present for ' + str(if_name)) nas_if.log_info(' interface config added successfully for ' + str(if_name)) if (nas_if.get_cps_attr(obj, negotiation_attr_name) is None): obj.add_attr(negotiation_attr_name, _yang_auto_neg) config = if_config.if_config_get(if_name) if config is None: nas_if.log_info(' interface not present in if config list' + str(if_name)) return True if npu_port_found: #NPU port attribute only found in create or associate/disassociate request nas_if.log_info(' set npu %s and port %s to if config' % (str(npu_id), str(port_id))) config.set_npu_port(npu_id, port_id) if op == 'set' or op == 'create': force_update = False if npu_port_found: if npu_id != None or port_id != None: #for create or assiociate request fp_port = nas_if.get_cps_attr(obj, fp_port_attr_name) subport_id = nas_if.get_cps_attr(obj, subport_attr_name) config.set_fp_port(fp_port) config.set_subport_id(subport_id) fp_obj = fp.find_front_panel_port(fp_port) if fp_obj != None: config.set_cfg_speed(fp_obj.get_port_speed()) config.set_breakout_mode(fp_obj.get_breakout_mode()) obj.add_attr(supported_autoneg, fp_obj.get_supported_autoneg()) else: nas_if.log_err('Unable to find front panel object for port %d' % fp_port) #read media type from PAS media_type = _get_if_media_type(fp_port) nas_if.log_info(' set media_type %s to if config for fp %d' % ( str(media_type), fp_port)); config.set_media_type(media_type) if check_if_media_supported(media_type, config) != True: config.set_is_media_supported(False) nas_if.log_err(' Plugged-in media is not supported for ' + str(if_name)) return True if check_if_media_support_phy_mode(media_type, config) != True: config.set_is_media_supported(False) nas_if.log_err(' Plugged-in media does not support configured phy mode for %s' % if_name) return True config.set_is_media_supported(True) obj.add_attr(media_type_attr_name, media_type) _if_init_config(obj, config) if op != 'create': # for the case of interface associate, force attribute update force_update = True else: #for disassociate request nas_if.log_info(' reset breakout_mode and media type in if config') config.set_breakout_mode(None) config.set_media_type(None) if not(_fp_identification_led_handle(obj)): nas_if.log_err('Setting identification led failed') return False if config.get_is_media_supported() == False: nas_if.log_info('media type not supported') # Do not do any further processing based on the media connected return True negotiation = nas_if.get_cps_attr(obj, negotiation_attr_name) speed = nas_if.get_cps_attr(obj, speed_attr_name) duplex = nas_if.get_cps_attr(obj, duplex_attr_name) # update the new speed, duplex and autoneg in the config. If # autoneg, speed or duplex is auto then fetch default value and replace in the cps object # do not set auto speed in case of breakout mode. # In case of ethernet mode, set default speed only in case of breakout mode 1x1 # in case of FC mode, set the default speed of the media. if speed != None and (force_update or speed != config.get_speed()): if _set_speed(speed, config, obj) == False: nas_if.log_err('failed to set speed') return False # in case of negotiation, add autoneg attribute to on or off or default autoneg # if negotiation== auto if negotiation != None and (force_update or negotiation != config.get_negotiation()): _set_autoneg(negotiation, config, obj) if duplex != None and (force_update or duplex != config.get_duplex()): _set_duplex(duplex, config, obj) fec_mode = nas_if.get_cps_attr(obj, fec_mode_attr_name) if op == 'create' or (fec_mode != None and (force_update or fec_mode != config.get_fec_mode())): if _set_fec_mode(fec_mode, config, obj, op) != True: nas_if.log_err('Failed to set FEC mode %d to interface %s' % (fec_mode, if_name)) return False if op == 'create': _set_hw_profile(config, obj) config.show() if op == 'delete': # remove the interface entry from the config if_config.if_config_del(if_name) return True
def if_handle_set_media_type(op, obj): nas_if.log_info('media obj: %s' % str(obj.get())) if_name = None try: npu = obj.get_attr_data(npu_attr_name) port = obj.get_attr_data(port_attr_name) media_type = obj.get_attr_data(media_type_attr_name) except ValueError: nas_if.log_info('missing npu,port or media type or non physical port cps obj request') nas_if.log_obj(obj.get()) return True # find npu, port in the _if_config if_name = if_config.if_config_get_by_npu_port(npu, port) if if_name == None: nas_if.log_err("No interface present for the npu "+str(npu)+ "and port " +str(port)) return False nas_if.log_info( "if name is " +str(if_name)) config = if_config.if_config_get(if_name) config.set_media_type(media_type) if check_if_media_supported(media_type, config) != True: config.set_is_media_supported(False) obj.del_attr(media_type_attr_name) return False if check_if_media_support_phy_mode(media_type, config) != True: config.set_is_media_supported(False) return False # Initialize default speed, hw_profile and negotiation to auto if not initialized if config.get_speed() is None: config.set_speed(_yang_auto_speed) if config.get_negotiation() is None: config.set_negotiation(_yang_auto_neg) config.set_is_media_supported(True) obj.add_attr(ifname_attr_name, if_name) # set the default speed if the speed is configured to auto it is in non-breakout mode if config.get_speed() == _yang_auto_speed: speed = _get_default_speed(config) if speed is not None: obj.add_attr(speed_attr_name, speed) if config.get_negotiation() == _yang_auto_neg: _add_default_autoneg(media_type, obj) if config.get_duplex() == _yang_auto_dup: _add_default_duplex(media_type, obj) if config.get_fec_mode() == nas_comm.get_value(nas_comm.yang_fec_mode, 'AUTO'): cfg_speed = config.get_cfg_speed() fec_cfg = _get_default_fec_mode(media_type, cfg_speed) if(fec_cfg is not None): obj.add_attr(fec_mode_attr_name,fec_cfg) _set_hw_profile(config, obj) # delete npu port attribute because NAS use them as flag for interface association obj.del_attr(npu_attr_name) obj.del_attr(port_attr_name) nas_if.log_info("media type setting is successful for " +str(if_name)) config.show() return True
def set_media_setting(op, obj): ''' Method to add default media settings to CPS Object ''' nas_if.log_info('media obj: %s' % str(obj.get())) if_name = None try: npu = obj.get_attr_data(nas_comm.yang.get_value('npu_id', 'attr_name')) port = obj.get_attr_data( nas_comm.yang.get_value('port_id', 'attr_name')) except ValueError: nas_if.log_info( 'missing npu or port or non physical port cps obj request') nas_if.log_obj(obj.get()) return False # find npu, port in the _if_config if_name = if_config.if_config_get_by_npu_port(npu, port) if if_name is None: nas_if.log_err("No interface present for the npu " + str(npu) + " and port " + str(port)) return False nas_if.log_info("if name is " + str(if_name)) obj.add_attr(nas_comm.yang.get_value('if_name', 'attr_name'), if_name) config = if_config.if_config_get(if_name) if check_if_media_supported( config) != True or check_if_media_support_phy_mode(config) != True: config.set_is_media_supported(False) return False obj.add_attr(nas_comm.yang.get_value('media_type', 'attr_name'), config.get_media_cable_type()) config.set_is_media_supported(True) _auto_speed = nas_comm.yang.get_value('auto', 'yang-speed') if config.get_speed() is None or config.get_speed() == _auto_speed: set_if_speed(_auto_speed, config, obj) _auto_negotiation = nas_comm.yang.get_value('auto', 'yang-autoneg') if config.get_negotiation() is None or config.get_negotiation( ) == _auto_negotiation: set_if_autoneg(_auto_negotiation, config, obj) _auto_fec = nas_comm.yang.get_value('auto', 'yang-fec') if config.get_fec_mode() is None or config.get_fec_mode() == _auto_fec: set_if_fec(_auto_fec, config, obj) _auto_duplex = nas_comm.yang.get_value('auto', 'yang-duplex') if config.get_duplex() is None or config.get_duplex() == _auto_duplex: set_if_duplex(_auto_duplex, config, obj) set_if_hw_profile(config, obj) # delete npu port attribute because NAS uses them as flag for interface association obj.del_attr(nas_comm.yang.get_value('npu_id', 'attr_name')) obj.del_attr(nas_comm.yang.get_value('port_id', 'attr_name')) nas_if.log_info("media type setting is successful for " + str(if_name)) config.show() return True
def _if_update_config(op, obj): if_name = None npu_id = None port_id = None negotiation = None speed = None duplex = None try: if_name = obj.get_attr_data( nas_comm.yang.get_value('if_name', 'attr_name')) except: nas_if.log_info("Interface name not present in the object") return True nas_if.log_info('update config for %s: op %s' % (if_name, op)) npu_port_found = True try: npu_id = obj.get_attr_data( nas_comm.yang.get_value('npu_id', 'attr_name')) port_id = obj.get_attr_data( nas_comm.yang.get_value('port_id', 'attr_name')) except: npu_port_found = False if op == 'create': # if config is cached only for physical interface if_type = if_config.get_intf_type(obj) if if_type != 'front-panel': return True ietf_intf_type = nas_if.get_cps_attr( obj, nas_comm.yang.get_value('intf_type', 'attr_name')) config = if_config.IF_CONFIG(if_name, ietf_intf_type) if if_config.if_config_add(if_name, config) == False: nas_if.log_err(' interface config already present for ' + str(if_name)) nas_if.log_info(' interface config added successfully for ' + str(if_name)) if (nas_if.get_cps_attr( obj, nas_comm.yang.get_value('negotiation', 'attr_name')) is None): obj.add_attr(nas_comm.yang.get_value('negotiation', 'attr_name'), nas_comm.yang.get_value('auto', 'yang-autoneg')) config = if_config.if_config_get(if_name) if config is None: nas_if.log_info(' interface not present in if config list' + str(if_name)) return True if npu_port_found: #NPU port attribute only found in create or associate/disassociate request nas_if.log_info(' set npu %s and port %s to if config' % (str(npu_id), str(port_id))) config.set_npu_port(npu_id, port_id) if op == 'set' or op == 'create': force_update = False negotiation = nas_if.get_cps_attr( obj, nas_comm.yang.get_value('negotiation', 'attr_name')) speed = nas_if.get_cps_attr( obj, nas_comm.yang.get_value('speed', 'attr_name')) duplex = nas_if.get_cps_attr( obj, nas_comm.yang.get_value('duplex', 'attr_name')) fec = nas_if.get_cps_attr( obj, nas_comm.yang.get_value('fec_mode', 'attr_name')) if npu_port_found: if npu_id != None or port_id != None: #for create or assiociate request fp_port = nas_if.get_cps_attr( obj, nas_comm.yang.get_value('fp_port', 'attr_name')) subport_id = nas_if.get_cps_attr( obj, nas_comm.yang.get_value('subport_id', 'attr_name')) config.set_fp_port(fp_port) config.set_subport_id(subport_id) fp_obj = fp.find_front_panel_port(fp_port) if fp_obj != None: config.set_cfg_speed(fp_obj.get_port_speed()) config.set_breakout_mode(fp_obj.get_breakout_mode()) obj.add_attr( nas_comm.yang.get_value('supported_autoneg', 'attr_name'), fp_obj.get_supported_autoneg()) else: nas_if.log_err( 'Unable to find front panel object for port %d' % fp_port) #read media type from PAS try: media_obj = _get_if_media_obj(fp_port) except: media_obj = None media_monitor.process_media_event(npu_id, port_id, media_obj) if if_lib.check_if_media_supported( config ) != True or if_lib.check_if_media_support_phy_mode( config) != True: config.set_is_media_supported(False) if negotiation is not None: config.set_negotiation(negotiation) if fec is not None and nas_comm.is_fec_supported( fec, config.get_cfg_speed()) is True: config.set_fec_mode(fec) if duplex is not None: config.set_duplex(duplex) if speed is not None: if speed != nas_comm.yang.get_value( 'auto', 'yang-speed' ) and if_lib.verify_intf_supported_speed( config, speed) is True: config.set_speed(speed) return True obj.add_attr( nas_comm.yang.get_value('media_type', 'attr_name'), config.get_media_cable_type()) config.set_is_media_supported(True) _if_init_config(obj, config) if op != 'create': # for the case of interface associate, force attribute update force_update = True else: #for disassociate request nas_if.log_info( ' reset breakout_mode and media type in if config') config.set_breakout_mode(None) config.set_media_obj(None) if not (_fp_identification_led_handle(obj)): nas_if.log_err('Setting identification led failed') return False if config.get_is_media_supported() == False: nas_if.log_info('media type not supported') # Do not do any further processing based on the media connected if negotiation is not None: config.set_negotiation(negotiation) if fec is not None and nas_comm.is_fec_supported( fec, config.get_cfg_speed()) is True: config.set_fec_mode(fec) if duplex is not None: config.set_duplex(duplex) if speed is not None: if speed != nas_comm.yang.get_value( 'auto', 'yang-speed') and if_lib.verify_intf_supported_speed( config, speed) is True: config.set_speed(speed) return True # update the new speed, duplex and autoneg in the config. If # autoneg, speed or duplex is auto then fetch default value and replace in the cps object # do not set auto speed in case of breakout mode. # In case of ethernet mode, set default speed only in case of breakout mode 1x1 # in case of FC mode, set the default speed of the media. if speed != None and (force_update or speed != config.get_speed()): if if_lib.set_if_speed(speed, config, obj) == False: nas_if.log_err('failed to set speed') return False if duplex != None and (force_update or duplex != config.get_duplex()): if_lib.set_if_duplex(duplex, config, obj) # in case of negotiation, add autoneg attribute to on or off or default autoneg for eth mode interfaces intf_phy_mode = nas_comm.yang.get_value(config.get_ietf_intf_type(), 'ietf-type-2-phy-mode') if intf_phy_mode is not nas_comm.yang.get_value('fc', 'yang-phy-mode'): if negotiation != None and ( force_update or negotiation != config.get_negotiation()): if_lib.set_if_autoneg(negotiation, config, obj) else: if (nas_if.get_cps_attr( obj, nas_comm.yang.get_value('negotiation', 'attr_name')) is not None): obj.del_attr(nas_comm.yang.get_value('auto_neg', 'attr_name')) if ((intf_phy_mode == nas_comm.yang.get_value('ether', 'yang-phy-mode')) and (op == 'create' or (fec != None and (force_update or fec != config.get_fec_mode())))): if if_lib.set_if_fec(fec, config, obj, op) == False: if op == 'create': obj.del_attr( nas_comm.yang.get_value('fec_mode', 'attr_name')) nas_if.log_info("Failed to set FEC") else: nas_if.log_err("Failed to set FEC") return False if op == 'create': if_lib.set_if_hw_profile(config, obj) config.show() if op == 'delete': # remove the interface entry from the config if_config.if_config_del(if_name) return True
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) config = if_config.if_config_get(if_name) speed = config.get_speed() 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 if speed is not None: media.media_led_set(1, fp_details.media_id, _lane, speed) else: nas_if.log_err("Error speed not present") media.media_transceiver_set(1, fp_details.media_id, _lane, enable)