/* 
 * this api is used to for querying the entire fault
 * history from the cli.
 */
ClRcT
clFaultCliDebugCompleteHistoryShow( ClUint32T argc, 
                                    ClCharT **argv, 
                                    ClCharT** ret)
{
    ClRcT               rc = CL_OK;
    SaNameT             moIdName = {0};
    ClCorMOIdT          moid;
    ClCorObjectHandleT  hMSOObj;

    if ( argc != 2 )
    {
        clFaultCliStrPrint(ret, "\nUsage : queryCompleteFaultHistory <Moid>\n"
                "\tMoid [STRING]     : This is the absolute path of the MOID"
                "i.e \\Class_Chassis:0\\Class_GigeBlade:1 \n");
        return CL_OK;
    }
    //rc = clFaultXlateMOPath (argv[1], &moid );
    strcpy(moIdName.value, argv[1]);
    moIdName.length = strlen(argv[1]);
    rc = clCorMoIdNameToMoIdGet(&moIdName, &moid);
    if ( CL_OK == rc)
    {
        rc = clCorObjectHandleGet(&moid, &hMSOObj);
        if (CL_OK != rc)
        {
            clFaultCliStrPrint(ret, "clCorObjectHandleGet failed w/rc :%x \n", rc);
            return rc;
        }
        rc = clFaultHistoryShow(&moid);	
        if(CL_OK != rc)
        {
            clFaultCliStrPrint(ret, 
                    "Error in fault history show, rc [0x%x]", rc);
            return rc;

        }
        clFaultCliStrPrint(ret, gHistoryString);
        clHeapFree(gHistoryString);
    }
    else
        clFaultCliStrPrint(ret, " MOId name to MOId conversion failed ..... \n");
        
    return CL_OK;
}
/**
 * This function is used to un-register for all the MOs for which the registration was happened
 * during initialization phase. It will un-register for all the resource entires of the resource
 * table (rt) xml file.
 */ 
