def set_fp_port_config(fr_port, br_mode, phy_port_speed, phy_mode):
    nas_if.log_info(
        'Front-panel-port %d config request: br_mode %s speed %s phy_mode %s' %
        (fr_port, br_mode, phy_port_speed, phy_mode))

    fp_port_obj = fp.find_front_panel_port(fr_port)
    if fp_port_obj is None:
        nas_if.log_err('Front-panel-port %d not found' % fr_port)
        return False

    npu = fp_port_obj.npu
    if phy_mode == None:
        phy_mode = nas_comm.yang.get_value('ether', 'yang-phy-mode')

    #Check if breakout mode is same as current breakout mode
    if (br_mode == fp_port_obj.get_breakout_mode()
            and fp_port_obj.get_phy_mode() == phy_mode
            and fp_port_obj.get_port_speed() == phy_port_speed):
        nas_if.log_info('FP config is same as current config')
        return True

    #check if breakout mode is supported by the FP port   ( not now)
    # TODO

    port_list = port_utils.get_phy_port_list()
    #convert FP port to Hwport list ( control port)
    hwports = fp_port_obj.hwports[:]
    deleted_phy_ports = {}
    for hwport in hwports:
        phy_port_obj = port_utils.get_phy_port_by_hw_port(
            port_list, npu, hwport)
        if phy_port_obj == None:
            continue
        if port_utils.cps_del_nas_port(phy_port_obj):
            port_utils.del_phy_port(port_list, phy_port_obj)
            deleted_phy_ports[hwport] = phy_port_obj
        else:
            nas_if.log_err('Failed to delete physical port')
            return False
    # Create new phy ports based on the new breakout mode
    created_phy_ports = {}
    if port_utils.create_nas_ports(npu, hwports, br_mode, phy_port_speed,
                                   phy_mode, fr_port,
                                   created_phy_ports) == True:
        for port in created_phy_ports:
            port_utils.add_phy_port(port_list, created_phy_ports[port])
    else:
        nas_if.log_err(
            'Failed to create physical port, rollback to previous status')
        port_utils.rollback_port_add_del(port_list, created_phy_ports,
                                         deleted_phy_ports,
                                         fp_port_obj.get_port_speed(),
                                         fp_port_obj.get_phy_mode())
        return False

    #set new breakout mode and new port speed
    fp_port_obj.set_breakout_mode(br_mode)
    fp_port_obj.set_port_speed(phy_port_speed)
    send_fp_event(fp_port_obj)
    return True
def set_fp_to_hwp_mapping(fr_port, br_mode, port_speed, phy_mode, hwports):
    # If hwports is empty then delete all phy ports under the FP and set the hwport list to NOne
    port_detail = fp.find_front_panel_port(fr_port)
    if port_detail == None:
        return False
    hwp_list = port_detail.get_hwports()
    port_list = port_utils.get_phy_port_list()
    if len(hwports) == 0:
        npu = port_detail.npu
        if hwp_list != None:
            for hwp in hwp_list:
                phy_obj = port_utils.get_phy_port_by_hw_port(
                    port_list, npu, hwp)
                if phy_obj != None:
                    # delete the physical port
                    ret = port_utils.cps_del_nas_port(phy_obj)
                    if ret == False:
                        nas_if.log_err(' failed to delete Phy port')
                        return False
                    # Delete hwp to phy port mapping
                    port_utils.del_phy_port(port_list, phy_obj)
            hwports += hwp_list
        # set the hw port list to None
        port_detail.set_hwports(None)
        # set breakout mode to None
        port_detail.set_breakout_mode(None)
        return True
    else:
        # hwports is not empty. It means add the hwport to the fp port
        # create phy port corresponding to the hwport
        # check if hwport list is empty
        if hwp_list != None and len(hwp_list) > 0:
            # hw port list is not empty, return False
            print 'port list is not empty'
            return False
        port_detail.set_hwports(hwports)
        # Now create phy ports base on the new hw port list.
        ret = set_fp_port_config(fr_port, br_mode, port_speed, phy_mode)
        if not ret:
            # Rollback
            port_detail.set_hwports(None)
        return ret
    return True