示例#1
0
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])
示例#3
0
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
示例#4
0
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)