ClRcT _clProvOIUnregister()
{
    ClRcT                   rc = CL_OK;
    ClCorAddrT              provAddr = {0};
    ClCorMOIdT              moId ;
    ClUint32T               index = 0;
    ClOampRtResourceArrayT  resourcesArray = {0};    

    rc = clMsoConfigResourceInfoGet( &provAddr, &resourcesArray );
    if (CL_OK != rc)
    {
        clLogError("PRV","URG", "Failed while getting the resource information. rc[0x%x] ", rc);
        return rc;
    }

    for (index = 0; index < resourcesArray.noOfResources ; index++)
    {
        clCorMoIdInitialize(&moId);

        rc = clCorMoIdNameToMoIdGet(&(resourcesArray.pResources[index].resourceName), &moId);
        if (CL_OK != rc)
        {
            clLogError("PRV", "URG", "Failed to get the MOID from the give moid name[%s]. rc[0x%x]", 
                    resourcesArray.pResources[index].resourceName.value, rc);
            continue;
        }

        clCorMoIdServiceSet(&moId, CL_COR_SVC_ID_PROVISIONING_MANAGEMENT);

        rc = clCorOIUnregister(&moId, &provAddr);
        if (CL_OK != rc)
        {
            clLogError("PRV", "URG", 
                    "Failed while unregistering the route entry for resource [%s], rc[0x%x]", 
                    resourcesArray.pResources[index].resourceName.value, rc);
            continue;
        }
    }


    if (resourcesArray.noOfResources != 0)
        clHeapFree(resourcesArray.pResources);

    return rc;
}
ClRcT corAmfMibTreeInitialize(void)
{
    ClRcT rc = CL_OK;
    ClVersionT version = {'B', 0x1 , 0x1};
    ClCorMOIdT moId;
    ClCorMOIdT chassisMoid;
    ClAmsEntityBufferT nodeList = {0};
    ClAmsEntityBufferT suList = {0};
    ClAmsEntityBufferT compList = {0};
    ClAmsEntityBufferT sgList = {0};
    ClAmsEntityBufferT siList = {0};
    ClAmsEntityBufferT csiList = {0};
    ClCorClassTypeT classIds[CL_AMS_ENTITY_TYPE_MAX+2] = {0};
    ClInt32T chassisId = 0;
    ClNameT entityName = {0};
    ClUint32T i = 0;
    static ClUint32T extendedIndexTable[CL_AMS_MGMT_OI_EXTENDED_CLASS_MAX];

    rc = corAmfEntityInitialize();
    if(rc != CL_OK) goto out;

    rc = clAmsMgmtInitialize(&mgmtHandle,  NULL, &version);
    if(rc != CL_OK)
    {
        clLogError("COR", "AMF", "Mgmt initialize returned [%#x]", rc);
        goto out;
    }
    
    snprintf(entityName.value, sizeof(entityName.value), "%s:%d", "\\Chassis", chassisId);
    entityName.length = strlen(entityName.value);
    rc = clCorMoIdNameToMoIdGet(&entityName, &chassisMoid);
    if(rc != CL_OK)
    {
        clLogError("COR", "AMF", "Cor moid get returned [%#x] for name [%s]",
                   rc, entityName.value);
        goto out;
    }

    for(i = 0; i <= CL_AMS_ENTITY_TYPE_MAX; ++i)
    {
        rc = corAmfEntityClassGet(i, classIds + i);
        if(rc != CL_OK)
        {
            clLogError("COR", "AMF", "Entity class for [%s] not found",
                       CL_AMS_STRING_ENTITY_TYPE(i));
            goto out;
        }
    }

    if( (rc = clAmsMgmtGetNodeList(mgmtHandle, &nodeList)) != CL_OK)
    {
        clLogError("COR", "AMF", "Node list returned [%#x]", rc);
        goto out;
    }


    /*
     * Create objects for nodes/sus/comps/sgs/sis/csis
     */
    for(i = 0; i < nodeList.count; ++i)
    {
        memcpy(&moId, &chassisMoid, sizeof(moId));
        clCorMoIdAppend(&moId, classIds[CL_AMS_ENTITY_TYPE_NODE], i);
        rc = corAmfObjectCreate(i, &nodeList.entity[i], &moId);
        if(rc != CL_OK) goto out;
    }

    rc = clAmsMgmtGetSUList(mgmtHandle, &suList);
    if(rc != CL_OK)
    {
        clLogError("COR", "AMF", "SU list get returned [%#x]", rc);
        goto out;
    }

    for(i = 0; i < suList.count; ++i)
    {
        memcpy(&moId, &chassisMoid, sizeof(moId));
        rc = clCorMoIdAppend(&moId, classIds[CL_AMS_ENTITY_TYPE_SU], i);
        CL_ASSERT(rc == CL_OK);
        rc = corAmfObjectCreate(i, &suList.entity[i], &moId);
        if(rc != CL_OK) goto out;
    }
    
    rc = clAmsMgmtGetCompList(mgmtHandle, &compList);
    if(rc != CL_OK)
    {
        clLogError("COR", "AMF", "Comp list get returned [%#x]", rc);
        goto out;
    }

    for(i = 0; i < compList.count; ++i)
    {
        memcpy(&moId, &chassisMoid, sizeof(moId));
        rc = clCorMoIdAppend(&moId, classIds[CL_AMS_ENTITY_TYPE_COMP], i);
        CL_ASSERT(rc == CL_OK);
        rc = corAmfObjectCreate(i, &compList.entity[i], &moId);
        if(rc != CL_OK) goto out;
    }

    rc = clAmsMgmtGetSGList(mgmtHandle, &sgList);
    if(rc != CL_OK)
    {
        clLogError("COR", "AMF", "SG list returned [%#x]", rc);
        goto out;
    }

    for(i = 0; i < sgList.count; ++i)
    {
        ClAmsEntityBufferT rankList = {0};
        memcpy(&moId, &chassisMoid, sizeof(moId));
        rc = clCorMoIdAppend(&moId, classIds[CL_AMS_ENTITY_TYPE_SG], i);
        CL_ASSERT(rc == CL_OK);
        rc = corAmfObjectCreate(i, &sgList.entity[i], &moId);
        if(rc != CL_OK) goto out;
        rc = clAmsMgmtGetSGSIList(mgmtHandle, &sgList.entity[i], &rankList);
        if(rc != CL_OK)
        {
            clLogError("COR", "AMF", "SG [%s] si list returned [%#x]",
                       sgList.entity[i].name.value, rc);
            goto out;
        }
        rc = corAmfExtendedClassObjectCreate("saAmfSGSIRankTable",
                                             &sgList.entity[i],
                                             &chassisMoid,
                                             rankList.count,
                                             &extendedIndexTable[CL_AMS_MGMT_OI_SGSIRANK],
                                             &i);
        if(rankList.entity)
        {
            clHeapFree(rankList.entity);
            rankList.entity = NULL;
            rankList.count = 0;
        }
        
        rc = clAmsMgmtGetSGSUList(mgmtHandle, &sgList.entity[i], &rankList);
        if(rc != CL_OK)
        {
            clLogError("COR", "AMF", "SG [%s] su list returned [%#x]",
                       sgList.entity[i].name.value, rc);
            goto out;
        }
        rc = corAmfExtendedClassObjectCreate("saAmfSGSURankTable",
                                             &sgList.entity[i],
                                             &chassisMoid,
                                             rankList.count,
                                             &extendedIndexTable[CL_AMS_MGMT_OI_SGSURANK],
                                             &i);
        if(rankList.entity)
        {
            clHeapFree(rankList.entity);
            rankList.count = 0;
        }
    }

    rc = clAmsMgmtGetSIList(mgmtHandle, &siList);
    if(rc != CL_OK)
    {
        clLogError("COR", "AMF", "SI list get returned [%#x]", rc);
        goto out;
    }

    for(i = 0; i < siList.count; ++i)
    {
        ClAmsEntityBufferT list = {0};
        memcpy(&moId, &chassisMoid, sizeof(moId));
        rc = clCorMoIdAppend(&moId, classIds[CL_AMS_ENTITY_TYPE_SI], i);
        CL_ASSERT(rc == CL_OK);
        rc = corAmfObjectCreate(i, &siList.entity[i], &moId);
        if(rc != CL_OK) goto out;
        
        rc = clAmsMgmtGetSIDependenciesList(mgmtHandle, &siList.entity[i],
                                            &list);
        if(rc != CL_OK)
        {
            clLogError("COR", "AMF", "SI [%s] dependencies list returned [%#x]",
                       siList.entity[i].name.value, rc);
            goto out;
        }
        if(list.count)
        {
            rc = corAmfExtendedClassObjectCreate("saAmfSISIDepTable",
                                                 &siList.entity[i],
                                                 &chassisMoid,
                                                 list.count,
                                                 &extendedIndexTable[CL_AMS_MGMT_OI_SISIDEP],
                                                 &i);
        }

        if(list.entity)
        {
            clHeapFree(list.entity);
            list.count = 0;
        }
        rc = clAmsMgmtGetSISURankList(mgmtHandle, &siList.entity[i], &list);
        if(rc != CL_OK)
        {
            clLogError("COR", "AMF", "SI [%s] su rank list returned [%#x]",
                       siList.entity[i].name.value, rc);
            goto out;
        }
        if(list.count)
        {
            rc = corAmfExtendedClassObjectCreate("saAmfSUsperSIRankTable",
                                                 &siList.entity[i],
                                                 &chassisMoid,
                                                 list.count,
                                                 &extendedIndexTable[CL_AMS_MGMT_OI_SUSPERSIRANK],
                                                 &i);
        }
        if(list.entity)
        {
            list.count = 0;
            clHeapFree(list.entity);
        }
    }
    
    rc = clAmsMgmtGetCSIList(mgmtHandle, &csiList);
    if(rc != CL_OK)
    {
        clLogError("COR", "AMF", "CSI list get returned [%#x]", rc);
        goto out;
    }
    for(i = 0; i < csiList.count; ++i)
    {
        ClAmsCSINVPBufferT buffer = {0};
        ClAmsEntityBufferT list = {0};
        memcpy(&moId, &chassisMoid, sizeof(moId));
        rc = clCorMoIdAppend(&moId, classIds[CL_AMS_ENTITY_TYPE_CSI], i);
        CL_ASSERT(rc == CL_OK);
        rc = corAmfObjectCreate(i, &csiList.entity[i], &moId);
        if(rc != CL_OK) goto out;

        rc = clAmsMgmtGetCSINVPList(mgmtHandle, &csiList.entity[i], &buffer);
        if(rc != CL_OK)
        {
            clLogError("COR", "AMF", "CSI [%s] nvp list returned [%#x]",
                       csiList.entity[i].name.value, rc);
            goto out;
        }
        
        rc = corAmfExtendedClassObjectCreate("saAmfCSINameValueTable",
                                             &csiList.entity[i],
                                             &chassisMoid,
                                             buffer.count,
                                             &extendedIndexTable[CL_AMS_MGMT_OI_CSINAMEVALUE],
                                             &i);
        if(buffer.nvp)
        {
            clHeapFree(buffer.nvp);
        }

        rc = clAmsMgmtGetCSIDependenciesList(mgmtHandle, &csiList.entity[i],
                                             &list);
        if(rc != CL_OK)
        {
            clLogError("COR", "AMF", "CSI [%s] dependencies list returned [%#x]",
                       csiList.entity[i].name.value, rc);
            goto out;
        }
        
        rc = corAmfExtendedClassObjectCreate("saAmfCSICSIDepTable",
                                             &csiList.entity[i],
                                             &chassisMoid,
                                             list.count,
                                             &extendedIndexTable[CL_AMS_MGMT_OI_CSICSIDEP],
                                             &i);
        if(list.entity)
        {
            clHeapFree(list.entity);
        }
    }

    /*
     * We are here when the objects are all created. Do a commit
     */
    rc = corAmfObjectCommit();
    if(rc != CL_OK)
    {
        clLogError("COR", "AMF", "Object commit returned [%#x]", rc);
        goto out;
    }

    clLogNotice("COR", "AMF", "COR AMF tree successfully initialized");

    out:
    if(nodeList.entity) 
        clHeapFree(nodeList.entity);
    if(suList.entity)   
        clHeapFree(suList.entity);
    if(compList.entity) 
        clHeapFree(compList.entity);
    if(sgList.entity)   
        clHeapFree(sgList.entity);
    if(siList.entity)   
        clHeapFree(siList.entity);
    if(csiList.entity) 
        clHeapFree(csiList.entity);
    return rc;
}
ClRcT clAmsMgmtOIInitialize(ClAmsMgmtHandleT *pHandle, 
                            ClRcT (*pClAmsMgmtOIConfigAttributesGet)
                            (ClAmsEntityConfigT*, ClCorAttributeValueListPtrT pAttrList),
                            ClRcT (*pClAmsMgmtOIExtendedConfigAttributesGet)
                            (ClAmsMgmtOIExtendedClassTypeT type, 
                             ClAmsMgmtOIExtendedEntityConfigT *pConfig,
                             ClCorClassTypeT *pClassType,
                             ClCorAttributeValueListT *pAttrList))
{
    ClRcT rc = CL_OK;
    ClAmsMgmtHandleT handle = 0;
    ClAmsEntityBufferT buffer[CL_AMS_ENTITY_TYPE_MAX+2] = {{0}};
    ClVersionT version = {'B', 0x1, 0x1};
    ClCorTxnSessionIdT txnSession = 0;
    ClUint32T i;
    ClCorAddrT appAddress = {0};
    SaNameT chassisInstance = {0};
    ClUint32T chassisId = 0;

    if(!pClAmsMgmtOIConfigAttributesGet)
        return CL_AMS_RC(CL_ERR_INVALID_PARAMETER);

    rc = clOsalMutexInit(&gClAmsMgmtOICacheMutex);
    CL_ASSERT(rc == CL_OK);

    rc = clEoMyEoIocPortGet(&appAddress.portId);
    if(rc != CL_OK) 
        return rc;
    appAddress.nodeAddress = clIocLocalAddressGet();

    rc = clAmsMgmtInitialize(&handle, NULL, &version);
    if(rc != CL_OK)
    {
        return rc;
    }
    snprintf(chassisInstance.value, sizeof(chassisInstance.value),
             "%s:%d", "\\Chassis", chassisId);
    chassisInstance.length = strlen(chassisInstance.value);
    rc = clCorMoIdNameToMoIdGet(&chassisInstance, &gClChassisMoid);
    if(rc != CL_OK)
    {
        clLogError("AMF", "MGMT", "COR moid get for [%s] returned [%#x]",
                   chassisInstance.value, rc);
        goto out_free;
    }
    rc = clAmsMgmtGetSGList(handle, &buffer[CL_AMS_ENTITY_TYPE_SG]);
    if(rc != CL_OK)
    {
        clLogError("AMF", "MGMT", "Get SG list returned [%#x]", rc);
        goto out_free;
    }
    rc = clAmsMgmtGetSIList(handle, &buffer[CL_AMS_ENTITY_TYPE_SI]);
    if(rc != CL_OK)
    {
        clLogError("AMF", "MGMT", "Get SI list returned [%#x]", rc);
        goto out_free;
    }
    rc = clAmsMgmtGetCSIList(handle, &buffer[CL_AMS_ENTITY_TYPE_CSI]);
    if(rc != CL_OK)
    {
        clLogError("AMF", "MGMT", "Get CSI list returned [%#x]", rc);
        goto out_free;
    }
    rc = clAmsMgmtGetNodeList(handle, &buffer[CL_AMS_ENTITY_TYPE_NODE]);
    if(rc != CL_OK)
    {
        clLogError("AMF", "MGMT", "Get NODE list returned [%#x]", rc);
        goto out_free;
    }
    rc = clAmsMgmtGetSUList(handle, &buffer[CL_AMS_ENTITY_TYPE_SU]);
    if(rc != CL_OK)
    {
        clLogError("AMF", "MGMT", "Get SU list returned [%#x]", rc);
        goto out_free;
    }
    rc = clAmsMgmtGetCompList(handle, &buffer[CL_AMS_ENTITY_TYPE_COMP]);
    if(rc != CL_OK)
    {
        clLogError("AMF", "MGMT", "Get COMP list returned [%#x]", rc);
        goto out_free;
    }
    /*
     * Now fetch the moid for each of the entities and build the cache.
     */
    for(i = 0; i <= CL_AMS_ENTITY_TYPE_MAX; ++i)
    {
        ClAmsEntityBufferT *pBuffer = &buffer[i];
        ClUint32T j;
        if(!pBuffer->count || !pBuffer->entity)
            continue;
        gClAmsMgmtOIIndexTable[i] = pBuffer->count;
        for(j = 0; j < pBuffer->count; ++j)
        {
            ClCorMOIdT moid = {{{0}}};
            rc = clAmsMgmtOIMoIdGet(handle, pBuffer->entity+j, &moid);
            if(rc != CL_OK)
            {
                continue;
            }
            clAmsMgmtOICacheAdd(clCorMoIdToInstanceGet(&moid), pBuffer->entity+j);
            /*
             * Required for instances exceeding the pre-configured limit.
             */
             rc = clCorOIRegister(&moid, &appAddress);
             if(rc != CL_OK)
             {
                 continue;
             }
            rc = clCorPrimaryOISet(&moid, &appAddress);
            if(rc != CL_OK)
            {
                /*
                 * Ignore as it could be already set by the active.
                 */
                continue;
            }
            clAmsMgmtOIConfigAttributeSet(handle, &txnSession, &moid, pBuffer->entity+j, pClAmsMgmtOIConfigAttributesGet);
            clAmsMgmtOIExtendedConfigAttributeSet(handle, &txnSession, pBuffer->entity+j,
                                                  pClAmsMgmtOIExtendedConfigAttributesGet);
        }
    }
    rc = clCorTxnSessionCommit(txnSession);
    if(rc != CL_OK)
    {
        clLogError("AMF", "MGMT", "AMF OI config commit returned [%#x]", rc);
    }
    else
    {
        clLogNotice("AMF", "MGMT", "Entity cache successfully initialized");
        gClAmsMgmtOIInitialized = CL_TRUE;
    }

    out_free:
    for(i = 0; i <= CL_AMS_ENTITY_TYPE_MAX; ++i)
    {
        if(buffer[i].entity) clHeapFree(buffer[i].entity);
        if(rc != CL_OK) clAmsMgmtOICacheDestroy(i);
    }
    if(rc != CL_OK)
    {
        for(i = 0; i < CL_AMS_MGMT_OI_EXTENDED_CLASS_MAX; ++i)
            clAmsMgmtOIExtendedCacheDestroy(i);
    }
    if(rc == CL_OK && pHandle)
        *pHandle = handle;
    else 
        clAmsMgmtFinalize(handle);

    return rc;
}
ClRcT clComponentCallBack(void *arg)
{

    ClRcT rc = CL_OK;
    struct timeval alarmTime;
    ClAlarmHandleT alarmHandle;
    ClNameT moidName = {strlen("\\Chassis:0\\GigeBlade:0"),
                        "\\Chassis:0\\GigeBlade:0"};
    ClNameT moidName2 = {strlen("\\Chassis:0\\GigeBlade:0\\GigePort:0"),
                        "\\Chassis:0\\GigeBlade:0\\GigePort:0"};

    ClAlarmInfoT *pAlarmInfo;
    ClCorMOIdT   moId;
    ClNameT      moIdName = {0};

    pAlarmInfo = clHeapAllocate(sizeof(ClAlarmInfoT)+strlen("HelloHelloHelloHelloHelloHelloHelloHello")+1);
    if(pAlarmInfo == NULL)
    {
        clOsalPrintf("Failed while allocating the memory for the alamr information.");
        return CL_ALARM_RC(CL_ERR_NO_MEMORY);
    }

    clCpmComponentNameGet(0,&(pAlarmInfo->compName));
    CL_DEBUG_PRINT(CL_DEBUG_ERROR, (" CompName : %s\n", pAlarmInfo->compName.value));
    clCorMoIdNameToMoIdGet(&moidName,&(pAlarmInfo->moId));

    pAlarmInfo->alarmState      = CL_ALARM_STATE_ASSERT;
    pAlarmInfo->category        = CL_ALARM_CATEGORY_QUALITY_OF_SERVICE;
    pAlarmInfo->specificProblem = 0;
    pAlarmInfo->severity        = CL_ALARM_SEVERITY_CRITICAL;
    gettimeofday(&alarmTime,NULL);
    pAlarmInfo->eventTime       = alarmTime.tv_sec;
    pAlarmInfo->len = strlen("HelloHelloHelloHelloHelloHelloHelloHello")+1;
    memcpy(pAlarmInfo->buff,"HelloHelloHelloHelloHelloHelloHelloHello",pAlarmInfo->len);

    ClEoExecutionObjT* peoObj=(ClEoExecutionObjT *)arg;
    if ( (rc = clEoMyEoObjectSet(peoObj)) != CL_OK)
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR, (" clEoMyEoObjectSet failed, rc:0x%x \n", rc));
        return rc;
    }

	/**
	  * Raising alarm for :
	  * MOId -  /Chassis:0/GigeBlade:0
	  * Category - CL_ALARM_CATEGORY_QUALITY_OF_SERVICE
	  * Probable Cause - CL_ALARM_PROB_CAUSE_BANDWIDTH_REDUCED
	  */
    CL_DEBUG_PRINT(CL_DEBUG_ERROR,("Raising alarm for [%s] and the probable cause\
			[%d]", moidName.value, CL_ALARM_PROB_CAUSE_LOSS_OF_FRAME));
    pAlarmInfo->probCause = CL_ALARM_PROB_CAUSE_BANDWIDTH_REDUCED;
    rc = clAlarmRaise(pAlarmInfo,&alarmHandle);

	/**
	  * Raising alarm for :
	  * MOId - /Chassis:0/GigeBlade:0
	  * Category -  CL_ALARM_CATEGORY_QUALITY_OF_SERVICE
	  * Probable Cause - CL_ALARM_PROB_CAUSE_RESPONSE_TIME_EXCESSIVE
	  */
    pAlarmInfo->probCause = CL_ALARM_PROB_CAUSE_RESPONSE_TIME_EXCESSIVE;
    CL_DEBUG_PRINT(CL_DEBUG_ERROR,("Raising alarm for [%s] and the probable \
		cause [%d]", moidName.value, CL_ALARM_PROB_CAUSE_RESPONSE_TIME_EXCESSIVE));
    rc = clAlarmRaise(pAlarmInfo,&alarmHandle);
    CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Alarm Category : %d \n",pAlarmInfo->category ));
    CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Alarm severity: %d \n",pAlarmInfo->severity));

    rc = clAlarmClientResourceInfoGet(alarmHandle, &moId);
    if ( CL_OK != rc)
    {
        clOsalPrintf("Failed while asking the moid for the alarm handle [%d]. rc[0x%x] \n", alarmHandle, rc);
        return rc;
    }

    rc = clCorMoIdToMoIdNameGet(&moId, &moIdName);
    if(CL_OK != rc)
    {
        clOsalPrintf("Failed while getting the mOId name from moid . rc[0x%x]", rc) ;
        return rc;
    }

    clOsalPrintf("The MOID for the alarm handle is [%d] is [%s]\n", alarmHandle, moIdName.value);
	/**
	  * Raising alarm for :
	  * MOId - /Chassis:0/GigeBlade:0/GigePort:0
	  * Category - CL_ALARM_CATEGORY_QUALITY_OF_SERVICE
	  * Probable Cause - CL_ALARM_PROB_CAUSE_LOSS_OF_FRAME
	  */
    CL_DEBUG_PRINT(CL_DEBUG_ERROR,("Raising alarm for [%s] and the probable \
				cause [%d]", moidName2.value, CL_ALARM_PROB_CAUSE_LOSS_OF_FRAME));
    pAlarmInfo->probCause = CL_ALARM_PROB_CAUSE_LOSS_OF_FRAME;
    clCorMoIdNameToMoIdGet(&moidName2,&(pAlarmInfo->moId));

    rc = clAlarmRaise(pAlarmInfo,&alarmHandle);
    CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Alarm Category : %d \n",pAlarmInfo->category ));
    CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Alarm severity: %d \n",pAlarmInfo->severity));

    rc = clAlarmClientResourceInfoGet(alarmHandle, &moId);
    if ( CL_OK != rc)
    {
        clOsalPrintf("Failed while asking the moid for the alarm handle [%d]. rc[0x%x] \n", alarmHandle, rc);
        return rc;
    }

    rc = clCorMoIdToMoIdNameGet(&moId, &moIdName);
    if(CL_OK != rc)
    {
        clOsalPrintf("Failed while getting the mOId name from moid . rc[0x%x]", rc) ;
        return rc;
    }

    clOsalPrintf("The MOID for the alarm handle is [%d] is [%s]\n", alarmHandle, moIdName.value);
	/**
	  * Raising alarm for :
	  * MOId -  /Chassis:0/GigeBlade:0/GigePort:0
	  * Category - CL_ALARM_CATEGORY_QUALITY_OF_SERVICE 
	  * Probable Cause - CL_ALARM_PROB_CAUSE_MULTIPLEXER_PROBLEM 
	  */
    CL_DEBUG_PRINT(CL_DEBUG_ERROR,("Raising alarm for [%s] and the probable \
				cause [%d]", moidName2.value, CL_ALARM_PROB_CAUSE_MULTIPLEXER_PROBLEM));
    pAlarmInfo->probCause = CL_ALARM_PROB_CAUSE_MULTIPLEXER_PROBLEM;
    clCorMoIdNameToMoIdGet(&moidName2,&(pAlarmInfo->moId));
    rc = clAlarmRaise(pAlarmInfo,&alarmHandle);
    CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Alarm Category : %d \n",pAlarmInfo->category ));
    CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Alarm severity: %d \n",pAlarmInfo->severity));


	/**
	  * Clearing alarm for :
	  * MOId - /Chassis:0/GigeBlade:0/GigePort:0 
	  * Category - CL_ALARM_CATEGORY_QUALITY_OF_SERVICE
	  * Probable Cause - CL_ALARM_PROB_CAUSE_MULTIPLEXER_PROBLEM
	  */
    CL_DEBUG_PRINT(CL_DEBUG_ERROR,("Clearing alarm for [%s] and the probable \
				cause [%d]", moidName.value, CL_ALARM_PROB_CAUSE_MULTIPLEXER_PROBLEM));
    pAlarmInfo->alarmState = CL_ALARM_STATE_CLEAR;
    clCorMoIdNameToMoIdGet(&moidName2,&(pAlarmInfo->moId));
    rc = clAlarmRaise(pAlarmInfo,&alarmHandle);
    CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Alarm Category : %d \n",pAlarmInfo->category ));
    CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Alarm severity: %d \n",pAlarmInfo->severity));

	/**
	  * Clearing alarm for :
	  * MOId - /Chassis:0/GigeBlade:0/GigePort:0 
	  * Category - CL_ALARM_CATEGORY_QUALITY_OF_SERVICE
	  * Probable Cause - CL_ALARM_PROB_CAUSE_LOSS_OF_FRAME
	  */
    CL_DEBUG_PRINT(CL_DEBUG_ERROR,("Raising alarm for [%s] and the probable \
				cause [%d]", moidName.value, CL_ALARM_PROB_CAUSE_LOSS_OF_FRAME));
    pAlarmInfo->probCause = CL_ALARM_PROB_CAUSE_LOSS_OF_FRAME;
    rc = clAlarmRaise(pAlarmInfo,&alarmHandle);
    CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Alarm Category : %d \n",pAlarmInfo->category ));
    CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Alarm severity: %d \n",pAlarmInfo->severity));
    return rc;
}
/* 
 * this api is used for generating the fault
 * from the cli.
 */
ClRcT
clFaultCliDebugGenerateFault(ClUint32T argc, 
                             ClCharT **argv, 
                             ClCharT** ret)
{
	ClRcT               rc = CL_OK;
    SaNameT             moIdName = {0};
	ClCorMOIdT          moid;
	ClFaultRecordT*     fRecord;
	ClCorObjectHandleT  hMSOObj;

	if ( argc != 7 )
    {
		clFaultCliStrPrint(ret, 
                "\nUsage : generateFault <Moid#>"
                " <Category#> <SpecificProblem#> <Severity#> <Cause#> <alarmState>\n"
                "\tMoid [STRING]    : This is the absolute path of the MOID"
                "Ex:- \\Class_Chassis:0\\Class_GigeBlade:1 \n"
                "\tCategory [DEC]   : Category of the fault\n"
                "\tValid values are : 1 for COMMUNICATIONS, 2 for QUALITY OF SERVICE,\n\t\t\t   3 for PROCESSING ERROR, 4 for EQUIPMENT,\n\t\t\t   5 for ENVIRONMENTAL\n\n"
                "\tSpecProb [DEC]   : Specific problem of the fault\n"
                "\tSeverity [DEC]   : Severity of the fault\n"
                "\tValid values are : 1 for CRITICAL, 2 for MAJOR,\n\t\t\t   3 for MINOR, 4 for WARNING,\n\t\t\t   5 for INTERMEDIATE, 6 for CLEAR\n\n"
                "\tCause [DEC]      : Cause of the fault\n"
                "\tValid values are : 1 to 57. Refer ClAlarmProbableCauseT for more description\n"
                "\tAlarm State [DEC]: State of the fault\n"
                "\tValid values are : 0 for CLEAR, 1 for ASSERT\n");
		return CL_OK;
    }
//	rc = clFaultXlateMOPath (argv[1], &moid );
    strcpy(moIdName.value, argv[1]);
    moIdName.length = strlen(argv[1]);
    rc = clCorMoIdNameToMoIdGet(&moIdName, &moid);
	if ( CL_OK == rc)
    {
		fRecord =(ClFaultRecordT*)clHeapAllocate(sizeof(ClFaultRecordT));
		if(fRecord == NULL)
		{
            clFaultCliStrPrint(ret,
                    "Heap allocation error. Error in generating fault\n");
			return CL_FAULT_RC(CL_ERR_NO_MEMORY);
		}
		
        clCorMoIdShow(&moid);
		rc = clCorObjectHandleGet(&moid, &hMSOObj);
		if (CL_OK != rc)
		{
			clFaultCliStrPrint(ret,
                    "clCorObjectHandleGet for MOId [%s] failed with error [0x%x]. Error in generating fault\n", 
                    moIdName.value, rc);
			clHeapFree(fRecord);
            return rc;
		}
		(fRecord->event).category = atoi(argv[2]);
        (fRecord->event).specificProblem = atoi(argv[3]);
        (fRecord->event).severity = atoi(argv[4]);
        (fRecord->event).cause = atoi(argv[5]);
        if((fRecord->event).cause < CL_ALARM_PROB_CAUSE_LOSS_OF_SIGNAL 
                        ||
           (fRecord->event).cause > CL_ALARM_PROB_CAUSE_ENCLOSURE_DOOR_OPEN)
        {
            clFaultCliStrPrint(ret, 
                    "Invalid probable cause [%s] supplied. Please see usage for the valid range of values\n");
            return CL_FAULT_ERR_INVLD_VAL;
        }
        (fRecord->event).alarmState = atoi(argv[6]);
		(fRecord->event).moId = moid;	

		rc = clFaultValidateCategory((fRecord->event).category);
        if (CL_OK != rc)
        {
			clHeapFree(fRecord);
	        clFaultCliStrPrint(ret, 
                    "Invalid Category [%s] of Alarm. Please see usage for the valid range of values\n",
                    argv[2]);
            return rc;
        }

		rc = clFaultValidateSeverity((fRecord->event).severity);
        if (CL_OK != rc)
        {
			clHeapFree(fRecord);
	        clFaultCliStrPrint(ret,
                    "Invalid Severity [%s] of Alarm. Please use usage for the valid range of values\n",
                    argv[4]);
            return rc;
        }

		if((fRecord->event).alarmState == 1 ||
			(fRecord->event).alarmState == 0)
		{
								
			(fRecord->event).category=
				clFaultCategory2InternalTranslate((fRecord->event).category);
			(fRecord->event).severity=
				clFaultSeverity2InternalTranslate((fRecord->event.severity));
			rc = clFaultRepairProcess(fRecord);
            if(CL_OK != rc)
            {
                clFaultCliStrPrint(ret, 
                        "Error in generating fault error[0x%x]\n");
                clHeapFree(fRecord);
                return rc;
            }
			clHeapFree(fRecord);	
            clFaultCliStrPrint(ret, 
                    "Successfully generated fault\n");
            return CL_OK;
		}
		else
        {
			clFaultCliStrPrint(ret, 
                    " Invalid Alarm State. Error in generating fault \n");
            clHeapFree(fRecord);
            return rc;
        }
    }
	else
    {
		clLogError(CL_FAULT_SERVER_LIB,CL_LOG_CONTEXT_UNSPECIFIED,
                           "MOId name to MOId conversion failed. Error in generating fault\n");
        clFaultCliStrPrint(ret,
                "Name to MOId conversion failed for MOId[%s], error [0x%x]\n", 
                moIdName.value, rc);
    }

	return rc;
}
/* 
 * this api is used to for querying the fault history
 * for a particular set of attributes from the cli.
 */
ClRcT
clFaultCliDebugHistoryShow( ClUint32T argc, 
                            ClCharT **argv, 
                            ClCharT** ret)
{
    ClRcT               rc = CL_OK;
    SaNameT             moIdName = {0};
    ClUint8T            catIndex, sevIndex;
    ClUint8T    		recordFound = 0;	
    ClCorMOIdT          moid;
    ClFaultRecordT*     fRecord;
    ClFaultRecordPtr 	historyRec;
    ClCorObjectHandleT  hMSOObj;

    if ( argc != 6 )
    {
        clFaultCliStrPrint(ret, "\nUsage : queryFaulthistory <Moid>"
                " <Category#> <SpecificProblem#> <Severity#> <Cause#>\n"
                "\tMoid [STRING]    : This is the absolute path of the MOID"
                "i.e \\Class_Chassis:0\\Class_GigeBlade:1 \n"
                "\tCategory [DEC]   : Category of the fault\n"
                "\tValid values are : 1 for COMMUNICATIONS, 2 for QUALITY OF SERVICE,\n\t\t\t   3 for PROCESSING ERROR, 4 for EQUIPMENT,\n\t\t\t   5 for ENVIRONMENTAL\n\n"
                "\tSpecProblem[DEC] : Specific problem of the fault\n"
                "\tSeverity [DEC]   : Severity of the fault\n"
                "\tValid values are : 1 for CRITICAL, 2 for MAJOR,\n\t\t\t   3 for MINOR, 4 for WARNING,\n\t\t\t   5 for INTERMEDIATE, 6 for CLEAR\n\n"
                "\tCause [DEC]      : Cause of the fault\n"
                "\tValid values are : 1 to 57. Refer ClAlarmProbableCauseT for more description\n");
        return CL_OK;
    }
    //rc = clFaultXlateMOPath (argv[1], &moid );
    strcpy(moIdName.value, argv[1]);
    moIdName.length = strlen(argv[1]);
    rc = clCorMoIdNameToMoIdGet(&moIdName, &moid);
    if ( CL_OK == rc)
    {
        fRecord =(ClFaultRecordT*)clHeapAllocate(sizeof(ClFaultRecordT));

        historyRec = (ClFaultRecordPtr)clHeapAllocate(sizeof(ClFaultRecordT));	

        if(fRecord == NULL || historyRec == NULL)
        {
            clLogWrite(CL_LOG_HANDLE_SYS, CL_LOG_SEV_CRITICAL, CL_FAULT_SERVER_LIB,
                    CL_LOG_MESSAGE_0_MEMORY_ALLOCATION_FAILED);
            return CL_FAULT_RC(CL_ERR_NO_MEMORY);
        }
                            
        rc = clCorObjectHandleGet(&moid, &hMSOObj);
        if (CL_OK != rc)
        {
            clFaultCliStrPrint(ret, " Invalid MoId passed..... \n");
            clHeapFree(fRecord);
            clHeapFree(historyRec);
            return rc;
        }
        (fRecord->event).category = atoi(argv[2]);
        (fRecord->event).specificProblem = atoi(argv[3]);
        (fRecord->event).severity = atoi(argv[4]);
        (fRecord->event).cause = atoi(argv[5]);
        if((fRecord->event).cause < CL_ALARM_PROB_CAUSE_LOSS_OF_SIGNAL 
                        ||
           (fRecord->event).cause > CL_ALARM_PROB_CAUSE_ENCLOSURE_DOOR_OPEN)
        {
            clFaultCliStrPrint(ret, 
                    "Invalid probable cause [%s] supplied. Please see usage for the valid range of values\n");
            return CL_FAULT_ERR_INVLD_VAL;
        }
        (fRecord->event).moId = moid;	
                            
        (fRecord->event).category=
            clFaultCategory2InternalTranslate((fRecord->event).category);
        (fRecord->event).severity=
            clFaultSeverity2InternalTranslate((fRecord->event.severity));

        if ( (rc = clFaultCategory2IndexTranslate(
                        (fRecord->event).category, &catIndex)) != CL_OK )
        {
            clFaultCliStrPrint(ret, 
                    "\nFM REPAIR, Invalid CATEGORY. CANNOT PROCESS QUERY\n");
            clHeapFree(fRecord);
            clHeapFree(historyRec);
            return CL_OK;
        }
        if( (rc = clFaultSeverity2IndexTranslate(
                        (fRecord->event).severity, &sevIndex)) != CL_OK )
        {
            clFaultCliStrPrint(ret, 
                    "\nFM REPAIR, Invalid SEVERITY. CANNOT PROCESS QUERY\n");
            clHeapFree(fRecord);
            clHeapFree(historyRec);
            return rc;
        }

        rc = clFaultHistoryDataLock();
        if (rc != CL_OK)
        {
            clFaultCliStrPrint(ret, 
                    " REPAIR: Not able to get history data lock rc [0x%x]\n", rc);
            clHeapFree(fRecord);
            clHeapFree(historyRec);
            return rc;
        }
        rc = clFaultProcessFaultRecordQuery(&(fRecord->event.moId),
                                               (fRecord->event).category,
                                               (fRecord->event).severity,
                                               (fRecord->event).specificProblem,
                                               (fRecord->event).cause,
                                               CL_ALL_BUCKETS,historyRec,
                                               &recordFound);
        if(!recordFound)
        {
            /* record not found */
            fRecord->seqNum = 0;
        }
        else
        {
            /* record found */
            fRecord->seqNum = historyRec->seqNum;
        }
        rc = clFaultHistoryDataUnLock();
        if (rc != CL_OK)
        {
            clFaultCliStrPrint(ret, 
                    "REPAIR: Not able to get history data lock rc:0x%x \n", rc);
            clHeapFree(fRecord);
            clHeapFree(historyRec);
            return rc;
        }
    
        clFaultRecordPack(fRecord,ret);
        clHeapFree(fRecord);
        clHeapFree(historyRec);
    }
    else
        clFaultCliStrPrint(ret, 
                " MOId name to MOId conversion failed ..... \n");
    return CL_OK;
}
ClRcT
clProvProvisionOmCreateAndRuleAdd( SaNameT* pResourceStringMoId,
                                   ClCorMOIdPtrT pFullMoId,
                                   ClCorAddrT* pProvAddr,
                                   ClUint32T createFlag,
                                   ClBoolT   autoCreateFlag,
                                   ClUint32T primaryOIFlag,
                                   ClUint32T wildCardFlag )
{
    ClRcT               rc          = CL_OK;
    ClCorMOClassPathT   moPath;

    CL_FUNC_ENTER();

    rc = clCorMoIdNameToMoIdGet( pResourceStringMoId, pFullMoId );
    CL_PROV_CHECK_RC1_LOG1( rc, CL_OK, CL_PROV_RC(CL_PROV_INTERNAL_ERROR), CL_LOG_ERROR,
                            CL_PROV_LOG_1_MOID_STRING_MOID, rc );

    /*
     * If given Prov MSO is not associated for given resource then don't add the rule 
     * silently supperss the information.
     * Some case alarm is associated with some resource but for the same resource prov may not
     * be associated. In this case prov should not register for those resource with COR.
     */
    rc = clCorMoIdToMoClassPathGet( pFullMoId, &moPath );
    rc = clCorMSOClassExist( &moPath, CL_COR_SVC_ID_PROVISIONING_MANAGEMENT );
    if ( CL_OK != rc )
    {
        return rc;
    }

    /*
     * Add to prov resource list 
     */
    memcpy(&pProvMoIdList->moId[pProvMoIdList->moIdCnt], pFullMoId, sizeof(ClCorMOIdT));
    clCorMoIdServiceSet(&pProvMoIdList->moId[pProvMoIdList->moIdCnt], CL_COR_SVC_ID_PROVISIONING_MANAGEMENT);
    pProvMoIdList->moIdCnt++;

    if ( CL_TRUE == wildCardFlag )
    {
        return CL_OK;
    }

    if ( CL_FALSE == createFlag )
    {
        rc = clProvIfCreateFlagIsFalse( pFullMoId, pProvAddr, primaryOIFlag );
        if ( CL_OK != rc )
        {
            return rc;
        }
    }
    else
    {
        rc = clProvIfCreateFlagIsTrue( pFullMoId, pProvAddr, primaryOIFlag, autoCreateFlag );
        if ( CL_OK != rc )
        {
            return rc;
        }
    }

    CL_FUNC_EXIT();
    return rc;
}
ClRcT clCpmSlotInfoGet(ClCpmSlotInfoFieldIdT flag, ClCpmSlotInfoT *slotInfo)
{
    ClRcT rc = CL_OK;
    ClIocNodeAddressT masterIocAddress = 0;
    ClCpmSlotInfoRecvT  slotInfoRecv = { CL_CPM_SLOT_ID};
    ClUint32T           bufSize = 0;
    
    /* make a SYNC RMD to CPM/G master */
    
    rc = clCpmMasterAddressGet(&masterIocAddress);
    if (rc != CL_OK)
        goto failure;

    slotInfoRecv.flag = flag;
    switch(slotInfoRecv.flag)
    {
        case CL_CPM_SLOT_ID:
        {
            slotInfoRecv.slotId = slotInfo->slotId;
            break;
        }
        case CL_CPM_IOC_ADDRESS:
        {
            slotInfoRecv.nodeIocAddress = slotInfo->nodeIocAddress;
            break;
        }
#ifdef USE_COR        
        case CL_CPM_NODE_MOID:
        {
            slotInfoRecv.nodeMoIdStr.length = 0;
            slotInfoRecv.nodeMoIdStr.value[0] = 0;                
            rc = clCorMoIdToMoIdNameGet(&slotInfo->nodeMoId, &slotInfoRecv.nodeMoIdStr);
            CPM_CLIENT_CHECK(CL_LOG_SEV_ERROR,("MoIdToMoIdNameGet Failed, rc=[0x%x]\n", rc), rc);
            break;
        }
#endif        
        case CL_CPM_NODENAME:
        {
            memcpy(&slotInfoRecv.nodeName, &slotInfo->nodeName, sizeof(SaNameT));
            break;
        }
        default:
        {
            rc = CL_CPM_RC(CL_ERR_INVALID_PARAMETER);
            clLogError(CPM_LOG_AREA_CPM,CL_LOG_CONTEXT_UNSPECIFIED,
                       "Invalid flag passed, rc=[0x%x]\n", rc);
            goto failure;
            break;
        }
    }

    rc = clCpmClientRMDSyncNew(masterIocAddress, CPM_SLOT_INFO_GET,
                               (ClUint8T *) &slotInfoRecv, sizeof(ClUint32T),
                               (ClUint8T *) &slotInfoRecv, &bufSize,
                               CL_RMD_CALL_NEED_REPLY, 0, 0, 0,
                               MARSHALL_FN(ClCpmSlotInfoRecvT, 4, 0, 0),
                               UNMARSHALL_FN(ClCpmSlotInfoRecvT, 4, 0, 0));
    
    CPM_CLIENT_CHECK(CL_LOG_SEV_ERROR, ("Unable to find information about given entity, rc=[0x%x]\n", rc), rc);

    switch(slotInfoRecv.flag)
    {
        case CL_CPM_SLOT_ID:
        {
            slotInfo->nodeIocAddress = slotInfoRecv.nodeIocAddress;
#ifdef USE_COR        
            rc = clCorMoIdNameToMoIdGet(&slotInfoRecv.nodeMoIdStr, &slotInfo->nodeMoId);
            CPM_CLIENT_CHECK(CL_LOG_SEV_ERROR,
                    ("MoIdNameToMoIdGet Failed, rc=[0x%x]\n", rc), rc);
#endif            
            memcpy(&slotInfo->nodeName, &slotInfoRecv.nodeName, sizeof(SaNameT));

            break;
        }
        case CL_CPM_IOC_ADDRESS:
        {
            slotInfo->slotId = slotInfoRecv.slotId;
#ifdef USE_COR  
            rc = clCorMoIdNameToMoIdGet(&slotInfoRecv.nodeMoIdStr, &slotInfo->nodeMoId);
            CPM_CLIENT_CHECK(CL_LOG_SEV_ERROR,
                    ("MoIdNameToMoIdGet Failed, rc=[0x%x]\n", rc), rc);
#endif
            memcpy(&slotInfo->nodeName, &slotInfoRecv.nodeName, sizeof(SaNameT));

            break;
        }
        case CL_CPM_NODE_MOID:
        {
            slotInfo->slotId = slotInfoRecv.slotId;
            
            slotInfo->nodeIocAddress = slotInfoRecv.nodeIocAddress;
            
            memcpy(&slotInfo->nodeName, &slotInfoRecv.nodeName, sizeof(SaNameT));

            break;
        }
        case CL_CPM_NODENAME:
        {
            slotInfo->slotId = slotInfoRecv.slotId;

            slotInfo->nodeIocAddress = slotInfoRecv.nodeIocAddress;
#ifdef USE_COR 
            rc = clCorMoIdNameToMoIdGet(&slotInfoRecv.nodeMoIdStr, &slotInfo->nodeMoId);
            CPM_CLIENT_CHECK(CL_LOG_SEV_ERROR,
                    ("MoIdNameToMoIdGet Failed, rc=[0x%x]\n", rc), rc);
#endif
            break;
        }
        default:
        {
            rc = CL_CPM_RC(CL_ERR_INVALID_PARAMETER);
            clLogError(CPM_LOG_AREA_CPM,CL_LOG_CONTEXT_UNSPECIFIED,
                       "Invalid flag passed, rc=[0x%x]\n", rc);
            goto failure;
            break;
        }
    }

    return rc;

failure:
    return rc;
}